@cdktn/provider-newrelic 14.0.0
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/.jsii +198156 -0
- package/LICENSE +355 -0
- package/README.md +94 -0
- package/lib/account-management/index.d.ts +122 -0
- package/lib/account-management/index.js +293 -0
- package/lib/alert-channel/index.d.ts +351 -0
- package/lib/alert-channel/index.js +769 -0
- package/lib/alert-compound-condition/index.d.ts +233 -0
- package/lib/alert-compound-condition/index.js +506 -0
- package/lib/alert-condition/index.d.ts +271 -0
- package/lib/alert-condition/index.js +558 -0
- package/lib/alert-muting-rule/index.d.ts +309 -0
- package/lib/alert-muting-rule/index.js +714 -0
- package/lib/alert-policy/index.d.ts +91 -0
- package/lib/alert-policy/index.js +174 -0
- package/lib/alert-policy-channel/index.d.ts +114 -0
- package/lib/alert-policy-channel/index.js +258 -0
- package/lib/api-access-key/index.d.ts +102 -0
- package/lib/api-access-key/index.js +220 -0
- package/lib/application-settings/index.d.ts +414 -0
- package/lib/application-settings/index.js +944 -0
- package/lib/browser-application/index.d.ts +149 -0
- package/lib/browser-application/index.js +341 -0
- package/lib/cloud-aws-eu-sovereign-integrations/index.d.ts +199 -0
- package/lib/cloud-aws-eu-sovereign-integrations/index.js +481 -0
- package/lib/cloud-aws-eu-sovereign-link-account/index.d.ts +90 -0
- package/lib/cloud-aws-eu-sovereign-link-account/index.js +171 -0
- package/lib/cloud-aws-govcloud-integrations/index.d.ts +1523 -0
- package/lib/cloud-aws-govcloud-integrations/index.js +3776 -0
- package/lib/cloud-aws-govcloud-link-account/index.d.ts +90 -0
- package/lib/cloud-aws-govcloud-link-account/index.js +171 -0
- package/lib/cloud-aws-integrations/index.d.ts +3345 -0
- package/lib/cloud-aws-integrations/index.js +8599 -0
- package/lib/cloud-aws-link-account/index.d.ts +90 -0
- package/lib/cloud-aws-link-account/index.js +171 -0
- package/lib/cloud-azure-integrations/index.d.ts +1666 -0
- package/lib/cloud-azure-integrations/index.js +4361 -0
- package/lib/cloud-azure-link-account/index.d.ts +109 -0
- package/lib/cloud-azure-link-account/index.js +204 -0
- package/lib/cloud-gcp-integrations/index.d.ts +1049 -0
- package/lib/cloud-gcp-integrations/index.js +2810 -0
- package/lib/cloud-gcp-link-account/index.d.ts +79 -0
- package/lib/cloud-gcp-link-account/index.js +150 -0
- package/lib/cloud-oci-link-account/index.d.ts +195 -0
- package/lib/cloud-oci-link-account/index.js +366 -0
- package/lib/data-newrelic-account/index.d.ts +82 -0
- package/lib/data-newrelic-account/index.js +160 -0
- package/lib/data-newrelic-alert-channel/index.d.ts +126 -0
- package/lib/data-newrelic-alert-channel/index.js +298 -0
- package/lib/data-newrelic-alert-policy/index.d.ts +82 -0
- package/lib/data-newrelic-alert-policy/index.js +161 -0
- package/lib/data-newrelic-application/index.d.ts +60 -0
- package/lib/data-newrelic-application/index.js +122 -0
- package/lib/data-newrelic-authentication-domain/index.d.ts +47 -0
- package/lib/data-newrelic-authentication-domain/index.js +97 -0
- package/lib/data-newrelic-cloud-account/index.d.ts +79 -0
- package/lib/data-newrelic-cloud-account/index.js +150 -0
- package/lib/data-newrelic-entity/index.d.ts +189 -0
- package/lib/data-newrelic-entity/index.js +401 -0
- package/lib/data-newrelic-group/index.d.ts +58 -0
- package/lib/data-newrelic-group/index.js +116 -0
- package/lib/data-newrelic-key-transaction/index.d.ts +82 -0
- package/lib/data-newrelic-key-transaction/index.js +161 -0
- package/lib/data-newrelic-notification-destination/index.d.ts +165 -0
- package/lib/data-newrelic-notification-destination/index.js +372 -0
- package/lib/data-newrelic-obfuscation-expression/index.d.ts +69 -0
- package/lib/data-newrelic-obfuscation-expression/index.js +132 -0
- package/lib/data-newrelic-service-level-alert-helper/index.d.ts +111 -0
- package/lib/data-newrelic-service-level-alert-helper/index.js +244 -0
- package/lib/data-newrelic-synthetics-private-location/index.d.ts +80 -0
- package/lib/data-newrelic-synthetics-private-location/index.js +153 -0
- package/lib/data-newrelic-synthetics-secure-credential/index.d.ts +71 -0
- package/lib/data-newrelic-synthetics-secure-credential/index.js +140 -0
- package/lib/data-newrelic-test-grok-pattern/index.d.ts +149 -0
- package/lib/data-newrelic-test-grok-pattern/index.js +318 -0
- package/lib/data-newrelic-user/index.d.ts +69 -0
- package/lib/data-newrelic-user/index.js +136 -0
- package/lib/data-partition-rule/index.d.ts +146 -0
- package/lib/data-partition-rule/index.js +319 -0
- package/lib/entity-tags/index.d.ts +156 -0
- package/lib/entity-tags/index.js +368 -0
- package/lib/events-to-metrics-rule/index.d.ts +102 -0
- package/lib/events-to-metrics-rule/index.js +196 -0
- package/lib/group/index.d.ts +79 -0
- package/lib/group/index.js +150 -0
- package/lib/index.d.ts +74 -0
- package/lib/index.js +80 -0
- package/lib/infra-alert-condition/index.d.ts +293 -0
- package/lib/infra-alert-condition/index.js +665 -0
- package/lib/insights-event/index.d.ts +186 -0
- package/lib/insights-event/index.js +425 -0
- package/lib/key-transaction/index.d.ts +100 -0
- package/lib/key-transaction/index.js +191 -0
- package/lib/lazy-index.d.ts +4 -0
- package/lib/lazy-index.js +77 -0
- package/lib/log-parsing-rule/index.d.ts +132 -0
- package/lib/log-parsing-rule/index.js +250 -0
- package/lib/monitor-downtime/index.d.ts +259 -0
- package/lib/monitor-downtime/index.js +594 -0
- package/lib/notification-channel/index.d.ts +240 -0
- package/lib/notification-channel/index.js +546 -0
- package/lib/notification-destination/index.d.ts +406 -0
- package/lib/notification-destination/index.js +1030 -0
- package/lib/nrql-alert-condition/index.d.ts +976 -0
- package/lib/nrql-alert-condition/index.js +2320 -0
- package/lib/nrql-drop-rule/index.d.ts +127 -0
- package/lib/nrql-drop-rule/index.js +287 -0
- package/lib/obfuscation-expression/index.d.ts +90 -0
- package/lib/obfuscation-expression/index.js +171 -0
- package/lib/obfuscation-rule/index.d.ts +173 -0
- package/lib/obfuscation-rule/index.js +361 -0
- package/lib/one-dashboard/index-structs/index.d.ts +6 -0
- package/lib/one-dashboard/index-structs/index.js +23 -0
- package/lib/one-dashboard/index-structs/structs0.d.ts +7000 -0
- package/lib/one-dashboard/index-structs/structs0.js +17966 -0
- package/lib/one-dashboard/index-structs/structs400.d.ts +3703 -0
- package/lib/one-dashboard/index-structs/structs400.js +9484 -0
- package/lib/one-dashboard/index.d.ts +116 -0
- package/lib/one-dashboard/index.js +246 -0
- package/lib/one-dashboard-json/index.d.ts +116 -0
- package/lib/one-dashboard-json/index.js +278 -0
- package/lib/one-dashboard-raw/index.d.ts +278 -0
- package/lib/one-dashboard-raw/index.js +646 -0
- package/lib/pipeline-cloud-rule/index.d.ts +90 -0
- package/lib/pipeline-cloud-rule/index.js +171 -0
- package/lib/provider/index.d.ts +164 -0
- package/lib/provider/index.js +354 -0
- package/lib/service-level/index.d.ts +505 -0
- package/lib/service-level/index.js +1429 -0
- package/lib/synthetics-alert-condition/index.d.ts +101 -0
- package/lib/synthetics-alert-condition/index.js +193 -0
- package/lib/synthetics-broken-links-monitor/index.d.ts +221 -0
- package/lib/synthetics-broken-links-monitor/index.js +455 -0
- package/lib/synthetics-cert-check-monitor/index.d.ts +226 -0
- package/lib/synthetics-cert-check-monitor/index.js +469 -0
- package/lib/synthetics-monitor/index.d.ts +408 -0
- package/lib/synthetics-monitor/index.js +843 -0
- package/lib/synthetics-multilocation-alert-condition/index.d.ts +181 -0
- package/lib/synthetics-multilocation-alert-condition/index.js +403 -0
- package/lib/synthetics-private-location/index.d.ts +94 -0
- package/lib/synthetics-private-location/index.js +187 -0
- package/lib/synthetics-script-monitor/index.d.ts +352 -0
- package/lib/synthetics-script-monitor/index.js +736 -0
- package/lib/synthetics-secure-credential/index.d.ts +136 -0
- package/lib/synthetics-secure-credential/index.js +300 -0
- package/lib/synthetics-step-monitor/index.d.ts +372 -0
- package/lib/synthetics-step-monitor/index.js +809 -0
- package/lib/user/index.d.ts +89 -0
- package/lib/user/index.js +168 -0
- package/lib/workflow/index.d.ts +445 -0
- package/lib/workflow/index.js +1058 -0
- package/lib/workload/index.d.ts +518 -0
- package/lib/workload/index.js +1279 -0
- package/package.json +155 -0
|
@@ -0,0 +1,2320 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.NrqlAlertCondition = exports.NrqlAlertConditionWarningOutputReference = exports.NrqlAlertConditionWarningPredictionOutputReference = exports.NrqlAlertConditionTimeoutsOutputReference = exports.NrqlAlertConditionTermList = exports.NrqlAlertConditionTermOutputReference = exports.NrqlAlertConditionTermPredictionOutputReference = exports.NrqlAlertConditionOutlierConfigurationOutputReference = exports.NrqlAlertConditionOutlierConfigurationDbscanOutputReference = exports.NrqlAlertConditionNrqlOutputReference = exports.NrqlAlertConditionCriticalOutputReference = exports.NrqlAlertConditionCriticalPredictionOutputReference = void 0;
|
|
5
|
+
exports.nrqlAlertConditionCriticalPredictionToTerraform = nrqlAlertConditionCriticalPredictionToTerraform;
|
|
6
|
+
exports.nrqlAlertConditionCriticalPredictionToHclTerraform = nrqlAlertConditionCriticalPredictionToHclTerraform;
|
|
7
|
+
exports.nrqlAlertConditionCriticalToTerraform = nrqlAlertConditionCriticalToTerraform;
|
|
8
|
+
exports.nrqlAlertConditionCriticalToHclTerraform = nrqlAlertConditionCriticalToHclTerraform;
|
|
9
|
+
exports.nrqlAlertConditionNrqlToTerraform = nrqlAlertConditionNrqlToTerraform;
|
|
10
|
+
exports.nrqlAlertConditionNrqlToHclTerraform = nrqlAlertConditionNrqlToHclTerraform;
|
|
11
|
+
exports.nrqlAlertConditionOutlierConfigurationDbscanToTerraform = nrqlAlertConditionOutlierConfigurationDbscanToTerraform;
|
|
12
|
+
exports.nrqlAlertConditionOutlierConfigurationDbscanToHclTerraform = nrqlAlertConditionOutlierConfigurationDbscanToHclTerraform;
|
|
13
|
+
exports.nrqlAlertConditionOutlierConfigurationToTerraform = nrqlAlertConditionOutlierConfigurationToTerraform;
|
|
14
|
+
exports.nrqlAlertConditionOutlierConfigurationToHclTerraform = nrqlAlertConditionOutlierConfigurationToHclTerraform;
|
|
15
|
+
exports.nrqlAlertConditionTermPredictionToTerraform = nrqlAlertConditionTermPredictionToTerraform;
|
|
16
|
+
exports.nrqlAlertConditionTermPredictionToHclTerraform = nrqlAlertConditionTermPredictionToHclTerraform;
|
|
17
|
+
exports.nrqlAlertConditionTermToTerraform = nrqlAlertConditionTermToTerraform;
|
|
18
|
+
exports.nrqlAlertConditionTermToHclTerraform = nrqlAlertConditionTermToHclTerraform;
|
|
19
|
+
exports.nrqlAlertConditionTimeoutsToTerraform = nrqlAlertConditionTimeoutsToTerraform;
|
|
20
|
+
exports.nrqlAlertConditionTimeoutsToHclTerraform = nrqlAlertConditionTimeoutsToHclTerraform;
|
|
21
|
+
exports.nrqlAlertConditionWarningPredictionToTerraform = nrqlAlertConditionWarningPredictionToTerraform;
|
|
22
|
+
exports.nrqlAlertConditionWarningPredictionToHclTerraform = nrqlAlertConditionWarningPredictionToHclTerraform;
|
|
23
|
+
exports.nrqlAlertConditionWarningToTerraform = nrqlAlertConditionWarningToTerraform;
|
|
24
|
+
exports.nrqlAlertConditionWarningToHclTerraform = nrqlAlertConditionWarningToHclTerraform;
|
|
25
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
26
|
+
const cdktn = require("cdktn");
|
|
27
|
+
function nrqlAlertConditionCriticalPredictionToTerraform(struct) {
|
|
28
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
29
|
+
return struct;
|
|
30
|
+
}
|
|
31
|
+
if (cdktn.isComplexElement(struct)) {
|
|
32
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
predict_by: cdktn.numberToTerraform(struct.predictBy),
|
|
36
|
+
prefer_prediction_violation: cdktn.booleanToTerraform(struct.preferPredictionViolation),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function nrqlAlertConditionCriticalPredictionToHclTerraform(struct) {
|
|
40
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
41
|
+
return struct;
|
|
42
|
+
}
|
|
43
|
+
if (cdktn.isComplexElement(struct)) {
|
|
44
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
45
|
+
}
|
|
46
|
+
const attrs = {
|
|
47
|
+
predict_by: {
|
|
48
|
+
value: cdktn.numberToHclTerraform(struct.predictBy),
|
|
49
|
+
isBlock: false,
|
|
50
|
+
type: "simple",
|
|
51
|
+
storageClassType: "number",
|
|
52
|
+
},
|
|
53
|
+
prefer_prediction_violation: {
|
|
54
|
+
value: cdktn.booleanToHclTerraform(struct.preferPredictionViolation),
|
|
55
|
+
isBlock: false,
|
|
56
|
+
type: "simple",
|
|
57
|
+
storageClassType: "boolean",
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
// remove undefined attributes
|
|
61
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
62
|
+
}
|
|
63
|
+
class NrqlAlertConditionCriticalPredictionOutputReference extends cdktn.ComplexObject {
|
|
64
|
+
/**
|
|
65
|
+
* @param terraformResource The parent resource
|
|
66
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
67
|
+
*/
|
|
68
|
+
constructor(terraformResource, terraformAttribute) {
|
|
69
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
70
|
+
this.isEmptyObject = false;
|
|
71
|
+
}
|
|
72
|
+
get internalValue() {
|
|
73
|
+
let hasAnyValues = this.isEmptyObject;
|
|
74
|
+
const internalValueResult = {};
|
|
75
|
+
if (this._predictBy !== undefined) {
|
|
76
|
+
hasAnyValues = true;
|
|
77
|
+
internalValueResult.predictBy = this._predictBy;
|
|
78
|
+
}
|
|
79
|
+
if (this._preferPredictionViolation !== undefined) {
|
|
80
|
+
hasAnyValues = true;
|
|
81
|
+
internalValueResult.preferPredictionViolation = this._preferPredictionViolation;
|
|
82
|
+
}
|
|
83
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
84
|
+
}
|
|
85
|
+
set internalValue(value) {
|
|
86
|
+
if (value === undefined) {
|
|
87
|
+
this.isEmptyObject = false;
|
|
88
|
+
this._predictBy = undefined;
|
|
89
|
+
this._preferPredictionViolation = undefined;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
93
|
+
this._predictBy = value.predictBy;
|
|
94
|
+
this._preferPredictionViolation = value.preferPredictionViolation;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
get predictBy() {
|
|
98
|
+
return this.getNumberAttribute('predict_by');
|
|
99
|
+
}
|
|
100
|
+
set predictBy(value) {
|
|
101
|
+
this._predictBy = value;
|
|
102
|
+
}
|
|
103
|
+
resetPredictBy() {
|
|
104
|
+
this._predictBy = undefined;
|
|
105
|
+
}
|
|
106
|
+
// Temporarily expose input value. Use with caution.
|
|
107
|
+
get predictByInput() {
|
|
108
|
+
return this._predictBy;
|
|
109
|
+
}
|
|
110
|
+
get preferPredictionViolation() {
|
|
111
|
+
return this.getBooleanAttribute('prefer_prediction_violation');
|
|
112
|
+
}
|
|
113
|
+
set preferPredictionViolation(value) {
|
|
114
|
+
this._preferPredictionViolation = value;
|
|
115
|
+
}
|
|
116
|
+
resetPreferPredictionViolation() {
|
|
117
|
+
this._preferPredictionViolation = undefined;
|
|
118
|
+
}
|
|
119
|
+
// Temporarily expose input value. Use with caution.
|
|
120
|
+
get preferPredictionViolationInput() {
|
|
121
|
+
return this._preferPredictionViolation;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.NrqlAlertConditionCriticalPredictionOutputReference = NrqlAlertConditionCriticalPredictionOutputReference;
|
|
125
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
126
|
+
NrqlAlertConditionCriticalPredictionOutputReference[_a] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionCriticalPredictionOutputReference", version: "14.0.0" };
|
|
127
|
+
function nrqlAlertConditionCriticalToTerraform(struct) {
|
|
128
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
129
|
+
return struct;
|
|
130
|
+
}
|
|
131
|
+
if (cdktn.isComplexElement(struct)) {
|
|
132
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
disable_health_status_reporting: cdktn.booleanToTerraform(struct.disableHealthStatusReporting),
|
|
136
|
+
duration: cdktn.numberToTerraform(struct.duration),
|
|
137
|
+
operator: cdktn.stringToTerraform(struct.operator),
|
|
138
|
+
threshold: cdktn.numberToTerraform(struct.threshold),
|
|
139
|
+
threshold_duration: cdktn.numberToTerraform(struct.thresholdDuration),
|
|
140
|
+
threshold_occurrences: cdktn.stringToTerraform(struct.thresholdOccurrences),
|
|
141
|
+
time_function: cdktn.stringToTerraform(struct.timeFunction),
|
|
142
|
+
prediction: nrqlAlertConditionCriticalPredictionToTerraform(struct.prediction),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function nrqlAlertConditionCriticalToHclTerraform(struct) {
|
|
146
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
147
|
+
return struct;
|
|
148
|
+
}
|
|
149
|
+
if (cdktn.isComplexElement(struct)) {
|
|
150
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
151
|
+
}
|
|
152
|
+
const attrs = {
|
|
153
|
+
disable_health_status_reporting: {
|
|
154
|
+
value: cdktn.booleanToHclTerraform(struct.disableHealthStatusReporting),
|
|
155
|
+
isBlock: false,
|
|
156
|
+
type: "simple",
|
|
157
|
+
storageClassType: "boolean",
|
|
158
|
+
},
|
|
159
|
+
duration: {
|
|
160
|
+
value: cdktn.numberToHclTerraform(struct.duration),
|
|
161
|
+
isBlock: false,
|
|
162
|
+
type: "simple",
|
|
163
|
+
storageClassType: "number",
|
|
164
|
+
},
|
|
165
|
+
operator: {
|
|
166
|
+
value: cdktn.stringToHclTerraform(struct.operator),
|
|
167
|
+
isBlock: false,
|
|
168
|
+
type: "simple",
|
|
169
|
+
storageClassType: "string",
|
|
170
|
+
},
|
|
171
|
+
threshold: {
|
|
172
|
+
value: cdktn.numberToHclTerraform(struct.threshold),
|
|
173
|
+
isBlock: false,
|
|
174
|
+
type: "simple",
|
|
175
|
+
storageClassType: "number",
|
|
176
|
+
},
|
|
177
|
+
threshold_duration: {
|
|
178
|
+
value: cdktn.numberToHclTerraform(struct.thresholdDuration),
|
|
179
|
+
isBlock: false,
|
|
180
|
+
type: "simple",
|
|
181
|
+
storageClassType: "number",
|
|
182
|
+
},
|
|
183
|
+
threshold_occurrences: {
|
|
184
|
+
value: cdktn.stringToHclTerraform(struct.thresholdOccurrences),
|
|
185
|
+
isBlock: false,
|
|
186
|
+
type: "simple",
|
|
187
|
+
storageClassType: "string",
|
|
188
|
+
},
|
|
189
|
+
time_function: {
|
|
190
|
+
value: cdktn.stringToHclTerraform(struct.timeFunction),
|
|
191
|
+
isBlock: false,
|
|
192
|
+
type: "simple",
|
|
193
|
+
storageClassType: "string",
|
|
194
|
+
},
|
|
195
|
+
prediction: {
|
|
196
|
+
value: nrqlAlertConditionCriticalPredictionToHclTerraform(struct.prediction),
|
|
197
|
+
isBlock: true,
|
|
198
|
+
type: "set",
|
|
199
|
+
storageClassType: "NrqlAlertConditionCriticalPredictionList",
|
|
200
|
+
},
|
|
201
|
+
};
|
|
202
|
+
// remove undefined attributes
|
|
203
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
204
|
+
}
|
|
205
|
+
class NrqlAlertConditionCriticalOutputReference extends cdktn.ComplexObject {
|
|
206
|
+
/**
|
|
207
|
+
* @param terraformResource The parent resource
|
|
208
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
209
|
+
*/
|
|
210
|
+
constructor(terraformResource, terraformAttribute) {
|
|
211
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
212
|
+
this.isEmptyObject = false;
|
|
213
|
+
// prediction - computed: false, optional: true, required: false
|
|
214
|
+
this._prediction = new NrqlAlertConditionCriticalPredictionOutputReference(this, "prediction");
|
|
215
|
+
}
|
|
216
|
+
get internalValue() {
|
|
217
|
+
let hasAnyValues = this.isEmptyObject;
|
|
218
|
+
const internalValueResult = {};
|
|
219
|
+
if (this._disableHealthStatusReporting !== undefined) {
|
|
220
|
+
hasAnyValues = true;
|
|
221
|
+
internalValueResult.disableHealthStatusReporting = this._disableHealthStatusReporting;
|
|
222
|
+
}
|
|
223
|
+
if (this._duration !== undefined) {
|
|
224
|
+
hasAnyValues = true;
|
|
225
|
+
internalValueResult.duration = this._duration;
|
|
226
|
+
}
|
|
227
|
+
if (this._operator !== undefined) {
|
|
228
|
+
hasAnyValues = true;
|
|
229
|
+
internalValueResult.operator = this._operator;
|
|
230
|
+
}
|
|
231
|
+
if (this._threshold !== undefined) {
|
|
232
|
+
hasAnyValues = true;
|
|
233
|
+
internalValueResult.threshold = this._threshold;
|
|
234
|
+
}
|
|
235
|
+
if (this._thresholdDuration !== undefined) {
|
|
236
|
+
hasAnyValues = true;
|
|
237
|
+
internalValueResult.thresholdDuration = this._thresholdDuration;
|
|
238
|
+
}
|
|
239
|
+
if (this._thresholdOccurrences !== undefined) {
|
|
240
|
+
hasAnyValues = true;
|
|
241
|
+
internalValueResult.thresholdOccurrences = this._thresholdOccurrences;
|
|
242
|
+
}
|
|
243
|
+
if (this._timeFunction !== undefined) {
|
|
244
|
+
hasAnyValues = true;
|
|
245
|
+
internalValueResult.timeFunction = this._timeFunction;
|
|
246
|
+
}
|
|
247
|
+
if (this._prediction?.internalValue !== undefined) {
|
|
248
|
+
hasAnyValues = true;
|
|
249
|
+
internalValueResult.prediction = this._prediction?.internalValue;
|
|
250
|
+
}
|
|
251
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
252
|
+
}
|
|
253
|
+
set internalValue(value) {
|
|
254
|
+
if (value === undefined) {
|
|
255
|
+
this.isEmptyObject = false;
|
|
256
|
+
this._disableHealthStatusReporting = undefined;
|
|
257
|
+
this._duration = undefined;
|
|
258
|
+
this._operator = undefined;
|
|
259
|
+
this._threshold = undefined;
|
|
260
|
+
this._thresholdDuration = undefined;
|
|
261
|
+
this._thresholdOccurrences = undefined;
|
|
262
|
+
this._timeFunction = undefined;
|
|
263
|
+
this._prediction.internalValue = undefined;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
267
|
+
this._disableHealthStatusReporting = value.disableHealthStatusReporting;
|
|
268
|
+
this._duration = value.duration;
|
|
269
|
+
this._operator = value.operator;
|
|
270
|
+
this._threshold = value.threshold;
|
|
271
|
+
this._thresholdDuration = value.thresholdDuration;
|
|
272
|
+
this._thresholdOccurrences = value.thresholdOccurrences;
|
|
273
|
+
this._timeFunction = value.timeFunction;
|
|
274
|
+
this._prediction.internalValue = value.prediction;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
get disableHealthStatusReporting() {
|
|
278
|
+
return this.getBooleanAttribute('disable_health_status_reporting');
|
|
279
|
+
}
|
|
280
|
+
set disableHealthStatusReporting(value) {
|
|
281
|
+
this._disableHealthStatusReporting = value;
|
|
282
|
+
}
|
|
283
|
+
resetDisableHealthStatusReporting() {
|
|
284
|
+
this._disableHealthStatusReporting = undefined;
|
|
285
|
+
}
|
|
286
|
+
// Temporarily expose input value. Use with caution.
|
|
287
|
+
get disableHealthStatusReportingInput() {
|
|
288
|
+
return this._disableHealthStatusReporting;
|
|
289
|
+
}
|
|
290
|
+
get duration() {
|
|
291
|
+
return this.getNumberAttribute('duration');
|
|
292
|
+
}
|
|
293
|
+
set duration(value) {
|
|
294
|
+
this._duration = value;
|
|
295
|
+
}
|
|
296
|
+
resetDuration() {
|
|
297
|
+
this._duration = undefined;
|
|
298
|
+
}
|
|
299
|
+
// Temporarily expose input value. Use with caution.
|
|
300
|
+
get durationInput() {
|
|
301
|
+
return this._duration;
|
|
302
|
+
}
|
|
303
|
+
get operator() {
|
|
304
|
+
return this.getStringAttribute('operator');
|
|
305
|
+
}
|
|
306
|
+
set operator(value) {
|
|
307
|
+
this._operator = value;
|
|
308
|
+
}
|
|
309
|
+
resetOperator() {
|
|
310
|
+
this._operator = undefined;
|
|
311
|
+
}
|
|
312
|
+
// Temporarily expose input value. Use with caution.
|
|
313
|
+
get operatorInput() {
|
|
314
|
+
return this._operator;
|
|
315
|
+
}
|
|
316
|
+
get threshold() {
|
|
317
|
+
return this.getNumberAttribute('threshold');
|
|
318
|
+
}
|
|
319
|
+
set threshold(value) {
|
|
320
|
+
this._threshold = value;
|
|
321
|
+
}
|
|
322
|
+
// Temporarily expose input value. Use with caution.
|
|
323
|
+
get thresholdInput() {
|
|
324
|
+
return this._threshold;
|
|
325
|
+
}
|
|
326
|
+
get thresholdDuration() {
|
|
327
|
+
return this.getNumberAttribute('threshold_duration');
|
|
328
|
+
}
|
|
329
|
+
set thresholdDuration(value) {
|
|
330
|
+
this._thresholdDuration = value;
|
|
331
|
+
}
|
|
332
|
+
resetThresholdDuration() {
|
|
333
|
+
this._thresholdDuration = undefined;
|
|
334
|
+
}
|
|
335
|
+
// Temporarily expose input value. Use with caution.
|
|
336
|
+
get thresholdDurationInput() {
|
|
337
|
+
return this._thresholdDuration;
|
|
338
|
+
}
|
|
339
|
+
get thresholdOccurrences() {
|
|
340
|
+
return this.getStringAttribute('threshold_occurrences');
|
|
341
|
+
}
|
|
342
|
+
set thresholdOccurrences(value) {
|
|
343
|
+
this._thresholdOccurrences = value;
|
|
344
|
+
}
|
|
345
|
+
resetThresholdOccurrences() {
|
|
346
|
+
this._thresholdOccurrences = undefined;
|
|
347
|
+
}
|
|
348
|
+
// Temporarily expose input value. Use with caution.
|
|
349
|
+
get thresholdOccurrencesInput() {
|
|
350
|
+
return this._thresholdOccurrences;
|
|
351
|
+
}
|
|
352
|
+
get timeFunction() {
|
|
353
|
+
return this.getStringAttribute('time_function');
|
|
354
|
+
}
|
|
355
|
+
set timeFunction(value) {
|
|
356
|
+
this._timeFunction = value;
|
|
357
|
+
}
|
|
358
|
+
resetTimeFunction() {
|
|
359
|
+
this._timeFunction = undefined;
|
|
360
|
+
}
|
|
361
|
+
// Temporarily expose input value. Use with caution.
|
|
362
|
+
get timeFunctionInput() {
|
|
363
|
+
return this._timeFunction;
|
|
364
|
+
}
|
|
365
|
+
get prediction() {
|
|
366
|
+
return this._prediction;
|
|
367
|
+
}
|
|
368
|
+
putPrediction(value) {
|
|
369
|
+
this._prediction.internalValue = value;
|
|
370
|
+
}
|
|
371
|
+
resetPrediction() {
|
|
372
|
+
this._prediction.internalValue = undefined;
|
|
373
|
+
}
|
|
374
|
+
// Temporarily expose input value. Use with caution.
|
|
375
|
+
get predictionInput() {
|
|
376
|
+
return this._prediction.internalValue;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
exports.NrqlAlertConditionCriticalOutputReference = NrqlAlertConditionCriticalOutputReference;
|
|
380
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
381
|
+
NrqlAlertConditionCriticalOutputReference[_b] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionCriticalOutputReference", version: "14.0.0" };
|
|
382
|
+
function nrqlAlertConditionNrqlToTerraform(struct) {
|
|
383
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
384
|
+
return struct;
|
|
385
|
+
}
|
|
386
|
+
if (cdktn.isComplexElement(struct)) {
|
|
387
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
388
|
+
}
|
|
389
|
+
return {
|
|
390
|
+
data_account_id: cdktn.numberToTerraform(struct.dataAccountId),
|
|
391
|
+
evaluation_offset: cdktn.numberToTerraform(struct.evaluationOffset),
|
|
392
|
+
query: cdktn.stringToTerraform(struct.query),
|
|
393
|
+
since_value: cdktn.stringToTerraform(struct.sinceValue),
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
function nrqlAlertConditionNrqlToHclTerraform(struct) {
|
|
397
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
398
|
+
return struct;
|
|
399
|
+
}
|
|
400
|
+
if (cdktn.isComplexElement(struct)) {
|
|
401
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
402
|
+
}
|
|
403
|
+
const attrs = {
|
|
404
|
+
data_account_id: {
|
|
405
|
+
value: cdktn.numberToHclTerraform(struct.dataAccountId),
|
|
406
|
+
isBlock: false,
|
|
407
|
+
type: "simple",
|
|
408
|
+
storageClassType: "number",
|
|
409
|
+
},
|
|
410
|
+
evaluation_offset: {
|
|
411
|
+
value: cdktn.numberToHclTerraform(struct.evaluationOffset),
|
|
412
|
+
isBlock: false,
|
|
413
|
+
type: "simple",
|
|
414
|
+
storageClassType: "number",
|
|
415
|
+
},
|
|
416
|
+
query: {
|
|
417
|
+
value: cdktn.stringToHclTerraform(struct.query),
|
|
418
|
+
isBlock: false,
|
|
419
|
+
type: "simple",
|
|
420
|
+
storageClassType: "string",
|
|
421
|
+
},
|
|
422
|
+
since_value: {
|
|
423
|
+
value: cdktn.stringToHclTerraform(struct.sinceValue),
|
|
424
|
+
isBlock: false,
|
|
425
|
+
type: "simple",
|
|
426
|
+
storageClassType: "string",
|
|
427
|
+
},
|
|
428
|
+
};
|
|
429
|
+
// remove undefined attributes
|
|
430
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
431
|
+
}
|
|
432
|
+
class NrqlAlertConditionNrqlOutputReference extends cdktn.ComplexObject {
|
|
433
|
+
/**
|
|
434
|
+
* @param terraformResource The parent resource
|
|
435
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
436
|
+
*/
|
|
437
|
+
constructor(terraformResource, terraformAttribute) {
|
|
438
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
439
|
+
this.isEmptyObject = false;
|
|
440
|
+
}
|
|
441
|
+
get internalValue() {
|
|
442
|
+
let hasAnyValues = this.isEmptyObject;
|
|
443
|
+
const internalValueResult = {};
|
|
444
|
+
if (this._dataAccountId !== undefined) {
|
|
445
|
+
hasAnyValues = true;
|
|
446
|
+
internalValueResult.dataAccountId = this._dataAccountId;
|
|
447
|
+
}
|
|
448
|
+
if (this._evaluationOffset !== undefined) {
|
|
449
|
+
hasAnyValues = true;
|
|
450
|
+
internalValueResult.evaluationOffset = this._evaluationOffset;
|
|
451
|
+
}
|
|
452
|
+
if (this._query !== undefined) {
|
|
453
|
+
hasAnyValues = true;
|
|
454
|
+
internalValueResult.query = this._query;
|
|
455
|
+
}
|
|
456
|
+
if (this._sinceValue !== undefined) {
|
|
457
|
+
hasAnyValues = true;
|
|
458
|
+
internalValueResult.sinceValue = this._sinceValue;
|
|
459
|
+
}
|
|
460
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
461
|
+
}
|
|
462
|
+
set internalValue(value) {
|
|
463
|
+
if (value === undefined) {
|
|
464
|
+
this.isEmptyObject = false;
|
|
465
|
+
this._dataAccountId = undefined;
|
|
466
|
+
this._evaluationOffset = undefined;
|
|
467
|
+
this._query = undefined;
|
|
468
|
+
this._sinceValue = undefined;
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
472
|
+
this._dataAccountId = value.dataAccountId;
|
|
473
|
+
this._evaluationOffset = value.evaluationOffset;
|
|
474
|
+
this._query = value.query;
|
|
475
|
+
this._sinceValue = value.sinceValue;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
get dataAccountId() {
|
|
479
|
+
return this.getNumberAttribute('data_account_id');
|
|
480
|
+
}
|
|
481
|
+
set dataAccountId(value) {
|
|
482
|
+
this._dataAccountId = value;
|
|
483
|
+
}
|
|
484
|
+
resetDataAccountId() {
|
|
485
|
+
this._dataAccountId = undefined;
|
|
486
|
+
}
|
|
487
|
+
// Temporarily expose input value. Use with caution.
|
|
488
|
+
get dataAccountIdInput() {
|
|
489
|
+
return this._dataAccountId;
|
|
490
|
+
}
|
|
491
|
+
get evaluationOffset() {
|
|
492
|
+
return this.getNumberAttribute('evaluation_offset');
|
|
493
|
+
}
|
|
494
|
+
set evaluationOffset(value) {
|
|
495
|
+
this._evaluationOffset = value;
|
|
496
|
+
}
|
|
497
|
+
resetEvaluationOffset() {
|
|
498
|
+
this._evaluationOffset = undefined;
|
|
499
|
+
}
|
|
500
|
+
// Temporarily expose input value. Use with caution.
|
|
501
|
+
get evaluationOffsetInput() {
|
|
502
|
+
return this._evaluationOffset;
|
|
503
|
+
}
|
|
504
|
+
get query() {
|
|
505
|
+
return this.getStringAttribute('query');
|
|
506
|
+
}
|
|
507
|
+
set query(value) {
|
|
508
|
+
this._query = value;
|
|
509
|
+
}
|
|
510
|
+
// Temporarily expose input value. Use with caution.
|
|
511
|
+
get queryInput() {
|
|
512
|
+
return this._query;
|
|
513
|
+
}
|
|
514
|
+
get sinceValue() {
|
|
515
|
+
return this.getStringAttribute('since_value');
|
|
516
|
+
}
|
|
517
|
+
set sinceValue(value) {
|
|
518
|
+
this._sinceValue = value;
|
|
519
|
+
}
|
|
520
|
+
resetSinceValue() {
|
|
521
|
+
this._sinceValue = undefined;
|
|
522
|
+
}
|
|
523
|
+
// Temporarily expose input value. Use with caution.
|
|
524
|
+
get sinceValueInput() {
|
|
525
|
+
return this._sinceValue;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
exports.NrqlAlertConditionNrqlOutputReference = NrqlAlertConditionNrqlOutputReference;
|
|
529
|
+
_c = JSII_RTTI_SYMBOL_1;
|
|
530
|
+
NrqlAlertConditionNrqlOutputReference[_c] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionNrqlOutputReference", version: "14.0.0" };
|
|
531
|
+
function nrqlAlertConditionOutlierConfigurationDbscanToTerraform(struct) {
|
|
532
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
533
|
+
return struct;
|
|
534
|
+
}
|
|
535
|
+
if (cdktn.isComplexElement(struct)) {
|
|
536
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
537
|
+
}
|
|
538
|
+
return {
|
|
539
|
+
epsilon: cdktn.numberToTerraform(struct.epsilon),
|
|
540
|
+
evaluation_group_facet: cdktn.stringToTerraform(struct.evaluationGroupFacet),
|
|
541
|
+
minimum_points: cdktn.numberToTerraform(struct.minimumPoints),
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
function nrqlAlertConditionOutlierConfigurationDbscanToHclTerraform(struct) {
|
|
545
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
546
|
+
return struct;
|
|
547
|
+
}
|
|
548
|
+
if (cdktn.isComplexElement(struct)) {
|
|
549
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
550
|
+
}
|
|
551
|
+
const attrs = {
|
|
552
|
+
epsilon: {
|
|
553
|
+
value: cdktn.numberToHclTerraform(struct.epsilon),
|
|
554
|
+
isBlock: false,
|
|
555
|
+
type: "simple",
|
|
556
|
+
storageClassType: "number",
|
|
557
|
+
},
|
|
558
|
+
evaluation_group_facet: {
|
|
559
|
+
value: cdktn.stringToHclTerraform(struct.evaluationGroupFacet),
|
|
560
|
+
isBlock: false,
|
|
561
|
+
type: "simple",
|
|
562
|
+
storageClassType: "string",
|
|
563
|
+
},
|
|
564
|
+
minimum_points: {
|
|
565
|
+
value: cdktn.numberToHclTerraform(struct.minimumPoints),
|
|
566
|
+
isBlock: false,
|
|
567
|
+
type: "simple",
|
|
568
|
+
storageClassType: "number",
|
|
569
|
+
},
|
|
570
|
+
};
|
|
571
|
+
// remove undefined attributes
|
|
572
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
573
|
+
}
|
|
574
|
+
class NrqlAlertConditionOutlierConfigurationDbscanOutputReference extends cdktn.ComplexObject {
|
|
575
|
+
/**
|
|
576
|
+
* @param terraformResource The parent resource
|
|
577
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
578
|
+
*/
|
|
579
|
+
constructor(terraformResource, terraformAttribute) {
|
|
580
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
581
|
+
this.isEmptyObject = false;
|
|
582
|
+
}
|
|
583
|
+
get internalValue() {
|
|
584
|
+
let hasAnyValues = this.isEmptyObject;
|
|
585
|
+
const internalValueResult = {};
|
|
586
|
+
if (this._epsilon !== undefined) {
|
|
587
|
+
hasAnyValues = true;
|
|
588
|
+
internalValueResult.epsilon = this._epsilon;
|
|
589
|
+
}
|
|
590
|
+
if (this._evaluationGroupFacet !== undefined) {
|
|
591
|
+
hasAnyValues = true;
|
|
592
|
+
internalValueResult.evaluationGroupFacet = this._evaluationGroupFacet;
|
|
593
|
+
}
|
|
594
|
+
if (this._minimumPoints !== undefined) {
|
|
595
|
+
hasAnyValues = true;
|
|
596
|
+
internalValueResult.minimumPoints = this._minimumPoints;
|
|
597
|
+
}
|
|
598
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
599
|
+
}
|
|
600
|
+
set internalValue(value) {
|
|
601
|
+
if (value === undefined) {
|
|
602
|
+
this.isEmptyObject = false;
|
|
603
|
+
this._epsilon = undefined;
|
|
604
|
+
this._evaluationGroupFacet = undefined;
|
|
605
|
+
this._minimumPoints = undefined;
|
|
606
|
+
}
|
|
607
|
+
else {
|
|
608
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
609
|
+
this._epsilon = value.epsilon;
|
|
610
|
+
this._evaluationGroupFacet = value.evaluationGroupFacet;
|
|
611
|
+
this._minimumPoints = value.minimumPoints;
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
get epsilon() {
|
|
615
|
+
return this.getNumberAttribute('epsilon');
|
|
616
|
+
}
|
|
617
|
+
set epsilon(value) {
|
|
618
|
+
this._epsilon = value;
|
|
619
|
+
}
|
|
620
|
+
// Temporarily expose input value. Use with caution.
|
|
621
|
+
get epsilonInput() {
|
|
622
|
+
return this._epsilon;
|
|
623
|
+
}
|
|
624
|
+
get evaluationGroupFacet() {
|
|
625
|
+
return this.getStringAttribute('evaluation_group_facet');
|
|
626
|
+
}
|
|
627
|
+
set evaluationGroupFacet(value) {
|
|
628
|
+
this._evaluationGroupFacet = value;
|
|
629
|
+
}
|
|
630
|
+
resetEvaluationGroupFacet() {
|
|
631
|
+
this._evaluationGroupFacet = undefined;
|
|
632
|
+
}
|
|
633
|
+
// Temporarily expose input value. Use with caution.
|
|
634
|
+
get evaluationGroupFacetInput() {
|
|
635
|
+
return this._evaluationGroupFacet;
|
|
636
|
+
}
|
|
637
|
+
get minimumPoints() {
|
|
638
|
+
return this.getNumberAttribute('minimum_points');
|
|
639
|
+
}
|
|
640
|
+
set minimumPoints(value) {
|
|
641
|
+
this._minimumPoints = value;
|
|
642
|
+
}
|
|
643
|
+
// Temporarily expose input value. Use with caution.
|
|
644
|
+
get minimumPointsInput() {
|
|
645
|
+
return this._minimumPoints;
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
exports.NrqlAlertConditionOutlierConfigurationDbscanOutputReference = NrqlAlertConditionOutlierConfigurationDbscanOutputReference;
|
|
649
|
+
_d = JSII_RTTI_SYMBOL_1;
|
|
650
|
+
NrqlAlertConditionOutlierConfigurationDbscanOutputReference[_d] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionOutlierConfigurationDbscanOutputReference", version: "14.0.0" };
|
|
651
|
+
function nrqlAlertConditionOutlierConfigurationToTerraform(struct) {
|
|
652
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
653
|
+
return struct;
|
|
654
|
+
}
|
|
655
|
+
if (cdktn.isComplexElement(struct)) {
|
|
656
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
657
|
+
}
|
|
658
|
+
return {
|
|
659
|
+
dbscan: nrqlAlertConditionOutlierConfigurationDbscanToTerraform(struct.dbscan),
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
function nrqlAlertConditionOutlierConfigurationToHclTerraform(struct) {
|
|
663
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
664
|
+
return struct;
|
|
665
|
+
}
|
|
666
|
+
if (cdktn.isComplexElement(struct)) {
|
|
667
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
668
|
+
}
|
|
669
|
+
const attrs = {
|
|
670
|
+
dbscan: {
|
|
671
|
+
value: nrqlAlertConditionOutlierConfigurationDbscanToHclTerraform(struct.dbscan),
|
|
672
|
+
isBlock: true,
|
|
673
|
+
type: "list",
|
|
674
|
+
storageClassType: "NrqlAlertConditionOutlierConfigurationDbscanList",
|
|
675
|
+
},
|
|
676
|
+
};
|
|
677
|
+
// remove undefined attributes
|
|
678
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
679
|
+
}
|
|
680
|
+
class NrqlAlertConditionOutlierConfigurationOutputReference extends cdktn.ComplexObject {
|
|
681
|
+
/**
|
|
682
|
+
* @param terraformResource The parent resource
|
|
683
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
684
|
+
*/
|
|
685
|
+
constructor(terraformResource, terraformAttribute) {
|
|
686
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
687
|
+
this.isEmptyObject = false;
|
|
688
|
+
// dbscan - computed: false, optional: false, required: true
|
|
689
|
+
this._dbscan = new NrqlAlertConditionOutlierConfigurationDbscanOutputReference(this, "dbscan");
|
|
690
|
+
}
|
|
691
|
+
get internalValue() {
|
|
692
|
+
let hasAnyValues = this.isEmptyObject;
|
|
693
|
+
const internalValueResult = {};
|
|
694
|
+
if (this._dbscan?.internalValue !== undefined) {
|
|
695
|
+
hasAnyValues = true;
|
|
696
|
+
internalValueResult.dbscan = this._dbscan?.internalValue;
|
|
697
|
+
}
|
|
698
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
699
|
+
}
|
|
700
|
+
set internalValue(value) {
|
|
701
|
+
if (value === undefined) {
|
|
702
|
+
this.isEmptyObject = false;
|
|
703
|
+
this._dbscan.internalValue = undefined;
|
|
704
|
+
}
|
|
705
|
+
else {
|
|
706
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
707
|
+
this._dbscan.internalValue = value.dbscan;
|
|
708
|
+
}
|
|
709
|
+
}
|
|
710
|
+
get dbscan() {
|
|
711
|
+
return this._dbscan;
|
|
712
|
+
}
|
|
713
|
+
putDbscan(value) {
|
|
714
|
+
this._dbscan.internalValue = value;
|
|
715
|
+
}
|
|
716
|
+
// Temporarily expose input value. Use with caution.
|
|
717
|
+
get dbscanInput() {
|
|
718
|
+
return this._dbscan.internalValue;
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
exports.NrqlAlertConditionOutlierConfigurationOutputReference = NrqlAlertConditionOutlierConfigurationOutputReference;
|
|
722
|
+
_e = JSII_RTTI_SYMBOL_1;
|
|
723
|
+
NrqlAlertConditionOutlierConfigurationOutputReference[_e] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionOutlierConfigurationOutputReference", version: "14.0.0" };
|
|
724
|
+
function nrqlAlertConditionTermPredictionToTerraform(struct) {
|
|
725
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
726
|
+
return struct;
|
|
727
|
+
}
|
|
728
|
+
if (cdktn.isComplexElement(struct)) {
|
|
729
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
730
|
+
}
|
|
731
|
+
return {
|
|
732
|
+
predict_by: cdktn.numberToTerraform(struct.predictBy),
|
|
733
|
+
prefer_prediction_violation: cdktn.booleanToTerraform(struct.preferPredictionViolation),
|
|
734
|
+
};
|
|
735
|
+
}
|
|
736
|
+
function nrqlAlertConditionTermPredictionToHclTerraform(struct) {
|
|
737
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
738
|
+
return struct;
|
|
739
|
+
}
|
|
740
|
+
if (cdktn.isComplexElement(struct)) {
|
|
741
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
742
|
+
}
|
|
743
|
+
const attrs = {
|
|
744
|
+
predict_by: {
|
|
745
|
+
value: cdktn.numberToHclTerraform(struct.predictBy),
|
|
746
|
+
isBlock: false,
|
|
747
|
+
type: "simple",
|
|
748
|
+
storageClassType: "number",
|
|
749
|
+
},
|
|
750
|
+
prefer_prediction_violation: {
|
|
751
|
+
value: cdktn.booleanToHclTerraform(struct.preferPredictionViolation),
|
|
752
|
+
isBlock: false,
|
|
753
|
+
type: "simple",
|
|
754
|
+
storageClassType: "boolean",
|
|
755
|
+
},
|
|
756
|
+
};
|
|
757
|
+
// remove undefined attributes
|
|
758
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
759
|
+
}
|
|
760
|
+
class NrqlAlertConditionTermPredictionOutputReference extends cdktn.ComplexObject {
|
|
761
|
+
/**
|
|
762
|
+
* @param terraformResource The parent resource
|
|
763
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
764
|
+
*/
|
|
765
|
+
constructor(terraformResource, terraformAttribute) {
|
|
766
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
767
|
+
this.isEmptyObject = false;
|
|
768
|
+
}
|
|
769
|
+
get internalValue() {
|
|
770
|
+
let hasAnyValues = this.isEmptyObject;
|
|
771
|
+
const internalValueResult = {};
|
|
772
|
+
if (this._predictBy !== undefined) {
|
|
773
|
+
hasAnyValues = true;
|
|
774
|
+
internalValueResult.predictBy = this._predictBy;
|
|
775
|
+
}
|
|
776
|
+
if (this._preferPredictionViolation !== undefined) {
|
|
777
|
+
hasAnyValues = true;
|
|
778
|
+
internalValueResult.preferPredictionViolation = this._preferPredictionViolation;
|
|
779
|
+
}
|
|
780
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
781
|
+
}
|
|
782
|
+
set internalValue(value) {
|
|
783
|
+
if (value === undefined) {
|
|
784
|
+
this.isEmptyObject = false;
|
|
785
|
+
this._predictBy = undefined;
|
|
786
|
+
this._preferPredictionViolation = undefined;
|
|
787
|
+
}
|
|
788
|
+
else {
|
|
789
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
790
|
+
this._predictBy = value.predictBy;
|
|
791
|
+
this._preferPredictionViolation = value.preferPredictionViolation;
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
get predictBy() {
|
|
795
|
+
return this.getNumberAttribute('predict_by');
|
|
796
|
+
}
|
|
797
|
+
set predictBy(value) {
|
|
798
|
+
this._predictBy = value;
|
|
799
|
+
}
|
|
800
|
+
resetPredictBy() {
|
|
801
|
+
this._predictBy = undefined;
|
|
802
|
+
}
|
|
803
|
+
// Temporarily expose input value. Use with caution.
|
|
804
|
+
get predictByInput() {
|
|
805
|
+
return this._predictBy;
|
|
806
|
+
}
|
|
807
|
+
get preferPredictionViolation() {
|
|
808
|
+
return this.getBooleanAttribute('prefer_prediction_violation');
|
|
809
|
+
}
|
|
810
|
+
set preferPredictionViolation(value) {
|
|
811
|
+
this._preferPredictionViolation = value;
|
|
812
|
+
}
|
|
813
|
+
resetPreferPredictionViolation() {
|
|
814
|
+
this._preferPredictionViolation = undefined;
|
|
815
|
+
}
|
|
816
|
+
// Temporarily expose input value. Use with caution.
|
|
817
|
+
get preferPredictionViolationInput() {
|
|
818
|
+
return this._preferPredictionViolation;
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
exports.NrqlAlertConditionTermPredictionOutputReference = NrqlAlertConditionTermPredictionOutputReference;
|
|
822
|
+
_f = JSII_RTTI_SYMBOL_1;
|
|
823
|
+
NrqlAlertConditionTermPredictionOutputReference[_f] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionTermPredictionOutputReference", version: "14.0.0" };
|
|
824
|
+
function nrqlAlertConditionTermToTerraform(struct) {
|
|
825
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
826
|
+
return struct;
|
|
827
|
+
}
|
|
828
|
+
if (cdktn.isComplexElement(struct)) {
|
|
829
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
830
|
+
}
|
|
831
|
+
return {
|
|
832
|
+
disable_health_status_reporting: cdktn.booleanToTerraform(struct.disableHealthStatusReporting),
|
|
833
|
+
duration: cdktn.numberToTerraform(struct.duration),
|
|
834
|
+
operator: cdktn.stringToTerraform(struct.operator),
|
|
835
|
+
priority: cdktn.stringToTerraform(struct.priority),
|
|
836
|
+
threshold: cdktn.numberToTerraform(struct.threshold),
|
|
837
|
+
threshold_duration: cdktn.numberToTerraform(struct.thresholdDuration),
|
|
838
|
+
threshold_occurrences: cdktn.stringToTerraform(struct.thresholdOccurrences),
|
|
839
|
+
time_function: cdktn.stringToTerraform(struct.timeFunction),
|
|
840
|
+
prediction: nrqlAlertConditionTermPredictionToTerraform(struct.prediction),
|
|
841
|
+
};
|
|
842
|
+
}
|
|
843
|
+
function nrqlAlertConditionTermToHclTerraform(struct) {
|
|
844
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
845
|
+
return struct;
|
|
846
|
+
}
|
|
847
|
+
if (cdktn.isComplexElement(struct)) {
|
|
848
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
849
|
+
}
|
|
850
|
+
const attrs = {
|
|
851
|
+
disable_health_status_reporting: {
|
|
852
|
+
value: cdktn.booleanToHclTerraform(struct.disableHealthStatusReporting),
|
|
853
|
+
isBlock: false,
|
|
854
|
+
type: "simple",
|
|
855
|
+
storageClassType: "boolean",
|
|
856
|
+
},
|
|
857
|
+
duration: {
|
|
858
|
+
value: cdktn.numberToHclTerraform(struct.duration),
|
|
859
|
+
isBlock: false,
|
|
860
|
+
type: "simple",
|
|
861
|
+
storageClassType: "number",
|
|
862
|
+
},
|
|
863
|
+
operator: {
|
|
864
|
+
value: cdktn.stringToHclTerraform(struct.operator),
|
|
865
|
+
isBlock: false,
|
|
866
|
+
type: "simple",
|
|
867
|
+
storageClassType: "string",
|
|
868
|
+
},
|
|
869
|
+
priority: {
|
|
870
|
+
value: cdktn.stringToHclTerraform(struct.priority),
|
|
871
|
+
isBlock: false,
|
|
872
|
+
type: "simple",
|
|
873
|
+
storageClassType: "string",
|
|
874
|
+
},
|
|
875
|
+
threshold: {
|
|
876
|
+
value: cdktn.numberToHclTerraform(struct.threshold),
|
|
877
|
+
isBlock: false,
|
|
878
|
+
type: "simple",
|
|
879
|
+
storageClassType: "number",
|
|
880
|
+
},
|
|
881
|
+
threshold_duration: {
|
|
882
|
+
value: cdktn.numberToHclTerraform(struct.thresholdDuration),
|
|
883
|
+
isBlock: false,
|
|
884
|
+
type: "simple",
|
|
885
|
+
storageClassType: "number",
|
|
886
|
+
},
|
|
887
|
+
threshold_occurrences: {
|
|
888
|
+
value: cdktn.stringToHclTerraform(struct.thresholdOccurrences),
|
|
889
|
+
isBlock: false,
|
|
890
|
+
type: "simple",
|
|
891
|
+
storageClassType: "string",
|
|
892
|
+
},
|
|
893
|
+
time_function: {
|
|
894
|
+
value: cdktn.stringToHclTerraform(struct.timeFunction),
|
|
895
|
+
isBlock: false,
|
|
896
|
+
type: "simple",
|
|
897
|
+
storageClassType: "string",
|
|
898
|
+
},
|
|
899
|
+
prediction: {
|
|
900
|
+
value: nrqlAlertConditionTermPredictionToHclTerraform(struct.prediction),
|
|
901
|
+
isBlock: true,
|
|
902
|
+
type: "set",
|
|
903
|
+
storageClassType: "NrqlAlertConditionTermPredictionList",
|
|
904
|
+
},
|
|
905
|
+
};
|
|
906
|
+
// remove undefined attributes
|
|
907
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
908
|
+
}
|
|
909
|
+
class NrqlAlertConditionTermOutputReference extends cdktn.ComplexObject {
|
|
910
|
+
/**
|
|
911
|
+
* @param terraformResource The parent resource
|
|
912
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
913
|
+
* @param complexObjectIndex the index of this item in the list
|
|
914
|
+
* @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
915
|
+
*/
|
|
916
|
+
constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
|
|
917
|
+
super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
|
|
918
|
+
this.isEmptyObject = false;
|
|
919
|
+
// prediction - computed: false, optional: true, required: false
|
|
920
|
+
this._prediction = new NrqlAlertConditionTermPredictionOutputReference(this, "prediction");
|
|
921
|
+
}
|
|
922
|
+
get internalValue() {
|
|
923
|
+
if (this.resolvableValue) {
|
|
924
|
+
return this.resolvableValue;
|
|
925
|
+
}
|
|
926
|
+
let hasAnyValues = this.isEmptyObject;
|
|
927
|
+
const internalValueResult = {};
|
|
928
|
+
if (this._disableHealthStatusReporting !== undefined) {
|
|
929
|
+
hasAnyValues = true;
|
|
930
|
+
internalValueResult.disableHealthStatusReporting = this._disableHealthStatusReporting;
|
|
931
|
+
}
|
|
932
|
+
if (this._duration !== undefined) {
|
|
933
|
+
hasAnyValues = true;
|
|
934
|
+
internalValueResult.duration = this._duration;
|
|
935
|
+
}
|
|
936
|
+
if (this._operator !== undefined) {
|
|
937
|
+
hasAnyValues = true;
|
|
938
|
+
internalValueResult.operator = this._operator;
|
|
939
|
+
}
|
|
940
|
+
if (this._priority !== undefined) {
|
|
941
|
+
hasAnyValues = true;
|
|
942
|
+
internalValueResult.priority = this._priority;
|
|
943
|
+
}
|
|
944
|
+
if (this._threshold !== undefined) {
|
|
945
|
+
hasAnyValues = true;
|
|
946
|
+
internalValueResult.threshold = this._threshold;
|
|
947
|
+
}
|
|
948
|
+
if (this._thresholdDuration !== undefined) {
|
|
949
|
+
hasAnyValues = true;
|
|
950
|
+
internalValueResult.thresholdDuration = this._thresholdDuration;
|
|
951
|
+
}
|
|
952
|
+
if (this._thresholdOccurrences !== undefined) {
|
|
953
|
+
hasAnyValues = true;
|
|
954
|
+
internalValueResult.thresholdOccurrences = this._thresholdOccurrences;
|
|
955
|
+
}
|
|
956
|
+
if (this._timeFunction !== undefined) {
|
|
957
|
+
hasAnyValues = true;
|
|
958
|
+
internalValueResult.timeFunction = this._timeFunction;
|
|
959
|
+
}
|
|
960
|
+
if (this._prediction?.internalValue !== undefined) {
|
|
961
|
+
hasAnyValues = true;
|
|
962
|
+
internalValueResult.prediction = this._prediction?.internalValue;
|
|
963
|
+
}
|
|
964
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
965
|
+
}
|
|
966
|
+
set internalValue(value) {
|
|
967
|
+
if (value === undefined) {
|
|
968
|
+
this.isEmptyObject = false;
|
|
969
|
+
this.resolvableValue = undefined;
|
|
970
|
+
this._disableHealthStatusReporting = undefined;
|
|
971
|
+
this._duration = undefined;
|
|
972
|
+
this._operator = undefined;
|
|
973
|
+
this._priority = undefined;
|
|
974
|
+
this._threshold = undefined;
|
|
975
|
+
this._thresholdDuration = undefined;
|
|
976
|
+
this._thresholdOccurrences = undefined;
|
|
977
|
+
this._timeFunction = undefined;
|
|
978
|
+
this._prediction.internalValue = undefined;
|
|
979
|
+
}
|
|
980
|
+
else if (cdktn.Tokenization.isResolvable(value)) {
|
|
981
|
+
this.isEmptyObject = false;
|
|
982
|
+
this.resolvableValue = value;
|
|
983
|
+
}
|
|
984
|
+
else {
|
|
985
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
986
|
+
this.resolvableValue = undefined;
|
|
987
|
+
this._disableHealthStatusReporting = value.disableHealthStatusReporting;
|
|
988
|
+
this._duration = value.duration;
|
|
989
|
+
this._operator = value.operator;
|
|
990
|
+
this._priority = value.priority;
|
|
991
|
+
this._threshold = value.threshold;
|
|
992
|
+
this._thresholdDuration = value.thresholdDuration;
|
|
993
|
+
this._thresholdOccurrences = value.thresholdOccurrences;
|
|
994
|
+
this._timeFunction = value.timeFunction;
|
|
995
|
+
this._prediction.internalValue = value.prediction;
|
|
996
|
+
}
|
|
997
|
+
}
|
|
998
|
+
get disableHealthStatusReporting() {
|
|
999
|
+
return this.getBooleanAttribute('disable_health_status_reporting');
|
|
1000
|
+
}
|
|
1001
|
+
set disableHealthStatusReporting(value) {
|
|
1002
|
+
this._disableHealthStatusReporting = value;
|
|
1003
|
+
}
|
|
1004
|
+
resetDisableHealthStatusReporting() {
|
|
1005
|
+
this._disableHealthStatusReporting = undefined;
|
|
1006
|
+
}
|
|
1007
|
+
// Temporarily expose input value. Use with caution.
|
|
1008
|
+
get disableHealthStatusReportingInput() {
|
|
1009
|
+
return this._disableHealthStatusReporting;
|
|
1010
|
+
}
|
|
1011
|
+
get duration() {
|
|
1012
|
+
return this.getNumberAttribute('duration');
|
|
1013
|
+
}
|
|
1014
|
+
set duration(value) {
|
|
1015
|
+
this._duration = value;
|
|
1016
|
+
}
|
|
1017
|
+
resetDuration() {
|
|
1018
|
+
this._duration = undefined;
|
|
1019
|
+
}
|
|
1020
|
+
// Temporarily expose input value. Use with caution.
|
|
1021
|
+
get durationInput() {
|
|
1022
|
+
return this._duration;
|
|
1023
|
+
}
|
|
1024
|
+
get operator() {
|
|
1025
|
+
return this.getStringAttribute('operator');
|
|
1026
|
+
}
|
|
1027
|
+
set operator(value) {
|
|
1028
|
+
this._operator = value;
|
|
1029
|
+
}
|
|
1030
|
+
resetOperator() {
|
|
1031
|
+
this._operator = undefined;
|
|
1032
|
+
}
|
|
1033
|
+
// Temporarily expose input value. Use with caution.
|
|
1034
|
+
get operatorInput() {
|
|
1035
|
+
return this._operator;
|
|
1036
|
+
}
|
|
1037
|
+
get priority() {
|
|
1038
|
+
return this.getStringAttribute('priority');
|
|
1039
|
+
}
|
|
1040
|
+
set priority(value) {
|
|
1041
|
+
this._priority = value;
|
|
1042
|
+
}
|
|
1043
|
+
resetPriority() {
|
|
1044
|
+
this._priority = undefined;
|
|
1045
|
+
}
|
|
1046
|
+
// Temporarily expose input value. Use with caution.
|
|
1047
|
+
get priorityInput() {
|
|
1048
|
+
return this._priority;
|
|
1049
|
+
}
|
|
1050
|
+
get threshold() {
|
|
1051
|
+
return this.getNumberAttribute('threshold');
|
|
1052
|
+
}
|
|
1053
|
+
set threshold(value) {
|
|
1054
|
+
this._threshold = value;
|
|
1055
|
+
}
|
|
1056
|
+
// Temporarily expose input value. Use with caution.
|
|
1057
|
+
get thresholdInput() {
|
|
1058
|
+
return this._threshold;
|
|
1059
|
+
}
|
|
1060
|
+
get thresholdDuration() {
|
|
1061
|
+
return this.getNumberAttribute('threshold_duration');
|
|
1062
|
+
}
|
|
1063
|
+
set thresholdDuration(value) {
|
|
1064
|
+
this._thresholdDuration = value;
|
|
1065
|
+
}
|
|
1066
|
+
resetThresholdDuration() {
|
|
1067
|
+
this._thresholdDuration = undefined;
|
|
1068
|
+
}
|
|
1069
|
+
// Temporarily expose input value. Use with caution.
|
|
1070
|
+
get thresholdDurationInput() {
|
|
1071
|
+
return this._thresholdDuration;
|
|
1072
|
+
}
|
|
1073
|
+
get thresholdOccurrences() {
|
|
1074
|
+
return this.getStringAttribute('threshold_occurrences');
|
|
1075
|
+
}
|
|
1076
|
+
set thresholdOccurrences(value) {
|
|
1077
|
+
this._thresholdOccurrences = value;
|
|
1078
|
+
}
|
|
1079
|
+
resetThresholdOccurrences() {
|
|
1080
|
+
this._thresholdOccurrences = undefined;
|
|
1081
|
+
}
|
|
1082
|
+
// Temporarily expose input value. Use with caution.
|
|
1083
|
+
get thresholdOccurrencesInput() {
|
|
1084
|
+
return this._thresholdOccurrences;
|
|
1085
|
+
}
|
|
1086
|
+
get timeFunction() {
|
|
1087
|
+
return this.getStringAttribute('time_function');
|
|
1088
|
+
}
|
|
1089
|
+
set timeFunction(value) {
|
|
1090
|
+
this._timeFunction = value;
|
|
1091
|
+
}
|
|
1092
|
+
resetTimeFunction() {
|
|
1093
|
+
this._timeFunction = undefined;
|
|
1094
|
+
}
|
|
1095
|
+
// Temporarily expose input value. Use with caution.
|
|
1096
|
+
get timeFunctionInput() {
|
|
1097
|
+
return this._timeFunction;
|
|
1098
|
+
}
|
|
1099
|
+
get prediction() {
|
|
1100
|
+
return this._prediction;
|
|
1101
|
+
}
|
|
1102
|
+
putPrediction(value) {
|
|
1103
|
+
this._prediction.internalValue = value;
|
|
1104
|
+
}
|
|
1105
|
+
resetPrediction() {
|
|
1106
|
+
this._prediction.internalValue = undefined;
|
|
1107
|
+
}
|
|
1108
|
+
// Temporarily expose input value. Use with caution.
|
|
1109
|
+
get predictionInput() {
|
|
1110
|
+
return this._prediction.internalValue;
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
exports.NrqlAlertConditionTermOutputReference = NrqlAlertConditionTermOutputReference;
|
|
1114
|
+
_g = JSII_RTTI_SYMBOL_1;
|
|
1115
|
+
NrqlAlertConditionTermOutputReference[_g] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionTermOutputReference", version: "14.0.0" };
|
|
1116
|
+
class NrqlAlertConditionTermList extends cdktn.ComplexList {
|
|
1117
|
+
/**
|
|
1118
|
+
* @param terraformResource The parent resource
|
|
1119
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1120
|
+
* @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
1121
|
+
*/
|
|
1122
|
+
constructor(terraformResource, terraformAttribute, wrapsSet) {
|
|
1123
|
+
super(terraformResource, terraformAttribute, wrapsSet);
|
|
1124
|
+
this.terraformResource = terraformResource;
|
|
1125
|
+
this.terraformAttribute = terraformAttribute;
|
|
1126
|
+
this.wrapsSet = wrapsSet;
|
|
1127
|
+
}
|
|
1128
|
+
/**
|
|
1129
|
+
* @param index the index of the item to return
|
|
1130
|
+
*/
|
|
1131
|
+
get(index) {
|
|
1132
|
+
return new NrqlAlertConditionTermOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
|
|
1133
|
+
}
|
|
1134
|
+
}
|
|
1135
|
+
exports.NrqlAlertConditionTermList = NrqlAlertConditionTermList;
|
|
1136
|
+
_h = JSII_RTTI_SYMBOL_1;
|
|
1137
|
+
NrqlAlertConditionTermList[_h] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionTermList", version: "14.0.0" };
|
|
1138
|
+
function nrqlAlertConditionTimeoutsToTerraform(struct) {
|
|
1139
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1140
|
+
return struct;
|
|
1141
|
+
}
|
|
1142
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1143
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1144
|
+
}
|
|
1145
|
+
return {
|
|
1146
|
+
create: cdktn.stringToTerraform(struct.create),
|
|
1147
|
+
};
|
|
1148
|
+
}
|
|
1149
|
+
function nrqlAlertConditionTimeoutsToHclTerraform(struct) {
|
|
1150
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1151
|
+
return struct;
|
|
1152
|
+
}
|
|
1153
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1154
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1155
|
+
}
|
|
1156
|
+
const attrs = {
|
|
1157
|
+
create: {
|
|
1158
|
+
value: cdktn.stringToHclTerraform(struct.create),
|
|
1159
|
+
isBlock: false,
|
|
1160
|
+
type: "simple",
|
|
1161
|
+
storageClassType: "string",
|
|
1162
|
+
},
|
|
1163
|
+
};
|
|
1164
|
+
// remove undefined attributes
|
|
1165
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1166
|
+
}
|
|
1167
|
+
class NrqlAlertConditionTimeoutsOutputReference extends cdktn.ComplexObject {
|
|
1168
|
+
/**
|
|
1169
|
+
* @param terraformResource The parent resource
|
|
1170
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1171
|
+
*/
|
|
1172
|
+
constructor(terraformResource, terraformAttribute) {
|
|
1173
|
+
super(terraformResource, terraformAttribute, false);
|
|
1174
|
+
this.isEmptyObject = false;
|
|
1175
|
+
}
|
|
1176
|
+
get internalValue() {
|
|
1177
|
+
if (this.resolvableValue) {
|
|
1178
|
+
return this.resolvableValue;
|
|
1179
|
+
}
|
|
1180
|
+
let hasAnyValues = this.isEmptyObject;
|
|
1181
|
+
const internalValueResult = {};
|
|
1182
|
+
if (this._create !== undefined) {
|
|
1183
|
+
hasAnyValues = true;
|
|
1184
|
+
internalValueResult.create = this._create;
|
|
1185
|
+
}
|
|
1186
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
1187
|
+
}
|
|
1188
|
+
set internalValue(value) {
|
|
1189
|
+
if (value === undefined) {
|
|
1190
|
+
this.isEmptyObject = false;
|
|
1191
|
+
this.resolvableValue = undefined;
|
|
1192
|
+
this._create = undefined;
|
|
1193
|
+
}
|
|
1194
|
+
else if (cdktn.Tokenization.isResolvable(value)) {
|
|
1195
|
+
this.isEmptyObject = false;
|
|
1196
|
+
this.resolvableValue = value;
|
|
1197
|
+
}
|
|
1198
|
+
else {
|
|
1199
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
1200
|
+
this.resolvableValue = undefined;
|
|
1201
|
+
this._create = value.create;
|
|
1202
|
+
}
|
|
1203
|
+
}
|
|
1204
|
+
get create() {
|
|
1205
|
+
return this.getStringAttribute('create');
|
|
1206
|
+
}
|
|
1207
|
+
set create(value) {
|
|
1208
|
+
this._create = value;
|
|
1209
|
+
}
|
|
1210
|
+
resetCreate() {
|
|
1211
|
+
this._create = undefined;
|
|
1212
|
+
}
|
|
1213
|
+
// Temporarily expose input value. Use with caution.
|
|
1214
|
+
get createInput() {
|
|
1215
|
+
return this._create;
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
exports.NrqlAlertConditionTimeoutsOutputReference = NrqlAlertConditionTimeoutsOutputReference;
|
|
1219
|
+
_j = JSII_RTTI_SYMBOL_1;
|
|
1220
|
+
NrqlAlertConditionTimeoutsOutputReference[_j] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionTimeoutsOutputReference", version: "14.0.0" };
|
|
1221
|
+
function nrqlAlertConditionWarningPredictionToTerraform(struct) {
|
|
1222
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1223
|
+
return struct;
|
|
1224
|
+
}
|
|
1225
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1226
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1227
|
+
}
|
|
1228
|
+
return {
|
|
1229
|
+
predict_by: cdktn.numberToTerraform(struct.predictBy),
|
|
1230
|
+
prefer_prediction_violation: cdktn.booleanToTerraform(struct.preferPredictionViolation),
|
|
1231
|
+
};
|
|
1232
|
+
}
|
|
1233
|
+
function nrqlAlertConditionWarningPredictionToHclTerraform(struct) {
|
|
1234
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1235
|
+
return struct;
|
|
1236
|
+
}
|
|
1237
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1238
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1239
|
+
}
|
|
1240
|
+
const attrs = {
|
|
1241
|
+
predict_by: {
|
|
1242
|
+
value: cdktn.numberToHclTerraform(struct.predictBy),
|
|
1243
|
+
isBlock: false,
|
|
1244
|
+
type: "simple",
|
|
1245
|
+
storageClassType: "number",
|
|
1246
|
+
},
|
|
1247
|
+
prefer_prediction_violation: {
|
|
1248
|
+
value: cdktn.booleanToHclTerraform(struct.preferPredictionViolation),
|
|
1249
|
+
isBlock: false,
|
|
1250
|
+
type: "simple",
|
|
1251
|
+
storageClassType: "boolean",
|
|
1252
|
+
},
|
|
1253
|
+
};
|
|
1254
|
+
// remove undefined attributes
|
|
1255
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1256
|
+
}
|
|
1257
|
+
class NrqlAlertConditionWarningPredictionOutputReference extends cdktn.ComplexObject {
|
|
1258
|
+
/**
|
|
1259
|
+
* @param terraformResource The parent resource
|
|
1260
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1261
|
+
*/
|
|
1262
|
+
constructor(terraformResource, terraformAttribute) {
|
|
1263
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
1264
|
+
this.isEmptyObject = false;
|
|
1265
|
+
}
|
|
1266
|
+
get internalValue() {
|
|
1267
|
+
let hasAnyValues = this.isEmptyObject;
|
|
1268
|
+
const internalValueResult = {};
|
|
1269
|
+
if (this._predictBy !== undefined) {
|
|
1270
|
+
hasAnyValues = true;
|
|
1271
|
+
internalValueResult.predictBy = this._predictBy;
|
|
1272
|
+
}
|
|
1273
|
+
if (this._preferPredictionViolation !== undefined) {
|
|
1274
|
+
hasAnyValues = true;
|
|
1275
|
+
internalValueResult.preferPredictionViolation = this._preferPredictionViolation;
|
|
1276
|
+
}
|
|
1277
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
1278
|
+
}
|
|
1279
|
+
set internalValue(value) {
|
|
1280
|
+
if (value === undefined) {
|
|
1281
|
+
this.isEmptyObject = false;
|
|
1282
|
+
this._predictBy = undefined;
|
|
1283
|
+
this._preferPredictionViolation = undefined;
|
|
1284
|
+
}
|
|
1285
|
+
else {
|
|
1286
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
1287
|
+
this._predictBy = value.predictBy;
|
|
1288
|
+
this._preferPredictionViolation = value.preferPredictionViolation;
|
|
1289
|
+
}
|
|
1290
|
+
}
|
|
1291
|
+
get predictBy() {
|
|
1292
|
+
return this.getNumberAttribute('predict_by');
|
|
1293
|
+
}
|
|
1294
|
+
set predictBy(value) {
|
|
1295
|
+
this._predictBy = value;
|
|
1296
|
+
}
|
|
1297
|
+
resetPredictBy() {
|
|
1298
|
+
this._predictBy = undefined;
|
|
1299
|
+
}
|
|
1300
|
+
// Temporarily expose input value. Use with caution.
|
|
1301
|
+
get predictByInput() {
|
|
1302
|
+
return this._predictBy;
|
|
1303
|
+
}
|
|
1304
|
+
get preferPredictionViolation() {
|
|
1305
|
+
return this.getBooleanAttribute('prefer_prediction_violation');
|
|
1306
|
+
}
|
|
1307
|
+
set preferPredictionViolation(value) {
|
|
1308
|
+
this._preferPredictionViolation = value;
|
|
1309
|
+
}
|
|
1310
|
+
resetPreferPredictionViolation() {
|
|
1311
|
+
this._preferPredictionViolation = undefined;
|
|
1312
|
+
}
|
|
1313
|
+
// Temporarily expose input value. Use with caution.
|
|
1314
|
+
get preferPredictionViolationInput() {
|
|
1315
|
+
return this._preferPredictionViolation;
|
|
1316
|
+
}
|
|
1317
|
+
}
|
|
1318
|
+
exports.NrqlAlertConditionWarningPredictionOutputReference = NrqlAlertConditionWarningPredictionOutputReference;
|
|
1319
|
+
_k = JSII_RTTI_SYMBOL_1;
|
|
1320
|
+
NrqlAlertConditionWarningPredictionOutputReference[_k] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionWarningPredictionOutputReference", version: "14.0.0" };
|
|
1321
|
+
function nrqlAlertConditionWarningToTerraform(struct) {
|
|
1322
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1323
|
+
return struct;
|
|
1324
|
+
}
|
|
1325
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1326
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1327
|
+
}
|
|
1328
|
+
return {
|
|
1329
|
+
disable_health_status_reporting: cdktn.booleanToTerraform(struct.disableHealthStatusReporting),
|
|
1330
|
+
duration: cdktn.numberToTerraform(struct.duration),
|
|
1331
|
+
operator: cdktn.stringToTerraform(struct.operator),
|
|
1332
|
+
threshold: cdktn.numberToTerraform(struct.threshold),
|
|
1333
|
+
threshold_duration: cdktn.numberToTerraform(struct.thresholdDuration),
|
|
1334
|
+
threshold_occurrences: cdktn.stringToTerraform(struct.thresholdOccurrences),
|
|
1335
|
+
time_function: cdktn.stringToTerraform(struct.timeFunction),
|
|
1336
|
+
prediction: nrqlAlertConditionWarningPredictionToTerraform(struct.prediction),
|
|
1337
|
+
};
|
|
1338
|
+
}
|
|
1339
|
+
function nrqlAlertConditionWarningToHclTerraform(struct) {
|
|
1340
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
1341
|
+
return struct;
|
|
1342
|
+
}
|
|
1343
|
+
if (cdktn.isComplexElement(struct)) {
|
|
1344
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1345
|
+
}
|
|
1346
|
+
const attrs = {
|
|
1347
|
+
disable_health_status_reporting: {
|
|
1348
|
+
value: cdktn.booleanToHclTerraform(struct.disableHealthStatusReporting),
|
|
1349
|
+
isBlock: false,
|
|
1350
|
+
type: "simple",
|
|
1351
|
+
storageClassType: "boolean",
|
|
1352
|
+
},
|
|
1353
|
+
duration: {
|
|
1354
|
+
value: cdktn.numberToHclTerraform(struct.duration),
|
|
1355
|
+
isBlock: false,
|
|
1356
|
+
type: "simple",
|
|
1357
|
+
storageClassType: "number",
|
|
1358
|
+
},
|
|
1359
|
+
operator: {
|
|
1360
|
+
value: cdktn.stringToHclTerraform(struct.operator),
|
|
1361
|
+
isBlock: false,
|
|
1362
|
+
type: "simple",
|
|
1363
|
+
storageClassType: "string",
|
|
1364
|
+
},
|
|
1365
|
+
threshold: {
|
|
1366
|
+
value: cdktn.numberToHclTerraform(struct.threshold),
|
|
1367
|
+
isBlock: false,
|
|
1368
|
+
type: "simple",
|
|
1369
|
+
storageClassType: "number",
|
|
1370
|
+
},
|
|
1371
|
+
threshold_duration: {
|
|
1372
|
+
value: cdktn.numberToHclTerraform(struct.thresholdDuration),
|
|
1373
|
+
isBlock: false,
|
|
1374
|
+
type: "simple",
|
|
1375
|
+
storageClassType: "number",
|
|
1376
|
+
},
|
|
1377
|
+
threshold_occurrences: {
|
|
1378
|
+
value: cdktn.stringToHclTerraform(struct.thresholdOccurrences),
|
|
1379
|
+
isBlock: false,
|
|
1380
|
+
type: "simple",
|
|
1381
|
+
storageClassType: "string",
|
|
1382
|
+
},
|
|
1383
|
+
time_function: {
|
|
1384
|
+
value: cdktn.stringToHclTerraform(struct.timeFunction),
|
|
1385
|
+
isBlock: false,
|
|
1386
|
+
type: "simple",
|
|
1387
|
+
storageClassType: "string",
|
|
1388
|
+
},
|
|
1389
|
+
prediction: {
|
|
1390
|
+
value: nrqlAlertConditionWarningPredictionToHclTerraform(struct.prediction),
|
|
1391
|
+
isBlock: true,
|
|
1392
|
+
type: "set",
|
|
1393
|
+
storageClassType: "NrqlAlertConditionWarningPredictionList",
|
|
1394
|
+
},
|
|
1395
|
+
};
|
|
1396
|
+
// remove undefined attributes
|
|
1397
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1398
|
+
}
|
|
1399
|
+
class NrqlAlertConditionWarningOutputReference extends cdktn.ComplexObject {
|
|
1400
|
+
/**
|
|
1401
|
+
* @param terraformResource The parent resource
|
|
1402
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1403
|
+
*/
|
|
1404
|
+
constructor(terraformResource, terraformAttribute) {
|
|
1405
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
1406
|
+
this.isEmptyObject = false;
|
|
1407
|
+
// prediction - computed: false, optional: true, required: false
|
|
1408
|
+
this._prediction = new NrqlAlertConditionWarningPredictionOutputReference(this, "prediction");
|
|
1409
|
+
}
|
|
1410
|
+
get internalValue() {
|
|
1411
|
+
let hasAnyValues = this.isEmptyObject;
|
|
1412
|
+
const internalValueResult = {};
|
|
1413
|
+
if (this._disableHealthStatusReporting !== undefined) {
|
|
1414
|
+
hasAnyValues = true;
|
|
1415
|
+
internalValueResult.disableHealthStatusReporting = this._disableHealthStatusReporting;
|
|
1416
|
+
}
|
|
1417
|
+
if (this._duration !== undefined) {
|
|
1418
|
+
hasAnyValues = true;
|
|
1419
|
+
internalValueResult.duration = this._duration;
|
|
1420
|
+
}
|
|
1421
|
+
if (this._operator !== undefined) {
|
|
1422
|
+
hasAnyValues = true;
|
|
1423
|
+
internalValueResult.operator = this._operator;
|
|
1424
|
+
}
|
|
1425
|
+
if (this._threshold !== undefined) {
|
|
1426
|
+
hasAnyValues = true;
|
|
1427
|
+
internalValueResult.threshold = this._threshold;
|
|
1428
|
+
}
|
|
1429
|
+
if (this._thresholdDuration !== undefined) {
|
|
1430
|
+
hasAnyValues = true;
|
|
1431
|
+
internalValueResult.thresholdDuration = this._thresholdDuration;
|
|
1432
|
+
}
|
|
1433
|
+
if (this._thresholdOccurrences !== undefined) {
|
|
1434
|
+
hasAnyValues = true;
|
|
1435
|
+
internalValueResult.thresholdOccurrences = this._thresholdOccurrences;
|
|
1436
|
+
}
|
|
1437
|
+
if (this._timeFunction !== undefined) {
|
|
1438
|
+
hasAnyValues = true;
|
|
1439
|
+
internalValueResult.timeFunction = this._timeFunction;
|
|
1440
|
+
}
|
|
1441
|
+
if (this._prediction?.internalValue !== undefined) {
|
|
1442
|
+
hasAnyValues = true;
|
|
1443
|
+
internalValueResult.prediction = this._prediction?.internalValue;
|
|
1444
|
+
}
|
|
1445
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
1446
|
+
}
|
|
1447
|
+
set internalValue(value) {
|
|
1448
|
+
if (value === undefined) {
|
|
1449
|
+
this.isEmptyObject = false;
|
|
1450
|
+
this._disableHealthStatusReporting = undefined;
|
|
1451
|
+
this._duration = undefined;
|
|
1452
|
+
this._operator = undefined;
|
|
1453
|
+
this._threshold = undefined;
|
|
1454
|
+
this._thresholdDuration = undefined;
|
|
1455
|
+
this._thresholdOccurrences = undefined;
|
|
1456
|
+
this._timeFunction = undefined;
|
|
1457
|
+
this._prediction.internalValue = undefined;
|
|
1458
|
+
}
|
|
1459
|
+
else {
|
|
1460
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
1461
|
+
this._disableHealthStatusReporting = value.disableHealthStatusReporting;
|
|
1462
|
+
this._duration = value.duration;
|
|
1463
|
+
this._operator = value.operator;
|
|
1464
|
+
this._threshold = value.threshold;
|
|
1465
|
+
this._thresholdDuration = value.thresholdDuration;
|
|
1466
|
+
this._thresholdOccurrences = value.thresholdOccurrences;
|
|
1467
|
+
this._timeFunction = value.timeFunction;
|
|
1468
|
+
this._prediction.internalValue = value.prediction;
|
|
1469
|
+
}
|
|
1470
|
+
}
|
|
1471
|
+
get disableHealthStatusReporting() {
|
|
1472
|
+
return this.getBooleanAttribute('disable_health_status_reporting');
|
|
1473
|
+
}
|
|
1474
|
+
set disableHealthStatusReporting(value) {
|
|
1475
|
+
this._disableHealthStatusReporting = value;
|
|
1476
|
+
}
|
|
1477
|
+
resetDisableHealthStatusReporting() {
|
|
1478
|
+
this._disableHealthStatusReporting = undefined;
|
|
1479
|
+
}
|
|
1480
|
+
// Temporarily expose input value. Use with caution.
|
|
1481
|
+
get disableHealthStatusReportingInput() {
|
|
1482
|
+
return this._disableHealthStatusReporting;
|
|
1483
|
+
}
|
|
1484
|
+
get duration() {
|
|
1485
|
+
return this.getNumberAttribute('duration');
|
|
1486
|
+
}
|
|
1487
|
+
set duration(value) {
|
|
1488
|
+
this._duration = value;
|
|
1489
|
+
}
|
|
1490
|
+
resetDuration() {
|
|
1491
|
+
this._duration = undefined;
|
|
1492
|
+
}
|
|
1493
|
+
// Temporarily expose input value. Use with caution.
|
|
1494
|
+
get durationInput() {
|
|
1495
|
+
return this._duration;
|
|
1496
|
+
}
|
|
1497
|
+
get operator() {
|
|
1498
|
+
return this.getStringAttribute('operator');
|
|
1499
|
+
}
|
|
1500
|
+
set operator(value) {
|
|
1501
|
+
this._operator = value;
|
|
1502
|
+
}
|
|
1503
|
+
resetOperator() {
|
|
1504
|
+
this._operator = undefined;
|
|
1505
|
+
}
|
|
1506
|
+
// Temporarily expose input value. Use with caution.
|
|
1507
|
+
get operatorInput() {
|
|
1508
|
+
return this._operator;
|
|
1509
|
+
}
|
|
1510
|
+
get threshold() {
|
|
1511
|
+
return this.getNumberAttribute('threshold');
|
|
1512
|
+
}
|
|
1513
|
+
set threshold(value) {
|
|
1514
|
+
this._threshold = value;
|
|
1515
|
+
}
|
|
1516
|
+
// Temporarily expose input value. Use with caution.
|
|
1517
|
+
get thresholdInput() {
|
|
1518
|
+
return this._threshold;
|
|
1519
|
+
}
|
|
1520
|
+
get thresholdDuration() {
|
|
1521
|
+
return this.getNumberAttribute('threshold_duration');
|
|
1522
|
+
}
|
|
1523
|
+
set thresholdDuration(value) {
|
|
1524
|
+
this._thresholdDuration = value;
|
|
1525
|
+
}
|
|
1526
|
+
resetThresholdDuration() {
|
|
1527
|
+
this._thresholdDuration = undefined;
|
|
1528
|
+
}
|
|
1529
|
+
// Temporarily expose input value. Use with caution.
|
|
1530
|
+
get thresholdDurationInput() {
|
|
1531
|
+
return this._thresholdDuration;
|
|
1532
|
+
}
|
|
1533
|
+
get thresholdOccurrences() {
|
|
1534
|
+
return this.getStringAttribute('threshold_occurrences');
|
|
1535
|
+
}
|
|
1536
|
+
set thresholdOccurrences(value) {
|
|
1537
|
+
this._thresholdOccurrences = value;
|
|
1538
|
+
}
|
|
1539
|
+
resetThresholdOccurrences() {
|
|
1540
|
+
this._thresholdOccurrences = undefined;
|
|
1541
|
+
}
|
|
1542
|
+
// Temporarily expose input value. Use with caution.
|
|
1543
|
+
get thresholdOccurrencesInput() {
|
|
1544
|
+
return this._thresholdOccurrences;
|
|
1545
|
+
}
|
|
1546
|
+
get timeFunction() {
|
|
1547
|
+
return this.getStringAttribute('time_function');
|
|
1548
|
+
}
|
|
1549
|
+
set timeFunction(value) {
|
|
1550
|
+
this._timeFunction = value;
|
|
1551
|
+
}
|
|
1552
|
+
resetTimeFunction() {
|
|
1553
|
+
this._timeFunction = undefined;
|
|
1554
|
+
}
|
|
1555
|
+
// Temporarily expose input value. Use with caution.
|
|
1556
|
+
get timeFunctionInput() {
|
|
1557
|
+
return this._timeFunction;
|
|
1558
|
+
}
|
|
1559
|
+
get prediction() {
|
|
1560
|
+
return this._prediction;
|
|
1561
|
+
}
|
|
1562
|
+
putPrediction(value) {
|
|
1563
|
+
this._prediction.internalValue = value;
|
|
1564
|
+
}
|
|
1565
|
+
resetPrediction() {
|
|
1566
|
+
this._prediction.internalValue = undefined;
|
|
1567
|
+
}
|
|
1568
|
+
// Temporarily expose input value. Use with caution.
|
|
1569
|
+
get predictionInput() {
|
|
1570
|
+
return this._prediction.internalValue;
|
|
1571
|
+
}
|
|
1572
|
+
}
|
|
1573
|
+
exports.NrqlAlertConditionWarningOutputReference = NrqlAlertConditionWarningOutputReference;
|
|
1574
|
+
_l = JSII_RTTI_SYMBOL_1;
|
|
1575
|
+
NrqlAlertConditionWarningOutputReference[_l] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertConditionWarningOutputReference", version: "14.0.0" };
|
|
1576
|
+
/**
|
|
1577
|
+
* Represents a {@link https://registry.terraform.io/providers/newrelic/newrelic/3.80.2/docs/resources/nrql_alert_condition newrelic_nrql_alert_condition}
|
|
1578
|
+
*/
|
|
1579
|
+
class NrqlAlertCondition extends cdktn.TerraformResource {
|
|
1580
|
+
// ==============
|
|
1581
|
+
// STATIC Methods
|
|
1582
|
+
// ==============
|
|
1583
|
+
/**
|
|
1584
|
+
* Generates CDKTN code for importing a NrqlAlertCondition resource upon running "cdktn plan <stack-name>"
|
|
1585
|
+
* @param scope The scope in which to define this construct
|
|
1586
|
+
* @param importToId The construct id used in the generated config for the NrqlAlertCondition to import
|
|
1587
|
+
* @param importFromId The id of the existing NrqlAlertCondition that should be imported. Refer to the {@link https://registry.terraform.io/providers/newrelic/newrelic/3.80.2/docs/resources/nrql_alert_condition#import import section} in the documentation of this resource for the id to use
|
|
1588
|
+
* @param provider? Optional instance of the provider where the NrqlAlertCondition to import is found
|
|
1589
|
+
*/
|
|
1590
|
+
static generateConfigForImport(scope, importToId, importFromId, provider) {
|
|
1591
|
+
return new cdktn.ImportableResource(scope, importToId, { terraformResourceType: "newrelic_nrql_alert_condition", importId: importFromId, provider });
|
|
1592
|
+
}
|
|
1593
|
+
// ===========
|
|
1594
|
+
// INITIALIZER
|
|
1595
|
+
// ===========
|
|
1596
|
+
/**
|
|
1597
|
+
* Create a new {@link https://registry.terraform.io/providers/newrelic/newrelic/3.80.2/docs/resources/nrql_alert_condition newrelic_nrql_alert_condition} Resource
|
|
1598
|
+
*
|
|
1599
|
+
* @param scope The scope in which to define this construct
|
|
1600
|
+
* @param id The scoped construct ID. Must be unique amongst siblings in the same scope
|
|
1601
|
+
* @param options NrqlAlertConditionConfig
|
|
1602
|
+
*/
|
|
1603
|
+
constructor(scope, id, config) {
|
|
1604
|
+
super(scope, id, {
|
|
1605
|
+
terraformResourceType: 'newrelic_nrql_alert_condition',
|
|
1606
|
+
terraformGeneratorMetadata: {
|
|
1607
|
+
providerName: 'newrelic',
|
|
1608
|
+
providerVersion: '3.80.2',
|
|
1609
|
+
providerVersionConstraint: '~> 3.7'
|
|
1610
|
+
},
|
|
1611
|
+
provider: config.provider,
|
|
1612
|
+
dependsOn: config.dependsOn,
|
|
1613
|
+
count: config.count,
|
|
1614
|
+
lifecycle: config.lifecycle,
|
|
1615
|
+
provisioners: config.provisioners,
|
|
1616
|
+
connection: config.connection,
|
|
1617
|
+
forEach: config.forEach
|
|
1618
|
+
});
|
|
1619
|
+
// critical - computed: false, optional: true, required: false
|
|
1620
|
+
this._critical = new NrqlAlertConditionCriticalOutputReference(this, "critical");
|
|
1621
|
+
// nrql - computed: false, optional: false, required: true
|
|
1622
|
+
this._nrql = new NrqlAlertConditionNrqlOutputReference(this, "nrql");
|
|
1623
|
+
// outlier_configuration - computed: false, optional: true, required: false
|
|
1624
|
+
this._outlierConfiguration = new NrqlAlertConditionOutlierConfigurationOutputReference(this, "outlier_configuration");
|
|
1625
|
+
// term - computed: false, optional: true, required: false
|
|
1626
|
+
this._term = new NrqlAlertConditionTermList(this, "term", true);
|
|
1627
|
+
// timeouts - computed: false, optional: true, required: false
|
|
1628
|
+
this._timeouts = new NrqlAlertConditionTimeoutsOutputReference(this, "timeouts");
|
|
1629
|
+
// warning - computed: false, optional: true, required: false
|
|
1630
|
+
this._warning = new NrqlAlertConditionWarningOutputReference(this, "warning");
|
|
1631
|
+
this._accountId = config.accountId;
|
|
1632
|
+
this._aggregationDelay = config.aggregationDelay;
|
|
1633
|
+
this._aggregationMethod = config.aggregationMethod;
|
|
1634
|
+
this._aggregationTimer = config.aggregationTimer;
|
|
1635
|
+
this._aggregationWindow = config.aggregationWindow;
|
|
1636
|
+
this._baselineDirection = config.baselineDirection;
|
|
1637
|
+
this._closeViolationsOnExpiration = config.closeViolationsOnExpiration;
|
|
1638
|
+
this._description = config.description;
|
|
1639
|
+
this._enabled = config.enabled;
|
|
1640
|
+
this._evaluationDelay = config.evaluationDelay;
|
|
1641
|
+
this._expirationDuration = config.expirationDuration;
|
|
1642
|
+
this._fillOption = config.fillOption;
|
|
1643
|
+
this._fillValue = config.fillValue;
|
|
1644
|
+
this._id = config.id;
|
|
1645
|
+
this._ignoreOnExpectedTermination = config.ignoreOnExpectedTermination;
|
|
1646
|
+
this._name = config.name;
|
|
1647
|
+
this._openViolationOnExpiration = config.openViolationOnExpiration;
|
|
1648
|
+
this._policyId = config.policyId;
|
|
1649
|
+
this._runbookUrl = config.runbookUrl;
|
|
1650
|
+
this._signalSeasonality = config.signalSeasonality;
|
|
1651
|
+
this._slideBy = config.slideBy;
|
|
1652
|
+
this._targetEntity = config.targetEntity;
|
|
1653
|
+
this._titleTemplate = config.titleTemplate;
|
|
1654
|
+
this._type = config.type;
|
|
1655
|
+
this._violationTimeLimit = config.violationTimeLimit;
|
|
1656
|
+
this._violationTimeLimitSeconds = config.violationTimeLimitSeconds;
|
|
1657
|
+
this._critical.internalValue = config.critical;
|
|
1658
|
+
this._nrql.internalValue = config.nrql;
|
|
1659
|
+
this._outlierConfiguration.internalValue = config.outlierConfiguration;
|
|
1660
|
+
this._term.internalValue = config.term;
|
|
1661
|
+
this._timeouts.internalValue = config.timeouts;
|
|
1662
|
+
this._warning.internalValue = config.warning;
|
|
1663
|
+
}
|
|
1664
|
+
get accountId() {
|
|
1665
|
+
return this.getNumberAttribute('account_id');
|
|
1666
|
+
}
|
|
1667
|
+
set accountId(value) {
|
|
1668
|
+
this._accountId = value;
|
|
1669
|
+
}
|
|
1670
|
+
resetAccountId() {
|
|
1671
|
+
this._accountId = undefined;
|
|
1672
|
+
}
|
|
1673
|
+
// Temporarily expose input value. Use with caution.
|
|
1674
|
+
get accountIdInput() {
|
|
1675
|
+
return this._accountId;
|
|
1676
|
+
}
|
|
1677
|
+
get aggregationDelay() {
|
|
1678
|
+
return this.getStringAttribute('aggregation_delay');
|
|
1679
|
+
}
|
|
1680
|
+
set aggregationDelay(value) {
|
|
1681
|
+
this._aggregationDelay = value;
|
|
1682
|
+
}
|
|
1683
|
+
resetAggregationDelay() {
|
|
1684
|
+
this._aggregationDelay = undefined;
|
|
1685
|
+
}
|
|
1686
|
+
// Temporarily expose input value. Use with caution.
|
|
1687
|
+
get aggregationDelayInput() {
|
|
1688
|
+
return this._aggregationDelay;
|
|
1689
|
+
}
|
|
1690
|
+
get aggregationMethod() {
|
|
1691
|
+
return this.getStringAttribute('aggregation_method');
|
|
1692
|
+
}
|
|
1693
|
+
set aggregationMethod(value) {
|
|
1694
|
+
this._aggregationMethod = value;
|
|
1695
|
+
}
|
|
1696
|
+
resetAggregationMethod() {
|
|
1697
|
+
this._aggregationMethod = undefined;
|
|
1698
|
+
}
|
|
1699
|
+
// Temporarily expose input value. Use with caution.
|
|
1700
|
+
get aggregationMethodInput() {
|
|
1701
|
+
return this._aggregationMethod;
|
|
1702
|
+
}
|
|
1703
|
+
get aggregationTimer() {
|
|
1704
|
+
return this.getStringAttribute('aggregation_timer');
|
|
1705
|
+
}
|
|
1706
|
+
set aggregationTimer(value) {
|
|
1707
|
+
this._aggregationTimer = value;
|
|
1708
|
+
}
|
|
1709
|
+
resetAggregationTimer() {
|
|
1710
|
+
this._aggregationTimer = undefined;
|
|
1711
|
+
}
|
|
1712
|
+
// Temporarily expose input value. Use with caution.
|
|
1713
|
+
get aggregationTimerInput() {
|
|
1714
|
+
return this._aggregationTimer;
|
|
1715
|
+
}
|
|
1716
|
+
get aggregationWindow() {
|
|
1717
|
+
return this.getNumberAttribute('aggregation_window');
|
|
1718
|
+
}
|
|
1719
|
+
set aggregationWindow(value) {
|
|
1720
|
+
this._aggregationWindow = value;
|
|
1721
|
+
}
|
|
1722
|
+
resetAggregationWindow() {
|
|
1723
|
+
this._aggregationWindow = undefined;
|
|
1724
|
+
}
|
|
1725
|
+
// Temporarily expose input value. Use with caution.
|
|
1726
|
+
get aggregationWindowInput() {
|
|
1727
|
+
return this._aggregationWindow;
|
|
1728
|
+
}
|
|
1729
|
+
get baselineDirection() {
|
|
1730
|
+
return this.getStringAttribute('baseline_direction');
|
|
1731
|
+
}
|
|
1732
|
+
set baselineDirection(value) {
|
|
1733
|
+
this._baselineDirection = value;
|
|
1734
|
+
}
|
|
1735
|
+
resetBaselineDirection() {
|
|
1736
|
+
this._baselineDirection = undefined;
|
|
1737
|
+
}
|
|
1738
|
+
// Temporarily expose input value. Use with caution.
|
|
1739
|
+
get baselineDirectionInput() {
|
|
1740
|
+
return this._baselineDirection;
|
|
1741
|
+
}
|
|
1742
|
+
get closeViolationsOnExpiration() {
|
|
1743
|
+
return this.getBooleanAttribute('close_violations_on_expiration');
|
|
1744
|
+
}
|
|
1745
|
+
set closeViolationsOnExpiration(value) {
|
|
1746
|
+
this._closeViolationsOnExpiration = value;
|
|
1747
|
+
}
|
|
1748
|
+
resetCloseViolationsOnExpiration() {
|
|
1749
|
+
this._closeViolationsOnExpiration = undefined;
|
|
1750
|
+
}
|
|
1751
|
+
// Temporarily expose input value. Use with caution.
|
|
1752
|
+
get closeViolationsOnExpirationInput() {
|
|
1753
|
+
return this._closeViolationsOnExpiration;
|
|
1754
|
+
}
|
|
1755
|
+
get description() {
|
|
1756
|
+
return this.getStringAttribute('description');
|
|
1757
|
+
}
|
|
1758
|
+
set description(value) {
|
|
1759
|
+
this._description = value;
|
|
1760
|
+
}
|
|
1761
|
+
resetDescription() {
|
|
1762
|
+
this._description = undefined;
|
|
1763
|
+
}
|
|
1764
|
+
// Temporarily expose input value. Use with caution.
|
|
1765
|
+
get descriptionInput() {
|
|
1766
|
+
return this._description;
|
|
1767
|
+
}
|
|
1768
|
+
get enabled() {
|
|
1769
|
+
return this.getBooleanAttribute('enabled');
|
|
1770
|
+
}
|
|
1771
|
+
set enabled(value) {
|
|
1772
|
+
this._enabled = value;
|
|
1773
|
+
}
|
|
1774
|
+
resetEnabled() {
|
|
1775
|
+
this._enabled = undefined;
|
|
1776
|
+
}
|
|
1777
|
+
// Temporarily expose input value. Use with caution.
|
|
1778
|
+
get enabledInput() {
|
|
1779
|
+
return this._enabled;
|
|
1780
|
+
}
|
|
1781
|
+
// entity_guid - computed: true, optional: false, required: false
|
|
1782
|
+
get entityGuid() {
|
|
1783
|
+
return this.getStringAttribute('entity_guid');
|
|
1784
|
+
}
|
|
1785
|
+
get evaluationDelay() {
|
|
1786
|
+
return this.getNumberAttribute('evaluation_delay');
|
|
1787
|
+
}
|
|
1788
|
+
set evaluationDelay(value) {
|
|
1789
|
+
this._evaluationDelay = value;
|
|
1790
|
+
}
|
|
1791
|
+
resetEvaluationDelay() {
|
|
1792
|
+
this._evaluationDelay = undefined;
|
|
1793
|
+
}
|
|
1794
|
+
// Temporarily expose input value. Use with caution.
|
|
1795
|
+
get evaluationDelayInput() {
|
|
1796
|
+
return this._evaluationDelay;
|
|
1797
|
+
}
|
|
1798
|
+
get expirationDuration() {
|
|
1799
|
+
return this.getNumberAttribute('expiration_duration');
|
|
1800
|
+
}
|
|
1801
|
+
set expirationDuration(value) {
|
|
1802
|
+
this._expirationDuration = value;
|
|
1803
|
+
}
|
|
1804
|
+
resetExpirationDuration() {
|
|
1805
|
+
this._expirationDuration = undefined;
|
|
1806
|
+
}
|
|
1807
|
+
// Temporarily expose input value. Use with caution.
|
|
1808
|
+
get expirationDurationInput() {
|
|
1809
|
+
return this._expirationDuration;
|
|
1810
|
+
}
|
|
1811
|
+
get fillOption() {
|
|
1812
|
+
return this.getStringAttribute('fill_option');
|
|
1813
|
+
}
|
|
1814
|
+
set fillOption(value) {
|
|
1815
|
+
this._fillOption = value;
|
|
1816
|
+
}
|
|
1817
|
+
resetFillOption() {
|
|
1818
|
+
this._fillOption = undefined;
|
|
1819
|
+
}
|
|
1820
|
+
// Temporarily expose input value. Use with caution.
|
|
1821
|
+
get fillOptionInput() {
|
|
1822
|
+
return this._fillOption;
|
|
1823
|
+
}
|
|
1824
|
+
get fillValue() {
|
|
1825
|
+
return this.getNumberAttribute('fill_value');
|
|
1826
|
+
}
|
|
1827
|
+
set fillValue(value) {
|
|
1828
|
+
this._fillValue = value;
|
|
1829
|
+
}
|
|
1830
|
+
resetFillValue() {
|
|
1831
|
+
this._fillValue = undefined;
|
|
1832
|
+
}
|
|
1833
|
+
// Temporarily expose input value. Use with caution.
|
|
1834
|
+
get fillValueInput() {
|
|
1835
|
+
return this._fillValue;
|
|
1836
|
+
}
|
|
1837
|
+
get id() {
|
|
1838
|
+
return this.getStringAttribute('id');
|
|
1839
|
+
}
|
|
1840
|
+
set id(value) {
|
|
1841
|
+
this._id = value;
|
|
1842
|
+
}
|
|
1843
|
+
resetId() {
|
|
1844
|
+
this._id = undefined;
|
|
1845
|
+
}
|
|
1846
|
+
// Temporarily expose input value. Use with caution.
|
|
1847
|
+
get idInput() {
|
|
1848
|
+
return this._id;
|
|
1849
|
+
}
|
|
1850
|
+
get ignoreOnExpectedTermination() {
|
|
1851
|
+
return this.getBooleanAttribute('ignore_on_expected_termination');
|
|
1852
|
+
}
|
|
1853
|
+
set ignoreOnExpectedTermination(value) {
|
|
1854
|
+
this._ignoreOnExpectedTermination = value;
|
|
1855
|
+
}
|
|
1856
|
+
resetIgnoreOnExpectedTermination() {
|
|
1857
|
+
this._ignoreOnExpectedTermination = undefined;
|
|
1858
|
+
}
|
|
1859
|
+
// Temporarily expose input value. Use with caution.
|
|
1860
|
+
get ignoreOnExpectedTerminationInput() {
|
|
1861
|
+
return this._ignoreOnExpectedTermination;
|
|
1862
|
+
}
|
|
1863
|
+
get name() {
|
|
1864
|
+
return this.getStringAttribute('name');
|
|
1865
|
+
}
|
|
1866
|
+
set name(value) {
|
|
1867
|
+
this._name = value;
|
|
1868
|
+
}
|
|
1869
|
+
// Temporarily expose input value. Use with caution.
|
|
1870
|
+
get nameInput() {
|
|
1871
|
+
return this._name;
|
|
1872
|
+
}
|
|
1873
|
+
get openViolationOnExpiration() {
|
|
1874
|
+
return this.getBooleanAttribute('open_violation_on_expiration');
|
|
1875
|
+
}
|
|
1876
|
+
set openViolationOnExpiration(value) {
|
|
1877
|
+
this._openViolationOnExpiration = value;
|
|
1878
|
+
}
|
|
1879
|
+
resetOpenViolationOnExpiration() {
|
|
1880
|
+
this._openViolationOnExpiration = undefined;
|
|
1881
|
+
}
|
|
1882
|
+
// Temporarily expose input value. Use with caution.
|
|
1883
|
+
get openViolationOnExpirationInput() {
|
|
1884
|
+
return this._openViolationOnExpiration;
|
|
1885
|
+
}
|
|
1886
|
+
get policyId() {
|
|
1887
|
+
return this.getNumberAttribute('policy_id');
|
|
1888
|
+
}
|
|
1889
|
+
set policyId(value) {
|
|
1890
|
+
this._policyId = value;
|
|
1891
|
+
}
|
|
1892
|
+
// Temporarily expose input value. Use with caution.
|
|
1893
|
+
get policyIdInput() {
|
|
1894
|
+
return this._policyId;
|
|
1895
|
+
}
|
|
1896
|
+
get runbookUrl() {
|
|
1897
|
+
return this.getStringAttribute('runbook_url');
|
|
1898
|
+
}
|
|
1899
|
+
set runbookUrl(value) {
|
|
1900
|
+
this._runbookUrl = value;
|
|
1901
|
+
}
|
|
1902
|
+
resetRunbookUrl() {
|
|
1903
|
+
this._runbookUrl = undefined;
|
|
1904
|
+
}
|
|
1905
|
+
// Temporarily expose input value. Use with caution.
|
|
1906
|
+
get runbookUrlInput() {
|
|
1907
|
+
return this._runbookUrl;
|
|
1908
|
+
}
|
|
1909
|
+
get signalSeasonality() {
|
|
1910
|
+
return this.getStringAttribute('signal_seasonality');
|
|
1911
|
+
}
|
|
1912
|
+
set signalSeasonality(value) {
|
|
1913
|
+
this._signalSeasonality = value;
|
|
1914
|
+
}
|
|
1915
|
+
resetSignalSeasonality() {
|
|
1916
|
+
this._signalSeasonality = undefined;
|
|
1917
|
+
}
|
|
1918
|
+
// Temporarily expose input value. Use with caution.
|
|
1919
|
+
get signalSeasonalityInput() {
|
|
1920
|
+
return this._signalSeasonality;
|
|
1921
|
+
}
|
|
1922
|
+
get slideBy() {
|
|
1923
|
+
return this.getNumberAttribute('slide_by');
|
|
1924
|
+
}
|
|
1925
|
+
set slideBy(value) {
|
|
1926
|
+
this._slideBy = value;
|
|
1927
|
+
}
|
|
1928
|
+
resetSlideBy() {
|
|
1929
|
+
this._slideBy = undefined;
|
|
1930
|
+
}
|
|
1931
|
+
// Temporarily expose input value. Use with caution.
|
|
1932
|
+
get slideByInput() {
|
|
1933
|
+
return this._slideBy;
|
|
1934
|
+
}
|
|
1935
|
+
get targetEntity() {
|
|
1936
|
+
return this.getStringAttribute('target_entity');
|
|
1937
|
+
}
|
|
1938
|
+
set targetEntity(value) {
|
|
1939
|
+
this._targetEntity = value;
|
|
1940
|
+
}
|
|
1941
|
+
resetTargetEntity() {
|
|
1942
|
+
this._targetEntity = undefined;
|
|
1943
|
+
}
|
|
1944
|
+
// Temporarily expose input value. Use with caution.
|
|
1945
|
+
get targetEntityInput() {
|
|
1946
|
+
return this._targetEntity;
|
|
1947
|
+
}
|
|
1948
|
+
get titleTemplate() {
|
|
1949
|
+
return this.getStringAttribute('title_template');
|
|
1950
|
+
}
|
|
1951
|
+
set titleTemplate(value) {
|
|
1952
|
+
this._titleTemplate = value;
|
|
1953
|
+
}
|
|
1954
|
+
resetTitleTemplate() {
|
|
1955
|
+
this._titleTemplate = undefined;
|
|
1956
|
+
}
|
|
1957
|
+
// Temporarily expose input value. Use with caution.
|
|
1958
|
+
get titleTemplateInput() {
|
|
1959
|
+
return this._titleTemplate;
|
|
1960
|
+
}
|
|
1961
|
+
get type() {
|
|
1962
|
+
return this.getStringAttribute('type');
|
|
1963
|
+
}
|
|
1964
|
+
set type(value) {
|
|
1965
|
+
this._type = value;
|
|
1966
|
+
}
|
|
1967
|
+
resetType() {
|
|
1968
|
+
this._type = undefined;
|
|
1969
|
+
}
|
|
1970
|
+
// Temporarily expose input value. Use with caution.
|
|
1971
|
+
get typeInput() {
|
|
1972
|
+
return this._type;
|
|
1973
|
+
}
|
|
1974
|
+
get violationTimeLimit() {
|
|
1975
|
+
return this.getStringAttribute('violation_time_limit');
|
|
1976
|
+
}
|
|
1977
|
+
set violationTimeLimit(value) {
|
|
1978
|
+
this._violationTimeLimit = value;
|
|
1979
|
+
}
|
|
1980
|
+
resetViolationTimeLimit() {
|
|
1981
|
+
this._violationTimeLimit = undefined;
|
|
1982
|
+
}
|
|
1983
|
+
// Temporarily expose input value. Use with caution.
|
|
1984
|
+
get violationTimeLimitInput() {
|
|
1985
|
+
return this._violationTimeLimit;
|
|
1986
|
+
}
|
|
1987
|
+
get violationTimeLimitSeconds() {
|
|
1988
|
+
return this.getNumberAttribute('violation_time_limit_seconds');
|
|
1989
|
+
}
|
|
1990
|
+
set violationTimeLimitSeconds(value) {
|
|
1991
|
+
this._violationTimeLimitSeconds = value;
|
|
1992
|
+
}
|
|
1993
|
+
resetViolationTimeLimitSeconds() {
|
|
1994
|
+
this._violationTimeLimitSeconds = undefined;
|
|
1995
|
+
}
|
|
1996
|
+
// Temporarily expose input value. Use with caution.
|
|
1997
|
+
get violationTimeLimitSecondsInput() {
|
|
1998
|
+
return this._violationTimeLimitSeconds;
|
|
1999
|
+
}
|
|
2000
|
+
get critical() {
|
|
2001
|
+
return this._critical;
|
|
2002
|
+
}
|
|
2003
|
+
putCritical(value) {
|
|
2004
|
+
this._critical.internalValue = value;
|
|
2005
|
+
}
|
|
2006
|
+
resetCritical() {
|
|
2007
|
+
this._critical.internalValue = undefined;
|
|
2008
|
+
}
|
|
2009
|
+
// Temporarily expose input value. Use with caution.
|
|
2010
|
+
get criticalInput() {
|
|
2011
|
+
return this._critical.internalValue;
|
|
2012
|
+
}
|
|
2013
|
+
get nrql() {
|
|
2014
|
+
return this._nrql;
|
|
2015
|
+
}
|
|
2016
|
+
putNrql(value) {
|
|
2017
|
+
this._nrql.internalValue = value;
|
|
2018
|
+
}
|
|
2019
|
+
// Temporarily expose input value. Use with caution.
|
|
2020
|
+
get nrqlInput() {
|
|
2021
|
+
return this._nrql.internalValue;
|
|
2022
|
+
}
|
|
2023
|
+
get outlierConfiguration() {
|
|
2024
|
+
return this._outlierConfiguration;
|
|
2025
|
+
}
|
|
2026
|
+
putOutlierConfiguration(value) {
|
|
2027
|
+
this._outlierConfiguration.internalValue = value;
|
|
2028
|
+
}
|
|
2029
|
+
resetOutlierConfiguration() {
|
|
2030
|
+
this._outlierConfiguration.internalValue = undefined;
|
|
2031
|
+
}
|
|
2032
|
+
// Temporarily expose input value. Use with caution.
|
|
2033
|
+
get outlierConfigurationInput() {
|
|
2034
|
+
return this._outlierConfiguration.internalValue;
|
|
2035
|
+
}
|
|
2036
|
+
get term() {
|
|
2037
|
+
return this._term;
|
|
2038
|
+
}
|
|
2039
|
+
putTerm(value) {
|
|
2040
|
+
this._term.internalValue = value;
|
|
2041
|
+
}
|
|
2042
|
+
resetTerm() {
|
|
2043
|
+
this._term.internalValue = undefined;
|
|
2044
|
+
}
|
|
2045
|
+
// Temporarily expose input value. Use with caution.
|
|
2046
|
+
get termInput() {
|
|
2047
|
+
return this._term.internalValue;
|
|
2048
|
+
}
|
|
2049
|
+
get timeouts() {
|
|
2050
|
+
return this._timeouts;
|
|
2051
|
+
}
|
|
2052
|
+
putTimeouts(value) {
|
|
2053
|
+
this._timeouts.internalValue = value;
|
|
2054
|
+
}
|
|
2055
|
+
resetTimeouts() {
|
|
2056
|
+
this._timeouts.internalValue = undefined;
|
|
2057
|
+
}
|
|
2058
|
+
// Temporarily expose input value. Use with caution.
|
|
2059
|
+
get timeoutsInput() {
|
|
2060
|
+
return this._timeouts.internalValue;
|
|
2061
|
+
}
|
|
2062
|
+
get warning() {
|
|
2063
|
+
return this._warning;
|
|
2064
|
+
}
|
|
2065
|
+
putWarning(value) {
|
|
2066
|
+
this._warning.internalValue = value;
|
|
2067
|
+
}
|
|
2068
|
+
resetWarning() {
|
|
2069
|
+
this._warning.internalValue = undefined;
|
|
2070
|
+
}
|
|
2071
|
+
// Temporarily expose input value. Use with caution.
|
|
2072
|
+
get warningInput() {
|
|
2073
|
+
return this._warning.internalValue;
|
|
2074
|
+
}
|
|
2075
|
+
// =========
|
|
2076
|
+
// SYNTHESIS
|
|
2077
|
+
// =========
|
|
2078
|
+
synthesizeAttributes() {
|
|
2079
|
+
return {
|
|
2080
|
+
account_id: cdktn.numberToTerraform(this._accountId),
|
|
2081
|
+
aggregation_delay: cdktn.stringToTerraform(this._aggregationDelay),
|
|
2082
|
+
aggregation_method: cdktn.stringToTerraform(this._aggregationMethod),
|
|
2083
|
+
aggregation_timer: cdktn.stringToTerraform(this._aggregationTimer),
|
|
2084
|
+
aggregation_window: cdktn.numberToTerraform(this._aggregationWindow),
|
|
2085
|
+
baseline_direction: cdktn.stringToTerraform(this._baselineDirection),
|
|
2086
|
+
close_violations_on_expiration: cdktn.booleanToTerraform(this._closeViolationsOnExpiration),
|
|
2087
|
+
description: cdktn.stringToTerraform(this._description),
|
|
2088
|
+
enabled: cdktn.booleanToTerraform(this._enabled),
|
|
2089
|
+
evaluation_delay: cdktn.numberToTerraform(this._evaluationDelay),
|
|
2090
|
+
expiration_duration: cdktn.numberToTerraform(this._expirationDuration),
|
|
2091
|
+
fill_option: cdktn.stringToTerraform(this._fillOption),
|
|
2092
|
+
fill_value: cdktn.numberToTerraform(this._fillValue),
|
|
2093
|
+
id: cdktn.stringToTerraform(this._id),
|
|
2094
|
+
ignore_on_expected_termination: cdktn.booleanToTerraform(this._ignoreOnExpectedTermination),
|
|
2095
|
+
name: cdktn.stringToTerraform(this._name),
|
|
2096
|
+
open_violation_on_expiration: cdktn.booleanToTerraform(this._openViolationOnExpiration),
|
|
2097
|
+
policy_id: cdktn.numberToTerraform(this._policyId),
|
|
2098
|
+
runbook_url: cdktn.stringToTerraform(this._runbookUrl),
|
|
2099
|
+
signal_seasonality: cdktn.stringToTerraform(this._signalSeasonality),
|
|
2100
|
+
slide_by: cdktn.numberToTerraform(this._slideBy),
|
|
2101
|
+
target_entity: cdktn.stringToTerraform(this._targetEntity),
|
|
2102
|
+
title_template: cdktn.stringToTerraform(this._titleTemplate),
|
|
2103
|
+
type: cdktn.stringToTerraform(this._type),
|
|
2104
|
+
violation_time_limit: cdktn.stringToTerraform(this._violationTimeLimit),
|
|
2105
|
+
violation_time_limit_seconds: cdktn.numberToTerraform(this._violationTimeLimitSeconds),
|
|
2106
|
+
critical: nrqlAlertConditionCriticalToTerraform(this._critical.internalValue),
|
|
2107
|
+
nrql: nrqlAlertConditionNrqlToTerraform(this._nrql.internalValue),
|
|
2108
|
+
outlier_configuration: nrqlAlertConditionOutlierConfigurationToTerraform(this._outlierConfiguration.internalValue),
|
|
2109
|
+
term: cdktn.listMapper(nrqlAlertConditionTermToTerraform, true)(this._term.internalValue),
|
|
2110
|
+
timeouts: nrqlAlertConditionTimeoutsToTerraform(this._timeouts.internalValue),
|
|
2111
|
+
warning: nrqlAlertConditionWarningToTerraform(this._warning.internalValue),
|
|
2112
|
+
};
|
|
2113
|
+
}
|
|
2114
|
+
synthesizeHclAttributes() {
|
|
2115
|
+
const attrs = {
|
|
2116
|
+
account_id: {
|
|
2117
|
+
value: cdktn.numberToHclTerraform(this._accountId),
|
|
2118
|
+
isBlock: false,
|
|
2119
|
+
type: "simple",
|
|
2120
|
+
storageClassType: "number",
|
|
2121
|
+
},
|
|
2122
|
+
aggregation_delay: {
|
|
2123
|
+
value: cdktn.stringToHclTerraform(this._aggregationDelay),
|
|
2124
|
+
isBlock: false,
|
|
2125
|
+
type: "simple",
|
|
2126
|
+
storageClassType: "string",
|
|
2127
|
+
},
|
|
2128
|
+
aggregation_method: {
|
|
2129
|
+
value: cdktn.stringToHclTerraform(this._aggregationMethod),
|
|
2130
|
+
isBlock: false,
|
|
2131
|
+
type: "simple",
|
|
2132
|
+
storageClassType: "string",
|
|
2133
|
+
},
|
|
2134
|
+
aggregation_timer: {
|
|
2135
|
+
value: cdktn.stringToHclTerraform(this._aggregationTimer),
|
|
2136
|
+
isBlock: false,
|
|
2137
|
+
type: "simple",
|
|
2138
|
+
storageClassType: "string",
|
|
2139
|
+
},
|
|
2140
|
+
aggregation_window: {
|
|
2141
|
+
value: cdktn.numberToHclTerraform(this._aggregationWindow),
|
|
2142
|
+
isBlock: false,
|
|
2143
|
+
type: "simple",
|
|
2144
|
+
storageClassType: "number",
|
|
2145
|
+
},
|
|
2146
|
+
baseline_direction: {
|
|
2147
|
+
value: cdktn.stringToHclTerraform(this._baselineDirection),
|
|
2148
|
+
isBlock: false,
|
|
2149
|
+
type: "simple",
|
|
2150
|
+
storageClassType: "string",
|
|
2151
|
+
},
|
|
2152
|
+
close_violations_on_expiration: {
|
|
2153
|
+
value: cdktn.booleanToHclTerraform(this._closeViolationsOnExpiration),
|
|
2154
|
+
isBlock: false,
|
|
2155
|
+
type: "simple",
|
|
2156
|
+
storageClassType: "boolean",
|
|
2157
|
+
},
|
|
2158
|
+
description: {
|
|
2159
|
+
value: cdktn.stringToHclTerraform(this._description),
|
|
2160
|
+
isBlock: false,
|
|
2161
|
+
type: "simple",
|
|
2162
|
+
storageClassType: "string",
|
|
2163
|
+
},
|
|
2164
|
+
enabled: {
|
|
2165
|
+
value: cdktn.booleanToHclTerraform(this._enabled),
|
|
2166
|
+
isBlock: false,
|
|
2167
|
+
type: "simple",
|
|
2168
|
+
storageClassType: "boolean",
|
|
2169
|
+
},
|
|
2170
|
+
evaluation_delay: {
|
|
2171
|
+
value: cdktn.numberToHclTerraform(this._evaluationDelay),
|
|
2172
|
+
isBlock: false,
|
|
2173
|
+
type: "simple",
|
|
2174
|
+
storageClassType: "number",
|
|
2175
|
+
},
|
|
2176
|
+
expiration_duration: {
|
|
2177
|
+
value: cdktn.numberToHclTerraform(this._expirationDuration),
|
|
2178
|
+
isBlock: false,
|
|
2179
|
+
type: "simple",
|
|
2180
|
+
storageClassType: "number",
|
|
2181
|
+
},
|
|
2182
|
+
fill_option: {
|
|
2183
|
+
value: cdktn.stringToHclTerraform(this._fillOption),
|
|
2184
|
+
isBlock: false,
|
|
2185
|
+
type: "simple",
|
|
2186
|
+
storageClassType: "string",
|
|
2187
|
+
},
|
|
2188
|
+
fill_value: {
|
|
2189
|
+
value: cdktn.numberToHclTerraform(this._fillValue),
|
|
2190
|
+
isBlock: false,
|
|
2191
|
+
type: "simple",
|
|
2192
|
+
storageClassType: "number",
|
|
2193
|
+
},
|
|
2194
|
+
id: {
|
|
2195
|
+
value: cdktn.stringToHclTerraform(this._id),
|
|
2196
|
+
isBlock: false,
|
|
2197
|
+
type: "simple",
|
|
2198
|
+
storageClassType: "string",
|
|
2199
|
+
},
|
|
2200
|
+
ignore_on_expected_termination: {
|
|
2201
|
+
value: cdktn.booleanToHclTerraform(this._ignoreOnExpectedTermination),
|
|
2202
|
+
isBlock: false,
|
|
2203
|
+
type: "simple",
|
|
2204
|
+
storageClassType: "boolean",
|
|
2205
|
+
},
|
|
2206
|
+
name: {
|
|
2207
|
+
value: cdktn.stringToHclTerraform(this._name),
|
|
2208
|
+
isBlock: false,
|
|
2209
|
+
type: "simple",
|
|
2210
|
+
storageClassType: "string",
|
|
2211
|
+
},
|
|
2212
|
+
open_violation_on_expiration: {
|
|
2213
|
+
value: cdktn.booleanToHclTerraform(this._openViolationOnExpiration),
|
|
2214
|
+
isBlock: false,
|
|
2215
|
+
type: "simple",
|
|
2216
|
+
storageClassType: "boolean",
|
|
2217
|
+
},
|
|
2218
|
+
policy_id: {
|
|
2219
|
+
value: cdktn.numberToHclTerraform(this._policyId),
|
|
2220
|
+
isBlock: false,
|
|
2221
|
+
type: "simple",
|
|
2222
|
+
storageClassType: "number",
|
|
2223
|
+
},
|
|
2224
|
+
runbook_url: {
|
|
2225
|
+
value: cdktn.stringToHclTerraform(this._runbookUrl),
|
|
2226
|
+
isBlock: false,
|
|
2227
|
+
type: "simple",
|
|
2228
|
+
storageClassType: "string",
|
|
2229
|
+
},
|
|
2230
|
+
signal_seasonality: {
|
|
2231
|
+
value: cdktn.stringToHclTerraform(this._signalSeasonality),
|
|
2232
|
+
isBlock: false,
|
|
2233
|
+
type: "simple",
|
|
2234
|
+
storageClassType: "string",
|
|
2235
|
+
},
|
|
2236
|
+
slide_by: {
|
|
2237
|
+
value: cdktn.numberToHclTerraform(this._slideBy),
|
|
2238
|
+
isBlock: false,
|
|
2239
|
+
type: "simple",
|
|
2240
|
+
storageClassType: "number",
|
|
2241
|
+
},
|
|
2242
|
+
target_entity: {
|
|
2243
|
+
value: cdktn.stringToHclTerraform(this._targetEntity),
|
|
2244
|
+
isBlock: false,
|
|
2245
|
+
type: "simple",
|
|
2246
|
+
storageClassType: "string",
|
|
2247
|
+
},
|
|
2248
|
+
title_template: {
|
|
2249
|
+
value: cdktn.stringToHclTerraform(this._titleTemplate),
|
|
2250
|
+
isBlock: false,
|
|
2251
|
+
type: "simple",
|
|
2252
|
+
storageClassType: "string",
|
|
2253
|
+
},
|
|
2254
|
+
type: {
|
|
2255
|
+
value: cdktn.stringToHclTerraform(this._type),
|
|
2256
|
+
isBlock: false,
|
|
2257
|
+
type: "simple",
|
|
2258
|
+
storageClassType: "string",
|
|
2259
|
+
},
|
|
2260
|
+
violation_time_limit: {
|
|
2261
|
+
value: cdktn.stringToHclTerraform(this._violationTimeLimit),
|
|
2262
|
+
isBlock: false,
|
|
2263
|
+
type: "simple",
|
|
2264
|
+
storageClassType: "string",
|
|
2265
|
+
},
|
|
2266
|
+
violation_time_limit_seconds: {
|
|
2267
|
+
value: cdktn.numberToHclTerraform(this._violationTimeLimitSeconds),
|
|
2268
|
+
isBlock: false,
|
|
2269
|
+
type: "simple",
|
|
2270
|
+
storageClassType: "number",
|
|
2271
|
+
},
|
|
2272
|
+
critical: {
|
|
2273
|
+
value: nrqlAlertConditionCriticalToHclTerraform(this._critical.internalValue),
|
|
2274
|
+
isBlock: true,
|
|
2275
|
+
type: "list",
|
|
2276
|
+
storageClassType: "NrqlAlertConditionCriticalList",
|
|
2277
|
+
},
|
|
2278
|
+
nrql: {
|
|
2279
|
+
value: nrqlAlertConditionNrqlToHclTerraform(this._nrql.internalValue),
|
|
2280
|
+
isBlock: true,
|
|
2281
|
+
type: "list",
|
|
2282
|
+
storageClassType: "NrqlAlertConditionNrqlList",
|
|
2283
|
+
},
|
|
2284
|
+
outlier_configuration: {
|
|
2285
|
+
value: nrqlAlertConditionOutlierConfigurationToHclTerraform(this._outlierConfiguration.internalValue),
|
|
2286
|
+
isBlock: true,
|
|
2287
|
+
type: "list",
|
|
2288
|
+
storageClassType: "NrqlAlertConditionOutlierConfigurationList",
|
|
2289
|
+
},
|
|
2290
|
+
term: {
|
|
2291
|
+
value: cdktn.listMapperHcl(nrqlAlertConditionTermToHclTerraform, true)(this._term.internalValue),
|
|
2292
|
+
isBlock: true,
|
|
2293
|
+
type: "set",
|
|
2294
|
+
storageClassType: "NrqlAlertConditionTermList",
|
|
2295
|
+
},
|
|
2296
|
+
timeouts: {
|
|
2297
|
+
value: nrqlAlertConditionTimeoutsToHclTerraform(this._timeouts.internalValue),
|
|
2298
|
+
isBlock: true,
|
|
2299
|
+
type: "struct",
|
|
2300
|
+
storageClassType: "NrqlAlertConditionTimeouts",
|
|
2301
|
+
},
|
|
2302
|
+
warning: {
|
|
2303
|
+
value: nrqlAlertConditionWarningToHclTerraform(this._warning.internalValue),
|
|
2304
|
+
isBlock: true,
|
|
2305
|
+
type: "list",
|
|
2306
|
+
storageClassType: "NrqlAlertConditionWarningList",
|
|
2307
|
+
},
|
|
2308
|
+
};
|
|
2309
|
+
// remove undefined attributes
|
|
2310
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
2311
|
+
}
|
|
2312
|
+
}
|
|
2313
|
+
exports.NrqlAlertCondition = NrqlAlertCondition;
|
|
2314
|
+
_m = JSII_RTTI_SYMBOL_1;
|
|
2315
|
+
NrqlAlertCondition[_m] = { fqn: "@cdktn/provider-newrelic.nrqlAlertCondition.NrqlAlertCondition", version: "14.0.0" };
|
|
2316
|
+
// =================
|
|
2317
|
+
// STATIC PROPERTIES
|
|
2318
|
+
// =================
|
|
2319
|
+
NrqlAlertCondition.tfResourceType = "newrelic_nrql_alert_condition";
|
|
2320
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbnJxbC1hbGVydC1jb25kaXRpb24vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQStOQSwwR0FTQztBQUdELGdIQXNCQztBQTJIRCxzRkFlQztBQUdELDRGQTBEQztBQWtPRCw4RUFXQztBQUdELG9GQWtDQztBQXNJRCwwSEFVQztBQUdELGdJQTRCQztBQWlHRCw4R0FRQztBQUdELG9IQWdCQztBQThERCxrR0FTQztBQUdELHdHQXNCQztBQWlJRCw4RUFnQkM7QUFHRCxvRkFnRUM7QUFzUUQsc0ZBUUM7QUFHRCw0RkFnQkM7QUEyRUQsd0dBU0M7QUFHRCw4R0FzQkM7QUEySEQsb0ZBZUM7QUFHRCwwRkEwREM7O0FBcjRERCwrQkFBK0I7QUFzTi9CLFNBQWdCLCtDQUErQyxDQUFDLE1BQW1HO0lBQ2pLLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE9BQU87UUFDTCxVQUFVLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxTQUFTLENBQUM7UUFDdEQsMkJBQTJCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU8sQ0FBQyx5QkFBeUIsQ0FBQztLQUN6RixDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLGtEQUFrRCxDQUFDLE1BQW1HO0lBQ3BLLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENB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SUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLG9DQUFvQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO2dCQUNoRyxPQUFPLEVBQUUsSUFBSTtnQkFDYixJQUFJLEVBQUUsS0FBSztnQkFDWCxnQkFBZ0IsRUFBRSw0QkFBNEI7YUFDL0M7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLHdDQUF3QyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO2dCQUM3RSxPQUFPLEVBQUUsSUFBSTtnQkFDYixJQUFJLEVBQUUsUUFBUTtnQkFDZCxnQkFBZ0IsRUFBRSw0QkFBNEI7YUFDL0M7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsS0FBSyxFQUFFLHVDQUF1QyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO2dCQUMzRSxPQUFPLEVBQUUsSUFBSTtnQkFDYixJQUFJLEVBQUUsTUFBTTtnQkFDWixnQkFBZ0IsRUFBRSwrQkFBK0I7YUFDbEQ7U0FDRixDQUFDO1FBRUYsOEJBQThCO1FBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFFLENBQUMsQ0FBQTtJQUM1SCxDQUFDOztBQWowQkgsZ0RBazBCQzs7O0FBaDBCQyxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNHLGlDQUFjLEdBQUcsK0JBQStCLEFBQWxDLENBQW1DIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMjEsIDIwMjZcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuLy8gaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvblxuLy8gZ2VuZXJhdGVkIGZyb20gdGVycmFmb3JtIHJlc291cmNlIHNjaGVtYVxuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGNka3RuIGZyb20gJ2Nka3RuJztcblxuLy8gQ29uZmlndXJhdGlvblxuXG5leHBvcnQgaW50ZXJmYWNlIE5ycWxBbGVydENvbmRpdGlvbkNvbmZpZyBleHRlbmRzIGNka3RuLlRlcnJhZm9ybU1ldGFBcmd1bWVudHMge1xuICAvKipcbiAgKiBUaGUgTmV3IFJlbGljIGFjY291bnQgSUQgZm9yIG1hbmFnaW5nIHlvdXIgTlJRTCBhbGVydCBjb25kaXRpb25zLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2FjY291bnRfaWQgTnJxbEFsZXJ0Q29uZGl0aW9uI2FjY291bnRfaWR9XG4gICovXG4gIHJlYWRvbmx5IGFjY291bnRJZD86IG51bWJlcjtcbiAgLyoqXG4gICogSG93IGxvbmcgd2Ugd2FpdCBmb3IgZGF0YSB0aGF0IGJlbG9uZ3MgaW4gZWFjaCBhZ2dyZWdhdGlvbiB3aW5kb3cuIERlcGVuZGluZyBvbiB5b3VyIGRhdGEsIGEgbG9uZ2VyIGRlbGF5IG1heSBpbmNyZWFzZSBhY2N1cmFjeSBidXQgZGVsYXkgbm90aWZpY2F0aW9ucy4gVXNlIGFnZ3JlZ2F0aW9uRGVsYXkgd2l0aCB0aGUgRVZFTlRfRkxPVyBhbmQgQ0FERU5DRSBhZ2dyZWdhdGlvbiBtZXRob2RzLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2FnZ3JlZ2F0aW9uX2RlbGF5IE5ycWxBbGVydENvbmRpdGlvbiNhZ2dyZWdhdGlvbl9kZWxheX1cbiAgKi9cbiAgcmVhZG9ubHkgYWdncmVnYXRpb25EZWxheT86IHN0cmluZztcbiAgLyoqXG4gICogVGhlIG1ldGhvZCB0aGF0IGRldGVybWluZXMgd2hlbiB3ZSBjb25zaWRlciBhbiBhZ2dyZWdhdGlvbiB3aW5kb3cgdG8gYmUgY29tcGxldGUgc28gdGhhdCB3ZSBjYW4gZXZhbHVhdGUgdGhlIHNpZ25hbCBmb3IgaW5jaWRlbnRzLiBEZWZhdWx0IGlzIEVWRU5UX0ZMT1cuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jYWdncmVnYXRpb25fbWV0aG9kIE5ycWxBbGVydENvbmRpdGlvbiNhZ2dyZWdhdGlvbl9tZXRob2R9XG4gICovXG4gIHJlYWRvbmx5IGFnZ3JlZ2F0aW9uTWV0aG9kPzogc3RyaW5nO1xuICAvKipcbiAgKiBIb3cgbG9uZyB3ZSB3YWl0IGFmdGVyIGVhY2ggZGF0YSBwb2ludCBhcnJpdmVzIHRvIG1ha2Ugc3VyZSB3ZSd2ZSBwcm9jZXNzZWQgdGhlIHdob2xlIGJhdGNoLiBVc2UgYWdncmVnYXRpb25UaW1lciB3aXRoIHRoZSBFVkVOVF9USU1FUiBhZ2dyZWdhdGlvbiBtZXRob2QuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jYWdncmVnYXRpb25fdGltZXIgTnJxbEFsZXJ0Q29uZGl0aW9uI2FnZ3JlZ2F0aW9uX3RpbWVyfVxuICAqL1xuICByZWFkb25seSBhZ2dyZWdhdGlvblRpbWVyPzogc3RyaW5nO1xuICAvKipcbiAgKiBUaGUgZHVyYXRpb24gb2YgdGhlIHRpbWUgd2luZG93IHVzZWQgdG8gZXZhbHVhdGUgdGhlIE5SUUwgcXVlcnksIGluIHNlY29uZHMuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jYWdncmVnYXRpb25fd2luZG93IE5ycWxBbGVydENvbmRpdGlvbiNhZ2dyZWdhdGlvbl93aW5kb3d9XG4gICovXG4gIHJlYWRvbmx5IGFnZ3JlZ2F0aW9uV2luZG93PzogbnVtYmVyO1xuICAvKipcbiAgKiBUaGUgYmFzZWxpbmUgZGlyZWN0aW9uIG9mIGEgYmFzZWxpbmUgTlJRTCBhbGVydCBjb25kaXRpb24uIFZhbGlkIHZhbHVlcyBhcmU6ICdMT1dFUl9PTkxZJywgJ1VQUEVSX0FORF9MT1dFUicsICdVUFBFUl9PTkxZJyAoY2FzZSBpbnNlbnNpdGl2ZSkuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jYmFzZWxpbmVfZGlyZWN0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNiYXNlbGluZV9kaXJlY3Rpb259XG4gICovXG4gIHJlYWRvbmx5IGJhc2VsaW5lRGlyZWN0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgKiBXaGV0aGVyIHRvIGNsb3NlIGFsbCBvcGVuIGluY2lkZW50cyB3aGVuIHRoZSBzaWduYWwgZXhwaXJlcy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNjbG9zZV92aW9sYXRpb25zX29uX2V4cGlyYXRpb24gTnJxbEFsZXJ0Q29uZGl0aW9uI2Nsb3NlX3Zpb2xhdGlvbnNfb25fZXhwaXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgY2xvc2VWaW9sYXRpb25zT25FeHBpcmF0aW9uPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIE5SUUwgYWxlcnQgY29uZGl0aW9uLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2Rlc2NyaXB0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNkZXNjcmlwdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFdoZXRoZXIgb3Igbm90IHRvIGVuYWJsZSB0aGUgYWxlcnQgY29uZGl0aW9uLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2VuYWJsZWQgTnJxbEFsZXJ0Q29uZGl0aW9uI2VuYWJsZWR9XG4gICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIEhvdyBsb25nIHdlIHdhaXQgdW50aWwgdGhlIHNpZ25hbCBzdGFydHMgZXZhbHVhdGluZy4gVGhlIG1heGltdW0gZGVsYXkgaXMgNzIwMCBzZWNvbmRzICgxMjAgbWludXRlcylcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNldmFsdWF0aW9uX2RlbGF5IE5ycWxBbGVydENvbmRpdGlvbiNldmFsdWF0aW9uX2RlbGF5fVxuICAqL1xuICByZWFkb25seSBldmFsdWF0aW9uRGVsYXk/OiBudW1iZXI7XG4gIC8qKlxuICAqIFRoZSBhbW91bnQgb2YgdGltZSAoaW4gc2Vjb25kcykgdG8gd2FpdCBiZWZvcmUgY29uc2lkZXJpbmcgdGhlIHNpZ25hbCBleHBpcmVkLiAgTXVzdCBiZSBpbiB0aGUgcmFuZ2Ugb2YgMzAgdG8gMTcyODAwIChpbmNsdXNpdmUpXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jZXhwaXJhdGlvbl9kdXJhdGlvbiBOcnFsQWxlcnRDb25kaXRpb24jZXhwaXJhdGlvbl9kdXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZXhwaXJhdGlvbkR1cmF0aW9uPzogbnVtYmVyO1xuICAvKipcbiAgKiBXaGljaCBzdHJhdGVneSB0byB1c2Ugd2hlbiBmaWxsaW5nIGdhcHMgaW4gdGhlIHNpZ25hbC4gSWYgc3RhdGljLCB0aGUgJ2ZpbGwgdmFsdWUnIHdpbGwgYmUgdXNlZCBmb3IgZmlsbGluZyBnYXBzIGluIHRoZSBzaWduYWwuIFZhbGlkIHZhbHVlcyBhcmU6ICdOT05FJywgJ0xBU1RfVkFMVUUnLCBvciAnU1RBVElDJyAoY2FzZSBpbnNlbnNpdGl2ZSkuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jZmlsbF9vcHRpb24gTnJxbEFsZXJ0Q29uZGl0aW9uI2ZpbGxfb3B0aW9ufVxuICAqL1xuICByZWFkb25seSBmaWxsT3B0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgKiBJZiB1c2luZyB0aGUgJ3N0YXRpYycgZmlsbCBvcHRpb24sIHRoaXMgdmFsdWUgd2lsbCBiZSB1c2VkIGZvciBmaWxsaW5nIGdhcHMgaW4gdGhlIHNpZ25hbC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNmaWxsX3ZhbHVlIE5ycWxBbGVydENvbmRpdGlvbiNmaWxsX3ZhbHVlfVxuICAqL1xuICByZWFkb25seSBmaWxsVmFsdWU/OiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNpZCBOcnFsQWxlcnRDb25kaXRpb24jaWR9XG4gICpcbiAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCB0aGUgaWQgZmllbGQgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbGwgcmVzb3VyY2VzIGluIFRlcnJhZm9ybSBwcm92aWRlcnMgdXNpbmcgYSBUZXJyYWZvcm0gcHJvdmlkZXIgU0RLIHZlcnNpb24gYmVsb3cgMi5cbiAgKiBJZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyBzZXR0aW5nIHRoaXMgdmFsdWUgaXQgbWlnaHQgbm90IGJlIHNldHRhYmxlLiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgdGhlIHByb3ZpZGVyIGRvY3VtZW50YXRpb24gdG8gZW5zdXJlIGl0IHNob3VsZCBiZSBzZXR0YWJsZS5cbiAgKi9cbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFdoZXRoZXIgdG8gaWdub3JlIGV4cGVjdGVkIHRlcm1pbmF0aW9uIG9mIGEgc2lnbmFsIHdoZW4gY29uc2lkZXJpbmcgd2hldGhlciB0byBjcmVhdGUgYSBsb3NzIG9mIHNpZ25hbCBpbmNpZGVudFxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2lnbm9yZV9vbl9leHBlY3RlZF90ZXJtaW5hdGlvbiBOcnFsQWxlcnRDb25kaXRpb24jaWdub3JlX29uX2V4cGVjdGVkX3Rlcm1pbmF0aW9ufVxuICAqL1xuICByZWFkb25seSBpZ25vcmVPbkV4cGVjdGVkVGVybWluYXRpb24/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIFRoZSB0aXRsZSBvZiB0aGUgY29uZGl0aW9uLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI25hbWUgTnJxbEFsZXJ0Q29uZGl0aW9uI25hbWV9XG4gICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICogV2hldGhlciB0byBjcmVhdGUgYSBuZXcgaW5jaWRlbnQgdG8gY2FwdHVyZSB0aGF0IHRoZSBzaWduYWwgZXhwaXJlZC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNvcGVuX3Zpb2xhdGlvbl9vbl9leHBpcmF0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNvcGVuX3Zpb2xhdGlvbl9vbl9leHBpcmF0aW9ufVxuICAqL1xuICByZWFkb25seSBvcGVuVmlvbGF0aW9uT25FeHBpcmF0aW9uPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBUaGUgSUQgb2YgdGhlIHBvbGljeSB3aGVyZSB0aGlzIGNvbmRpdGlvbiBzaG91bGQgYmUgdXNlZC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNwb2xpY3lfaWQgTnJxbEFsZXJ0Q29uZGl0aW9uI3BvbGljeV9pZH1cbiAgKi9cbiAgcmVhZG9ubHkgcG9saWN5SWQ6IG51bWJlcjtcbiAgLyoqXG4gICogUnVuYm9vayBVUkwgdG8gZGlzcGxheSBpbiBub3RpZmljYXRpb25zLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3J1bmJvb2tfdXJsIE5ycWxBbGVydENvbmRpdGlvbiNydW5ib29rX3VybH1cbiAgKi9cbiAgcmVhZG9ubHkgcnVuYm9va1VybD86IHN0cmluZztcbiAgLyoqXG4gICogU2Vhc29uYWxpdHkgdW5kZXIgd2hpY2ggYSBjb25kaXRpb24ncyBzaWduYWwocykgYXJlIGV2YWx1YXRlZC4gVmFsaWQgdmFsdWVzIGFyZTogJ05FV19SRUxJQ19DQUxDVUxBVElPTicsICdIT1VSTFknLCAnREFJTFknLCAnV0VFS0xZJywgb3IgJ05PTkUnLiBUbyBoYXZlIE5ldyBSZWxpYyBjYWxjdWxhdGUgc2Vhc29uYWxpdHkgYXV0b21hdGljYWxseSwgc2V0IHRvICdORVdfUkVMSUNfQ0FMQ1VMQVRJT04nIChkZWZhdWx0KS4gVG8gdHVybiBvZmYgc2Vhc29uYWxpdHkgY29tcGxldGVseSwgc2V0IHRvICdOT05FJy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNzaWduYWxfc2Vhc29uYWxpdHkgTnJxbEFsZXJ0Q29uZGl0aW9uI3NpZ25hbF9zZWFzb25hbGl0eX1cbiAgKi9cbiAgcmVhZG9ubHkgc2lnbmFsU2Vhc29uYWxpdHk/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFRoZSBkdXJhdGlvbiBvZiBvdmVybGFwcGluZyB0aW1lIHdpbmRvd3MgdXNlZCB0byBzbW9vdGggdGhlIGNoYXJ0IGxpbmUsIGluIHNlY29uZHMuIE11c3QgYmUgYSBmYWN0b3Igb2YgYGFnZ3JlZ2F0aW9uX3dpbmRvd2AgYW5kIGxlc3MgdGhhbiB0aGUgYWdncmVnYXRpb24gd2luZG93LiBJZiBgYWdncmVnYXRpb25fd2luZG93YCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMzYwMCBzZWNvbmRzLCBpdCBzaG91bGQgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAzMCBzZWNvbmRzLiBJZiBgYWdncmVnYXRpb25fd2luZG93YCBpcyBncmVhdGVyIHRoYW4gMzYwMCBzZWNvbmRzIGJ1dCBsZXNzIHRoYW4gNzIwMCBzZWNvbmRzLCBpdCBzaG91bGQgYmUgZ3JlYXRlciBvciBlcXVhbCB0byBgYWdncmVnYXRpb25fd2luZG93IC8gMTIwYC4gIElmIGBhZ2dyZWdhdGlvbl93aW5kb3dgIGlzIGdyZWF0ZXIgdGhhbiA3MjAwIHNlY29uZHMsIGl0IHNob3VsZCBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIGBhZ2dyZWdhdGlvbl93aW5kb3cgLyAyNFxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3NsaWRlX2J5IE5ycWxBbGVydENvbmRpdGlvbiNzbGlkZV9ieX1cbiAgKi9cbiAgcmVhZG9ubHkgc2xpZGVCeT86IG51bWJlcjtcbiAgLyoqXG4gICogQkVUQSBQUkVWSUVXOiB0aGUgYHRhcmdldF9lbnRpdHlgIGZpZWxkIGlzIGluIGxpbWl0ZWQgcmVsZWFzZSBhbmQgb25seSBlbmFibGVkIGZvciBwcmV2aWV3IG9uIGEgcGVyLWFjY291bnQgYmFzaXMuIC0gVGhlIEdVSUQgb2YgdGhlIGVudGl0eSBleHBsaWNpdGx5IHRhcmdldGVkIGJ5IHRoZSBjb25kaXRpb24uIElzc3VlcyB0cmlnZ2VyZWQgYnkgdGhpcyBjb25kaXRpb24gd2lsbCBhZmZlY3QgdGhlIGhlYWx0aCBzdGF0dXMgb2YgdGhpcyBlbnRpdHkgaW5zdGVhZCBvZiBoYXZpbmcgdGhlIGFmZmVjdGVkIGVudGl0eSBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5XG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jdGFyZ2V0X2VudGl0eSBOcnFsQWxlcnRDb25kaXRpb24jdGFyZ2V0X2VudGl0eX1cbiAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0RW50aXR5Pzogc3RyaW5nO1xuICAvKipcbiAgKiBUaGlzIGZpZWxkIGFsbG93cyB5b3UgdG8gY3JlYXRlIGEgY3VzdG9tIHRpdGxlIHRvIGJlIHVzZWQgd2hlbiBpbmNpZGVudHMgYXJlIG9wZW5lZCBieSB0aGUgY29uZGl0aW9uLiBTZXR0aW5nIHRoaXMgZmllbGQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCB0aXRsZS4gTXVzdCBiZSBIYW5kbGViYXJzIGZvcm1hdC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN0aXRsZV90ZW1wbGF0ZSBOcnFsQWxlcnRDb25kaXRpb24jdGl0bGVfdGVtcGxhdGV9XG4gICovXG4gIHJlYWRvbmx5IHRpdGxlVGVtcGxhdGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFRoZSB0eXBlIG9mIE5SUUwgYWxlcnQgY29uZGl0aW9uIHRvIGNyZWF0ZS4gVmFsaWQgdmFsdWVzIGFyZTogJ3N0YXRpYycsICdiYXNlbGluZScsICdvdXRsaWVyJy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN0eXBlIE5ycWxBbGVydENvbmRpdGlvbiN0eXBlfVxuICAqL1xuICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICAvKipcbiAgKiBTZXRzIGEgdGltZSBsaW1pdCwgaW4gaG91cnMsIHRoYXQgd2lsbCBhdXRvbWF0aWNhbGx5IGZvcmNlLWNsb3NlIGEgbG9uZy1sYXN0aW5nIGluY2lkZW50IGFmdGVyIHRoZSB0aW1lIGxpbWl0IHlvdSBzZWxlY3QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgJ09ORV9IT1VSJywgJ1RXT19IT1VSUycsICdGT1VSX0hPVVJTJywgJ0VJR0hUX0hPVVJTJywgJ1RXRUxWRV9IT1VSUycsICdUV0VOVFlfRk9VUl9IT1VSUycsICdUSElSVFlfREFZUycgKGNhc2UgaW5zZW5zaXRpdmUpLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3Zpb2xhdGlvbl90aW1lX2xpbWl0IE5ycWxBbGVydENvbmRpdGlvbiN2aW9sYXRpb25fdGltZV9saW1pdH1cbiAgKi9cbiAgcmVhZG9ubHkgdmlvbGF0aW9uVGltZUxpbWl0Pzogc3RyaW5nO1xuICAvKipcbiAgKiBTZXRzIGEgdGltZSBsaW1pdCwgaW4gc2Vjb25kcywgdGhhdCB3aWxsIGF1dG9tYXRpY2FsbHkgZm9yY2UtY2xvc2UgYSBsb25nLWxhc3RpbmcgaW5jaWRlbnQgYWZ0ZXIgdGhlIHRpbWUgbGltaXQgeW91IHNlbGVjdC4gIE11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIDMwMCB0byAyNTkyMDAwIChpbmNsdXNpdmUpXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jdmlvbGF0aW9uX3RpbWVfbGltaXRfc2Vjb25kcyBOcnFsQWxlcnRDb25kaXRpb24jdmlvbGF0aW9uX3RpbWVfbGltaXRfc2Vjb25kc31cbiAgKi9cbiAgcmVhZG9ubHkgdmlvbGF0aW9uVGltZUxpbWl0U2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICogY3JpdGljYWwgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNjcml0aWNhbCBOcnFsQWxlcnRDb25kaXRpb24jY3JpdGljYWx9XG4gICovXG4gIHJlYWRvbmx5IGNyaXRpY2FsPzogTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWw7XG4gIC8qKlxuICAqIG5ycWwgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNucnFsIE5ycWxBbGVydENvbmRpdGlvbiNucnFsfVxuICAqL1xuICByZWFkb25seSBucnFsOiBOcnFsQWxlcnRDb25kaXRpb25OcnFsO1xuICAvKipcbiAgKiBvdXRsaWVyX2NvbmZpZ3VyYXRpb24gYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNvdXRsaWVyX2NvbmZpZ3VyYXRpb24gTnJxbEFsZXJ0Q29uZGl0aW9uI291dGxpZXJfY29uZmlndXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgb3V0bGllckNvbmZpZ3VyYXRpb24/OiBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbjtcbiAgLyoqXG4gICogdGVybSBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3Rlcm0gTnJxbEFsZXJ0Q29uZGl0aW9uI3Rlcm19XG4gICovXG4gIHJlYWRvbmx5IHRlcm0/OiBOcnFsQWxlcnRDb25kaXRpb25UZXJtW10gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogdGltZW91dHMgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN0aW1lb3V0cyBOcnFsQWxlcnRDb25kaXRpb24jdGltZW91dHN9XG4gICovXG4gIHJlYWRvbmx5IHRpbWVvdXRzPzogTnJxbEFsZXJ0Q29uZGl0aW9uVGltZW91dHM7XG4gIC8qKlxuICAqIHdhcm5pbmcgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN3YXJuaW5nIE5ycWxBbGVydENvbmRpdGlvbiN3YXJuaW5nfVxuICAqL1xuICByZWFkb25seSB3YXJuaW5nPzogTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWxQcmVkaWN0aW9uIHtcbiAgLyoqXG4gICogQkVUQSBQUkVWSUVXOiB0aGUgYHByZWRpY3RfYnlgIGZpZWxkIGlzIGluIGxpbWl0ZWQgcmVsZWFzZSBhbmQgb25seSBlbmFibGVkIGZvciBwcmV2aWV3IG9uIGEgcGVyLWFjY291bnQgYmFzaXMuIC0gVGhlIGR1cmF0aW9uLCBpbiBzZWNvbmRzLCB0aGF0IHRoZSBwcmVkaWN0aW9uIHNob3VsZCBsb29rIGludG8gdGhlIGZ1dHVyZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNwcmVkaWN0X2J5IE5ycWxBbGVydENvbmRpdGlvbiNwcmVkaWN0X2J5fVxuICAqL1xuICByZWFkb25seSBwcmVkaWN0Qnk/OiBudW1iZXI7XG4gIC8qKlxuICAqIEJFVEEgUFJFVklFVzogdGhlIGBwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb25gIGZpZWxkIGlzIGluIGxpbWl0ZWQgcmVsZWFzZSBhbmQgb25seSBlbmFibGVkIGZvciBwcmV2aWV3IG9uIGEgcGVyLWFjY291bnQgYmFzaXMuIC0gSWYgYSBwcmVkaWN0aW9uIGluY2lkZW50IGlzIG9wZW4gd2hlbiBhIHRlcm0ncyBzdGF0aWMgdGhyZXNob2xkIGlzIGJyZWFjaGVkIGJ5IHRoZSBhY3R1YWwgc2lnbmFsLCBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGNsb3NlIHRoZSBwcmVkaWN0aW9uIGluY2lkZW50IGFuZCBvcGVuIGEgc3RhdGljIGluY2lkZW50LiBTZXR0aW5nIGBwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb25gIHRvIGB0cnVlYCBvdmVycmlkZXMgdGhpcyBiZWhhdmlvciBsZWF2aW5nIHRoZSBwcmVkaWN0aW9uIGluY2lkZW50IG9wZW4gYW5kIHByZXZlbnRpbmcgYSBzdGF0aWMgaW5jaWRlbnQgZnJvbSBvcGVuaW5nLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3ByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbiBOcnFsQWxlcnRDb25kaXRpb24jcHJlZmVyX3ByZWRpY3Rpb25fdmlvbGF0aW9ufVxuICAqL1xuICByZWFkb25seSBwcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWxQcmVkaWN0aW9uVG9UZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWxQcmVkaWN0aW9uT3V0cHV0UmVmZXJlbmNlIHwgTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWxQcmVkaWN0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHByZWRpY3RfYnk6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEucHJlZGljdEJ5KSxcbiAgICBwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb246IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLnByZWZlclByZWRpY3Rpb25WaW9sYXRpb24pLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsUHJlZGljdGlvblRvSGNsVGVycmFmb3JtKHN0cnVjdD86IE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsUHJlZGljdGlvbk91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsUHJlZGljdGlvbik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgcHJlZGljdF9ieToge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEucHJlZGljdEJ5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbFByZWRpY3Rpb25PdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsUHJlZGljdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fcHJlZGljdEJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnByZWRpY3RCeSA9IHRoaXMuX3ByZWRpY3RCeTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbiA9IHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb247XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbFByZWRpY3Rpb24gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9wcmVkaWN0QnkgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9wcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9wcmVkaWN0QnkgPSB2YWx1ZS5wcmVkaWN0Qnk7XG4gICAgICB0aGlzLl9wcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uID0gdmFsdWUucHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbjtcbiAgICB9XG4gIH1cblxuICAvLyBwcmVkaWN0X2J5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3ByZWRpY3RCeT86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgcHJlZGljdEJ5KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgncHJlZGljdF9ieScpO1xuICB9XG4gIHB1YmxpYyBzZXQgcHJlZGljdEJ5KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wcmVkaWN0QnkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRQcmVkaWN0QnkoKSB7XG4gICAgdGhpcy5fcHJlZGljdEJ5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwcmVkaWN0QnlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZGljdEJ5O1xuICB9XG5cbiAgLy8gcHJlZmVyX3ByZWRpY3Rpb25fdmlvbGF0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IHByZWZlclByZWRpY3Rpb25WaW9sYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgncHJlZmVyX3ByZWRpY3Rpb25fdmlvbGF0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBwcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9wcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbigpIHtcbiAgICB0aGlzLl9wcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb247XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWwge1xuICAvKipcbiAgKiBWaW9sYXRpb25zIHdpbGwgbm90IGNoYW5nZSBzeXN0ZW0gaGVhbHRoIHN0YXR1cyBmb3IgdGhpcyB0ZXJtLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2Rpc2FibGVfaGVhbHRoX3N0YXR1c19yZXBvcnRpbmcgTnJxbEFsZXJ0Q29uZGl0aW9uI2Rpc2FibGVfaGVhbHRoX3N0YXR1c19yZXBvcnRpbmd9XG4gICovXG4gIHJlYWRvbmx5IGRpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmc/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIEluIG1pbnV0ZXMsIG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIDEgdG8gMTIwIChpbmNsdXNpdmUpLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2R1cmF0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNkdXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZHVyYXRpb24/OiBudW1iZXI7XG4gIC8qKlxuICAqIE9uZSBvZiAoYWJvdmUsIGFib3ZlX29yX2VxdWFscywgYmVsb3csIGJlbG93X29yX2VxdWFscywgZXF1YWxzLCBub3RfZXF1YWxzKS4gRGVmYXVsdHMgdG8gJ2VxdWFscycuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jb3BlcmF0b3IgTnJxbEFsZXJ0Q29uZGl0aW9uI29wZXJhdG9yfVxuICAqL1xuICByZWFkb25seSBvcGVyYXRvcj86IHN0cmluZztcbiAgLyoqXG4gICogRm9yIGJhc2VsaW5lIGNvbmRpdGlvbnMgbXVzdCBiZSBpbiByYW5nZSBbMSwgMTAwMF0uXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jdGhyZXNob2xkIE5ycWxBbGVydENvbmRpdGlvbiN0aHJlc2hvbGR9XG4gICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZDogbnVtYmVyO1xuICAvKipcbiAgKiBUaGUgZHVyYXRpb24sIGluIHNlY29uZHMsIHRoYXQgdGhlIHRocmVzaG9sZCBtdXN0IHZpb2xhdGUgaW4gb3JkZXIgdG8gY3JlYXRlIGFuIGluY2lkZW50LiBWYWx1ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlICdhZ2dyZWdhdGlvbl93aW5kb3cnICh3aGljaCBoYXMgYSBkZWZhdWx0IG9mIDYwIHNlY29uZHMpLiBWYWx1ZSBtdXN0IGJlIHdpdGhpbiAxMjAtODY0MDAgc2Vjb25kcyBmb3IgYmFzZWxpbmUgY29uZGl0aW9ucywgYW5kIHdpdGhpbiA2MC04NjQwMCBzZWNvbmRzIGZvciBzdGF0aWMgY29uZGl0aW9uc1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3RocmVzaG9sZF9kdXJhdGlvbiBOcnFsQWxlcnRDb25kaXRpb24jdGhyZXNob2xkX2R1cmF0aW9ufVxuICAqL1xuICByZWFkb25seSB0aHJlc2hvbGREdXJhdGlvbj86IG51bWJlcjtcbiAgLyoqXG4gICogVGhlIGNyaXRlcmlhIGZvciBob3cgbWFueSBkYXRhIHBvaW50cyBtdXN0IGJlIGluIHZpb2xhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCB0aHJlc2hvbGQgZHVyYXRpb24uIFZhbGlkIHZhbHVlcyBhcmU6ICdBTEwnIG9yICdBVF9MRUFTVF9PTkNFJyAoY2FzZSBpbnNlbnNpdGl2ZSkuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jdGhyZXNob2xkX29jY3VycmVuY2VzIE5ycWxBbGVydENvbmRpdGlvbiN0aHJlc2hvbGRfb2NjdXJyZW5jZXN9XG4gICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZE9jY3VycmVuY2VzPzogc3RyaW5nO1xuICAvKipcbiAgKiBWYWxpZCB2YWx1ZXMgYXJlOiAnYWxsJyBvciAnYW55J1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3RpbWVfZnVuY3Rpb24gTnJxbEFsZXJ0Q29uZGl0aW9uI3RpbWVfZnVuY3Rpb259XG4gICovXG4gIHJlYWRvbmx5IHRpbWVGdW5jdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICogcHJlZGljdGlvbiBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3ByZWRpY3Rpb24gTnJxbEFsZXJ0Q29uZGl0aW9uI3ByZWRpY3Rpb259XG4gICovXG4gIHJlYWRvbmx5IHByZWRpY3Rpb24/OiBOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbFByZWRpY3Rpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbFRvVGVycmFmb3JtKHN0cnVjdD86IE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsT3V0cHV0UmVmZXJlbmNlIHwgTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWwpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZGlzYWJsZV9oZWFsdGhfc3RhdHVzX3JlcG9ydGluZzogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyksXG4gICAgZHVyYXRpb246IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEuZHVyYXRpb24pLFxuICAgIG9wZXJhdG9yOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm9wZXJhdG9yKSxcbiAgICB0aHJlc2hvbGQ6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkKSxcbiAgICB0aHJlc2hvbGRfZHVyYXRpb246IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkRHVyYXRpb24pLFxuICAgIHRocmVzaG9sZF9vY2N1cnJlbmNlczogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGRPY2N1cnJlbmNlcyksXG4gICAgdGltZV9mdW5jdGlvbjogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50aW1lRnVuY3Rpb24pLFxuICAgIHByZWRpY3Rpb246IG5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsUHJlZGljdGlvblRvVGVycmFmb3JtKHN0cnVjdCEucHJlZGljdGlvbiksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gbnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWxUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbE91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIGR1cmF0aW9uOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kdXJhdGlvbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgb3BlcmF0b3I6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm9wZXJhdG9yKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0aHJlc2hvbGQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRocmVzaG9sZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgdGhyZXNob2xkX2R1cmF0aW9uOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGREdXJhdGlvbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgdGhyZXNob2xkX29jY3VycmVuY2VzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGRPY2N1cnJlbmNlcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdGltZV9mdW5jdGlvbjoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGltZUZ1bmN0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBwcmVkaWN0aW9uOiB7XG4gICAgICB2YWx1ZTogbnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWxQcmVkaWN0aW9uVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wcmVkaWN0aW9uKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbFByZWRpY3Rpb25MaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nID0gdGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2R1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmR1cmF0aW9uID0gdGhpcy5fZHVyYXRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLl9vcGVyYXRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5vcGVyYXRvciA9IHRoaXMuX29wZXJhdG9yO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRocmVzaG9sZCA9IHRoaXMuX3RocmVzaG9sZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RocmVzaG9sZER1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRocmVzaG9sZER1cmF0aW9uID0gdGhpcy5fdGhyZXNob2xkRHVyYXRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHRoaXMuX3RocmVzaG9sZE9jY3VycmVuY2VzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGltZUZ1bmN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRpbWVGdW5jdGlvbiA9IHRoaXMuX3RpbWVGdW5jdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ByZWRpY3Rpb24/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucHJlZGljdGlvbiA9IHRoaXMuX3ByZWRpY3Rpb24/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX29wZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGhyZXNob2xkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGhyZXNob2xkRHVyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RpbWVGdW5jdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3ByZWRpY3Rpb24uaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyA9IHZhbHVlLmRpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmc7XG4gICAgICB0aGlzLl9kdXJhdGlvbiA9IHZhbHVlLmR1cmF0aW9uO1xuICAgICAgdGhpcy5fb3BlcmF0b3IgPSB2YWx1ZS5vcGVyYXRvcjtcbiAgICAgIHRoaXMuX3RocmVzaG9sZCA9IHZhbHVlLnRocmVzaG9sZDtcbiAgICAgIHRoaXMuX3RocmVzaG9sZER1cmF0aW9uID0gdmFsdWUudGhyZXNob2xkRHVyYXRpb247XG4gICAgICB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHZhbHVlLnRocmVzaG9sZE9jY3VycmVuY2VzO1xuICAgICAgdGhpcy5fdGltZUZ1bmN0aW9uID0gdmFsdWUudGltZUZ1bmN0aW9uO1xuICAgICAgdGhpcy5fcHJlZGljdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWUucHJlZGljdGlvbjtcbiAgICB9XG4gIH1cblxuICAvLyBkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmc/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGRpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZGlzYWJsZV9oZWFsdGhfc3RhdHVzX3JlcG9ydGluZycpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcoKSB7XG4gICAgdGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZ0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nO1xuICB9XG5cbiAgLy8gZHVyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZHVyYXRpb24/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGR1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnZHVyYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGR1cmF0aW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kdXJhdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldER1cmF0aW9uKCkge1xuICAgIHRoaXMuX2R1cmF0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkdXJhdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kdXJhdGlvbjtcbiAgfVxuXG4gIC8vIG9wZXJhdG9yIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX29wZXJhdG9yPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBvcGVyYXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ29wZXJhdG9yJyk7XG4gIH1cbiAgcHVibGljIHNldCBvcGVyYXRvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fb3BlcmF0b3IgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRPcGVyYXRvcigpIHtcbiAgICB0aGlzLl9vcGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgb3BlcmF0b3JJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0b3I7XG4gIH1cblxuICAvLyB0aHJlc2hvbGQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdGhyZXNob2xkPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCB0aHJlc2hvbGQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCd0aHJlc2hvbGQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRocmVzaG9sZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aHJlc2hvbGQ7XG4gIH1cblxuICAvLyB0aHJlc2hvbGRfZHVyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGhyZXNob2xkRHVyYXRpb24/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgndGhyZXNob2xkX2R1cmF0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGREdXJhdGlvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkRHVyYXRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaHJlc2hvbGREdXJhdGlvbigpIHtcbiAgICB0aGlzLl90aHJlc2hvbGREdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkRHVyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhyZXNob2xkRHVyYXRpb247XG4gIH1cblxuICAvLyB0aHJlc2hvbGRfb2NjdXJyZW5jZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGhyZXNob2xkT2NjdXJyZW5jZXM/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZE9jY3VycmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGhyZXNob2xkX29jY3VycmVuY2VzJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGRPY2N1cnJlbmNlcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkT2NjdXJyZW5jZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaHJlc2hvbGRPY2N1cnJlbmNlcygpIHtcbiAgICB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkT2NjdXJyZW5jZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhyZXNob2xkT2NjdXJyZW5jZXM7XG4gIH1cblxuICAvLyB0aW1lX2Z1bmN0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RpbWVGdW5jdGlvbj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGltZUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGltZV9mdW5jdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGltZUZ1bmN0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90aW1lRnVuY3Rpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaW1lRnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fdGltZUZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aW1lRnVuY3Rpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZUZ1bmN0aW9uO1xuICB9XG5cbiAgLy8gcHJlZGljdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wcmVkaWN0aW9uID0gbmV3IE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsUHJlZGljdGlvbk91dHB1dFJlZmVyZW5jZSh0aGlzLCBcInByZWRpY3Rpb25cIik7XG4gIHB1YmxpYyBnZXQgcHJlZGljdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZGljdGlvbjtcbiAgfVxuICBwdWJsaWMgcHV0UHJlZGljdGlvbih2YWx1ZTogTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWxQcmVkaWN0aW9uKSB7XG4gICAgdGhpcy5fcHJlZGljdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UHJlZGljdGlvbigpIHtcbiAgICB0aGlzLl9wcmVkaWN0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHByZWRpY3Rpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZGljdGlvbi5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIE5ycWxBbGVydENvbmRpdGlvbk5ycWwge1xuICAvKipcbiAgKiBUaGUgTmV3IFJlbGljIGFjY291bnQgSUQgdG8gdXNlIGFzIHRoZSBiYXNpcyBmb3IgdGhlIE5SUUwgYWxlcnQgY29uZGl0aW9uJ3MgYHF1ZXJ5YDsgd2lsbCBkZWZhdWx0IHRvIGBhY2NvdW50X2lkYCBpZiB1bnNwZWNpZmllZC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNkYXRhX2FjY291bnRfaWQgTnJxbEFsZXJ0Q29uZGl0aW9uI2RhdGFfYWNjb3VudF9pZH1cbiAgKi9cbiAgcmVhZG9ubHkgZGF0YUFjY291bnRJZD86IG51bWJlcjtcbiAgLyoqXG4gICogTlJRTCBxdWVyaWVzIGFyZSBldmFsdWF0ZWQgaW4gb25lLW1pbnV0ZSB0aW1lIHdpbmRvd3MuIFRoZSBzdGFydCB0aW1lIGRlcGVuZHMgb24gdGhlIHZhbHVlIHlvdSBwcm92aWRlIGluIHRoZSBOUlFMIGNvbmRpdGlvbidzIGBldmFsdWF0aW9uX29mZnNldGAuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jZXZhbHVhdGlvbl9vZmZzZXQgTnJxbEFsZXJ0Q29uZGl0aW9uI2V2YWx1YXRpb25fb2Zmc2V0fVxuICAqL1xuICByZWFkb25seSBldmFsdWF0aW9uT2Zmc2V0PzogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jcXVlcnkgTnJxbEFsZXJ0Q29uZGl0aW9uI3F1ZXJ5fVxuICAqL1xuICByZWFkb25seSBxdWVyeTogc3RyaW5nO1xuICAvKipcbiAgKiBOUlFMIHF1ZXJpZXMgYXJlIGV2YWx1YXRlZCBpbiBvbmUtbWludXRlIHRpbWUgd2luZG93cy4gVGhlIHN0YXJ0IHRpbWUgZGVwZW5kcyBvbiB0aGUgdmFsdWUgeW91IHByb3ZpZGUgaW4gdGhlIE5SUUwgY29uZGl0aW9uJ3MgYHNpbmNlX3ZhbHVlYC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNzaW5jZV92YWx1ZSBOcnFsQWxlcnRDb25kaXRpb24jc2luY2VfdmFsdWV9XG4gICovXG4gIHJlYWRvbmx5IHNpbmNlVmFsdWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25OcnFsVG9UZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uTnJxbE91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbk5ycWwpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZGF0YV9hY2NvdW50X2lkOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmRhdGFBY2NvdW50SWQpLFxuICAgIGV2YWx1YXRpb25fb2Zmc2V0OiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmV2YWx1YXRpb25PZmZzZXQpLFxuICAgIHF1ZXJ5OiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnF1ZXJ5KSxcbiAgICBzaW5jZV92YWx1ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5zaW5jZVZhbHVlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25OcnFsVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uTnJxbE91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbk5ycWwpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGRhdGFfYWNjb3VudF9pZDoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGF0YUFjY291bnRJZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgZXZhbHVhdGlvbl9vZmZzZXQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmV2YWx1YXRpb25PZmZzZXQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHF1ZXJ5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5xdWVyeSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgc2luY2VfdmFsdWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnNpbmNlVmFsdWUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgTnJxbEFsZXJ0Q29uZGl0aW9uTnJxbE91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogTnJxbEFsZXJ0Q29uZGl0aW9uTnJxbCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZGF0YUFjY291bnRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5kYXRhQWNjb3VudElkID0gdGhpcy5fZGF0YUFjY291bnRJZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2V2YWx1YXRpb25PZmZzZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZXZhbHVhdGlvbk9mZnNldCA9IHRoaXMuX2V2YWx1YXRpb25PZmZzZXQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9xdWVyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5xdWVyeSA9IHRoaXMuX3F1ZXJ5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2luY2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zaW5jZVZhbHVlID0gdGhpcy5fc2luY2VWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IE5ycWxBbGVydENvbmRpdGlvbk5ycWwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9kYXRhQWNjb3VudElkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZXZhbHVhdGlvbk9mZnNldCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3F1ZXJ5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc2luY2VWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZGF0YUFjY291bnRJZCA9IHZhbHVlLmRhdGFBY2NvdW50SWQ7XG4gICAgICB0aGlzLl9ldmFsdWF0aW9uT2Zmc2V0ID0gdmFsdWUuZXZhbHVhdGlvbk9mZnNldDtcbiAgICAgIHRoaXMuX3F1ZXJ5ID0gdmFsdWUucXVlcnk7XG4gICAgICB0aGlzLl9zaW5jZVZhbHVlID0gdmFsdWUuc2luY2VWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBkYXRhX2FjY291bnRfaWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kYXRhQWNjb3VudElkPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBkYXRhQWNjb3VudElkKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnZGF0YV9hY2NvdW50X2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBkYXRhQWNjb3VudElkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kYXRhQWNjb3VudElkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGF0YUFjY291bnRJZCgpIHtcbiAgICB0aGlzLl9kYXRhQWNjb3VudElkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkYXRhQWNjb3VudElkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFBY2NvdW50SWQ7XG4gIH1cblxuICAvLyBldmFsdWF0aW9uX29mZnNldCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9ldmFsdWF0aW9uT2Zmc2V0PzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBldmFsdWF0aW9uT2Zmc2V0KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnZXZhbHVhdGlvbl9vZmZzZXQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV2YWx1YXRpb25PZmZzZXQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2V2YWx1YXRpb25PZmZzZXQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFdmFsdWF0aW9uT2Zmc2V0KCkge1xuICAgIHRoaXMuX2V2YWx1YXRpb25PZmZzZXQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGV2YWx1YXRpb25PZmZzZXRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXZhbHVhdGlvbk9mZnNldDtcbiAgfVxuXG4gIC8vIHF1ZXJ5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3F1ZXJ5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3F1ZXJ5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBxdWVyeSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcXVlcnkgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcXVlcnlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnk7XG4gIH1cblxuICAvLyBzaW5jZV92YWx1ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zaW5jZVZhbHVlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzaW5jZVZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnc2luY2VfdmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNpbmNlVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NpbmNlVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTaW5jZVZhbHVlKCkge1xuICAgIHRoaXMuX3NpbmNlVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNpbmNlVmFsdWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2luY2VWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbkRic2NhbiB7XG4gIC8qKlxuICAqIEJFVEEgUFJFVklFVzogdGhlIGBlcHNpbG9uYCBmaWVsZCBpcyBpbiBsaW1pdGVkIHJlbGVhc2UgYW5kIG9ubHkgZW5hYmxlZCBmb3IgcHJldmlldyBvbiBhIHBlci1hY2NvdW50IGJhc2lzLiAtIFJhZGl1cyAoZGlzdGFuY2UgdGhyZXNob2xkKSBmb3IgREJTQ0FOIGluIHRoZSB1bml0cyBvZiB0aGUgcXVlcnkgcmVzdWx0LiBTbWFsbGVyIHZhbHVlcyB0aWdodGVuIGNsdXN0ZXJzOyBsYXJnZXIgdmFsdWVzIGJyb2FkZW4gdGhlbS4gTXVzdCBiZSA+IDAuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jZXBzaWxvbiBOcnFsQWxlcnRDb25kaXRpb24jZXBzaWxvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZXBzaWxvbjogbnVtYmVyO1xuICAvKipcbiAgKiBCRVRBIFBSRVZJRVc6IHRoZSBgZXZhbHVhdGlvbl9ncm91cF9mYWNldGAgZmllbGQgaXMgaW4gbGltaXRlZCByZWxlYXNlIGFuZCBvbmx5IGVuYWJsZWQgZm9yIHByZXZpZXcgb24gYSBwZXItYWNjb3VudCBiYXNpcy4gLSBPcHRpb25hbCBOUlFMIGZhY2V0IGF0dHJpYnV0ZSB1c2VkIHRvIHNlZ21lbnQgZGF0YSBpbnRvIGdyb3VwcyAoZS5nLiBgaG9zdGAsIGByZWdpb25gKSBiZWZvcmUgcnVubmluZyBvdXRsaWVyIGRldGVjdGlvbi4gT21pdCB0byBldmFsdWF0ZSBhbGwgcmVzdWx0cyB0b2dldGhlci5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNldmFsdWF0aW9uX2dyb3VwX2ZhY2V0IE5ycWxBbGVydENvbmRpdGlvbiNldmFsdWF0aW9uX2dyb3VwX2ZhY2V0fVxuICAqL1xuICByZWFkb25seSBldmFsdWF0aW9uR3JvdXBGYWNldD86IHN0cmluZztcbiAgLyoqXG4gICogQkVUQSBQUkVWSUVXOiB0aGUgYG1pbmltdW1fcG9pbnRzYCBmaWVsZCBpcyBpbiBsaW1pdGVkIHJlbGVhc2UgYW5kIG9ubHkgZW5hYmxlZCBmb3IgcHJldmlldyBvbiBhIHBlci1hY2NvdW50IGJhc2lzLiAtIE1pbmltdW0gbnVtYmVyIG9mIG5laWdoYm9yaW5nIHBvaW50cyBuZWVkZWQgdG8gZm9ybSBhIGNsdXN0ZXIuIE11c3QgYmUgPj0gMS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNtaW5pbXVtX3BvaW50cyBOcnFsQWxlcnRDb25kaXRpb24jbWluaW11bV9wb2ludHN9XG4gICovXG4gIHJlYWRvbmx5IG1pbmltdW1Qb2ludHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uRGJzY2FuVG9UZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25EYnNjYW5PdXRwdXRSZWZlcmVuY2UgfCBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbkRic2Nhbik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBlcHNpbG9uOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmVwc2lsb24pLFxuICAgIGV2YWx1YXRpb25fZ3JvdXBfZmFjZXQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuZXZhbHVhdGlvbkdyb3VwRmFjZXQpLFxuICAgIG1pbmltdW1fcG9pbnRzOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1pbmltdW1Qb2ludHMpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uRGJzY2FuVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25EYnNjYW5PdXRwdXRSZWZlcmVuY2UgfCBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbkRic2Nhbik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZXBzaWxvbjoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZXBzaWxvbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgZXZhbHVhdGlvbl9ncm91cF9mYWNldDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuZXZhbHVhdGlvbkdyb3VwRmFjZXQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIG1pbmltdW1fcG9pbnRzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5taW5pbXVtUG9pbnRzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uRGJzY2FuT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbkRic2NhbiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZXBzaWxvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5lcHNpbG9uID0gdGhpcy5fZXBzaWxvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2V2YWx1YXRpb25Hcm91cEZhY2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmV2YWx1YXRpb25Hcm91cEZhY2V0ID0gdGhpcy5fZXZhbHVhdGlvbkdyb3VwRmFjZXQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9taW5pbXVtUG9pbnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1pbmltdW1Qb2ludHMgPSB0aGlzLl9taW5pbXVtUG9pbnRzO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogTnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25EYnNjYW4gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9lcHNpbG9uID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZXZhbHVhdGlvbkdyb3VwRmFjZXQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9taW5pbXVtUG9pbnRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9lcHNpbG9uID0gdmFsdWUuZXBzaWxvbjtcbiAgICAgIHRoaXMuX2V2YWx1YXRpb25Hcm91cEZhY2V0ID0gdmFsdWUuZXZhbHVhdGlvbkdyb3VwRmFjZXQ7XG4gICAgICB0aGlzLl9taW5pbXVtUG9pbnRzID0gdmFsdWUubWluaW11bVBvaW50cztcbiAgICB9XG4gIH1cblxuICAvLyBlcHNpbG9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2Vwc2lsb24/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGVwc2lsb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdlcHNpbG9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBlcHNpbG9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9lcHNpbG9uID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGVwc2lsb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXBzaWxvbjtcbiAgfVxuXG4gIC8vIGV2YWx1YXRpb25fZ3JvdXBfZmFjZXQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZXZhbHVhdGlvbkdyb3VwRmFjZXQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGV2YWx1YXRpb25Hcm91cEZhY2V0KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZXZhbHVhdGlvbl9ncm91cF9mYWNldCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXZhbHVhdGlvbkdyb3VwRmFjZXQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2V2YWx1YXRpb25Hcm91cEZhY2V0ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RXZhbHVhdGlvbkdyb3VwRmFjZXQoKSB7XG4gICAgdGhpcy5fZXZhbHVhdGlvbkdyb3VwRmFjZXQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGV2YWx1YXRpb25Hcm91cEZhY2V0SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V2YWx1YXRpb25Hcm91cEZhY2V0O1xuICB9XG5cbiAgLy8gbWluaW11bV9wb2ludHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbWluaW11bVBvaW50cz86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWluaW11bVBvaW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21pbmltdW1fcG9pbnRzJyk7XG4gIH1cbiAgcHVibGljIHNldCBtaW5pbXVtUG9pbnRzKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW5pbXVtUG9pbnRzID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1pbmltdW1Qb2ludHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWluaW11bVBvaW50cztcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAqIGRic2NhbiBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI2Ric2NhbiBOcnFsQWxlcnRDb25kaXRpb24jZGJzY2FufVxuICAqL1xuICByZWFkb25seSBkYnNjYW46IE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uRGJzY2FuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25Ub1RlcnJhZm9ybShzdHJ1Y3Q/OiBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGRic2NhbjogbnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25EYnNjYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmRic2NhbiksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gbnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbk91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBkYnNjYW46IHtcbiAgICAgIHZhbHVlOiBucnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbkRic2NhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGJzY2FuKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiTnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25EYnNjYW5MaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBOcnFsQWxlcnRDb25kaXRpb25PdXRsaWVyQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZGJzY2FuPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRic2NhbiA9IHRoaXMuX2Ric2Nhbj8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fZGJzY2FuLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2Ric2Nhbi5pbnRlcm5hbFZhbHVlID0gdmFsdWUuZGJzY2FuO1xuICAgIH1cbiAgfVxuXG4gIC8vIGRic2NhbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9kYnNjYW4gPSBuZXcgTnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25EYnNjYW5PdXRwdXRSZWZlcmVuY2UodGhpcywgXCJkYnNjYW5cIik7XG4gIHB1YmxpYyBnZXQgZGJzY2FuKCkge1xuICAgIHJldHVybiB0aGlzLl9kYnNjYW47XG4gIH1cbiAgcHVibGljIHB1dERic2Nhbih2YWx1ZTogTnJxbEFsZXJ0Q29uZGl0aW9uT3V0bGllckNvbmZpZ3VyYXRpb25EYnNjYW4pIHtcbiAgICB0aGlzLl9kYnNjYW4uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkYnNjYW5JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGJzY2FuLmludGVybmFsVmFsdWU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgTnJxbEFsZXJ0Q29uZGl0aW9uVGVybVByZWRpY3Rpb24ge1xuICAvKipcbiAgKiBCRVRBIFBSRVZJRVc6IHRoZSBgcHJlZGljdF9ieWAgZmllbGQgaXMgaW4gbGltaXRlZCByZWxlYXNlIGFuZCBvbmx5IGVuYWJsZWQgZm9yIHByZXZpZXcgb24gYSBwZXItYWNjb3VudCBiYXNpcy4gLSBUaGUgZHVyYXRpb24sIGluIHNlY29uZHMsIHRoYXQgdGhlIHByZWRpY3Rpb24gc2hvdWxkIGxvb2sgaW50byB0aGUgZnV0dXJlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3ByZWRpY3RfYnkgTnJxbEFsZXJ0Q29uZGl0aW9uI3ByZWRpY3RfYnl9XG4gICovXG4gIHJlYWRvbmx5IHByZWRpY3RCeT86IG51bWJlcjtcbiAgLyoqXG4gICogQkVUQSBQUkVWSUVXOiB0aGUgYHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbmAgZmllbGQgaXMgaW4gbGltaXRlZCByZWxlYXNlIGFuZCBvbmx5IGVuYWJsZWQgZm9yIHByZXZpZXcgb24gYSBwZXItYWNjb3VudCBiYXNpcy4gLSBJZiBhIHByZWRpY3Rpb24gaW5jaWRlbnQgaXMgb3BlbiB3aGVuIGEgdGVybSdzIHN0YXRpYyB0aHJlc2hvbGQgaXMgYnJlYWNoZWQgYnkgdGhlIGFjdHVhbCBzaWduYWwsIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2xvc2UgdGhlIHByZWRpY3Rpb24gaW5jaWRlbnQgYW5kIG9wZW4gYSBzdGF0aWMgaW5jaWRlbnQuIFNldHRpbmcgYHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbmAgdG8gYHRydWVgIG92ZXJyaWRlcyB0aGlzIGJlaGF2aW9yIGxlYXZpbmcgdGhlIHByZWRpY3Rpb24gaW5jaWRlbnQgb3BlbiBhbmQgcHJldmVudGluZyBhIHN0YXRpYyBpbmNpZGVudCBmcm9tIG9wZW5pbmcuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jcHJlZmVyX3ByZWRpY3Rpb25fdmlvbGF0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb259XG4gICovXG4gIHJlYWRvbmx5IHByZWZlclByZWRpY3Rpb25WaW9sYXRpb24/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25UZXJtUHJlZGljdGlvblRvVGVycmFmb3JtKHN0cnVjdD86IE5ycWxBbGVydENvbmRpdGlvblRlcm1QcmVkaWN0aW9uT3V0cHV0UmVmZXJlbmNlIHwgTnJxbEFsZXJ0Q29uZGl0aW9uVGVybVByZWRpY3Rpb24pOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHJlZGljdF9ieTogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5wcmVkaWN0QnkpLFxuICAgIHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbjogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEucHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbiksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gbnJxbEFsZXJ0Q29uZGl0aW9uVGVybVByZWRpY3Rpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBOcnFsQWxlcnRDb25kaXRpb25UZXJtUHJlZGljdGlvbk91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvblRlcm1QcmVkaWN0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBwcmVkaWN0X2J5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wcmVkaWN0QnkpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbjoge1xuICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnByZWZlclByZWRpY3Rpb25WaW9sYXRpb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ycWxBbGVydENvbmRpdGlvblRlcm1QcmVkaWN0aW9uT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBOcnFsQWxlcnRDb25kaXRpb25UZXJtUHJlZGljdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fcHJlZGljdEJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnByZWRpY3RCeSA9IHRoaXMuX3ByZWRpY3RCeTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbiA9IHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb247XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25UZXJtUHJlZGljdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3ByZWRpY3RCeSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX3ByZWRpY3RCeSA9IHZhbHVlLnByZWRpY3RCeTtcbiAgICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB2YWx1ZS5wcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByZWRpY3RfYnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcHJlZGljdEJ5PzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBwcmVkaWN0QnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdwcmVkaWN0X2J5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBwcmVkaWN0QnkodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3ByZWRpY3RCeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFByZWRpY3RCeSgpIHtcbiAgICB0aGlzLl9wcmVkaWN0QnkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHByZWRpY3RCeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVkaWN0Qnk7XG4gIH1cblxuICAvLyBwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbj86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgcHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IHByZWZlclByZWRpY3Rpb25WaW9sYXRpb24odmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRQcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uKCkge1xuICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHByZWZlclByZWRpY3Rpb25WaW9sYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbjtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBOcnFsQWxlcnRDb25kaXRpb25UZXJtIHtcbiAgLyoqXG4gICogVmlvbGF0aW9ucyB3aWxsIG5vdCBjaGFuZ2Ugc3lzdGVtIGhlYWx0aCBzdGF0dXMgZm9yIHRoaXMgdGVybS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nIE5ycWxBbGVydENvbmRpdGlvbiNkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nfVxuICAqL1xuICByZWFkb25seSBkaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBJbiBtaW51dGVzLCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiAxIHRvIDEyMCAoaW5jbHVzaXZlKS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNkdXJhdGlvbiBOcnFsQWxlcnRDb25kaXRpb24jZHVyYXRpb259XG4gICovXG4gIHJlYWRvbmx5IGR1cmF0aW9uPzogbnVtYmVyO1xuICAvKipcbiAgKiBPbmUgb2YgKGFib3ZlLCBhYm92ZV9vcl9lcXVhbHMsIGJlbG93LCBiZWxvd19vcl9lcXVhbHMsIGVxdWFscywgbm90X2VxdWFscykuIERlZmF1bHRzIHRvICdlcXVhbHMnLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI29wZXJhdG9yIE5ycWxBbGVydENvbmRpdGlvbiNvcGVyYXRvcn1cbiAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I/OiBzdHJpbmc7XG4gIC8qKlxuICAqIE9uZSBvZiAoY3JpdGljYWwsIHdhcm5pbmcpLiBEZWZhdWx0cyB0byAnY3JpdGljYWwnLiBBdCBsZWFzdCBvbmUgY29uZGl0aW9uIHRlcm0gbXVzdCBoYXZlIHByaW9yaXR5IHNldCB0byAnY3JpdGljYWwnLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3ByaW9yaXR5IE5ycWxBbGVydENvbmRpdGlvbiNwcmlvcml0eX1cbiAgKi9cbiAgcmVhZG9ubHkgcHJpb3JpdHk/OiBzdHJpbmc7XG4gIC8qKlxuICAqIEZvciBiYXNlbGluZSBjb25kaXRpb25zIG11c3QgYmUgaW4gcmFuZ2UgWzEsIDEwMDBdLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3RocmVzaG9sZCBOcnFsQWxlcnRDb25kaXRpb24jdGhyZXNob2xkfVxuICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgLyoqXG4gICogVGhlIGR1cmF0aW9uLCBpbiBzZWNvbmRzLCB0aGF0IHRoZSB0aHJlc2hvbGQgbXVzdCB2aW9sYXRlIGluIG9yZGVyIHRvIGNyZWF0ZSBhbiBpbmNpZGVudC4gVmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSAnYWdncmVnYXRpb25fd2luZG93JyAod2hpY2ggaGFzIGEgZGVmYXVsdCBvZiA2MCBzZWNvbmRzKS4gVmFsdWUgbXVzdCBiZSB3aXRoaW4gMTIwLTg2NDAwIHNlY29uZHMgZm9yIGJhc2VsaW5lIGNvbmRpdGlvbnMsIGFuZCB3aXRoaW4gNjAtODY0MDAgc2Vjb25kcyBmb3Igc3RhdGljIGNvbmRpdGlvbnNcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN0aHJlc2hvbGRfZHVyYXRpb24gTnJxbEFsZXJ0Q29uZGl0aW9uI3RocmVzaG9sZF9kdXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgdGhyZXNob2xkRHVyYXRpb24/OiBudW1iZXI7XG4gIC8qKlxuICAqIFRoZSBjcml0ZXJpYSBmb3IgaG93IG1hbnkgZGF0YSBwb2ludHMgbXVzdCBiZSBpbiB2aW9sYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgdGhyZXNob2xkIGR1cmF0aW9uLiBWYWxpZCB2YWx1ZXMgYXJlOiAnQUxMJyBvciAnQVRfTEVBU1RfT05DRScgKGNhc2UgaW5zZW5zaXRpdmUpLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3RocmVzaG9sZF9vY2N1cnJlbmNlcyBOcnFsQWxlcnRDb25kaXRpb24jdGhyZXNob2xkX29jY3VycmVuY2VzfVxuICAqL1xuICByZWFkb25seSB0aHJlc2hvbGRPY2N1cnJlbmNlcz86IHN0cmluZztcbiAgLyoqXG4gICogVmFsaWQgdmFsdWVzIGFyZTogJ2FsbCcgb3IgJ2FueSdcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN0aW1lX2Z1bmN0aW9uIE5ycWxBbGVydENvbmRpdGlvbiN0aW1lX2Z1bmN0aW9ufVxuICAqL1xuICByZWFkb25seSB0aW1lRnVuY3Rpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAqIHByZWRpY3Rpb24gYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNwcmVkaWN0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNwcmVkaWN0aW9ufVxuICAqL1xuICByZWFkb25seSBwcmVkaWN0aW9uPzogTnJxbEFsZXJ0Q29uZGl0aW9uVGVybVByZWRpY3Rpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25UZXJtVG9UZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uVGVybSB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGRpc2FibGVfaGVhbHRoX3N0YXR1c19yZXBvcnRpbmc6IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmRpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcpLFxuICAgIGR1cmF0aW9uOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmR1cmF0aW9uKSxcbiAgICBvcGVyYXRvcjogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5vcGVyYXRvciksXG4gICAgcHJpb3JpdHk6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEucHJpb3JpdHkpLFxuICAgIHRocmVzaG9sZDogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGQpLFxuICAgIHRocmVzaG9sZF9kdXJhdGlvbjogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGREdXJhdGlvbiksXG4gICAgdGhyZXNob2xkX29jY3VycmVuY2VzOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnRocmVzaG9sZE9jY3VycmVuY2VzKSxcbiAgICB0aW1lX2Z1bmN0aW9uOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnRpbWVGdW5jdGlvbiksXG4gICAgcHJlZGljdGlvbjogbnJxbEFsZXJ0Q29uZGl0aW9uVGVybVByZWRpY3Rpb25Ub1RlcnJhZm9ybShzdHJ1Y3QhLnByZWRpY3Rpb24pLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG5ycWxBbGVydENvbmRpdGlvblRlcm1Ub0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBOcnFsQWxlcnRDb25kaXRpb25UZXJtIHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGRpc2FibGVfaGVhbHRoX3N0YXR1c19yZXBvcnRpbmc6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgZHVyYXRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmR1cmF0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBvcGVyYXRvcjoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEub3BlcmF0b3IpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHByaW9yaXR5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wcmlvcml0eSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdGhyZXNob2xkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHRocmVzaG9sZF9kdXJhdGlvbjoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkRHVyYXRpb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHRocmVzaG9sZF9vY2N1cnJlbmNlczoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkT2NjdXJyZW5jZXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHRpbWVfZnVuY3Rpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRpbWVGdW5jdGlvbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgcHJlZGljdGlvbjoge1xuICAgICAgdmFsdWU6IG5ycWxBbGVydENvbmRpdGlvblRlcm1QcmVkaWN0aW9uVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wcmVkaWN0aW9uKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJOcnFsQWxlcnRDb25kaXRpb25UZXJtUHJlZGljdGlvbkxpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgTnJxbEFsZXJ0Q29uZGl0aW9uVGVybU91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0bi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBOcnFsQWxlcnRDb25kaXRpb25UZXJtIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcgPSB0aGlzLl9kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZHVyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZHVyYXRpb24gPSB0aGlzLl9kdXJhdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29wZXJhdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm9wZXJhdG9yID0gdGhpcy5fb3BlcmF0b3I7XG4gICAgfVxuICAgIGlmICh0aGlzLl9wcmlvcml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5wcmlvcml0eSA9IHRoaXMuX3ByaW9yaXR5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRocmVzaG9sZCA9IHRoaXMuX3RocmVzaG9sZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RocmVzaG9sZER1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRocmVzaG9sZER1cmF0aW9uID0gdGhpcy5fdGhyZXNob2xkRHVyYXRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHRoaXMuX3RocmVzaG9sZE9jY3VycmVuY2VzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGltZUZ1bmN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRpbWVGdW5jdGlvbiA9IHRoaXMuX3RpbWVGdW5jdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ByZWRpY3Rpb24/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucHJlZGljdGlvbiA9IHRoaXMuX3ByZWRpY3Rpb24/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25UZXJtIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX29wZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcHJpb3JpdHkgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90aHJlc2hvbGQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90aHJlc2hvbGREdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RocmVzaG9sZE9jY3VycmVuY2VzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGltZUZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcHJlZGljdGlvbi5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcgPSB2YWx1ZS5kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nO1xuICAgICAgdGhpcy5fZHVyYXRpb24gPSB2YWx1ZS5kdXJhdGlvbjtcbiAgICAgIHRoaXMuX29wZXJhdG9yID0gdmFsdWUub3BlcmF0b3I7XG4gICAgICB0aGlzLl9wcmlvcml0eSA9IHZhbHVlLnByaW9yaXR5O1xuICAgICAgdGhpcy5fdGhyZXNob2xkID0gdmFsdWUudGhyZXNob2xkO1xuICAgICAgdGhpcy5fdGhyZXNob2xkRHVyYXRpb24gPSB2YWx1ZS50aHJlc2hvbGREdXJhdGlvbjtcbiAgICAgIHRoaXMuX3RocmVzaG9sZE9jY3VycmVuY2VzID0gdmFsdWUudGhyZXNob2xkT2NjdXJyZW5jZXM7XG4gICAgICB0aGlzLl90aW1lRnVuY3Rpb24gPSB2YWx1ZS50aW1lRnVuY3Rpb247XG4gICAgICB0aGlzLl9wcmVkaWN0aW9uLmludGVybmFsVmFsdWUgPSB2YWx1ZS5wcmVkaWN0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8vIGRpc2FibGVfaGVhbHRoX3N0YXR1c19yZXBvcnRpbmcgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZz86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nJyk7XG4gIH1cbiAgcHVibGljIHNldCBkaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZygpIHtcbiAgICB0aGlzLl9kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmc7XG4gIH1cblxuICAvLyBkdXJhdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kdXJhdGlvbj86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgZHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdkdXJhdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgZHVyYXRpb24odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2R1cmF0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RHVyYXRpb24oKSB7XG4gICAgdGhpcy5fZHVyYXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGR1cmF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2R1cmF0aW9uO1xuICB9XG5cbiAgLy8gb3BlcmF0b3IgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfb3BlcmF0b3I/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IG9wZXJhdG9yKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnb3BlcmF0b3InKTtcbiAgfVxuICBwdWJsaWMgc2V0IG9wZXJhdG9yKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9vcGVyYXRvciA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE9wZXJhdG9yKCkge1xuICAgIHRoaXMuX29wZXJhdG9yID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBvcGVyYXRvcklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9vcGVyYXRvcjtcbiAgfVxuXG4gIC8vIHByaW9yaXR5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3ByaW9yaXR5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBwcmlvcml0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3ByaW9yaXR5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBwcmlvcml0eSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcHJpb3JpdHkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRQcmlvcml0eSgpIHtcbiAgICB0aGlzLl9wcmlvcml0eSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcHJpb3JpdHlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJpb3JpdHk7XG4gIH1cblxuICAvLyB0aHJlc2hvbGQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdGhyZXNob2xkPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCB0aHJlc2hvbGQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCd0aHJlc2hvbGQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRocmVzaG9sZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aHJlc2hvbGQ7XG4gIH1cblxuICAvLyB0aHJlc2hvbGRfZHVyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGhyZXNob2xkRHVyYXRpb24/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgndGhyZXNob2xkX2R1cmF0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGREdXJhdGlvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkRHVyYXRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaHJlc2hvbGREdXJhdGlvbigpIHtcbiAgICB0aGlzLl90aHJlc2hvbGREdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkRHVyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhyZXNob2xkRHVyYXRpb247XG4gIH1cblxuICAvLyB0aHJlc2hvbGRfb2NjdXJyZW5jZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGhyZXNob2xkT2NjdXJyZW5jZXM/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZE9jY3VycmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGhyZXNob2xkX29jY3VycmVuY2VzJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGRPY2N1cnJlbmNlcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkT2NjdXJyZW5jZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaHJlc2hvbGRPY2N1cnJlbmNlcygpIHtcbiAgICB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkT2NjdXJyZW5jZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhyZXNob2xkT2NjdXJyZW5jZXM7XG4gIH1cblxuICAvLyB0aW1lX2Z1bmN0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RpbWVGdW5jdGlvbj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGltZUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGltZV9mdW5jdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGltZUZ1bmN0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90aW1lRnVuY3Rpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaW1lRnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fdGltZUZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aW1lRnVuY3Rpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZUZ1bmN0aW9uO1xuICB9XG5cbiAgLy8gcHJlZGljdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wcmVkaWN0aW9uID0gbmV3IE5ycWxBbGVydENvbmRpdGlvblRlcm1QcmVkaWN0aW9uT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwicHJlZGljdGlvblwiKTtcbiAgcHVibGljIGdldCBwcmVkaWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVkaWN0aW9uO1xuICB9XG4gIHB1YmxpYyBwdXRQcmVkaWN0aW9uKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25UZXJtUHJlZGljdGlvbikge1xuICAgIHRoaXMuX3ByZWRpY3Rpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFByZWRpY3Rpb24oKSB7XG4gICAgdGhpcy5fcHJlZGljdGlvbi5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwcmVkaWN0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZWRpY3Rpb24uaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTnJxbEFsZXJ0Q29uZGl0aW9uVGVybUxpc3QgZXh0ZW5kcyBjZGt0bi5Db21wbGV4TGlzdCB7XG4gIHB1YmxpYyBpbnRlcm5hbFZhbHVlPyA6IE5ycWxBbGVydENvbmRpdGlvblRlcm1bXSB8IGNka3RuLklSZXNvbHZhYmxlXG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIHdyYXBzU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCBwcm90ZWN0ZWQgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIHByb3RlY3RlZCB3cmFwc1NldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIHdyYXBzU2V0KVxuICB9XG5cbiAgLyoqXG4gICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm5cbiAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogTnJxbEFsZXJ0Q29uZGl0aW9uVGVybU91dHB1dFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBOcnFsQWxlcnRDb25kaXRpb25UZXJtT3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgTnJxbEFsZXJ0Q29uZGl0aW9uVGltZW91dHMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jY3JlYXRlIE5ycWxBbGVydENvbmRpdGlvbiNjcmVhdGV9XG4gICovXG4gIHJlYWRvbmx5IGNyZWF0ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ycWxBbGVydENvbmRpdGlvblRpbWVvdXRzVG9UZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uVGltZW91dHMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjcmVhdGU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY3JlYXRlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25UaW1lb3V0c1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IE5ycWxBbGVydENvbmRpdGlvblRpbWVvdXRzIHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGNyZWF0ZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuY3JlYXRlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ycWxBbGVydENvbmRpdGlvblRpbWVvdXRzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICBwcml2YXRlIHJlc29sdmFibGVWYWx1ZT86IGNka3RuLklSZXNvbHZhYmxlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBOcnFsQWxlcnRDb25kaXRpb25UaW1lb3V0cyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fY3JlYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNyZWF0ZSA9IHRoaXMuX2NyZWF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IE5ycWxBbGVydENvbmRpdGlvblRpbWVvdXRzIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NyZWF0ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jcmVhdGUgPSB2YWx1ZS5jcmVhdGU7XG4gICAgfVxuICB9XG5cbiAgLy8gY3JlYXRlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2NyZWF0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgY3JlYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY3JlYXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCBjcmVhdGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NyZWF0ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENyZWF0ZSgpIHtcbiAgICB0aGlzLl9jcmVhdGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNyZWF0ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ1ByZWRpY3Rpb24ge1xuICAvKipcbiAgKiBCRVRBIFBSRVZJRVc6IHRoZSBgcHJlZGljdF9ieWAgZmllbGQgaXMgaW4gbGltaXRlZCByZWxlYXNlIGFuZCBvbmx5IGVuYWJsZWQgZm9yIHByZXZpZXcgb24gYSBwZXItYWNjb3VudCBiYXNpcy4gLSBUaGUgZHVyYXRpb24sIGluIHNlY29uZHMsIHRoYXQgdGhlIHByZWRpY3Rpb24gc2hvdWxkIGxvb2sgaW50byB0aGUgZnV0dXJlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3ByZWRpY3RfYnkgTnJxbEFsZXJ0Q29uZGl0aW9uI3ByZWRpY3RfYnl9XG4gICovXG4gIHJlYWRvbmx5IHByZWRpY3RCeT86IG51bWJlcjtcbiAgLyoqXG4gICogQkVUQSBQUkVWSUVXOiB0aGUgYHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbmAgZmllbGQgaXMgaW4gbGltaXRlZCByZWxlYXNlIGFuZCBvbmx5IGVuYWJsZWQgZm9yIHByZXZpZXcgb24gYSBwZXItYWNjb3VudCBiYXNpcy4gLSBJZiBhIHByZWRpY3Rpb24gaW5jaWRlbnQgaXMgb3BlbiB3aGVuIGEgdGVybSdzIHN0YXRpYyB0aHJlc2hvbGQgaXMgYnJlYWNoZWQgYnkgdGhlIGFjdHVhbCBzaWduYWwsIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gY2xvc2UgdGhlIHByZWRpY3Rpb24gaW5jaWRlbnQgYW5kIG9wZW4gYSBzdGF0aWMgaW5jaWRlbnQuIFNldHRpbmcgYHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbmAgdG8gYHRydWVgIG92ZXJyaWRlcyB0aGlzIGJlaGF2aW9yIGxlYXZpbmcgdGhlIHByZWRpY3Rpb24gaW5jaWRlbnQgb3BlbiBhbmQgcHJldmVudGluZyBhIHN0YXRpYyBpbmNpZGVudCBmcm9tIG9wZW5pbmcuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jcHJlZmVyX3ByZWRpY3Rpb25fdmlvbGF0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb259XG4gICovXG4gIHJlYWRvbmx5IHByZWZlclByZWRpY3Rpb25WaW9sYXRpb24/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25XYXJuaW5nUHJlZGljdGlvblRvVGVycmFmb3JtKHN0cnVjdD86IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmdQcmVkaWN0aW9uT3V0cHV0UmVmZXJlbmNlIHwgTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ1ByZWRpY3Rpb24pOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHJlZGljdF9ieTogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5wcmVkaWN0QnkpLFxuICAgIHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbjogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEucHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbiksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gbnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ1ByZWRpY3Rpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBOcnFsQWxlcnRDb25kaXRpb25XYXJuaW5nUHJlZGljdGlvbk91dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmdQcmVkaWN0aW9uKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBwcmVkaWN0X2J5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5wcmVkaWN0QnkpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHByZWZlcl9wcmVkaWN0aW9uX3Zpb2xhdGlvbjoge1xuICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnByZWZlclByZWRpY3Rpb25WaW9sYXRpb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmdQcmVkaWN0aW9uT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBOcnFsQWxlcnRDb25kaXRpb25XYXJuaW5nUHJlZGljdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fcHJlZGljdEJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnByZWRpY3RCeSA9IHRoaXMuX3ByZWRpY3RCeTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbiA9IHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb247XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25XYXJuaW5nUHJlZGljdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3ByZWRpY3RCeSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX3ByZWRpY3RCeSA9IHZhbHVlLnByZWRpY3RCeTtcbiAgICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB2YWx1ZS5wcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByZWRpY3RfYnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcHJlZGljdEJ5PzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBwcmVkaWN0QnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdwcmVkaWN0X2J5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBwcmVkaWN0QnkodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3ByZWRpY3RCeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFByZWRpY3RCeSgpIHtcbiAgICB0aGlzLl9wcmVkaWN0QnkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHByZWRpY3RCeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVkaWN0Qnk7XG4gIH1cblxuICAvLyBwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbj86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgcHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdwcmVmZXJfcHJlZGljdGlvbl92aW9sYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IHByZWZlclByZWRpY3Rpb25WaW9sYXRpb24odmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRQcmVmZXJQcmVkaWN0aW9uVmlvbGF0aW9uKCkge1xuICAgIHRoaXMuX3ByZWZlclByZWRpY3Rpb25WaW9sYXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHByZWZlclByZWRpY3Rpb25WaW9sYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcHJlZmVyUHJlZGljdGlvblZpb2xhdGlvbjtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBOcnFsQWxlcnRDb25kaXRpb25XYXJuaW5nIHtcbiAgLyoqXG4gICogVmlvbGF0aW9ucyB3aWxsIG5vdCBjaGFuZ2Ugc3lzdGVtIGhlYWx0aCBzdGF0dXMgZm9yIHRoaXMgdGVybS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nIE5ycWxBbGVydENvbmRpdGlvbiNkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nfVxuICAqL1xuICByZWFkb25seSBkaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBJbiBtaW51dGVzLCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiAxIHRvIDEyMCAoaW5jbHVzaXZlKS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNkdXJhdGlvbiBOcnFsQWxlcnRDb25kaXRpb24jZHVyYXRpb259XG4gICovXG4gIHJlYWRvbmx5IGR1cmF0aW9uPzogbnVtYmVyO1xuICAvKipcbiAgKiBPbmUgb2YgKGFib3ZlLCBhYm92ZV9vcl9lcXVhbHMsIGJlbG93LCBiZWxvd19vcl9lcXVhbHMsIGVxdWFscywgbm90X2VxdWFscykuIERlZmF1bHRzIHRvICdlcXVhbHMnLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI29wZXJhdG9yIE5ycWxBbGVydENvbmRpdGlvbiNvcGVyYXRvcn1cbiAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0b3I/OiBzdHJpbmc7XG4gIC8qKlxuICAqIEZvciBiYXNlbGluZSBjb25kaXRpb25zIG11c3QgYmUgaW4gcmFuZ2UgWzEsIDEwMDBdLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3RocmVzaG9sZCBOcnFsQWxlcnRDb25kaXRpb24jdGhyZXNob2xkfVxuICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgLyoqXG4gICogVGhlIGR1cmF0aW9uLCBpbiBzZWNvbmRzLCB0aGF0IHRoZSB0aHJlc2hvbGQgbXVzdCB2aW9sYXRlIGluIG9yZGVyIHRvIGNyZWF0ZSBhbiBpbmNpZGVudC4gVmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSAnYWdncmVnYXRpb25fd2luZG93JyAod2hpY2ggaGFzIGEgZGVmYXVsdCBvZiA2MCBzZWNvbmRzKS4gVmFsdWUgbXVzdCBiZSB3aXRoaW4gMTIwLTg2NDAwIHNlY29uZHMgZm9yIGJhc2VsaW5lIGNvbmRpdGlvbnMsIGFuZCB3aXRoaW4gNjAtODY0MDAgc2Vjb25kcyBmb3Igc3RhdGljIGNvbmRpdGlvbnNcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN0aHJlc2hvbGRfZHVyYXRpb24gTnJxbEFsZXJ0Q29uZGl0aW9uI3RocmVzaG9sZF9kdXJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgdGhyZXNob2xkRHVyYXRpb24/OiBudW1iZXI7XG4gIC8qKlxuICAqIFRoZSBjcml0ZXJpYSBmb3IgaG93IG1hbnkgZGF0YSBwb2ludHMgbXVzdCBiZSBpbiB2aW9sYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgdGhyZXNob2xkIGR1cmF0aW9uLiBWYWxpZCB2YWx1ZXMgYXJlOiAnQUxMJyBvciAnQVRfTEVBU1RfT05DRScgKGNhc2UgaW5zZW5zaXRpdmUpLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uI3RocmVzaG9sZF9vY2N1cnJlbmNlcyBOcnFsQWxlcnRDb25kaXRpb24jdGhyZXNob2xkX29jY3VycmVuY2VzfVxuICAqL1xuICByZWFkb25seSB0aHJlc2hvbGRPY2N1cnJlbmNlcz86IHN0cmluZztcbiAgLyoqXG4gICogVmFsaWQgdmFsdWVzIGFyZTogJ2FsbCcgb3IgJ2FueSdcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiN0aW1lX2Z1bmN0aW9uIE5ycWxBbGVydENvbmRpdGlvbiN0aW1lX2Z1bmN0aW9ufVxuICAqL1xuICByZWFkb25seSB0aW1lRnVuY3Rpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAqIHByZWRpY3Rpb24gYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiNwcmVkaWN0aW9uIE5ycWxBbGVydENvbmRpdGlvbiNwcmVkaWN0aW9ufVxuICAqL1xuICByZWFkb25seSBwcmVkaWN0aW9uPzogTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ1ByZWRpY3Rpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25XYXJuaW5nVG9UZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ091dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmcpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZGlzYWJsZV9oZWFsdGhfc3RhdHVzX3JlcG9ydGluZzogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyksXG4gICAgZHVyYXRpb246IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEuZHVyYXRpb24pLFxuICAgIG9wZXJhdG9yOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm9wZXJhdG9yKSxcbiAgICB0aHJlc2hvbGQ6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkKSxcbiAgICB0aHJlc2hvbGRfZHVyYXRpb246IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkRHVyYXRpb24pLFxuICAgIHRocmVzaG9sZF9vY2N1cnJlbmNlczogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGRPY2N1cnJlbmNlcyksXG4gICAgdGltZV9mdW5jdGlvbjogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50aW1lRnVuY3Rpb24pLFxuICAgIHByZWRpY3Rpb246IG5ycWxBbGVydENvbmRpdGlvbldhcm5pbmdQcmVkaWN0aW9uVG9UZXJyYWZvcm0oc3RydWN0IS5wcmVkaWN0aW9uKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBucnFsQWxlcnRDb25kaXRpb25XYXJuaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ091dHB1dFJlZmVyZW5jZSB8IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmcpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGRpc2FibGVfaGVhbHRoX3N0YXR1c19yZXBvcnRpbmc6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgZHVyYXRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmR1cmF0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBvcGVyYXRvcjoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEub3BlcmF0b3IpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHRocmVzaG9sZDoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICB0aHJlc2hvbGRfZHVyYXRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRocmVzaG9sZER1cmF0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICB0aHJlc2hvbGRfb2NjdXJyZW5jZXM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRocmVzaG9sZE9jY3VycmVuY2VzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0aW1lX2Z1bmN0aW9uOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50aW1lRnVuY3Rpb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHByZWRpY3Rpb246IHtcbiAgICAgIHZhbHVlOiBucnFsQWxlcnRDb25kaXRpb25XYXJuaW5nUHJlZGljdGlvblRvSGNsVGVycmFmb3JtKHN0cnVjdCEucHJlZGljdGlvbiksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ1ByZWRpY3Rpb25MaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmdPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyA9IHRoaXMuX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmc7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kdXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5kdXJhdGlvbiA9IHRoaXMuX2R1cmF0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5fb3BlcmF0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQub3BlcmF0b3IgPSB0aGlzLl9vcGVyYXRvcjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50aHJlc2hvbGQgPSB0aGlzLl90aHJlc2hvbGQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl90aHJlc2hvbGREdXJhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50aHJlc2hvbGREdXJhdGlvbiA9IHRoaXMuX3RocmVzaG9sZER1cmF0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGhyZXNob2xkT2NjdXJyZW5jZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGhyZXNob2xkT2NjdXJyZW5jZXMgPSB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RpbWVGdW5jdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50aW1lRnVuY3Rpb24gPSB0aGlzLl90aW1lRnVuY3Rpb247XG4gICAgfVxuICAgIGlmICh0aGlzLl9wcmVkaWN0aW9uPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnByZWRpY3Rpb24gPSB0aGlzLl9wcmVkaWN0aW9uPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX29wZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGhyZXNob2xkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGhyZXNob2xkRHVyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RpbWVGdW5jdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3ByZWRpY3Rpb24uaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyA9IHZhbHVlLmRpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmc7XG4gICAgICB0aGlzLl9kdXJhdGlvbiA9IHZhbHVlLmR1cmF0aW9uO1xuICAgICAgdGhpcy5fb3BlcmF0b3IgPSB2YWx1ZS5vcGVyYXRvcjtcbiAgICAgIHRoaXMuX3RocmVzaG9sZCA9IHZhbHVlLnRocmVzaG9sZDtcbiAgICAgIHRoaXMuX3RocmVzaG9sZER1cmF0aW9uID0gdmFsdWUudGhyZXNob2xkRHVyYXRpb247XG4gICAgICB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHZhbHVlLnRocmVzaG9sZE9jY3VycmVuY2VzO1xuICAgICAgdGhpcy5fdGltZUZ1bmN0aW9uID0gdmFsdWUudGltZUZ1bmN0aW9uO1xuICAgICAgdGhpcy5fcHJlZGljdGlvbi5pbnRlcm5hbFZhbHVlID0gdmFsdWUucHJlZGljdGlvbjtcbiAgICB9XG4gIH1cblxuICAvLyBkaXNhYmxlX2hlYWx0aF9zdGF0dXNfcmVwb3J0aW5nIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2Rpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmc/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGRpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZGlzYWJsZV9oZWFsdGhfc3RhdHVzX3JlcG9ydGluZycpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERpc2FibGVIZWFsdGhTdGF0dXNSZXBvcnRpbmcoKSB7XG4gICAgdGhpcy5fZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZGlzYWJsZUhlYWx0aFN0YXR1c1JlcG9ydGluZ0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlSGVhbHRoU3RhdHVzUmVwb3J0aW5nO1xuICB9XG5cbiAgLy8gZHVyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZHVyYXRpb24/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGR1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnZHVyYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGR1cmF0aW9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9kdXJhdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldER1cmF0aW9uKCkge1xuICAgIHRoaXMuX2R1cmF0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkdXJhdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kdXJhdGlvbjtcbiAgfVxuXG4gIC8vIG9wZXJhdG9yIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX29wZXJhdG9yPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBvcGVyYXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ29wZXJhdG9yJyk7XG4gIH1cbiAgcHVibGljIHNldCBvcGVyYXRvcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fb3BlcmF0b3IgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRPcGVyYXRvcigpIHtcbiAgICB0aGlzLl9vcGVyYXRvciA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgb3BlcmF0b3JJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0b3I7XG4gIH1cblxuICAvLyB0aHJlc2hvbGQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdGhyZXNob2xkPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCB0aHJlc2hvbGQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCd0aHJlc2hvbGQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRocmVzaG9sZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aHJlc2hvbGQ7XG4gIH1cblxuICAvLyB0aHJlc2hvbGRfZHVyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGhyZXNob2xkRHVyYXRpb24/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZER1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgndGhyZXNob2xkX2R1cmF0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGREdXJhdGlvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkRHVyYXRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaHJlc2hvbGREdXJhdGlvbigpIHtcbiAgICB0aGlzLl90aHJlc2hvbGREdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkRHVyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhyZXNob2xkRHVyYXRpb247XG4gIH1cblxuICAvLyB0aHJlc2hvbGRfb2NjdXJyZW5jZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGhyZXNob2xkT2NjdXJyZW5jZXM/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZE9jY3VycmVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGhyZXNob2xkX29jY3VycmVuY2VzJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGRPY2N1cnJlbmNlcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkT2NjdXJyZW5jZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaHJlc2hvbGRPY2N1cnJlbmNlcygpIHtcbiAgICB0aGlzLl90aHJlc2hvbGRPY2N1cnJlbmNlcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkT2NjdXJyZW5jZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhyZXNob2xkT2NjdXJyZW5jZXM7XG4gIH1cblxuICAvLyB0aW1lX2Z1bmN0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RpbWVGdW5jdGlvbj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGltZUZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGltZV9mdW5jdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGltZUZ1bmN0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90aW1lRnVuY3Rpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaW1lRnVuY3Rpb24oKSB7XG4gICAgdGhpcy5fdGltZUZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aW1lRnVuY3Rpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZUZ1bmN0aW9uO1xuICB9XG5cbiAgLy8gcHJlZGljdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9wcmVkaWN0aW9uID0gbmV3IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmdQcmVkaWN0aW9uT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwicHJlZGljdGlvblwiKTtcbiAgcHVibGljIGdldCBwcmVkaWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9wcmVkaWN0aW9uO1xuICB9XG4gIHB1YmxpYyBwdXRQcmVkaWN0aW9uKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25XYXJuaW5nUHJlZGljdGlvbikge1xuICAgIHRoaXMuX3ByZWRpY3Rpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFByZWRpY3Rpb24oKSB7XG4gICAgdGhpcy5fcHJlZGljdGlvbi5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwcmVkaWN0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ByZWRpY3Rpb24uaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiogUmVwcmVzZW50cyBhIHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL25ycWxfYWxlcnRfY29uZGl0aW9uIG5ld3JlbGljX25ycWxfYWxlcnRfY29uZGl0aW9ufVxuKi9cbmV4cG9ydCBjbGFzcyBOcnFsQWxlcnRDb25kaXRpb24gZXh0ZW5kcyBjZGt0bi5UZXJyYWZvcm1SZXNvdXJjZSB7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT1cbiAgLy8gU1RBVElDIFBST1BFUlRJRVNcbiAgLy8gPT09PT09PT09PT09PT09PT1cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSB0ZlJlc291cmNlVHlwZSA9IFwibmV3cmVsaWNfbnJxbF9hbGVydF9jb25kaXRpb25cIjtcblxuICAvLyA9PT09PT09PT09PT09PVxuICAvLyBTVEFUSUMgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PVxuICAvKipcbiAgKiBHZW5lcmF0ZXMgQ0RLVE4gY29kZSBmb3IgaW1wb3J0aW5nIGEgTnJxbEFsZXJ0Q29uZGl0aW9uIHJlc291cmNlIHVwb24gcnVubmluZyBcImNka3RuIHBsYW4gPHN0YWNrLW5hbWU+XCJcbiAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAqIEBwYXJhbSBpbXBvcnRUb0lkIFRoZSBjb25zdHJ1Y3QgaWQgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvbmZpZyBmb3IgdGhlIE5ycWxBbGVydENvbmRpdGlvbiB0byBpbXBvcnRcbiAgKiBAcGFyYW0gaW1wb3J0RnJvbUlkIFRoZSBpZCBvZiB0aGUgZXhpc3RpbmcgTnJxbEFsZXJ0Q29uZGl0aW9uIHRoYXQgc2hvdWxkIGJlIGltcG9ydGVkLiBSZWZlciB0byB0aGUge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvbnJxbF9hbGVydF9jb25kaXRpb24jaW1wb3J0IGltcG9ydCBzZWN0aW9ufSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIHJlc291cmNlIGZvciB0aGUgaWQgdG8gdXNlXG4gICogQHBhcmFtIHByb3ZpZGVyPyBPcHRpb25hbCBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZXIgd2hlcmUgdGhlIE5ycWxBbGVydENvbmRpdGlvbiB0byBpbXBvcnQgaXMgZm91bmRcbiAgKi9cbiAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUNvbmZpZ0ZvckltcG9ydChzY29wZTogQ29uc3RydWN0LCBpbXBvcnRUb0lkOiBzdHJpbmcsIGltcG9ydEZyb21JZDogc3RyaW5nLCBwcm92aWRlcj86IGNka3RuLlRlcnJhZm9ybVByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2RrdG4uSW1wb3J0YWJsZVJlc291cmNlKHNjb3BlLCBpbXBvcnRUb0lkLCB7IHRlcnJhZm9ybVJlc291cmNlVHlwZTogXCJuZXdyZWxpY19ucnFsX2FsZXJ0X2NvbmRpdGlvblwiLCBpbXBvcnRJZDogaW1wb3J0RnJvbUlkLCBwcm92aWRlciB9KTtcbiAgICAgIH1cblxuICAvLyA9PT09PT09PT09PVxuICAvLyBJTklUSUFMSVpFUlxuICAvLyA9PT09PT09PT09PVxuXG4gIC8qKlxuICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9ucnFsX2FsZXJ0X2NvbmRpdGlvbiBuZXdyZWxpY19ucnFsX2FsZXJ0X2NvbmRpdGlvbn0gUmVzb3VyY2VcbiAgKlxuICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICogQHBhcmFtIGlkIFRoZSBzY29wZWQgY29uc3RydWN0IElELiBNdXN0IGJlIHVuaXF1ZSBhbW9uZ3N0IHNpYmxpbmdzIGluIHRoZSBzYW1lIHNjb3BlXG4gICogQHBhcmFtIG9wdGlvbnMgTnJxbEFsZXJ0Q29uZGl0aW9uQ29uZmlnXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25maWc6IE5ycWxBbGVydENvbmRpdGlvbkNvbmZpZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiAnbmV3cmVsaWNfbnJxbF9hbGVydF9jb25kaXRpb24nLFxuICAgICAgdGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXJOYW1lOiAnbmV3cmVsaWMnLFxuICAgICAgICBwcm92aWRlclZlcnNpb246ICczLjgwLjInLFxuICAgICAgICBwcm92aWRlclZlcnNpb25Db25zdHJhaW50OiAnfj4gMy43J1xuICAgICAgfSxcbiAgICAgIHByb3ZpZGVyOiBjb25maWcucHJvdmlkZXIsXG4gICAgICBkZXBlbmRzT246IGNvbmZpZy5kZXBlbmRzT24sXG4gICAgICBjb3VudDogY29uZmlnLmNvdW50LFxuICAgICAgbGlmZWN5Y2xlOiBjb25maWcubGlmZWN5Y2xlLFxuICAgICAgcHJvdmlzaW9uZXJzOiBjb25maWcucHJvdmlzaW9uZXJzLFxuICAgICAgY29ubmVjdGlvbjogY29uZmlnLmNvbm5lY3Rpb24sXG4gICAgICBmb3JFYWNoOiBjb25maWcuZm9yRWFjaFxuICAgIH0pO1xuICAgIHRoaXMuX2FjY291bnRJZCA9IGNvbmZpZy5hY2NvdW50SWQ7XG4gICAgdGhpcy5fYWdncmVnYXRpb25EZWxheSA9IGNvbmZpZy5hZ2dyZWdhdGlvbkRlbGF5O1xuICAgIHRoaXMuX2FnZ3JlZ2F0aW9uTWV0aG9kID0gY29uZmlnLmFnZ3JlZ2F0aW9uTWV0aG9kO1xuICAgIHRoaXMuX2FnZ3JlZ2F0aW9uVGltZXIgPSBjb25maWcuYWdncmVnYXRpb25UaW1lcjtcbiAgICB0aGlzLl9hZ2dyZWdhdGlvbldpbmRvdyA9IGNvbmZpZy5hZ2dyZWdhdGlvbldpbmRvdztcbiAgICB0aGlzLl9iYXNlbGluZURpcmVjdGlvbiA9IGNvbmZpZy5iYXNlbGluZURpcmVjdGlvbjtcbiAgICB0aGlzLl9jbG9zZVZpb2xhdGlvbnNPbkV4cGlyYXRpb24gPSBjb25maWcuY2xvc2VWaW9sYXRpb25zT25FeHBpcmF0aW9uO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gY29uZmlnLmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2VuYWJsZWQgPSBjb25maWcuZW5hYmxlZDtcbiAgICB0aGlzLl9ldmFsdWF0aW9uRGVsYXkgPSBjb25maWcuZXZhbHVhdGlvbkRlbGF5O1xuICAgIHRoaXMuX2V4cGlyYXRpb25EdXJhdGlvbiA9IGNvbmZpZy5leHBpcmF0aW9uRHVyYXRpb247XG4gICAgdGhpcy5fZmlsbE9wdGlvbiA9IGNvbmZpZy5maWxsT3B0aW9uO1xuICAgIHRoaXMuX2ZpbGxWYWx1ZSA9IGNvbmZpZy5maWxsVmFsdWU7XG4gICAgdGhpcy5faWQgPSBjb25maWcuaWQ7XG4gICAgdGhpcy5faWdub3JlT25FeHBlY3RlZFRlcm1pbmF0aW9uID0gY29uZmlnLmlnbm9yZU9uRXhwZWN0ZWRUZXJtaW5hdGlvbjtcbiAgICB0aGlzLl9uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5fb3BlblZpb2xhdGlvbk9uRXhwaXJhdGlvbiA9IGNvbmZpZy5vcGVuVmlvbGF0aW9uT25FeHBpcmF0aW9uO1xuICAgIHRoaXMuX3BvbGljeUlkID0gY29uZmlnLnBvbGljeUlkO1xuICAgIHRoaXMuX3J1bmJvb2tVcmwgPSBjb25maWcucnVuYm9va1VybDtcbiAgICB0aGlzLl9zaWduYWxTZWFzb25hbGl0eSA9IGNvbmZpZy5zaWduYWxTZWFzb25hbGl0eTtcbiAgICB0aGlzLl9zbGlkZUJ5ID0gY29uZmlnLnNsaWRlQnk7XG4gICAgdGhpcy5fdGFyZ2V0RW50aXR5ID0gY29uZmlnLnRhcmdldEVudGl0eTtcbiAgICB0aGlzLl90aXRsZVRlbXBsYXRlID0gY29uZmlnLnRpdGxlVGVtcGxhdGU7XG4gICAgdGhpcy5fdHlwZSA9IGNvbmZpZy50eXBlO1xuICAgIHRoaXMuX3Zpb2xhdGlvblRpbWVMaW1pdCA9IGNvbmZpZy52aW9sYXRpb25UaW1lTGltaXQ7XG4gICAgdGhpcy5fdmlvbGF0aW9uVGltZUxpbWl0U2Vjb25kcyA9IGNvbmZpZy52aW9sYXRpb25UaW1lTGltaXRTZWNvbmRzO1xuICAgIHRoaXMuX2NyaXRpY2FsLmludGVybmFsVmFsdWUgPSBjb25maWcuY3JpdGljYWw7XG4gICAgdGhpcy5fbnJxbC5pbnRlcm5hbFZhbHVlID0gY29uZmlnLm5ycWw7XG4gICAgdGhpcy5fb3V0bGllckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5vdXRsaWVyQ29uZmlndXJhdGlvbjtcbiAgICB0aGlzLl90ZXJtLmludGVybmFsVmFsdWUgPSBjb25maWcudGVybTtcbiAgICB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLnRpbWVvdXRzO1xuICAgIHRoaXMuX3dhcm5pbmcuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy53YXJuaW5nO1xuICB9XG5cbiAgLy8gPT09PT09PT09PVxuICAvLyBBVFRSSUJVVEVTXG4gIC8vID09PT09PT09PT1cblxuICAvLyBhY2NvdW50X2lkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYWNjb3VudElkPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBhY2NvdW50SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdhY2NvdW50X2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBhY2NvdW50SWQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2FjY291bnRJZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEFjY291bnRJZCgpIHtcbiAgICB0aGlzLl9hY2NvdW50SWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGFjY291bnRJZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hY2NvdW50SWQ7XG4gIH1cblxuICAvLyBhZ2dyZWdhdGlvbl9kZWxheSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hZ2dyZWdhdGlvbkRlbGF5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBhZ2dyZWdhdGlvbkRlbGF5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnYWdncmVnYXRpb25fZGVsYXknKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFnZ3JlZ2F0aW9uRGVsYXkodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2FnZ3JlZ2F0aW9uRGVsYXkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBZ2dyZWdhdGlvbkRlbGF5KCkge1xuICAgIHRoaXMuX2FnZ3JlZ2F0aW9uRGVsYXkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uRGVsYXlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWdncmVnYXRpb25EZWxheTtcbiAgfVxuXG4gIC8vIGFnZ3JlZ2F0aW9uX21ldGhvZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hZ2dyZWdhdGlvbk1ldGhvZD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgYWdncmVnYXRpb25NZXRob2QoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdhZ2dyZWdhdGlvbl9tZXRob2QnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFnZ3JlZ2F0aW9uTWV0aG9kKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hZ2dyZWdhdGlvbk1ldGhvZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEFnZ3JlZ2F0aW9uTWV0aG9kKCkge1xuICAgIHRoaXMuX2FnZ3JlZ2F0aW9uTWV0aG9kID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhZ2dyZWdhdGlvbk1ldGhvZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hZ2dyZWdhdGlvbk1ldGhvZDtcbiAgfVxuXG4gIC8vIGFnZ3JlZ2F0aW9uX3RpbWVyIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2FnZ3JlZ2F0aW9uVGltZXI/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uVGltZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdhZ2dyZWdhdGlvbl90aW1lcicpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWdncmVnYXRpb25UaW1lcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYWdncmVnYXRpb25UaW1lciA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEFnZ3JlZ2F0aW9uVGltZXIoKSB7XG4gICAgdGhpcy5fYWdncmVnYXRpb25UaW1lciA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYWdncmVnYXRpb25UaW1lcklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hZ2dyZWdhdGlvblRpbWVyO1xuICB9XG5cbiAgLy8gYWdncmVnYXRpb25fd2luZG93IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYWdncmVnYXRpb25XaW5kb3c/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uV2luZG93KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnYWdncmVnYXRpb25fd2luZG93Jyk7XG4gIH1cbiAgcHVibGljIHNldCBhZ2dyZWdhdGlvbldpbmRvdyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fYWdncmVnYXRpb25XaW5kb3cgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBZ2dyZWdhdGlvbldpbmRvdygpIHtcbiAgICB0aGlzLl9hZ2dyZWdhdGlvbldpbmRvdyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYWdncmVnYXRpb25XaW5kb3dJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWdncmVnYXRpb25XaW5kb3c7XG4gIH1cblxuICAvLyBiYXNlbGluZV9kaXJlY3Rpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYmFzZWxpbmVEaXJlY3Rpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGJhc2VsaW5lRGlyZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnYmFzZWxpbmVfZGlyZWN0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBiYXNlbGluZURpcmVjdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYmFzZWxpbmVEaXJlY3Rpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRCYXNlbGluZURpcmVjdGlvbigpIHtcbiAgICB0aGlzLl9iYXNlbGluZURpcmVjdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYmFzZWxpbmVEaXJlY3Rpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYmFzZWxpbmVEaXJlY3Rpb247XG4gIH1cblxuICAvLyBjbG9zZV92aW9sYXRpb25zX29uX2V4cGlyYXRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY2xvc2VWaW9sYXRpb25zT25FeHBpcmF0aW9uPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBjbG9zZVZpb2xhdGlvbnNPbkV4cGlyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnY2xvc2VfdmlvbGF0aW9uc19vbl9leHBpcmF0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBjbG9zZVZpb2xhdGlvbnNPbkV4cGlyYXRpb24odmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2Nsb3NlVmlvbGF0aW9uc09uRXhwaXJhdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENsb3NlVmlvbGF0aW9uc09uRXhwaXJhdGlvbigpIHtcbiAgICB0aGlzLl9jbG9zZVZpb2xhdGlvbnNPbkV4cGlyYXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNsb3NlVmlvbGF0aW9uc09uRXhwaXJhdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jbG9zZVZpb2xhdGlvbnNPbkV4cGlyYXRpb247XG4gIH1cblxuICAvLyBkZXNjcmlwdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kZXNjcmlwdGlvbj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdkZXNjcmlwdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVzY3JpcHRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGVzY3JpcHRpb24oKSB7XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgLy8gZW5hYmxlZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9lbmFibGVkPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBlbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2VuYWJsZWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGVuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2VuYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFbmFibGVkKCkge1xuICAgIHRoaXMuX2VuYWJsZWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgfVxuXG4gIC8vIGVudGl0eV9ndWlkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgZW50aXR5R3VpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2VudGl0eV9ndWlkJyk7XG4gIH1cblxuICAvLyBldmFsdWF0aW9uX2RlbGF5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2V2YWx1YXRpb25EZWxheT86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgZXZhbHVhdGlvbkRlbGF5KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnZXZhbHVhdGlvbl9kZWxheScpO1xuICB9XG4gIHB1YmxpYyBzZXQgZXZhbHVhdGlvbkRlbGF5KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9ldmFsdWF0aW9uRGVsYXkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFdmFsdWF0aW9uRGVsYXkoKSB7XG4gICAgdGhpcy5fZXZhbHVhdGlvbkRlbGF5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBldmFsdWF0aW9uRGVsYXlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZXZhbHVhdGlvbkRlbGF5O1xuICB9XG5cbiAgLy8gZXhwaXJhdGlvbl9kdXJhdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9leHBpcmF0aW9uRHVyYXRpb24/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGV4cGlyYXRpb25EdXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2V4cGlyYXRpb25fZHVyYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4cGlyYXRpb25EdXJhdGlvbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZXhwaXJhdGlvbkR1cmF0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RXhwaXJhdGlvbkR1cmF0aW9uKCkge1xuICAgIHRoaXMuX2V4cGlyYXRpb25EdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZXhwaXJhdGlvbkR1cmF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2V4cGlyYXRpb25EdXJhdGlvbjtcbiAgfVxuXG4gIC8vIGZpbGxfb3B0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2ZpbGxPcHRpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGZpbGxPcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdmaWxsX29wdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgZmlsbE9wdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZmlsbE9wdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEZpbGxPcHRpb24oKSB7XG4gICAgdGhpcy5fZmlsbE9wdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZmlsbE9wdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9maWxsT3B0aW9uO1xuICB9XG5cbiAgLy8gZmlsbF92YWx1ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9maWxsVmFsdWU/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGZpbGxWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2ZpbGxfdmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZpbGxWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fZmlsbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RmlsbFZhbHVlKCkge1xuICAgIHRoaXMuX2ZpbGxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZmlsbFZhbHVlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbGxWYWx1ZTtcbiAgfVxuXG4gIC8vIGlkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldElkKCkge1xuICAgIHRoaXMuX2lkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIC8vIGlnbm9yZV9vbl9leHBlY3RlZF90ZXJtaW5hdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pZ25vcmVPbkV4cGVjdGVkVGVybWluYXRpb24/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGlnbm9yZU9uRXhwZWN0ZWRUZXJtaW5hdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdpZ25vcmVfb25fZXhwZWN0ZWRfdGVybWluYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlnbm9yZU9uRXhwZWN0ZWRUZXJtaW5hdGlvbih2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5faWdub3JlT25FeHBlY3RlZFRlcm1pbmF0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SWdub3JlT25FeHBlY3RlZFRlcm1pbmF0aW9uKCkge1xuICAgIHRoaXMuX2lnbm9yZU9uRXhwZWN0ZWRUZXJtaW5hdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaWdub3JlT25FeHBlY3RlZFRlcm1pbmF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lnbm9yZU9uRXhwZWN0ZWRUZXJtaW5hdGlvbjtcbiAgfVxuXG4gIC8vIG5hbWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbmFtZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbmFtZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLy8gb3Blbl92aW9sYXRpb25fb25fZXhwaXJhdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9vcGVuVmlvbGF0aW9uT25FeHBpcmF0aW9uPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBvcGVuVmlvbGF0aW9uT25FeHBpcmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ29wZW5fdmlvbGF0aW9uX29uX2V4cGlyYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IG9wZW5WaW9sYXRpb25PbkV4cGlyYXRpb24odmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX29wZW5WaW9sYXRpb25PbkV4cGlyYXRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRPcGVuVmlvbGF0aW9uT25FeHBpcmF0aW9uKCkge1xuICAgIHRoaXMuX29wZW5WaW9sYXRpb25PbkV4cGlyYXRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG9wZW5WaW9sYXRpb25PbkV4cGlyYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlblZpb2xhdGlvbk9uRXhwaXJhdGlvbjtcbiAgfVxuXG4gIC8vIHBvbGljeV9pZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9wb2xpY3lJZD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgcG9saWN5SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdwb2xpY3lfaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHBvbGljeUlkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9wb2xpY3lJZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBwb2xpY3lJZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9wb2xpY3lJZDtcbiAgfVxuXG4gIC8vIHJ1bmJvb2tfdXJsIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3J1bmJvb2tVcmw/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHJ1bmJvb2tVcmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdydW5ib29rX3VybCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgcnVuYm9va1VybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcnVuYm9va1VybCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFJ1bmJvb2tVcmwoKSB7XG4gICAgdGhpcy5fcnVuYm9va1VybCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcnVuYm9va1VybElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9ydW5ib29rVXJsO1xuICB9XG5cbiAgLy8gc2lnbmFsX3NlYXNvbmFsaXR5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NpZ25hbFNlYXNvbmFsaXR5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzaWduYWxTZWFzb25hbGl0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3NpZ25hbF9zZWFzb25hbGl0eScpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2lnbmFsU2Vhc29uYWxpdHkodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NpZ25hbFNlYXNvbmFsaXR5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U2lnbmFsU2Vhc29uYWxpdHkoKSB7XG4gICAgdGhpcy5fc2lnbmFsU2Vhc29uYWxpdHkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNpZ25hbFNlYXNvbmFsaXR5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbFNlYXNvbmFsaXR5O1xuICB9XG5cbiAgLy8gc2xpZGVfYnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc2xpZGVCeT86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgc2xpZGVCeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3NsaWRlX2J5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBzbGlkZUJ5KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9zbGlkZUJ5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U2xpZGVCeSgpIHtcbiAgICB0aGlzLl9zbGlkZUJ5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzbGlkZUJ5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NsaWRlQnk7XG4gIH1cblxuICAvLyB0YXJnZXRfZW50aXR5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RhcmdldEVudGl0eT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFyZ2V0RW50aXR5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGFyZ2V0X2VudGl0eScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGFyZ2V0RW50aXR5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YXJnZXRFbnRpdHkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUYXJnZXRFbnRpdHkoKSB7XG4gICAgdGhpcy5fdGFyZ2V0RW50aXR5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YXJnZXRFbnRpdHlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFyZ2V0RW50aXR5O1xuICB9XG5cbiAgLy8gdGl0bGVfdGVtcGxhdGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGl0bGVUZW1wbGF0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGl0bGVUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RpdGxlX3RlbXBsYXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aXRsZVRlbXBsYXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90aXRsZVRlbXBsYXRlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGl0bGVUZW1wbGF0ZSgpIHtcbiAgICB0aGlzLl90aXRsZVRlbXBsYXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aXRsZVRlbXBsYXRlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpdGxlVGVtcGxhdGU7XG4gIH1cblxuICAvLyB0eXBlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3R5cGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCB0eXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90eXBlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VHlwZSgpIHtcbiAgICB0aGlzLl90eXBlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0eXBlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICAvLyB2aW9sYXRpb25fdGltZV9saW1pdCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3Zpb2xhdGlvblRpbWVMaW1pdD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdmlvbGF0aW9uVGltZUxpbWl0KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndmlvbGF0aW9uX3RpbWVfbGltaXQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpb2xhdGlvblRpbWVMaW1pdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdmlvbGF0aW9uVGltZUxpbWl0ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VmlvbGF0aW9uVGltZUxpbWl0KCkge1xuICAgIHRoaXMuX3Zpb2xhdGlvblRpbWVMaW1pdCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdmlvbGF0aW9uVGltZUxpbWl0SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpb2xhdGlvblRpbWVMaW1pdDtcbiAgfVxuXG4gIC8vIHZpb2xhdGlvbl90aW1lX2xpbWl0X3NlY29uZHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdmlvbGF0aW9uVGltZUxpbWl0U2Vjb25kcz86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgdmlvbGF0aW9uVGltZUxpbWl0U2Vjb25kcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3Zpb2xhdGlvbl90aW1lX2xpbWl0X3NlY29uZHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZpb2xhdGlvblRpbWVMaW1pdFNlY29uZHModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3Zpb2xhdGlvblRpbWVMaW1pdFNlY29uZHMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRWaW9sYXRpb25UaW1lTGltaXRTZWNvbmRzKCkge1xuICAgIHRoaXMuX3Zpb2xhdGlvblRpbWVMaW1pdFNlY29uZHMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHZpb2xhdGlvblRpbWVMaW1pdFNlY29uZHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmlvbGF0aW9uVGltZUxpbWl0U2Vjb25kcztcbiAgfVxuXG4gIC8vIGNyaXRpY2FsIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2NyaXRpY2FsID0gbmV3IE5ycWxBbGVydENvbmRpdGlvbkNyaXRpY2FsT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiY3JpdGljYWxcIik7XG4gIHB1YmxpYyBnZXQgY3JpdGljYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NyaXRpY2FsO1xuICB9XG4gIHB1YmxpYyBwdXRDcml0aWNhbCh2YWx1ZTogTnJxbEFsZXJ0Q29uZGl0aW9uQ3JpdGljYWwpIHtcbiAgICB0aGlzLl9jcml0aWNhbC5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Q3JpdGljYWwoKSB7XG4gICAgdGhpcy5fY3JpdGljYWwuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY3JpdGljYWxJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3JpdGljYWwuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIG5ycWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbnJxbCA9IG5ldyBOcnFsQWxlcnRDb25kaXRpb25OcnFsT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwibnJxbFwiKTtcbiAgcHVibGljIGdldCBucnFsKCkge1xuICAgIHJldHVybiB0aGlzLl9ucnFsO1xuICB9XG4gIHB1YmxpYyBwdXROcnFsKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25OcnFsKSB7XG4gICAgdGhpcy5fbnJxbC5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG5ycWxJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbnJxbC5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gb3V0bGllcl9jb25maWd1cmF0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX291dGxpZXJDb25maWd1cmF0aW9uID0gbmV3IE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwib3V0bGllcl9jb25maWd1cmF0aW9uXCIpO1xuICBwdWJsaWMgZ2V0IG91dGxpZXJDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9vdXRsaWVyQ29uZmlndXJhdGlvbjtcbiAgfVxuICBwdWJsaWMgcHV0T3V0bGllckNvbmZpZ3VyYXRpb24odmFsdWU6IE5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5fb3V0bGllckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE91dGxpZXJDb25maWd1cmF0aW9uKCkge1xuICAgIHRoaXMuX291dGxpZXJDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG91dGxpZXJDb25maWd1cmF0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX291dGxpZXJDb25maWd1cmF0aW9uLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyB0ZXJtIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3Rlcm0gPSBuZXcgTnJxbEFsZXJ0Q29uZGl0aW9uVGVybUxpc3QodGhpcywgXCJ0ZXJtXCIsIHRydWUpO1xuICBwdWJsaWMgZ2V0IHRlcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rlcm07XG4gIH1cbiAgcHVibGljIHB1dFRlcm0odmFsdWU6IE5ycWxBbGVydENvbmRpdGlvblRlcm1bXSB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fdGVybS5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGVybSgpIHtcbiAgICB0aGlzLl90ZXJtLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRlcm1JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGVybS5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gdGltZW91dHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGltZW91dHMgPSBuZXcgTnJxbEFsZXJ0Q29uZGl0aW9uVGltZW91dHNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJ0aW1lb3V0c1wiKTtcbiAgcHVibGljIGdldCB0aW1lb3V0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZW91dHM7XG4gIH1cbiAgcHVibGljIHB1dFRpbWVvdXRzKHZhbHVlOiBOcnFsQWxlcnRDb25kaXRpb25UaW1lb3V0cykge1xuICAgIHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaW1lb3V0cygpIHtcbiAgICB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aW1lb3V0c0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gd2FybmluZyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF93YXJuaW5nID0gbmV3IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmdPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJ3YXJuaW5nXCIpO1xuICBwdWJsaWMgZ2V0IHdhcm5pbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dhcm5pbmc7XG4gIH1cbiAgcHVibGljIHB1dFdhcm5pbmcodmFsdWU6IE5ycWxBbGVydENvbmRpdGlvbldhcm5pbmcpIHtcbiAgICB0aGlzLl93YXJuaW5nLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRXYXJuaW5nKCkge1xuICAgIHRoaXMuX3dhcm5pbmcuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgd2FybmluZ0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl93YXJuaW5nLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyA9PT09PT09PT1cbiAgLy8gU1lOVEhFU0lTXG4gIC8vID09PT09PT09PVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY291bnRfaWQ6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX2FjY291bnRJZCksXG4gICAgICBhZ2dyZWdhdGlvbl9kZWxheTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fYWdncmVnYXRpb25EZWxheSksXG4gICAgICBhZ2dyZWdhdGlvbl9tZXRob2Q6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2FnZ3JlZ2F0aW9uTWV0aG9kKSxcbiAgICAgIGFnZ3JlZ2F0aW9uX3RpbWVyOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9hZ2dyZWdhdGlvblRpbWVyKSxcbiAgICAgIGFnZ3JlZ2F0aW9uX3dpbmRvdzogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0odGhpcy5fYWdncmVnYXRpb25XaW5kb3cpLFxuICAgICAgYmFzZWxpbmVfZGlyZWN0aW9uOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9iYXNlbGluZURpcmVjdGlvbiksXG4gICAgICBjbG9zZV92aW9sYXRpb25zX29uX2V4cGlyYXRpb246IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybSh0aGlzLl9jbG9zZVZpb2xhdGlvbnNPbkV4cGlyYXRpb24pLFxuICAgICAgZGVzY3JpcHRpb246IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2Rlc2NyaXB0aW9uKSxcbiAgICAgIGVuYWJsZWQ6IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybSh0aGlzLl9lbmFibGVkKSxcbiAgICAgIGV2YWx1YXRpb25fZGVsYXk6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX2V2YWx1YXRpb25EZWxheSksXG4gICAgICBleHBpcmF0aW9uX2R1cmF0aW9uOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybSh0aGlzLl9leHBpcmF0aW9uRHVyYXRpb24pLFxuICAgICAgZmlsbF9vcHRpb246IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2ZpbGxPcHRpb24pLFxuICAgICAgZmlsbF92YWx1ZTogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0odGhpcy5fZmlsbFZhbHVlKSxcbiAgICAgIGlkOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9pZCksXG4gICAgICBpZ25vcmVfb25fZXhwZWN0ZWRfdGVybWluYXRpb246IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybSh0aGlzLl9pZ25vcmVPbkV4cGVjdGVkVGVybWluYXRpb24pLFxuICAgICAgbmFtZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fbmFtZSksXG4gICAgICBvcGVuX3Zpb2xhdGlvbl9vbl9leHBpcmF0aW9uOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0odGhpcy5fb3BlblZpb2xhdGlvbk9uRXhwaXJhdGlvbiksXG4gICAgICBwb2xpY3lfaWQ6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX3BvbGljeUlkKSxcbiAgICAgIHJ1bmJvb2tfdXJsOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9ydW5ib29rVXJsKSxcbiAgICAgIHNpZ25hbF9zZWFzb25hbGl0eTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fc2lnbmFsU2Vhc29uYWxpdHkpLFxuICAgICAgc2xpZGVfYnk6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX3NsaWRlQnkpLFxuICAgICAgdGFyZ2V0X2VudGl0eTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fdGFyZ2V0RW50aXR5KSxcbiAgICAgIHRpdGxlX3RlbXBsYXRlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl90aXRsZVRlbXBsYXRlKSxcbiAgICAgIHR5cGU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX3R5cGUpLFxuICAgICAgdmlvbGF0aW9uX3RpbWVfbGltaXQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX3Zpb2xhdGlvblRpbWVMaW1pdCksXG4gICAgICB2aW9sYXRpb25fdGltZV9saW1pdF9zZWNvbmRzOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybSh0aGlzLl92aW9sYXRpb25UaW1lTGltaXRTZWNvbmRzKSxcbiAgICAgIGNyaXRpY2FsOiBucnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbFRvVGVycmFmb3JtKHRoaXMuX2NyaXRpY2FsLmludGVybmFsVmFsdWUpLFxuICAgICAgbnJxbDogbnJxbEFsZXJ0Q29uZGl0aW9uTnJxbFRvVGVycmFmb3JtKHRoaXMuX25ycWwuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBvdXRsaWVyX2NvbmZpZ3VyYXRpb246IG5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uVG9UZXJyYWZvcm0odGhpcy5fb3V0bGllckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSksXG4gICAgICB0ZXJtOiBjZGt0bi5saXN0TWFwcGVyKG5ycWxBbGVydENvbmRpdGlvblRlcm1Ub1RlcnJhZm9ybSwgdHJ1ZSkodGhpcy5fdGVybS5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIHRpbWVvdXRzOiBucnFsQWxlcnRDb25kaXRpb25UaW1lb3V0c1RvVGVycmFmb3JtKHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUpLFxuICAgICAgd2FybmluZzogbnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ1RvVGVycmFmb3JtKHRoaXMuX3dhcm5pbmcuaW50ZXJuYWxWYWx1ZSksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplSGNsQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICBhY2NvdW50X2lkOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybSh0aGlzLl9hY2NvdW50SWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICAgIH0sXG4gICAgICBhZ2dyZWdhdGlvbl9kZWxheToge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fYWdncmVnYXRpb25EZWxheSksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIGFnZ3JlZ2F0aW9uX21ldGhvZDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fYWdncmVnYXRpb25NZXRob2QpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBhZ2dyZWdhdGlvbl90aW1lcjoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fYWdncmVnYXRpb25UaW1lciksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIGFnZ3JlZ2F0aW9uX3dpbmRvdzoge1xuICAgICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0odGhpcy5fYWdncmVnYXRpb25XaW5kb3cpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICAgIH0sXG4gICAgICBiYXNlbGluZV9kaXJlY3Rpb246IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2Jhc2VsaW5lRGlyZWN0aW9uKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgY2xvc2VfdmlvbGF0aW9uc19vbl9leHBpcmF0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0odGhpcy5fY2xvc2VWaW9sYXRpb25zT25FeHBpcmF0aW9uKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9kZXNjcmlwdGlvbiksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIGVuYWJsZWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybSh0aGlzLl9lbmFibGVkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfSxcbiAgICAgIGV2YWx1YXRpb25fZGVsYXk6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHRoaXMuX2V2YWx1YXRpb25EZWxheSksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgICAgfSxcbiAgICAgIGV4cGlyYXRpb25fZHVyYXRpb246IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHRoaXMuX2V4cGlyYXRpb25EdXJhdGlvbiksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgICAgfSxcbiAgICAgIGZpbGxfb3B0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9maWxsT3B0aW9uKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgZmlsbF92YWx1ZToge1xuICAgICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0odGhpcy5fZmlsbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAgaWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2lkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgaWdub3JlX29uX2V4cGVjdGVkX3Rlcm1pbmF0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0odGhpcy5faWdub3JlT25FeHBlY3RlZFRlcm1pbmF0aW9uKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgfSxcbiAgICAgIG5hbWU6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX25hbWUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBvcGVuX3Zpb2xhdGlvbl9vbl9leHBpcmF0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0odGhpcy5fb3BlblZpb2xhdGlvbk9uRXhwaXJhdGlvbiksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICAgIH0sXG4gICAgICBwb2xpY3lfaWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHRoaXMuX3BvbGljeUlkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAgcnVuYm9va191cmw6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX3J1bmJvb2tVcmwpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBzaWduYWxfc2Vhc29uYWxpdHk6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX3NpZ25hbFNlYXNvbmFsaXR5KSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgc2xpZGVfYnk6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHRoaXMuX3NsaWRlQnkpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICAgIH0sXG4gICAgICB0YXJnZXRfZW50aXR5OiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl90YXJnZXRFbnRpdHkpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICB0aXRsZV90ZW1wbGF0ZToge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fdGl0bGVUZW1wbGF0ZSksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX3R5cGUpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICB2aW9sYXRpb25fdGltZV9saW1pdDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fdmlvbGF0aW9uVGltZUxpbWl0KSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgdmlvbGF0aW9uX3RpbWVfbGltaXRfc2Vjb25kczoge1xuICAgICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0odGhpcy5fdmlvbGF0aW9uVGltZUxpbWl0U2Vjb25kcyksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgICAgfSxcbiAgICAgIGNyaXRpY2FsOiB7XG4gICAgICAgIHZhbHVlOiBucnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbFRvSGNsVGVycmFmb3JtKHRoaXMuX2NyaXRpY2FsLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJOcnFsQWxlcnRDb25kaXRpb25Dcml0aWNhbExpc3RcIixcbiAgICAgIH0sXG4gICAgICBucnFsOiB7XG4gICAgICAgIHZhbHVlOiBucnFsQWxlcnRDb25kaXRpb25OcnFsVG9IY2xUZXJyYWZvcm0odGhpcy5fbnJxbC5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiTnJxbEFsZXJ0Q29uZGl0aW9uTnJxbExpc3RcIixcbiAgICAgIH0sXG4gICAgICBvdXRsaWVyX2NvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgdmFsdWU6IG5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uVG9IY2xUZXJyYWZvcm0odGhpcy5fb3V0bGllckNvbmZpZ3VyYXRpb24uaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIk5ycWxBbGVydENvbmRpdGlvbk91dGxpZXJDb25maWd1cmF0aW9uTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIHRlcm06IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2wobnJxbEFsZXJ0Q29uZGl0aW9uVGVybVRvSGNsVGVycmFmb3JtLCB0cnVlKSh0aGlzLl90ZXJtLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIk5ycWxBbGVydENvbmRpdGlvblRlcm1MaXN0XCIsXG4gICAgICB9LFxuICAgICAgdGltZW91dHM6IHtcbiAgICAgICAgdmFsdWU6IG5ycWxBbGVydENvbmRpdGlvblRpbWVvdXRzVG9IY2xUZXJyYWZvcm0odGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwic3RydWN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiTnJxbEFsZXJ0Q29uZGl0aW9uVGltZW91dHNcIixcbiAgICAgIH0sXG4gICAgICB3YXJuaW5nOiB7XG4gICAgICAgIHZhbHVlOiBucnFsQWxlcnRDb25kaXRpb25XYXJuaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fd2FybmluZy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiTnJxbEFsZXJ0Q29uZGl0aW9uV2FybmluZ0xpc3RcIixcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkICkpXG4gIH1cbn1cbiJdfQ==
|