@aws-cdk/aws-glue-alpha 2.176.0-alpha.0 → 2.178.0-alpha.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 +6187 -3907
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +525 -235
- package/README.md +422 -159
- package/awslint.json +5 -5
- package/lib/code.js +4 -5
- package/lib/connection.js +15 -3
- package/lib/constants.d.ts +261 -0
- package/lib/constants.js +281 -0
- package/lib/data-format.js +5 -5
- package/lib/data-quality-ruleset.js +6 -3
- package/lib/database.js +5 -2
- package/lib/external-table.js +20 -2
- package/lib/index.d.ts +13 -2
- package/lib/index.js +14 -3
- package/lib/jobs/job.d.ts +393 -0
- package/lib/jobs/job.js +298 -0
- package/lib/jobs/pyspark-etl-job.d.ts +81 -0
- package/lib/jobs/pyspark-etl-job.js +130 -0
- package/lib/jobs/pyspark-flex-etl-job.d.ts +83 -0
- package/lib/jobs/pyspark-flex-etl-job.js +137 -0
- package/lib/jobs/pyspark-streaming-job.d.ts +81 -0
- package/lib/jobs/pyspark-streaming-job.js +130 -0
- package/lib/jobs/python-shell-job.d.ts +55 -0
- package/lib/jobs/python-shell-job.js +99 -0
- package/lib/jobs/ray-job.d.ts +44 -0
- package/lib/jobs/ray-job.js +89 -0
- package/lib/jobs/scala-spark-etl-job.d.ts +78 -0
- package/lib/jobs/scala-spark-etl-job.js +134 -0
- package/lib/jobs/scala-spark-flex-etl-job.d.ts +109 -0
- package/lib/jobs/scala-spark-flex-etl-job.js +143 -0
- package/lib/jobs/scala-spark-streaming-job.d.ts +77 -0
- package/lib/jobs/scala-spark-streaming-job.js +131 -0
- package/lib/jobs/spark-ui-utils.d.ts +53 -0
- package/lib/jobs/spark-ui-utils.js +26 -0
- package/lib/s3-table.d.ts +4 -4
- package/lib/s3-table.js +20 -2
- package/lib/schema.d.ts +1 -1
- package/lib/schema.js +2 -2
- package/lib/security-configuration.js +5 -2
- package/lib/storage-parameter.js +1 -1
- package/lib/table-base.d.ts +1 -1
- package/lib/table-base.js +2 -2
- package/lib/table-deprecated.js +1 -1
- package/lib/triggers/trigger-options.d.ts +205 -0
- package/lib/triggers/trigger-options.js +39 -0
- package/lib/triggers/workflow.d.ts +203 -0
- package/lib/triggers/workflow.js +371 -0
- package/package.json +8 -8
- package/rosetta/default.ts-fixture +1 -1
- package/lib/job-executable.d.ts +0 -384
- package/lib/job-executable.js +0 -348
- package/lib/job.d.ts +0 -574
- package/lib/job.js +0 -531
package/lib/job-executable.js
DELETED
|
@@ -1,348 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var _a, _b, _c, _d;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.JobExecutable = exports.JobType = exports.Runtime = exports.PythonVersion = exports.JobLanguage = exports.GlueVersion = void 0;
|
|
5
|
-
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
|
|
6
|
-
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
7
|
-
/**
|
|
8
|
-
* AWS Glue version determines the versions of Apache Spark and Python that are available to the job.
|
|
9
|
-
*
|
|
10
|
-
* @see https://docs.aws.amazon.com/glue/latest/dg/add-job.html.
|
|
11
|
-
*
|
|
12
|
-
* If you need to use a GlueVersion that doesn't exist as a static member, you
|
|
13
|
-
* can instantiate a `GlueVersion` object, e.g: `GlueVersion.of('1.5')`.
|
|
14
|
-
*/
|
|
15
|
-
class GlueVersion {
|
|
16
|
-
/**
|
|
17
|
-
* Custom Glue version
|
|
18
|
-
* @param version custom version
|
|
19
|
-
*/
|
|
20
|
-
static of(version) {
|
|
21
|
-
return new GlueVersion(version);
|
|
22
|
-
}
|
|
23
|
-
constructor(name) {
|
|
24
|
-
this.name = name;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
exports.GlueVersion = GlueVersion;
|
|
28
|
-
_a = JSII_RTTI_SYMBOL_1;
|
|
29
|
-
GlueVersion[_a] = { fqn: "@aws-cdk/aws-glue-alpha.GlueVersion", version: "2.176.0-alpha.0" };
|
|
30
|
-
/**
|
|
31
|
-
* Glue version using Spark 2.2.1 and Python 2.7
|
|
32
|
-
* @deprecated Reached end of support
|
|
33
|
-
*/
|
|
34
|
-
GlueVersion.V0_9 = new GlueVersion('0.9');
|
|
35
|
-
/**
|
|
36
|
-
* Glue version using Spark 2.4.3, Python 2.7 and Python 3.6
|
|
37
|
-
* @deprecated Reached end of support
|
|
38
|
-
*/
|
|
39
|
-
GlueVersion.V1_0 = new GlueVersion('1.0');
|
|
40
|
-
/**
|
|
41
|
-
* Glue version using Spark 2.4.3 and Python 3.7
|
|
42
|
-
* @deprecated Reached end of support
|
|
43
|
-
*/
|
|
44
|
-
GlueVersion.V2_0 = new GlueVersion('2.0');
|
|
45
|
-
/**
|
|
46
|
-
* Glue version using Spark 3.1.1 and Python 3.7
|
|
47
|
-
*/
|
|
48
|
-
GlueVersion.V3_0 = new GlueVersion('3.0');
|
|
49
|
-
/**
|
|
50
|
-
* Glue version using Spark 3.3.0 and Python 3.10
|
|
51
|
-
*/
|
|
52
|
-
GlueVersion.V4_0 = new GlueVersion('4.0');
|
|
53
|
-
/**
|
|
54
|
-
* Glue version using Spark 3.5.2 and Python 3.11
|
|
55
|
-
*/
|
|
56
|
-
GlueVersion.V5_0 = new GlueVersion('5.0');
|
|
57
|
-
/**
|
|
58
|
-
* Runtime language of the Glue job
|
|
59
|
-
*/
|
|
60
|
-
var JobLanguage;
|
|
61
|
-
(function (JobLanguage) {
|
|
62
|
-
/**
|
|
63
|
-
* Scala
|
|
64
|
-
*/
|
|
65
|
-
JobLanguage["SCALA"] = "scala";
|
|
66
|
-
/**
|
|
67
|
-
* Python
|
|
68
|
-
*/
|
|
69
|
-
JobLanguage["PYTHON"] = "python";
|
|
70
|
-
})(JobLanguage || (exports.JobLanguage = JobLanguage = {}));
|
|
71
|
-
/**
|
|
72
|
-
* Python version
|
|
73
|
-
*/
|
|
74
|
-
var PythonVersion;
|
|
75
|
-
(function (PythonVersion) {
|
|
76
|
-
/**
|
|
77
|
-
* Python 2 (the exact version depends on GlueVersion and JobCommand used)
|
|
78
|
-
*/
|
|
79
|
-
PythonVersion["TWO"] = "2";
|
|
80
|
-
/**
|
|
81
|
-
* Python 3 (the exact version depends on GlueVersion and JobCommand used)
|
|
82
|
-
*/
|
|
83
|
-
PythonVersion["THREE"] = "3";
|
|
84
|
-
/**
|
|
85
|
-
* Python 3.9 (the exact version depends on GlueVersion and JobCommand used)
|
|
86
|
-
*/
|
|
87
|
-
PythonVersion["THREE_NINE"] = "3.9";
|
|
88
|
-
})(PythonVersion || (exports.PythonVersion = PythonVersion = {}));
|
|
89
|
-
/**
|
|
90
|
-
* AWS Glue runtime determines the runtime engine of the job.
|
|
91
|
-
*
|
|
92
|
-
*/
|
|
93
|
-
class Runtime {
|
|
94
|
-
/**
|
|
95
|
-
* Custom runtime
|
|
96
|
-
* @param runtime custom runtime
|
|
97
|
-
*/
|
|
98
|
-
static of(runtime) {
|
|
99
|
-
return new Runtime(runtime);
|
|
100
|
-
}
|
|
101
|
-
constructor(name) {
|
|
102
|
-
this.name = name;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
exports.Runtime = Runtime;
|
|
106
|
-
_b = JSII_RTTI_SYMBOL_1;
|
|
107
|
-
Runtime[_b] = { fqn: "@aws-cdk/aws-glue-alpha.Runtime", version: "2.176.0-alpha.0" };
|
|
108
|
-
/**
|
|
109
|
-
* Runtime for a Glue for Ray 2.4.
|
|
110
|
-
*/
|
|
111
|
-
Runtime.RAY_TWO_FOUR = new Runtime('Ray2.4');
|
|
112
|
-
/**
|
|
113
|
-
* The job type.
|
|
114
|
-
*
|
|
115
|
-
* If you need to use a JobType that doesn't exist as a static member, you
|
|
116
|
-
* can instantiate a `JobType` object, e.g: `JobType.of('other name')`.
|
|
117
|
-
*/
|
|
118
|
-
class JobType {
|
|
119
|
-
/**
|
|
120
|
-
* Custom type name
|
|
121
|
-
* @param name type name
|
|
122
|
-
*/
|
|
123
|
-
static of(name) {
|
|
124
|
-
return new JobType(name);
|
|
125
|
-
}
|
|
126
|
-
constructor(name) {
|
|
127
|
-
this.name = name;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
exports.JobType = JobType;
|
|
131
|
-
_c = JSII_RTTI_SYMBOL_1;
|
|
132
|
-
JobType[_c] = { fqn: "@aws-cdk/aws-glue-alpha.JobType", version: "2.176.0-alpha.0" };
|
|
133
|
-
/**
|
|
134
|
-
* Command for running a Glue Spark job.
|
|
135
|
-
*/
|
|
136
|
-
JobType.ETL = new JobType('glueetl');
|
|
137
|
-
/**
|
|
138
|
-
* Command for running a Glue Spark streaming job.
|
|
139
|
-
*/
|
|
140
|
-
JobType.STREAMING = new JobType('gluestreaming');
|
|
141
|
-
/**
|
|
142
|
-
* Command for running a Glue python shell job.
|
|
143
|
-
*/
|
|
144
|
-
JobType.PYTHON_SHELL = new JobType('pythonshell');
|
|
145
|
-
/**
|
|
146
|
-
* Command for running a Glue Ray job.
|
|
147
|
-
*/
|
|
148
|
-
JobType.RAY = new JobType('glueray');
|
|
149
|
-
/**
|
|
150
|
-
* The executable properties related to the Glue job's GlueVersion, JobType and code
|
|
151
|
-
*/
|
|
152
|
-
class JobExecutable {
|
|
153
|
-
/**
|
|
154
|
-
* Create Scala executable props for Apache Spark ETL job.
|
|
155
|
-
*
|
|
156
|
-
* @param props Scala Apache Spark Job props
|
|
157
|
-
*/
|
|
158
|
-
static scalaEtl(props) {
|
|
159
|
-
try {
|
|
160
|
-
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_ScalaJobExecutableProps(props);
|
|
161
|
-
}
|
|
162
|
-
catch (error) {
|
|
163
|
-
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
164
|
-
Error.captureStackTrace(error, this.scalaEtl);
|
|
165
|
-
}
|
|
166
|
-
throw error;
|
|
167
|
-
}
|
|
168
|
-
return new JobExecutable({
|
|
169
|
-
...props,
|
|
170
|
-
type: JobType.ETL,
|
|
171
|
-
language: JobLanguage.SCALA,
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Create Scala executable props for Apache Spark Streaming job.
|
|
176
|
-
*
|
|
177
|
-
* @param props Scala Apache Spark Job props
|
|
178
|
-
*/
|
|
179
|
-
static scalaStreaming(props) {
|
|
180
|
-
try {
|
|
181
|
-
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_ScalaJobExecutableProps(props);
|
|
182
|
-
}
|
|
183
|
-
catch (error) {
|
|
184
|
-
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
185
|
-
Error.captureStackTrace(error, this.scalaStreaming);
|
|
186
|
-
}
|
|
187
|
-
throw error;
|
|
188
|
-
}
|
|
189
|
-
return new JobExecutable({
|
|
190
|
-
...props,
|
|
191
|
-
type: JobType.STREAMING,
|
|
192
|
-
language: JobLanguage.SCALA,
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Create Python executable props for Apache Spark ETL job.
|
|
197
|
-
*
|
|
198
|
-
* @param props Python Apache Spark Job props
|
|
199
|
-
*/
|
|
200
|
-
static pythonEtl(props) {
|
|
201
|
-
try {
|
|
202
|
-
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_PythonSparkJobExecutableProps(props);
|
|
203
|
-
}
|
|
204
|
-
catch (error) {
|
|
205
|
-
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
206
|
-
Error.captureStackTrace(error, this.pythonEtl);
|
|
207
|
-
}
|
|
208
|
-
throw error;
|
|
209
|
-
}
|
|
210
|
-
return new JobExecutable({
|
|
211
|
-
...props,
|
|
212
|
-
type: JobType.ETL,
|
|
213
|
-
language: JobLanguage.PYTHON,
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Create Python executable props for Apache Spark Streaming job.
|
|
218
|
-
*
|
|
219
|
-
* @param props Python Apache Spark Job props
|
|
220
|
-
*/
|
|
221
|
-
static pythonStreaming(props) {
|
|
222
|
-
try {
|
|
223
|
-
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_PythonSparkJobExecutableProps(props);
|
|
224
|
-
}
|
|
225
|
-
catch (error) {
|
|
226
|
-
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
227
|
-
Error.captureStackTrace(error, this.pythonStreaming);
|
|
228
|
-
}
|
|
229
|
-
throw error;
|
|
230
|
-
}
|
|
231
|
-
return new JobExecutable({
|
|
232
|
-
...props,
|
|
233
|
-
type: JobType.STREAMING,
|
|
234
|
-
language: JobLanguage.PYTHON,
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Create Python executable props for python shell jobs.
|
|
239
|
-
*
|
|
240
|
-
* @param props Python Shell Job props.
|
|
241
|
-
*/
|
|
242
|
-
static pythonShell(props) {
|
|
243
|
-
try {
|
|
244
|
-
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_PythonShellExecutableProps(props);
|
|
245
|
-
}
|
|
246
|
-
catch (error) {
|
|
247
|
-
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
248
|
-
Error.captureStackTrace(error, this.pythonShell);
|
|
249
|
-
}
|
|
250
|
-
throw error;
|
|
251
|
-
}
|
|
252
|
-
return new JobExecutable({
|
|
253
|
-
...props,
|
|
254
|
-
type: JobType.PYTHON_SHELL,
|
|
255
|
-
language: JobLanguage.PYTHON,
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Create Python executable props for Ray jobs.
|
|
260
|
-
*
|
|
261
|
-
* @param props Ray Job props.
|
|
262
|
-
*/
|
|
263
|
-
static pythonRay(props) {
|
|
264
|
-
try {
|
|
265
|
-
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_PythonRayExecutableProps(props);
|
|
266
|
-
}
|
|
267
|
-
catch (error) {
|
|
268
|
-
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
269
|
-
Error.captureStackTrace(error, this.pythonRay);
|
|
270
|
-
}
|
|
271
|
-
throw error;
|
|
272
|
-
}
|
|
273
|
-
return new JobExecutable({
|
|
274
|
-
...props,
|
|
275
|
-
type: JobType.RAY,
|
|
276
|
-
language: JobLanguage.PYTHON,
|
|
277
|
-
});
|
|
278
|
-
}
|
|
279
|
-
/**
|
|
280
|
-
* Create a custom JobExecutable.
|
|
281
|
-
*
|
|
282
|
-
* @param config custom job executable configuration.
|
|
283
|
-
*/
|
|
284
|
-
static of(config) {
|
|
285
|
-
try {
|
|
286
|
-
jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_JobExecutableConfig(config);
|
|
287
|
-
}
|
|
288
|
-
catch (error) {
|
|
289
|
-
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
290
|
-
Error.captureStackTrace(error, this.of);
|
|
291
|
-
}
|
|
292
|
-
throw error;
|
|
293
|
-
}
|
|
294
|
-
return new JobExecutable(config);
|
|
295
|
-
}
|
|
296
|
-
constructor(config) {
|
|
297
|
-
const glueVersion = config.glueVersion.name;
|
|
298
|
-
const type = config.type.name;
|
|
299
|
-
if (JobType.PYTHON_SHELL.name === type) {
|
|
300
|
-
if (config.language !== JobLanguage.PYTHON) {
|
|
301
|
-
throw new Error('Python shell requires the language to be set to Python');
|
|
302
|
-
}
|
|
303
|
-
if ([GlueVersion.V0_9.name, GlueVersion.V4_0.name].includes(glueVersion)) {
|
|
304
|
-
throw new Error(`Specified GlueVersion ${glueVersion} does not support Python Shell`);
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
if (JobType.RAY.name === type) {
|
|
308
|
-
if (config.language !== JobLanguage.PYTHON) {
|
|
309
|
-
throw new Error('Ray requires the language to be set to Python');
|
|
310
|
-
}
|
|
311
|
-
if ([GlueVersion.V0_9.name, GlueVersion.V1_0.name, GlueVersion.V2_0.name, GlueVersion.V3_0.name].includes(glueVersion)) {
|
|
312
|
-
throw new Error(`Specified GlueVersion ${glueVersion} does not support Ray`);
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
if (config.extraJarsFirst && [GlueVersion.V0_9.name, GlueVersion.V1_0.name].includes(glueVersion)) {
|
|
316
|
-
throw new Error(`Specified GlueVersion ${glueVersion} does not support extraJarsFirst`);
|
|
317
|
-
}
|
|
318
|
-
if (config.pythonVersion === PythonVersion.TWO && ![GlueVersion.V0_9.name, GlueVersion.V1_0.name].includes(glueVersion)) {
|
|
319
|
-
throw new Error(`Specified GlueVersion ${glueVersion} does not support PythonVersion ${config.pythonVersion}`);
|
|
320
|
-
}
|
|
321
|
-
if (JobLanguage.PYTHON !== config.language && config.extraPythonFiles) {
|
|
322
|
-
throw new Error('extraPythonFiles is not supported for languages other than JobLanguage.PYTHON');
|
|
323
|
-
}
|
|
324
|
-
if (config.extraPythonFiles && type === JobType.RAY.name) {
|
|
325
|
-
throw new Error('extraPythonFiles is not supported for Ray jobs');
|
|
326
|
-
}
|
|
327
|
-
if (config.pythonVersion === PythonVersion.THREE_NINE && type !== JobType.PYTHON_SHELL.name && type !== JobType.RAY.name) {
|
|
328
|
-
throw new Error('Specified PythonVersion PythonVersion.THREE_NINE is only supported for JobType Python Shell and Ray');
|
|
329
|
-
}
|
|
330
|
-
if (config.pythonVersion === PythonVersion.THREE && type === JobType.RAY.name) {
|
|
331
|
-
throw new Error('Specified PythonVersion PythonVersion.THREE is not supported for Ray');
|
|
332
|
-
}
|
|
333
|
-
if (config.runtime === undefined && type === JobType.RAY.name) {
|
|
334
|
-
throw new Error('Runtime is required for Ray jobs');
|
|
335
|
-
}
|
|
336
|
-
this.config = config;
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Called during Job initialization to get JobExecutableConfig.
|
|
340
|
-
*/
|
|
341
|
-
bind() {
|
|
342
|
-
return this.config;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
exports.JobExecutable = JobExecutable;
|
|
346
|
-
_d = JSII_RTTI_SYMBOL_1;
|
|
347
|
-
JobExecutable[_d] = { fqn: "@aws-cdk/aws-glue-alpha.JobExecutable", version: "2.176.0-alpha.0" };
|
|
348
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam9iLWV4ZWN1dGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJqb2ItZXhlY3V0YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQTs7Ozs7OztHQU9HO0FBQ0gsTUFBYSxXQUFXO0lBa0N0Qjs7O09BR0c7SUFDSSxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQWU7UUFDOUIsT0FBTyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUNqQztJQU9ELFlBQW9CLElBQVk7UUFDOUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7S0FDbEI7O0FBakRILGtDQWtEQzs7O0FBakRDOzs7R0FHRztBQUNvQixnQkFBSSxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXJEOzs7R0FHRztBQUNvQixnQkFBSSxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXJEOzs7R0FHRztBQUNvQixnQkFBSSxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXJEOztHQUVHO0FBQ29CLGdCQUFJLEdBQUcsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFckQ7O0dBRUc7QUFDb0IsZ0JBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUVyRDs7R0FFRztBQUNvQixnQkFBSSxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBb0J2RDs7R0FFRztBQUNILElBQVksV0FVWDtBQVZELFdBQVksV0FBVztJQUNyQjs7T0FFRztJQUNILDhCQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILGdDQUFpQixDQUFBO0FBQ25CLENBQUMsRUFWVyxXQUFXLDJCQUFYLFdBQVcsUUFVdEI7QUFFRDs7R0FFRztBQUNILElBQVksYUFlWDtBQWZELFdBQVksYUFBYTtJQUN2Qjs7T0FFRztJQUNILDBCQUFTLENBQUE7SUFFVDs7T0FFRztJQUNILDRCQUFXLENB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Q0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekgsTUFBTSxJQUFJLEtBQUssQ0FBQyxxR0FBcUcsQ0FBQyxDQUFDO1FBQ3pILENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxhQUFhLEtBQUssYUFBYSxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5RSxNQUFNLElBQUksS0FBSyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDOUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztLQUN0QjtJQUVEOztPQUVHO0lBQ0ksSUFBSTtRQUNULE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztLQUNwQjs7QUEzSUgsc0NBNElDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29kZSB9IGZyb20gJy4vY29kZSc7XG5cbi8qKlxuICogQVdTIEdsdWUgdmVyc2lvbiBkZXRlcm1pbmVzIHRoZSB2ZXJzaW9ucyBvZiBBcGFjaGUgU3BhcmsgYW5kIFB5dGhvbiB0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIGpvYi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hZGQtam9iLmh0bWwuXG4gKlxuICogSWYgeW91IG5lZWQgdG8gdXNlIGEgR2x1ZVZlcnNpb24gdGhhdCBkb2Vzbid0IGV4aXN0IGFzIGEgc3RhdGljIG1lbWJlciwgeW91XG4gKiBjYW4gaW5zdGFudGlhdGUgYSBgR2x1ZVZlcnNpb25gIG9iamVjdCwgZS5nOiBgR2x1ZVZlcnNpb24ub2YoJzEuNScpYC5cbiAqL1xuZXhwb3J0IGNsYXNzIEdsdWVWZXJzaW9uIHtcbiAgLyoqXG4gICAqIEdsdWUgdmVyc2lvbiB1c2luZyBTcGFyayAyLjIuMSBhbmQgUHl0aG9uIDIuN1xuICAgKiBAZGVwcmVjYXRlZCBSZWFjaGVkIGVuZCBvZiBzdXBwb3J0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFYwXzkgPSBuZXcgR2x1ZVZlcnNpb24oJzAuOScpO1xuXG4gIC8qKlxuICAgKiBHbHVlIHZlcnNpb24gdXNpbmcgU3BhcmsgMi40LjMsIFB5dGhvbiAyLjcgYW5kIFB5dGhvbiAzLjZcbiAgICogQGRlcHJlY2F0ZWQgUmVhY2hlZCBlbmQgb2Ygc3VwcG9ydFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWMV8wID0gbmV3IEdsdWVWZXJzaW9uKCcxLjAnKTtcblxuICAvKipcbiAgICogR2x1ZSB2ZXJzaW9uIHVzaW5nIFNwYXJrIDIuNC4zIGFuZCBQeXRob24gMy43XG4gICAqIEBkZXByZWNhdGVkIFJlYWNoZWQgZW5kIG9mIHN1cHBvcnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVjJfMCA9IG5ldyBHbHVlVmVyc2lvbignMi4wJyk7XG5cbiAgLyoqXG4gICAqIEdsdWUgdmVyc2lvbiB1c2luZyBTcGFyayAzLjEuMSBhbmQgUHl0aG9uIDMuN1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWM18wID0gbmV3IEdsdWVWZXJzaW9uKCczLjAnKTtcblxuICAvKipcbiAgICogR2x1ZSB2ZXJzaW9uIHVzaW5nIFNwYXJrIDMuMy4wIGFuZCBQeXRob24gMy4xMFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWNF8wID0gbmV3IEdsdWVWZXJzaW9uKCc0LjAnKTtcblxuICAvKipcbiAgICogR2x1ZSB2ZXJzaW9uIHVzaW5nIFNwYXJrIDMuNS4yIGFuZCBQeXRob24gMy4xMVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWNV8wID0gbmV3IEdsdWVWZXJzaW9uKCc1LjAnKTtcblxuICAvKipcbiAgICogQ3VzdG9tIEdsdWUgdmVyc2lvblxuICAgKiBAcGFyYW0gdmVyc2lvbiBjdXN0b20gdmVyc2lvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZih2ZXJzaW9uOiBzdHJpbmcpOiBHbHVlVmVyc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBHbHVlVmVyc2lvbih2ZXJzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGlzIEdsdWVWZXJzaW9uLCBhcyBleHBlY3RlZCBieSBKb2IgcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnRpbWUgbGFuZ3VhZ2Ugb2YgdGhlIEdsdWUgam9iXG4gKi9cbmV4cG9ydCBlbnVtIEpvYkxhbmd1YWdlIHtcbiAgLyoqXG4gICAqIFNjYWxhXG4gICAqL1xuICBTQ0FMQSA9ICdzY2FsYScsXG5cbiAgLyoqXG4gICAqIFB5dGhvblxuICAgKi9cbiAgUFlUSE9OID0gJ3B5dGhvbicsXG59XG5cbi8qKlxuICogUHl0aG9uIHZlcnNpb25cbiAqL1xuZXhwb3J0IGVudW0gUHl0aG9uVmVyc2lvbiB7XG4gIC8qKlxuICAgKiBQeXRob24gMiAodGhlIGV4YWN0IHZlcnNpb24gZGVwZW5kcyBvbiBHbHVlVmVyc2lvbiBhbmQgSm9iQ29tbWFuZCB1c2VkKVxuICAgKi9cbiAgVFdPID0gJzInLFxuXG4gIC8qKlxuICAgKiBQeXRob24gMyAodGhlIGV4YWN0IHZlcnNpb24gZGVwZW5kcyBvbiBHbHVlVmVyc2lvbiBhbmQgSm9iQ29tbWFuZCB1c2VkKVxuICAgKi9cbiAgVEhSRUUgPSAnMycsXG5cbiAgLyoqXG4gICAqIFB5dGhvbiAzLjkgKHRoZSBleGFjdCB2ZXJzaW9uIGRlcGVuZHMgb24gR2x1ZVZlcnNpb24gYW5kIEpvYkNvbW1hbmQgdXNlZClcbiAgICovXG4gIFRIUkVFX05JTkUgPSAnMy45Jyxcbn1cblxuLyoqXG4gKiBBV1MgR2x1ZSBydW50aW1lIGRldGVybWluZXMgdGhlIHJ1bnRpbWUgZW5naW5lIG9mIHRoZSBqb2IuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZSB7XG4gIC8qKlxuICAgKiBSdW50aW1lIGZvciBhIEdsdWUgZm9yIFJheSAyLjQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJBWV9UV09fRk9VUiA9IG5ldyBSdW50aW1lKCdSYXkyLjQnKTtcblxuICAvKipcbiAgICogQ3VzdG9tIHJ1bnRpbWVcbiAgICogQHBhcmFtIHJ1bnRpbWUgY3VzdG9tIHJ1bnRpbWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YocnVudGltZTogc3RyaW5nKTogUnVudGltZSB7XG4gICAgcmV0dXJuIG5ldyBSdW50aW1lKHJ1bnRpbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgUnVudGltZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGpvYiB0eXBlLlxuICpcbiAqIElmIHlvdSBuZWVkIHRvIHVzZSBhIEpvYlR5cGUgdGhhdCBkb2Vzbid0IGV4aXN0IGFzIGEgc3RhdGljIG1lbWJlciwgeW91XG4gKiBjYW4gaW5zdGFudGlhdGUgYSBgSm9iVHlwZWAgb2JqZWN0LCBlLmc6IGBKb2JUeXBlLm9mKCdvdGhlciBuYW1lJylgLlxuICovXG5leHBvcnQgY2xhc3MgSm9iVHlwZSB7XG4gIC8qKlxuICAgKiBDb21tYW5kIGZvciBydW5uaW5nIGEgR2x1ZSBTcGFyayBqb2IuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEVUTCA9IG5ldyBKb2JUeXBlKCdnbHVlZXRsJyk7XG5cbiAgLyoqXG4gICAqIENvbW1hbmQgZm9yIHJ1bm5pbmcgYSBHbHVlIFNwYXJrIHN0cmVhbWluZyBqb2IuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNUUkVBTUlORyA9IG5ldyBKb2JUeXBlKCdnbHVlc3RyZWFtaW5nJyk7XG5cbiAgLyoqXG4gICAqIENvbW1hbmQgZm9yIHJ1bm5pbmcgYSBHbHVlIHB5dGhvbiBzaGVsbCBqb2IuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBZVEhPTl9TSEVMTCA9IG5ldyBKb2JUeXBlKCdweXRob25zaGVsbCcpO1xuXG4gIC8qKlxuICAgKiBDb21tYW5kIGZvciBydW5uaW5nIGEgR2x1ZSBSYXkgam9iLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBSQVkgPSBuZXcgSm9iVHlwZSgnZ2x1ZXJheScpO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gdHlwZSBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIHR5cGUgbmFtZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZihuYW1lOiBzdHJpbmcpOiBKb2JUeXBlIHtcbiAgICByZXR1cm4gbmV3IEpvYlR5cGUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyBKb2JUeXBlLCBhcyBleHBlY3RlZCBieSBKb2IgcmVzb3VyY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgUHl0aG9uRXhlY3V0YWJsZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBQeXRob24gdmVyc2lvbiB0byB1c2UuXG4gICAqL1xuICByZWFkb25seSBweXRob25WZXJzaW9uOiBQeXRob25WZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIFB5dGhvbiBmaWxlcyB0aGF0IEFXUyBHbHVlIGFkZHMgdG8gdGhlIFB5dGhvbiBwYXRoIGJlZm9yZSBleGVjdXRpbmcgeW91ciBzY3JpcHQuXG4gICAqIE9ubHkgaW5kaXZpZHVhbCBmaWxlcyBhcmUgc3VwcG9ydGVkLCBkaXJlY3RvcmllcyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICogRXF1aXZhbGVudCB0byBhIGpvYiBwYXJhbWV0ZXIgYC0tZXh0cmEtcHktZmlsZXNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dHJhIHB5dGhvbiBmaWxlcyBhbmQgYXJndW1lbnQgaXMgbm90IHNldFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFQeXRob25GaWxlcz86IENvZGVbXTtcbn1cblxuaW50ZXJmYWNlIFJheUV4ZWN1dGFibGVQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgUHl0aG9uIHZlcnNpb24gdG8gdXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHl0aG9uVmVyc2lvbjogUHl0aG9uVmVyc2lvbjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBQeXRob24gbW9kdWxlcyB0aGF0IEFXUyBHbHVlIGFkZHMgdG8gdGhlIFB5dGhvbiBwYXRoIGJlZm9yZSBleGVjdXRpbmcgeW91ciBzY3JpcHQuXG4gICAqIEVxdWl2YWxlbnQgdG8gYSBqb2IgcGFyYW1ldGVyIGAtLXMzLXB5LW1vZHVsZXNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dHJhIHB5dGhvbiBmaWxlcyBhbmQgYXJndW1lbnQgaXMgbm90IHNldFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hdXRob3Itam9iLXJheS1qb2ItcGFyYW1ldGVycy5odG1sXG4gICAqL1xuICByZWFkb25seSBzM1B5dGhvbk1vZHVsZXM/OiBDb2RlW107XG59XG5cbmludGVyZmFjZSBTaGFyZWRKb2JFeGVjdXRhYmxlUHJvcHMge1xuICAvKipcbiAgICogUnVudGltZS4gSXQgaXMgcmVxdWlyZWQgZm9yIFJheSBqb2JzLlxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZT86IFJ1bnRpbWU7XG5cbiAgLyoqXG4gICAqIEdsdWUgdmVyc2lvbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvcmVsZWFzZS1ub3Rlcy5odG1sXG4gICAqL1xuICByZWFkb25seSBnbHVlVmVyc2lvbjogR2x1ZVZlcnNpb247XG5cbiAgLyoqXG4gICAqIFRoZSBzY3JpcHQgdGhhdCBleGVjdXRlcyBhIGpvYi5cbiAgICovXG4gIHJlYWRvbmx5IHNjcmlwdDogQ29kZTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBmaWxlcywgc3VjaCBhcyBjb25maWd1cmF0aW9uIGZpbGVzIHRoYXQgQVdTIEdsdWUgY29waWVzIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBvZiB5b3VyIHNjcmlwdCBiZWZvcmUgZXhlY3V0aW5nIGl0LlxuICAgKiBPbmx5IGluZGl2aWR1YWwgZmlsZXMgYXJlIHN1cHBvcnRlZCwgZGlyZWN0b3JpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4gICAqIEVxdWl2YWxlbnQgdG8gYSBqb2IgcGFyYW1ldGVyIGAtLWV4dHJhLWZpbGVzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgW10gLSBubyBleHRyYSBmaWxlcyBhcmUgY29waWVkIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hd3MtZ2x1ZS1wcm9ncmFtbWluZy1ldGwtZ2x1ZS1hcmd1bWVudHMuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFGaWxlcz86IENvZGVbXTtcbn1cblxuaW50ZXJmYWNlIFNoYXJlZFNwYXJrSm9iRXhlY3V0YWJsZVByb3BzIGV4dGVuZHMgU2hhcmVkSm9iRXhlY3V0YWJsZVByb3BzIHtcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgSmF2YSAuamFyIGZpbGVzIHRoYXQgQVdTIEdsdWUgYWRkcyB0byB0aGUgSmF2YSBjbGFzc3BhdGggYmVmb3JlIGV4ZWN1dGluZyB5b3VyIHNjcmlwdC5cbiAgICogT25seSBpbmRpdmlkdWFsIGZpbGVzIGFyZSBzdXBwb3J0ZWQsIGRpcmVjdG9yaWVzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgKiBFcXVpdmFsZW50IHRvIGEgam9iIHBhcmFtZXRlciBgLS1leHRyYS1qYXJzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgW10gLSBubyBleHRyYSBqYXJzIGFyZSBhZGRlZCB0byB0aGUgY2xhc3NwYXRoXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICByZWFkb25seSBleHRyYUphcnM/OiBDb2RlW107XG5cbiAgLyoqXG4gICAqIFNldHRpbmcgdGhpcyB2YWx1ZSB0byB0cnVlIHByaW9yaXRpemVzIHRoZSBjdXN0b21lcidzIGV4dHJhIEpBUiBmaWxlcyBpbiB0aGUgY2xhc3NwYXRoLlxuICAgKiBFcXVpdmFsZW50IHRvIGEgam9iIHBhcmFtZXRlciBgLS11c2VyLWphcnMtZmlyc3RgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZSAtIHByaW9yaXR5IGlzIG5vdCBnaXZlbiB0byB1c2VyLXByb3ZpZGVkIGphcnNcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhSmFyc0ZpcnN0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9wcyBmb3IgY3JlYXRpbmcgYSBTY2FsYSBTcGFyayAoRVRMIG9yIFN0cmVhbWluZykgam9iIGV4ZWN1dGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2FsYUpvYkV4ZWN1dGFibGVQcm9wcyBleHRlbmRzIFNoYXJlZFNwYXJrSm9iRXhlY3V0YWJsZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBmdWxseSBxdWFsaWZpZWQgU2NhbGEgY2xhc3MgbmFtZSB0aGF0IHNlcnZlcyBhcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBqb2IuXG4gICAqIEVxdWl2YWxlbnQgdG8gYSBqb2IgcGFyYW1ldGVyIGAtLWNsYXNzYC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGNsYXNzTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFByb3BzIGZvciBjcmVhdGluZyBhIFB5dGhvbiBTcGFyayAoRVRMIG9yIFN0cmVhbWluZykgam9iIGV4ZWN1dGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQeXRob25TcGFya0pvYkV4ZWN1dGFibGVQcm9wcyBleHRlbmRzIFNoYXJlZFNwYXJrSm9iRXhlY3V0YWJsZVByb3BzLCBQeXRob25FeGVjdXRhYmxlUHJvcHMge31cblxuLyoqXG4gKiBQcm9wcyBmb3IgY3JlYXRpbmcgYSBQeXRob24gc2hlbGwgam9iIGV4ZWN1dGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQeXRob25TaGVsbEV4ZWN1dGFibGVQcm9wcyBleHRlbmRzIFNoYXJlZEpvYkV4ZWN1dGFibGVQcm9wcywgUHl0aG9uRXhlY3V0YWJsZVByb3BzIHt9XG5cbi8qKlxuICogUHJvcHMgZm9yIGNyZWF0aW5nIGEgUHl0aG9uIFJheSBqb2IgZXhlY3V0YWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB5dGhvblJheUV4ZWN1dGFibGVQcm9wcyBleHRlbmRzIFNoYXJlZEpvYkV4ZWN1dGFibGVQcm9wcywgUmF5RXhlY3V0YWJsZVByb3BzIHt9XG5cbi8qKlxuICogVGhlIGV4ZWN1dGFibGUgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoZSBHbHVlIGpvYidzIEdsdWVWZXJzaW9uLCBKb2JUeXBlIGFuZCBjb2RlXG4gKi9cbmV4cG9ydCBjbGFzcyBKb2JFeGVjdXRhYmxlIHtcblxuICAvKipcbiAgICogQ3JlYXRlIFNjYWxhIGV4ZWN1dGFibGUgcHJvcHMgZm9yIEFwYWNoZSBTcGFyayBFVEwgam9iLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgU2NhbGEgQXBhY2hlIFNwYXJrIEpvYiBwcm9wc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzY2FsYUV0bChwcm9wczogU2NhbGFKb2JFeGVjdXRhYmxlUHJvcHMpOiBKb2JFeGVjdXRhYmxlIHtcbiAgICByZXR1cm4gbmV3IEpvYkV4ZWN1dGFibGUoe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICB0eXBlOiBKb2JUeXBlLkVUTCxcbiAgICAgIGxhbmd1YWdlOiBKb2JMYW5ndWFnZS5TQ0FMQSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgU2NhbGEgZXhlY3V0YWJsZSBwcm9wcyBmb3IgQXBhY2hlIFNwYXJrIFN0cmVhbWluZyBqb2IuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBTY2FsYSBBcGFjaGUgU3BhcmsgSm9iIHByb3BzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNjYWxhU3RyZWFtaW5nKHByb3BzOiBTY2FsYUpvYkV4ZWN1dGFibGVQcm9wcyk6IEpvYkV4ZWN1dGFibGUge1xuICAgIHJldHVybiBuZXcgSm9iRXhlY3V0YWJsZSh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHR5cGU6IEpvYlR5cGUuU1RSRUFNSU5HLFxuICAgICAgbGFuZ3VhZ2U6IEpvYkxhbmd1YWdlLlNDQUxBLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBQeXRob24gZXhlY3V0YWJsZSBwcm9wcyBmb3IgQXBhY2hlIFNwYXJrIEVUTCBqb2IuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBQeXRob24gQXBhY2hlIFNwYXJrIEpvYiBwcm9wc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBweXRob25FdGwocHJvcHM6IFB5dGhvblNwYXJrSm9iRXhlY3V0YWJsZVByb3BzKTogSm9iRXhlY3V0YWJsZSB7XG4gICAgcmV0dXJuIG5ldyBKb2JFeGVjdXRhYmxlKHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgdHlwZTogSm9iVHlwZS5FVEwsXG4gICAgICBsYW5ndWFnZTogSm9iTGFuZ3VhZ2UuUFlUSE9OLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBQeXRob24gZXhlY3V0YWJsZSBwcm9wcyBmb3IgQXBhY2hlIFNwYXJrIFN0cmVhbWluZyBqb2IuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBQeXRob24gQXBhY2hlIFNwYXJrIEpvYiBwcm9wc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBweXRob25TdHJlYW1pbmcocHJvcHM6IFB5dGhvblNwYXJrSm9iRXhlY3V0YWJsZVByb3BzKTogSm9iRXhlY3V0YWJsZSB7XG4gICAgcmV0dXJuIG5ldyBKb2JFeGVjdXRhYmxlKHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgdHlwZTogSm9iVHlwZS5TVFJFQU1JTkcsXG4gICAgICBsYW5ndWFnZTogSm9iTGFuZ3VhZ2UuUFlUSE9OLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBQeXRob24gZXhlY3V0YWJsZSBwcm9wcyBmb3IgcHl0aG9uIHNoZWxsIGpvYnMuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyBQeXRob24gU2hlbGwgSm9iIHByb3BzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBweXRob25TaGVsbChwcm9wczogUHl0aG9uU2hlbGxFeGVjdXRhYmxlUHJvcHMpOiBKb2JFeGVjdXRhYmxlIHtcbiAgICByZXR1cm4gbmV3IEpvYkV4ZWN1dGFibGUoe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICB0eXBlOiBKb2JUeXBlLlBZVEhPTl9TSEVMTCxcbiAgICAgIGxhbmd1YWdlOiBKb2JMYW5ndWFnZS5QWVRIT04sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIFB5dGhvbiBleGVjdXRhYmxlIHByb3BzIGZvciBSYXkgam9icy5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIFJheSBKb2IgcHJvcHMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHB5dGhvblJheShwcm9wczogUHl0aG9uUmF5RXhlY3V0YWJsZVByb3BzKTogSm9iRXhlY3V0YWJsZSB7XG4gICAgcmV0dXJuIG5ldyBKb2JFeGVjdXRhYmxlKHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgdHlwZTogSm9iVHlwZS5SQVksXG4gICAgICBsYW5ndWFnZTogSm9iTGFuZ3VhZ2UuUFlUSE9OLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGN1c3RvbSBKb2JFeGVjdXRhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIGN1c3RvbSBqb2IgZXhlY3V0YWJsZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBvZihjb25maWc6IEpvYkV4ZWN1dGFibGVDb25maWcpOiBKb2JFeGVjdXRhYmxlIHtcbiAgICByZXR1cm4gbmV3IEpvYkV4ZWN1dGFibGUoY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uZmlnOiBKb2JFeGVjdXRhYmxlQ29uZmlnO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoY29uZmlnOiBKb2JFeGVjdXRhYmxlQ29uZmlnKSB7XG4gICAgY29uc3QgZ2x1ZVZlcnNpb24gPSBjb25maWcuZ2x1ZVZlcnNpb24ubmFtZTtcbiAgICBjb25zdCB0eXBlID0gY29uZmlnLnR5cGUubmFtZTtcbiAgICBpZiAoSm9iVHlwZS5QWVRIT05fU0hFTEwubmFtZSA9PT0gdHlwZSkge1xuICAgICAgaWYgKGNvbmZpZy5sYW5ndWFnZSAhPT0gSm9iTGFuZ3VhZ2UuUFlUSE9OKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUHl0aG9uIHNoZWxsIHJlcXVpcmVzIHRoZSBsYW5ndWFnZSB0byBiZSBzZXQgdG8gUHl0aG9uJyk7XG4gICAgICB9XG4gICAgICBpZiAoW0dsdWVWZXJzaW9uLlYwXzkubmFtZSwgR2x1ZVZlcnNpb24uVjRfMC5uYW1lXS5pbmNsdWRlcyhnbHVlVmVyc2lvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTcGVjaWZpZWQgR2x1ZVZlcnNpb24gJHtnbHVlVmVyc2lvbn0gZG9lcyBub3Qgc3VwcG9ydCBQeXRob24gU2hlbGxgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKEpvYlR5cGUuUkFZLm5hbWUgPT09IHR5cGUpIHtcbiAgICAgIGlmIChjb25maWcubGFuZ3VhZ2UgIT09IEpvYkxhbmd1YWdlLlBZVEhPTikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JheSByZXF1aXJlcyB0aGUgbGFuZ3VhZ2UgdG8gYmUgc2V0IHRvIFB5dGhvbicpO1xuICAgICAgfVxuICAgICAgaWYgKFtHbHVlVmVyc2lvbi5WMF85Lm5hbWUsIEdsdWVWZXJzaW9uLlYxXzAubmFtZSwgR2x1ZVZlcnNpb24uVjJfMC5uYW1lLCBHbHVlVmVyc2lvbi5WM18wLm5hbWVdLmluY2x1ZGVzKGdsdWVWZXJzaW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNwZWNpZmllZCBHbHVlVmVyc2lvbiAke2dsdWVWZXJzaW9ufSBkb2VzIG5vdCBzdXBwb3J0IFJheWApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY29uZmlnLmV4dHJhSmFyc0ZpcnN0ICYmIFtHbHVlVmVyc2lvbi5WMF85Lm5hbWUsIEdsdWVWZXJzaW9uLlYxXzAubmFtZV0uaW5jbHVkZXMoZ2x1ZVZlcnNpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNwZWNpZmllZCBHbHVlVmVyc2lvbiAke2dsdWVWZXJzaW9ufSBkb2VzIG5vdCBzdXBwb3J0IGV4dHJhSmFyc0ZpcnN0YCk7XG4gICAgfVxuICAgIGlmIChjb25maWcucHl0aG9uVmVyc2lvbiA9PT0gUHl0aG9uVmVyc2lvbi5UV08gJiYgIVtHbHVlVmVyc2lvbi5WMF85Lm5hbWUsIEdsdWVWZXJzaW9uLlYxXzAubmFtZV0uaW5jbHVkZXMoZ2x1ZVZlcnNpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNwZWNpZmllZCBHbHVlVmVyc2lvbiAke2dsdWVWZXJzaW9ufSBkb2VzIG5vdCBzdXBwb3J0IFB5dGhvblZlcnNpb24gJHtjb25maWcucHl0aG9uVmVyc2lvbn1gKTtcbiAgICB9XG4gICAgaWYgKEpvYkxhbmd1YWdlLlBZVEhPTiAhPT0gY29uZmlnLmxhbmd1YWdlICYmIGNvbmZpZy5leHRyYVB5dGhvbkZpbGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4dHJhUHl0aG9uRmlsZXMgaXMgbm90IHN1cHBvcnRlZCBmb3IgbGFuZ3VhZ2VzIG90aGVyIHRoYW4gSm9iTGFuZ3VhZ2UuUFlUSE9OJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcuZXh0cmFQeXRob25GaWxlcyAmJiB0eXBlID09PSBKb2JUeXBlLlJBWS5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4dHJhUHl0aG9uRmlsZXMgaXMgbm90IHN1cHBvcnRlZCBmb3IgUmF5IGpvYnMnKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5weXRob25WZXJzaW9uID09PSBQeXRob25WZXJzaW9uLlRIUkVFX05JTkUgJiYgdHlwZSAhPT0gSm9iVHlwZS5QWVRIT05fU0hFTEwubmFtZSAmJiB0eXBlICE9PSBKb2JUeXBlLlJBWS5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NwZWNpZmllZCBQeXRob25WZXJzaW9uIFB5dGhvblZlcnNpb24uVEhSRUVfTklORSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgSm9iVHlwZSBQeXRob24gU2hlbGwgYW5kIFJheScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnB5dGhvblZlcnNpb24gPT09IFB5dGhvblZlcnNpb24uVEhSRUUgJiYgdHlwZSA9PT0gSm9iVHlwZS5SQVkubmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTcGVjaWZpZWQgUHl0aG9uVmVyc2lvbiBQeXRob25WZXJzaW9uLlRIUkVFIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIFJheScpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJ1bnRpbWUgPT09IHVuZGVmaW5lZCAmJiB0eXBlID09PSBKb2JUeXBlLlJBWS5uYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1J1bnRpbWUgaXMgcmVxdWlyZWQgZm9yIFJheSBqb2JzJyk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBkdXJpbmcgSm9iIGluaXRpYWxpemF0aW9uIHRvIGdldCBKb2JFeGVjdXRhYmxlQ29uZmlnLlxuICAgKi9cbiAgcHVibGljIGJpbmQoKTogSm9iRXhlY3V0YWJsZUNvbmZpZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGJpbmRpbmcgYSBgSm9iRXhlY3V0YWJsZWAgaW50byBhIGBKb2JgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpvYkV4ZWN1dGFibGVDb25maWcge1xuICAvKipcbiAgICogR2x1ZSB2ZXJzaW9uLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9yZWxlYXNlLW5vdGVzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGdsdWVWZXJzaW9uOiBHbHVlVmVyc2lvbjtcblxuICAvKipcbiAgICogVGhlIGxhbmd1YWdlIG9mIHRoZSBqb2IgKFNjYWxhIG9yIFB5dGhvbikuXG4gICAqIEVxdWl2YWxlbnQgdG8gYSBqb2IgcGFyYW1ldGVyIGAtLWpvYi1sYW5ndWFnZWAuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL2F3cy1nbHVlLXByb2dyYW1taW5nLWV0bC1nbHVlLWFyZ3VtZW50cy5odG1sXG4gICAqL1xuICByZWFkb25seSBsYW5ndWFnZTogSm9iTGFuZ3VhZ2U7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHR5cGUgb2YgdGhlIGpvYiB3aGV0aGVyIGl0J3MgYW4gQXBhY2hlIFNwYXJrIEVUTCBvciBzdHJlYW1pbmcgb25lIG9yIGlmIGl0J3MgYSBQeXRob24gc2hlbGwgam9iLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogSm9iVHlwZTtcblxuICAvKipcbiAgICogVGhlIFB5dGhvbiB2ZXJzaW9uIHRvIHVzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBweXRob24gdmVyc2lvbiBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHB5dGhvblZlcnNpb24/OiBQeXRob25WZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgUnVudGltZSB0byB1c2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcnVudGltZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU/OiBSdW50aW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgc2NyaXB0IHRoYXQgaXMgZXhlY3V0ZWQgYnkgYSBqb2IuXG4gICAqL1xuICByZWFkb25seSBzY3JpcHQ6IENvZGU7XG5cbiAgLyoqXG4gICAqIFRoZSBTY2FsYSBjbGFzcyB0aGF0IHNlcnZlcyBhcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBqb2IuIFRoaXMgYXBwbGllcyBvbmx5IGlmIHlvdXIgdGhlIGpvYiBsYW5ndWFnZSBpcyBTY2FsYS5cbiAgICogRXF1aXZhbGVudCB0byBhIGpvYiBwYXJhbWV0ZXIgYC0tY2xhc3NgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHNjYWxhIGNsYXNzTmFtZSBzcGVjaWZpZWRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGNsYXNzTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBKYXZhIC5qYXIgZmlsZXMgdGhhdCBBV1MgR2x1ZSBhZGRzIHRvIHRoZSBKYXZhIGNsYXNzcGF0aCBiZWZvcmUgZXhlY3V0aW5nIHlvdXIgc2NyaXB0LlxuICAgKiBFcXVpdmFsZW50IHRvIGEgam9iIHBhcmFtZXRlciBgLS1leHRyYS1qYXJzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBleHRyYSBqYXJzIHNwZWNpZmllZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhSmFycz86IENvZGVbXTtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBQeXRob24gZmlsZXMgdGhhdCBBV1MgR2x1ZSBhZGRzIHRvIHRoZSBQeXRob24gcGF0aCBiZWZvcmUgZXhlY3V0aW5nIHlvdXIgc2NyaXB0LlxuICAgKiBFcXVpdmFsZW50IHRvIGEgam9iIHBhcmFtZXRlciBgLS1leHRyYS1weS1maWxlc2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgcHl0aG9uIGZpbGVzIHNwZWNpZmllZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhUHl0aG9uRmlsZXM/OiBDb2RlW107XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgUHl0aG9uIG1vZHVsZXMgdGhhdCBBV1MgR2x1ZSBhZGRzIHRvIHRoZSBQeXRob24gcGF0aCBiZWZvcmUgZXhlY3V0aW5nIHlvdXIgc2NyaXB0LlxuICAgKiBFcXVpdmFsZW50IHRvIGEgam9iIHBhcmFtZXRlciBgLS1zMy1weS1tb2R1bGVzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBleHRyYSBweXRob24gZmlsZXMgc3BlY2lmaWVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9hdXRob3Itam9iLXJheS1qb2ItcGFyYW1ldGVycy5odG1sXG4gICAqL1xuICByZWFkb25seSBzM1B5dGhvbk1vZHVsZXM/OiBDb2RlW107XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgZmlsZXMsIHN1Y2ggYXMgY29uZmlndXJhdGlvbiBmaWxlcyB0aGF0IEFXUyBHbHVlIGNvcGllcyB0byB0aGUgd29ya2luZyBkaXJlY3Rvcnkgb2YgeW91ciBzY3JpcHQgYmVmb3JlIGV4ZWN1dGluZyBpdC5cbiAgICogRXF1aXZhbGVudCB0byBhIGpvYiBwYXJhbWV0ZXIgYC0tZXh0cmEtZmlsZXNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dHJhIGZpbGVzIHNwZWNpZmllZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhRmlsZXM/OiBDb2RlW107XG5cbiAgLyoqXG4gICAqIFNldHRpbmcgdGhpcyB2YWx1ZSB0byB0cnVlIHByaW9yaXRpemVzIHRoZSBjdXN0b21lcidzIGV4dHJhIEpBUiBmaWxlcyBpbiB0aGUgY2xhc3NwYXRoLlxuICAgKiBFcXVpdmFsZW50IHRvIGEgam9iIHBhcmFtZXRlciBgLS11c2VyLWphcnMtZmlyc3RgLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGV4dHJhIGphcnMgYXJlIG5vdCBwcmlvcml0aXplZC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWdsdWUtYXJndW1lbnRzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IGV4dHJhSmFyc0ZpcnN0PzogYm9vbGVhbjtcbn1cbiJdfQ==
|