@sapui5/sap.fe.base 1.125.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.
@@ -0,0 +1,590 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util/uid", "sap/ui/base/Metadata", "sap/ui/base/Object", "sap/ui/core/mvc/ControllerMetadata"], function (ObjectPath, merge, uid, Metadata, BaseObject, ControllerMetadata) {
6
+ "use strict";
7
+
8
+ var _exports = {};
9
+ const ensureMetadata = function (target) {
10
+ target.metadata = merge({
11
+ controllerExtensions: {},
12
+ properties: {},
13
+ aggregations: {},
14
+ references: {},
15
+ associations: {},
16
+ methods: {},
17
+ events: {},
18
+ interfaces: []
19
+ }, target.metadata ?? {});
20
+ return target.metadata;
21
+ };
22
+
23
+ /**
24
+ * Method that will find the correct API object based on the current control hierarchy.
25
+ *
26
+ * @param target
27
+ * @returns The proper getAPI function for this constructor
28
+ */
29
+ function prepareGetAPIFunction(target) {
30
+ return function (oEvent) {
31
+ let apiFQN = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : target.getMetadata().getName();
32
+ let oSource = oEvent.getSource();
33
+ if (target._getAPIExtension) {
34
+ oSource = target._getAPIExtension(oSource) ?? oSource;
35
+ }
36
+ while (oSource && !oSource.isA(apiFQN) && oSource.getParent) {
37
+ if (this.isDependentBound) {
38
+ const oDependents = oSource.getDependents();
39
+ const hasCorrectDependent = oDependents.find(oDependent => oDependent.isA(apiFQN));
40
+ if (hasCorrectDependent) {
41
+ oSource = hasCorrectDependent;
42
+ } else {
43
+ oSource = oSource.getParent();
44
+ }
45
+ } else {
46
+ oSource = oSource.getParent();
47
+ }
48
+ }
49
+ if (!oSource || !oSource.isA(apiFQN)) {
50
+ const oSourceMap = this.instanceMap.get(this);
51
+ oSource = oSourceMap === null || oSourceMap === void 0 ? void 0 : oSourceMap[oSourceMap.length - 1];
52
+ }
53
+ let targetControl;
54
+ if (oSource && oSource.isA(apiFQN)) {
55
+ targetControl = oSource;
56
+ }
57
+ return targetControl;
58
+ };
59
+ }
60
+
61
+ /**
62
+ * Ensures that when an xmlEventHandler is defined, the `getAPI` function is properly assigned.
63
+ *
64
+ * @param target The class constructor that should hold the static functions
65
+ */
66
+ const ensureGetAPI = function (target) {
67
+ if (!target.__apiRegistered) {
68
+ target.__apiRegistered = true;
69
+ target.instanceMap = new WeakMap();
70
+ target.registerInstance = function (_instance) {
71
+ if (!this.instanceMap.get(_instance.constructor)) {
72
+ this.instanceMap.set(_instance.constructor, []);
73
+ }
74
+ this.instanceMap.get(_instance.constructor).push(_instance);
75
+ };
76
+ target.getAPI = prepareGetAPIFunction(target);
77
+ }
78
+ };
79
+
80
+ /* #region CONTROLLER EXTENSIONS */
81
+
82
+ /**
83
+ * Defines that the following method is an override for the method name with the same name in the specific controller extension or base implementation.
84
+ *
85
+ * @param extensionName The name of the extension that will be overridden
86
+ * @returns The decorated method
87
+ */
88
+ function methodOverride(extensionName) {
89
+ return function (target, propertyKey) {
90
+ if (!target.override) {
91
+ target.override = {};
92
+ }
93
+ if (!target.overrides) {
94
+ target.overrides = {};
95
+ }
96
+ let currentTarget = target.overrides;
97
+ if (extensionName) {
98
+ if (!currentTarget.extension) {
99
+ currentTarget.extension = {};
100
+ }
101
+ if (!currentTarget.extension[extensionName]) {
102
+ currentTarget.extension[extensionName] = {};
103
+ }
104
+ currentTarget = currentTarget.extension[extensionName];
105
+ }
106
+ currentTarget[propertyKey.toString()] = target[propertyKey.toString()];
107
+ };
108
+ }
109
+
110
+ /**
111
+ * Defines that the method can be extended by other controller extension based on the defined overrideExecutionType.
112
+ *
113
+ * @param overrideExecutionType The OverrideExecution defining when the override should run (Before / After / Instead)
114
+ * @returns The decorated method
115
+ */
116
+ _exports.methodOverride = methodOverride;
117
+ function extensible(overrideExecutionType) {
118
+ return function (target, propertyKey) {
119
+ const metadata = ensureMetadata(target);
120
+ if (!metadata.methods[propertyKey.toString()]) {
121
+ metadata.methods[propertyKey.toString()] = {};
122
+ }
123
+ metadata.methods[propertyKey.toString()].overrideExecution = overrideExecutionType;
124
+ };
125
+ }
126
+
127
+ /**
128
+ * Defines that the method will be publicly available for controller extension usage.
129
+ *
130
+ * @returns The decorated method
131
+ */
132
+ _exports.extensible = extensible;
133
+ function publicExtension() {
134
+ return function (target, propertyKey, descriptor) {
135
+ const metadata = ensureMetadata(target);
136
+ descriptor.enumerable = true;
137
+ if (!metadata.methods[propertyKey.toString()]) {
138
+ metadata.methods[propertyKey.toString()] = {};
139
+ }
140
+ metadata.methods[propertyKey.toString()].public = true;
141
+ };
142
+ }
143
+ /**
144
+ * Defines that the method will be only available for internal usage of the controller extension.
145
+ *
146
+ * @returns The decorated method
147
+ */
148
+ _exports.publicExtension = publicExtension;
149
+ function privateExtension() {
150
+ return function (target, propertyKey, descriptor) {
151
+ const metadata = ensureMetadata(target);
152
+ descriptor.enumerable = true;
153
+ if (!metadata.methods[propertyKey.toString()]) {
154
+ metadata.methods[propertyKey.toString()] = {};
155
+ }
156
+ metadata.methods[propertyKey.toString()].public = false;
157
+ };
158
+ }
159
+ /**
160
+ * Defines that the method cannot be further extended by other controller extension.
161
+ *
162
+ * @returns The decorated method
163
+ */
164
+ _exports.privateExtension = privateExtension;
165
+ function finalExtension() {
166
+ return function (target, propertyKey, descriptor) {
167
+ const metadata = ensureMetadata(target);
168
+ descriptor.enumerable = true;
169
+ if (!metadata.methods[propertyKey.toString()]) {
170
+ metadata.methods[propertyKey.toString()] = {};
171
+ }
172
+ metadata.methods[propertyKey.toString()].final = true;
173
+ };
174
+ }
175
+
176
+ /**
177
+ * Defines that we are going to use instantiate a controller extension under the following variable name.
178
+ *
179
+ * @param extensionClass The controller extension that will be instantiated
180
+ * @returns The decorated property
181
+ */
182
+ _exports.finalExtension = finalExtension;
183
+ function usingExtension(extensionClass) {
184
+ return function (target, propertyKey, propertyDescriptor) {
185
+ const metadata = ensureMetadata(target);
186
+ delete propertyDescriptor.initializer;
187
+ metadata.controllerExtensions[propertyKey.toString()] = extensionClass;
188
+ return propertyDescriptor;
189
+ }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if I declare it as such.
190
+ }
191
+
192
+ /* #endregion */
193
+
194
+ /* #region CONTROL */
195
+ /**
196
+ * Indicates that the property shall be declared as an event on the control metadata.
197
+ *
198
+ * @returns The decorated property
199
+ */
200
+ _exports.usingExtension = usingExtension;
201
+ function event() {
202
+ return function (target, eventKey) {
203
+ const metadata = ensureMetadata(target);
204
+ if (!metadata.events[eventKey.toString()]) {
205
+ metadata.events[eventKey.toString()] = {};
206
+ }
207
+ };
208
+ }
209
+
210
+ /**
211
+ * Defines the following property in the control metatada.
212
+ *
213
+ * @param attributeDefinition The property definition
214
+ * @returns The decorated property.
215
+ */
216
+ _exports.event = event;
217
+ function property(attributeDefinition) {
218
+ return function (target, propertyKey, propertyDescriptor) {
219
+ var _initializer, _ref;
220
+ const metadata = ensureMetadata(target);
221
+ if (attributeDefinition.bindable === undefined) {
222
+ attributeDefinition.bindable = true;
223
+ }
224
+ if (attributeDefinition.isBindingInfo === true) {
225
+ attributeDefinition.bindable = false;
226
+ attributeDefinition.group = "Data";
227
+ }
228
+ if (!metadata.properties[propertyKey]) {
229
+ metadata.properties[propertyKey] = attributeDefinition;
230
+ }
231
+ delete propertyDescriptor.writable;
232
+ attributeDefinition.defaultValue ??= (_initializer = (_ref = propertyDescriptor).initializer) === null || _initializer === void 0 ? void 0 : _initializer.call(_ref);
233
+ delete propertyDescriptor.initializer;
234
+ return propertyDescriptor;
235
+ }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
236
+ }
237
+
238
+ /**
239
+ * Defines and configure the following aggregation in the control metatada.
240
+ *
241
+ * @param aggregationDefinition The aggregation definition
242
+ * @returns The decorated property.
243
+ */
244
+ _exports.property = property;
245
+ function aggregation(aggregationDefinition) {
246
+ return function (target, propertyKey, propertyDescriptor) {
247
+ const metadata = ensureMetadata(target);
248
+ if (aggregationDefinition.multiple === undefined) {
249
+ // UI5 defaults this to true but this is just weird...
250
+ aggregationDefinition.multiple = false;
251
+ }
252
+ if (!metadata.aggregations[propertyKey]) {
253
+ metadata.aggregations[propertyKey] = aggregationDefinition;
254
+ }
255
+ if (aggregationDefinition.isDefault) {
256
+ metadata.defaultAggregation = propertyKey;
257
+ }
258
+ delete propertyDescriptor.writable;
259
+ delete propertyDescriptor.initializer;
260
+ return propertyDescriptor;
261
+ }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
262
+ }
263
+
264
+ /**
265
+ * Defines and configure the following association in the control metatada.
266
+ *
267
+ * @param ui5AssociationMetadata The definition of the association.
268
+ * @returns The decorated property
269
+ */
270
+ _exports.aggregation = aggregation;
271
+ function association(ui5AssociationMetadata) {
272
+ return function (target, propertyKey, propertyDescriptor) {
273
+ const metadata = ensureMetadata(target);
274
+ if (!metadata.associations[propertyKey]) {
275
+ metadata.associations[propertyKey] = ui5AssociationMetadata;
276
+ }
277
+ delete propertyDescriptor.writable;
278
+ delete propertyDescriptor.initializer;
279
+ return propertyDescriptor;
280
+ }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
281
+ }
282
+
283
+ /**
284
+ * Defines in the metadata that this control implements a specific interface.
285
+ *
286
+ * @param interfaceName The name of the implemented interface
287
+ * @returns The decorated method
288
+ */
289
+ _exports.association = association;
290
+ function implementInterface(interfaceName) {
291
+ return function (target) {
292
+ const metadata = ensureMetadata(target);
293
+ metadata.interfaces.push(interfaceName);
294
+ };
295
+ }
296
+
297
+ /**
298
+ * Indicates that the following method should also be exposed statically so we can call it from XML.
299
+ *
300
+ * @returns The decorated method
301
+ */
302
+ _exports.implementInterface = implementInterface;
303
+ function xmlEventHandler() {
304
+ return function (target, propertykey) {
305
+ const currentConstructor = target.constructor;
306
+ ensureGetAPI(currentConstructor);
307
+ currentConstructor[propertykey.toString()] = function () {
308
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
309
+ args[_key] = arguments[_key];
310
+ }
311
+ if (args && args.length) {
312
+ const currentTarget = currentConstructor.getAPI(args[0]);
313
+ currentTarget === null || currentTarget === void 0 ? void 0 : currentTarget[propertykey.toString()](...args);
314
+ }
315
+ };
316
+ };
317
+ }
318
+ _exports.xmlEventHandler = xmlEventHandler;
319
+ /**
320
+ * Indicates that the following class should define a UI5 control of the specified name.
321
+ *
322
+ * @param sTarget The fully qualified name of the UI5 class
323
+ * @param metadataDefinition Inline metadata definition
324
+ * @param forceDefineCall Whether a define call should be added for this, useful when defining sub classes
325
+ * @returns A class decorator that will create a ui5 class
326
+ */
327
+ function defineUI5Class(sTarget, metadataDefinition) {
328
+ let forceDefineCall = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
329
+ return function (constructor) {
330
+ if (!constructor.prototype.metadata) {
331
+ constructor.prototype.metadata = {};
332
+ }
333
+ if (metadataDefinition) {
334
+ for (const key in metadataDefinition) {
335
+ if (constructor.prototype.metadata[key]) {
336
+ if (Array.isArray(constructor.prototype.metadata[key])) {
337
+ constructor.prototype.metadata[key] = constructor.prototype.metadata[key].concat(metadataDefinition[key]);
338
+ } else {
339
+ constructor.prototype.metadata[key] = {
340
+ ...constructor.prototype.metadata[key],
341
+ ...metadataDefinition[key]
342
+ };
343
+ }
344
+ } else {
345
+ constructor.prototype.metadata[key] = metadataDefinition[key];
346
+ }
347
+ }
348
+ }
349
+ return registerUI5Metadata(constructor, sTarget, constructor.prototype, forceDefineCall);
350
+ };
351
+ }
352
+ _exports.defineUI5Class = defineUI5Class;
353
+ function createReference() {
354
+ return {
355
+ current: undefined,
356
+ setCurrent: function (oControlInstance) {
357
+ this.current = oControlInstance;
358
+ }
359
+ };
360
+ }
361
+ /**
362
+ * Defines that the following object will hold a reference to a control through jsx templating.
363
+ *
364
+ * @returns The decorated property.
365
+ */
366
+ _exports.createReference = createReference;
367
+ function defineReference() {
368
+ return function (target, propertyKey, propertyDescriptor) {
369
+ const metadata = ensureMetadata(target);
370
+ delete propertyDescriptor.writable;
371
+ delete propertyDescriptor.initializer;
372
+ if (BaseObject.isObjectA(target, "sap.ui.core.Control")) {
373
+ if (!metadata.references[propertyKey]) {
374
+ metadata.references[propertyKey] = true;
375
+ }
376
+ } else {
377
+ propertyDescriptor.initializer = createReference;
378
+ }
379
+ return propertyDescriptor;
380
+ }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
381
+ }
382
+
383
+ /**
384
+ * Internal heavy lifting that will take care of creating the class property for ui5 to use.
385
+ *
386
+ * @param clazz The class prototype
387
+ * @param name The name of the class to create
388
+ * @param inObj The metadata object
389
+ * @param forceDefineCall Whether a define call should be added for this, useful when defining sub classes
390
+ * @returns The metadata class
391
+ */
392
+ _exports.defineReference = defineReference;
393
+ function registerUI5Metadata(clazz, name, inObj, forceDefineCall) {
394
+ var _clazz$getMetadata, _clazz$getMetadata2, _inObj$metadata, _clazz$metadata, _obj$metadata;
395
+ if ((_clazz$getMetadata = clazz.getMetadata) !== null && _clazz$getMetadata !== void 0 && _clazz$getMetadata.call(clazz).isA("sap.ui.core.mvc.ControllerExtension")) {
396
+ Object.getOwnPropertyNames(inObj).forEach(objName => {
397
+ const descriptor = Object.getOwnPropertyDescriptor(inObj, objName);
398
+ if (descriptor && !descriptor.enumerable) {
399
+ descriptor.enumerable = true;
400
+ }
401
+ });
402
+ }
403
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
404
+ const obj = {};
405
+ obj.metadata = inObj.metadata || {};
406
+ obj.override = inObj.override;
407
+ obj.constructor = clazz;
408
+ obj.metadata.baseType = Object.getPrototypeOf(clazz.prototype).getMetadata().getName();
409
+ if ((clazz === null || clazz === void 0 ? void 0 : (_clazz$getMetadata2 = clazz.getMetadata()) === null || _clazz$getMetadata2 === void 0 ? void 0 : _clazz$getMetadata2.getStereotype()) === "control") {
410
+ const rendererDefinition = inObj.renderer || clazz.renderer || clazz.render;
411
+ obj.renderer = {
412
+ apiVersion: 2
413
+ };
414
+ if (typeof rendererDefinition === "function") {
415
+ obj.renderer.render = rendererDefinition;
416
+ } else if (rendererDefinition != undefined) {
417
+ obj.renderer = rendererDefinition;
418
+ }
419
+ }
420
+ obj.metadata.interfaces = ((_inObj$metadata = inObj.metadata) === null || _inObj$metadata === void 0 ? void 0 : _inObj$metadata.interfaces) || ((_clazz$metadata = clazz.metadata) === null || _clazz$metadata === void 0 ? void 0 : _clazz$metadata.interfaces);
421
+ Object.keys(clazz.prototype).forEach(key => {
422
+ if (key !== "metadata") {
423
+ try {
424
+ obj[key] = clazz.prototype[key];
425
+ } catch (e) {
426
+ // Do nothing
427
+ }
428
+ }
429
+ });
430
+ if ((_obj$metadata = obj.metadata) !== null && _obj$metadata !== void 0 && _obj$metadata.controllerExtensions && Object.keys(obj.metadata.controllerExtensions).length > 0) {
431
+ for (const cExtName in obj.metadata.controllerExtensions) {
432
+ obj[cExtName] = obj.metadata.controllerExtensions[cExtName];
433
+ }
434
+ }
435
+ const output = clazz.extend(name, obj);
436
+ const fnInit = output.prototype.init;
437
+ output.prototype.init = function () {
438
+ var _this = this;
439
+ if (fnInit) {
440
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
441
+ args[_key2] = arguments[_key2];
442
+ }
443
+ fnInit.apply(this, args);
444
+ }
445
+ if (clazz.registerInstance) {
446
+ clazz.registerInstance(this);
447
+ }
448
+ this.metadata = obj.metadata;
449
+ if (obj.metadata.properties) {
450
+ const aPropertyKeys = Object.keys(obj.metadata.properties);
451
+ aPropertyKeys.forEach(propertyKey => {
452
+ const propertyDef = obj.metadata.properties[propertyKey];
453
+ if (propertyDef.isBindingInfo === true) {
454
+ this._bindingProperties ??= {};
455
+ Object.defineProperty(this, propertyKey, {
456
+ configurable: true,
457
+ set: v => {
458
+ this._bindingProperties[propertyKey] = v;
459
+ this.mProperties[propertyKey] = v;
460
+ return this;
461
+ },
462
+ get() {
463
+ const propValue = this._bindingProperties[propertyKey] ?? this.getProperty(propertyKey);
464
+ if (typeof propValue === "object") {
465
+ return {
466
+ ...propValue
467
+ }; // Create shallow copy
468
+ } else {
469
+ return propValue;
470
+ }
471
+ }
472
+ });
473
+ } else {
474
+ Object.defineProperty(this, propertyKey, {
475
+ configurable: true,
476
+ set: v => {
477
+ return this.setProperty(propertyKey, v);
478
+ },
479
+ get: () => {
480
+ return this.getProperty(propertyKey);
481
+ }
482
+ });
483
+ }
484
+ if (propertyDef.defaultValue !== undefined) {
485
+ this._applyingSettings = true;
486
+ this[propertyKey] = propertyDef.defaultValue;
487
+ this._applyingSettings = false;
488
+ delete this._applyingSettings;
489
+ }
490
+ });
491
+ const aAggregationKeys = Object.keys(obj.metadata.aggregations);
492
+ aAggregationKeys.forEach(aggregationKey => {
493
+ Object.defineProperty(this, aggregationKey, {
494
+ configurable: true,
495
+ set: v => {
496
+ return this.setAggregation(aggregationKey, v);
497
+ },
498
+ get: () => {
499
+ const aggregationContent = this.getAggregation(aggregationKey);
500
+ if (obj.metadata.aggregations[aggregationKey].multiple) {
501
+ return aggregationContent || [];
502
+ } else {
503
+ return aggregationContent;
504
+ }
505
+ }
506
+ });
507
+ });
508
+ const aAssociationKeys = Object.keys(obj.metadata.associations);
509
+ aAssociationKeys.forEach(associationKey => {
510
+ Object.defineProperty(this, associationKey, {
511
+ configurable: true,
512
+ set: v => {
513
+ return this.setAssociation(associationKey, v);
514
+ },
515
+ get: () => {
516
+ const aggregationContent = this.getAssociation(associationKey);
517
+ if (obj.metadata.associations[associationKey].multiple) {
518
+ return aggregationContent || [];
519
+ } else {
520
+ return aggregationContent;
521
+ }
522
+ }
523
+ });
524
+ });
525
+ }
526
+ if (obj.metadata.references) {
527
+ const referenceProperties = Object.keys(obj.metadata.references);
528
+ referenceProperties.forEach(propertyKey => {
529
+ Object.defineProperty(this, propertyKey, {
530
+ configurable: true,
531
+ value: createReference()
532
+ });
533
+ });
534
+ }
535
+ if (obj.metadata.methods) {
536
+ for (const methodName in obj.metadata.methods) {
537
+ const methodDefinition = obj.metadata.methods[methodName];
538
+ if (methodDefinition.overrideExecution === "AfterAsync" || methodDefinition.overrideExecution === "BeforeAsync") {
539
+ if (!this.methodHolder) {
540
+ this.methodHolder = [];
541
+ }
542
+ this.methodHolder[methodName] = [this[methodName]];
543
+ Object.defineProperty(this, methodName, {
544
+ configurable: true,
545
+ set: v => {
546
+ return this.methodHolder[methodName].push(v);
547
+ },
548
+ get: () => {
549
+ return async function () {
550
+ const methodArrays = _this.methodHolder[methodName];
551
+ if (methodDefinition.overrideExecution === "BeforeAsync") {
552
+ methodArrays.reverse();
553
+ }
554
+ for (var _len3 = arguments.length, methodArgs = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
555
+ methodArgs[_key3] = arguments[_key3];
556
+ }
557
+ for (const arg of methodArrays) {
558
+ await arg.apply(_this, methodArgs);
559
+ }
560
+ };
561
+ }
562
+ });
563
+ }
564
+ }
565
+ }
566
+ };
567
+ clazz.override = function (oExtension) {
568
+ const pol = {};
569
+ pol.constructor = function () {
570
+ for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
571
+ args[_key4] = arguments[_key4];
572
+ }
573
+ return clazz.apply(this, args);
574
+ };
575
+ const oClass = Metadata.createClass(clazz, `anonymousExtension~${uid()}`, pol, ControllerMetadata);
576
+ oClass.getMetadata()._staticOverride = oExtension;
577
+ oClass.getMetadata()._override = clazz.getMetadata()._override;
578
+ return oClass;
579
+ };
580
+ ObjectPath.set(name, output);
581
+ if (forceDefineCall) {
582
+ sap.ui.define(output.getMetadata().getName().replaceAll(".", "/"), () => {
583
+ return output;
584
+ });
585
+ }
586
+ return output;
587
+ }
588
+ return _exports;
589
+ }, false);
590
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnN1cmVNZXRhZGF0YSIsInRhcmdldCIsIm1ldGFkYXRhIiwibWVyZ2UiLCJjb250cm9sbGVyRXh0ZW5zaW9ucyIsInByb3BlcnRpZXMiLCJhZ2dyZWdhdGlvbnMiLCJyZWZlcmVuY2VzIiwiYXNzb2NpYXRpb25zIiwibWV0aG9kcyIsImV2ZW50cyIsImludGVyZmFjZXMiLCJwcmVwYXJlR2V0QVBJRnVuY3Rpb24iLCJvRXZlbnQiLCJhcGlGUU4iLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJvU291cmNlIiwiZ2V0U291cmNlIiwiX2dldEFQSUV4dGVuc2lvbiIsImlzQSIsImdldFBhcmVudCIsImlzRGVwZW5kZW50Qm91bmQiLCJvRGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJoYXNDb3JyZWN0RGVwZW5kZW50IiwiZmluZCIsIm9EZXBlbmRlbnQiLCJvU291cmNlTWFwIiwiaW5zdGFuY2VNYXAiLCJnZXQiLCJsZW5ndGgiLCJ0YXJnZXRDb250cm9sIiwiZW5zdXJlR2V0QVBJIiwiX19hcGlSZWdpc3RlcmVkIiwiV2Vha01hcCIsInJlZ2lzdGVySW5zdGFuY2UiLCJfaW5zdGFuY2UiLCJjb25zdHJ1Y3RvciIsInNldCIsInB1c2giLCJnZXRBUEkiLCJtZXRob2RPdmVycmlkZSIsImV4dGVuc2lvbk5hbWUiLCJwcm9wZXJ0eUtleSIsIm92ZXJyaWRlIiwib3ZlcnJpZGVzIiwiY3VycmVudFRhcmdldCIsImV4dGVuc2lvbiIsInRvU3RyaW5nIiwiZXh0ZW5zaWJsZSIsIm92ZXJyaWRlRXhlY3V0aW9uVHlwZSIsIm92ZXJyaWRlRXhlY3V0aW9uIiwicHVibGljRXh0ZW5zaW9uIiwiZGVzY3JpcHRvciIsImVudW1lcmFibGUiLCJwdWJsaWMiLCJwcml2YXRlRXh0ZW5zaW9uIiwiZmluYWxFeHRlbnNpb24iLCJmaW5hbCIsInVzaW5nRXh0ZW5zaW9uIiwiZXh0ZW5zaW9uQ2xhc3MiLCJwcm9wZXJ0eURlc2NyaXB0b3IiLCJpbml0aWFsaXplciIsImV2ZW50IiwiZXZlbnRLZXkiLCJwcm9wZXJ0eSIsImF0dHJpYnV0ZURlZmluaXRpb24iLCJiaW5kYWJsZSIsInVuZGVmaW5lZCIsImlzQmluZGluZ0luZm8iLCJncm91cCIsIndyaXRhYmxlIiwiZGVmYXVsdFZhbHVlIiwiYWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkRlZmluaXRpb24iLCJtdWx0aXBsZSIsImlzRGVmYXVsdCIsImRlZmF1bHRBZ2dyZWdhdGlvbiIsImFzc29jaWF0aW9uIiwidWk1QXNzb2NpYXRpb25NZXRhZGF0YSIsImltcGxlbWVudEludGVyZmFjZSIsImludGVyZmFjZU5hbWUiLCJ4bWxFdmVudEhhbmRsZXIiLCJwcm9wZXJ0eWtleSIsImN1cnJlbnRDb25zdHJ1Y3RvciIsImFyZ3MiLCJkZWZpbmVVSTVDbGFzcyIsInNUYXJnZXQiLCJtZXRhZGF0YURlZmluaXRpb24iLCJmb3JjZURlZmluZUNhbGwiLCJwcm90b3R5cGUiLCJrZXkiLCJBcnJheSIsImlzQXJyYXkiLCJjb25jYXQiLCJyZWdpc3RlclVJNU1ldGFkYXRhIiwiY3JlYXRlUmVmZXJlbmNlIiwiY3VycmVudCIsInNldEN1cnJlbnQiLCJvQ29udHJvbEluc3RhbmNlIiwiZGVmaW5lUmVmZXJlbmNlIiwiQmFzZU9iamVjdCIsImlzT2JqZWN0QSIsImNsYXp6IiwibmFtZSIsImluT2JqIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImZvckVhY2giLCJvYmpOYW1lIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwib2JqIiwiYmFzZVR5cGUiLCJnZXRQcm90b3R5cGVPZiIsImdldFN0ZXJlb3R5cGUiLCJyZW5kZXJlckRlZmluaXRpb24iLCJyZW5kZXJlciIsInJlbmRlciIsImFwaVZlcnNpb24iLCJrZXlzIiwiZSIsImNFeHROYW1lIiwib3V0cHV0IiwiZXh0ZW5kIiwiZm5Jbml0IiwiaW5pdCIsImFwcGx5IiwiYVByb3BlcnR5S2V5cyIsInByb3BlcnR5RGVmIiwiX2JpbmRpbmdQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJ2IiwibVByb3BlcnRpZXMiLCJwcm9wVmFsdWUiLCJnZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5IiwiX2FwcGx5aW5nU2V0dGluZ3MiLCJhQWdncmVnYXRpb25LZXlzIiwiYWdncmVnYXRpb25LZXkiLCJzZXRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uQ29udGVudCIsImdldEFnZ3JlZ2F0aW9uIiwiYUFzc29jaWF0aW9uS2V5cyIsImFzc29jaWF0aW9uS2V5Iiwic2V0QXNzb2NpYXRpb24iLCJnZXRBc3NvY2lhdGlvbiIsInJlZmVyZW5jZVByb3BlcnRpZXMiLCJ2YWx1ZSIsIm1ldGhvZE5hbWUiLCJtZXRob2REZWZpbml0aW9uIiwibWV0aG9kSG9sZGVyIiwibWV0aG9kQXJyYXlzIiwicmV2ZXJzZSIsIm1ldGhvZEFyZ3MiLCJhcmciLCJvRXh0ZW5zaW9uIiwicG9sIiwib0NsYXNzIiwiTWV0YWRhdGEiLCJjcmVhdGVDbGFzcyIsInVpZCIsIkNvbnRyb2xsZXJNZXRhZGF0YSIsIl9zdGF0aWNPdmVycmlkZSIsIl9vdmVycmlkZSIsIk9iamVjdFBhdGgiLCJzYXAiLCJ1aSIsImRlZmluZSIsInJlcGxhY2VBbGwiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNsYXNzU3VwcG9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgT2JqZWN0UGF0aCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9PYmplY3RQYXRoXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NZXRhZGF0YVwiO1xuaW1wb3J0IEJhc2VPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL09iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgeyAkQ29udHJvbFNldHRpbmdzIH0gZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgQ29udHJvbGxlck1ldGFkYXRhIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlck1ldGFkYXRhXCI7XG5pbXBvcnQgdHlwZSBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5cbnR5cGUgT3ZlcnJpZGVEZWZpbml0aW9uID0gUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+O1xudHlwZSBVSTVDb250cm9sbGVyTWV0aG9kRGVmaW5pdGlvbiA9IHtcblx0b3ZlcnJpZGVFeGVjdXRpb24/OiBPdmVycmlkZUV4ZWN1dGlvbjtcblx0cHVibGljPzogYm9vbGVhbjtcblx0ZmluYWw/OiBib29sZWFuO1xufTtcbnR5cGUgVUk1UHJvcGVydHlNZXRhZGF0YSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRiaW5kYWJsZT86IGJvb2xlYW47XG5cdHJlcXVpcmVkPzogYm9vbGVhbjtcblx0Z3JvdXA/OiBzdHJpbmc7XG5cdGRlZmF1bHRWYWx1ZT86IHVua25vd247XG5cdGJ5VmFsdWU/OiBib29sZWFuO1xuXHRpc0JpbmRpbmdJbmZvPzogYm9vbGVhbjtcblx0ZXhwZWN0ZWRBbm5vdGF0aW9ucz86IHN0cmluZ1tdO1xuXHRleHBlY3RlZFR5cGVzPzogc3RyaW5nW107XG5cdGFsbG93ZWRWYWx1ZXM/OiBzdHJpbmdbXTtcbn07XG5leHBvcnQgdHlwZSBVSTVBZ2dyZWdhdGlvbk1ldGFkYXRhID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGFsdFR5cGVzPzogc3RyaW5nW107XG5cdG11bHRpcGxlPzogYm9vbGVhbjtcblx0aXNEZWZhdWx0PzogYm9vbGVhbjtcblx0ZGVmYXVsdENsYXNzPzogdW5rbm93bjtcblx0c2luZ3VsYXJOYW1lPzogc3RyaW5nO1xuXHR2aXNpYmlsaXR5Pzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFVJNUFzc29jaWF0aW9uTWV0YWRhdGEgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0bXVsdGlwbGU/OiBib29sZWFuO1xuXHRzaW5ndWxhck5hbWU/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbiA9IHtcblx0ZGVmYXVsdEFnZ3JlZ2F0aW9uPzogc3RyaW5nO1xuXHRjb250cm9sbGVyRXh0ZW5zaW9uczogUmVjb3JkPHN0cmluZywgdHlwZW9mIENvbnRyb2xsZXJFeHRlbnNpb24gfCBGdW5jdGlvbj47XG5cdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFVJNVByb3BlcnR5TWV0YWRhdGE+O1xuXHRhZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFVJNUFnZ3JlZ2F0aW9uTWV0YWRhdGE+O1xuXHRyZWZlcmVuY2VzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcblx0YXNzb2NpYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBVSTVBc3NvY2lhdGlvbk1ldGFkYXRhPjtcblx0bWV0aG9kczogUmVjb3JkPHN0cmluZywgVUk1Q29udHJvbGxlck1ldGhvZERlZmluaXRpb24+O1xuXHRldmVudHM6IFJlY29yZDxzdHJpbmcsIHt9Pjtcblx0aW50ZXJmYWNlczogc3RyaW5nW107XG5cdGxpYnJhcnk/OiBzdHJpbmc7XG5cdGRlc2lnbnRpbWU/OiBzdHJpbmc7XG5cdGNvbmZpZz86IHtcblx0XHRmdWxsV2lkdGg/OiBib29sZWFuO1xuXHR9O1xuXHRtYW5pZmVzdD86IHN0cmluZyB8IHVua25vd247XG5cdHJldHVyblR5cGVzPzogc3RyaW5nW107XG5cdGJ1aWxkaW5nQmxvY2tNZXRhZGF0YT86IHVua25vd247XG59O1xudHlwZSBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiA9IHtcblx0b3ZlcnJpZGU/OiB7IGV4dGVuc2lvbj86IFJlY29yZDxzdHJpbmcsIE92ZXJyaWRlRGVmaW5pdGlvbj4gfSAmIHtcblx0XHRbazogc3RyaW5nXTogRnVuY3Rpb247XG5cdH07XG5cdG92ZXJyaWRlcz86IHsgZXh0ZW5zaW9uPzogUmVjb3JkPHN0cmluZywgT3ZlcnJpZGVEZWZpbml0aW9uPiB9ICYge1xuXHRcdFtrOiBzdHJpbmddOiBGdW5jdGlvbjtcblx0fTtcblx0bWV0YWRhdGE/OiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uO1xuXHRyZW5kZXJlcj86IEZ1bmN0aW9uO1xufTtcblxudHlwZSBVSTVDb250cm9sRGVmaW5pdGlvbiA9IHtcblx0bWV0YWRhdGE/OiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uO1xuXHRvdmVycmlkZT86IHVua25vd247XG5cdHJlbmRlcmVyPzogRnVuY3Rpb247XG59O1xuXG50eXBlIFVJNUFQSUNvbnRyb2wgPSBDb250cm9sICYge1xuXHRnZXRBUEkoZXZlbnQ6IFVJNUV2ZW50LCBmcWRuPzogc3RyaW5nKTogVUk1QVBJQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0aW5zdGFuY2VNYXA6IFdlYWtNYXA8b2JqZWN0LCBvYmplY3RbXT47XG5cdF9fYXBpUmVnaXN0ZXJlZDogYm9vbGVhbjtcbn0gJiB7XG5cdFtrOiBzdHJpbmddOiBGdW5jdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIFhNTEV2ZW50SG9sZGVyID0ge1xuXHRnZXRBUEkoZXZlbnQ6IFVJNUV2ZW50LCBmcWRuPzogc3RyaW5nKTogVUk1QVBJQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0aW5zdGFuY2VNYXA6IFdlYWtNYXA8b2JqZWN0LCBvYmplY3RbXT47XG59O1xuXG50eXBlIENvbnRyb2xQcm9wZXJ0eU5hbWVzPFQ+ID0ge1xuXHQvLyBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgVFMgY29tcGlsZXJcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0W0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogSztcbn1ba2V5b2YgVF07XG5leHBvcnQgdHlwZSBQcm9wZXJ0aWVzT2Y8VCwgSyBleHRlbmRzIGtleW9mIFQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+ID0gUGFydGlhbDxQaWNrPFQsIENvbnRyb2xQcm9wZXJ0eU5hbWVzPFQ+Pj4gJlxuXHQoSyBleHRlbmRzIGtleW9mIFQgPyBQYXJ0aWFsPFBpY2s8VCwgSz4+IDoge30pICZcblx0JENvbnRyb2xTZXR0aW5ncztcbmV4cG9ydCB0eXBlIENvbnZlcnRDb250ZXh0VG9TdHJpbmc8VD4gPSB7XG5cdFtLIGluIGtleW9mIFRdOiBLIGV4dGVuZHMgXCJtZXRhUGF0aFwiIHwgXCJjb250ZXh0UGF0aFwiID8gc3RyaW5nIDogVFtLXTtcbn07XG5leHBvcnQgdHlwZSBTdHJpY3RQcm9wZXJ0aWVzT2Y8VCwgSyBleHRlbmRzIGtleW9mIFQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+ID0gUGljazxULCBDb250cm9sUHJvcGVydHlOYW1lczxUPj4gJlxuXHQoSyBleHRlbmRzIGtleW9mIFQgPyBQaWNrPFQsIEs+IDoge30pICZcblx0JENvbnRyb2xTZXR0aW5ncztcbmV4cG9ydCB0eXBlIFVJNUFjY2Vzc29yczxUPiA9IHtcblx0Ly8gQWRkIGFsbCB0aGUgZ2V0WFhYIG1ldGhvZCwgbWlnaHQgYWRkIHRvbyBtdWNoIGFzIEknbSBub3QgZmlsdGVyaW5nIG9uIGFjdHVhbCBwcm9wZXJ0aWVzLi4uXG5cdFtQIGluIGtleW9mIFJlcXVpcmVkPFQ+IGFzIGBnZXQke0NhcGl0YWxpemU8c3RyaW5nICYgUD59YF06ICgpID0+IFRbUF07XG59O1xuZXhwb3J0IHR5cGUgVUk1U2V0dGVyczxUPiA9IHtcblx0Ly8gQWRkIGFsbCB0aGUgc2V0WFhYIG1ldGhvZCwgbWlnaHQgYWRkIHRvbyBtdWNoIGFzIEknbSBub3QgZmlsdGVyaW5nIG9uIGFjdHVhbCBwcm9wZXJ0aWVzLi4uXG5cdFtQIGluIGtleW9mIFJlcXVpcmVkPFQ+IGFzIGBzZXQke0NhcGl0YWxpemU8c3RyaW5nICYgUD59YF06ICh2YWx1ZTogVFtQXSkgPT4gVDtcbn07XG5leHBvcnQgdHlwZSBFbmhhbmNlV2l0aFVJNTxUPiA9IHtcblx0bmV3IChwcm9wczogUHJvcGVydGllc09mPFQ+KTogRW5oYW5jZVdpdGhVSTU8VD47XG5cdG5ldyAoc0lkOiBzdHJpbmcsIHByb3BzOiBQcm9wZXJ0aWVzT2Y8VD4pOiBFbmhhbmNlV2l0aFVJNTxUPjtcbn0gJiBUICZcblx0VUk1QWNjZXNzb3JzPFQ+ICZcblx0VUk1U2V0dGVyczxUPjtcblxuY29uc3QgZW5zdXJlTWV0YWRhdGEgPSBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiB8IFVJNUNvbnRyb2xEZWZpbml0aW9uKTogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbiB7XG5cdHRhcmdldC5tZXRhZGF0YSA9IG1lcmdlKFxuXHRcdHtcblx0XHRcdGNvbnRyb2xsZXJFeHRlbnNpb25zOiB7fSxcblx0XHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdFx0YWdncmVnYXRpb25zOiB7fSxcblx0XHRcdHJlZmVyZW5jZXM6IHt9LFxuXHRcdFx0YXNzb2NpYXRpb25zOiB7fSxcblx0XHRcdG1ldGhvZHM6IHt9LFxuXHRcdFx0ZXZlbnRzOiB7fSxcblx0XHRcdGludGVyZmFjZXM6IFtdXG5cdFx0fSxcblx0XHR0YXJnZXQubWV0YWRhdGEgPz8ge31cblx0KSBhcyBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uO1xuXHRyZXR1cm4gdGFyZ2V0Lm1ldGFkYXRhO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdGhhdCB3aWxsIGZpbmQgdGhlIGNvcnJlY3QgQVBJIG9iamVjdCBiYXNlZCBvbiB0aGUgY3VycmVudCBjb250cm9sIGhpZXJhcmNoeS5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcmV0dXJucyBUaGUgcHJvcGVyIGdldEFQSSBmdW5jdGlvbiBmb3IgdGhpcyBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBwcmVwYXJlR2V0QVBJRnVuY3Rpb24odGFyZ2V0OiBVSTVBUElDb250cm9sKSB7XG5cdHJldHVybiBmdW5jdGlvbiA8VCBleHRlbmRzIFVJNUFQSUNvbnRyb2w+KFxuXHRcdHRoaXM6IFVJNUFQSUNvbnRyb2wsXG5cdFx0b0V2ZW50OiBVSTVFdmVudCxcblx0XHRhcGlGUU46IHN0cmluZyA9IHRhcmdldC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKVxuXHQpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgb1NvdXJjZSA9IG9FdmVudC5nZXRTb3VyY2UoKSBhcyBNYW5hZ2VkT2JqZWN0IHwgbnVsbDtcblx0XHRpZiAodGFyZ2V0Ll9nZXRBUElFeHRlbnNpb24pIHtcblx0XHRcdG9Tb3VyY2UgPSB0YXJnZXQuX2dldEFQSUV4dGVuc2lvbihvU291cmNlKSA/PyBvU291cmNlO1xuXHRcdH1cblx0XHR3aGlsZSAob1NvdXJjZSAmJiAhb1NvdXJjZS5pc0E8VD4oYXBpRlFOKSAmJiBvU291cmNlLmdldFBhcmVudCkge1xuXHRcdFx0aWYgKHRoaXMuaXNEZXBlbmRlbnRCb3VuZCkge1xuXHRcdFx0XHRjb25zdCBvRGVwZW5kZW50cyA9IChvU291cmNlIGFzIENvbnRyb2wpLmdldERlcGVuZGVudHMoKTtcblx0XHRcdFx0Y29uc3QgaGFzQ29ycmVjdERlcGVuZGVudCA9IG9EZXBlbmRlbnRzLmZpbmQoKG9EZXBlbmRlbnQ6IFVJNUVsZW1lbnQpID0+IG9EZXBlbmRlbnQuaXNBKGFwaUZRTikpO1xuXHRcdFx0XHRpZiAoaGFzQ29ycmVjdERlcGVuZGVudCkge1xuXHRcdFx0XHRcdG9Tb3VyY2UgPSBoYXNDb3JyZWN0RGVwZW5kZW50IGFzIHVua25vd24gYXMgVDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvU291cmNlID0gb1NvdXJjZS5nZXRQYXJlbnQoKSBhcyB1bmtub3duIGFzIFQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9Tb3VyY2UgPSBvU291cmNlLmdldFBhcmVudCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghb1NvdXJjZSB8fCAhb1NvdXJjZS5pc0E8VD4oYXBpRlFOKSkge1xuXHRcdFx0Y29uc3Qgb1NvdXJjZU1hcCA9IHRoaXMuaW5zdGFuY2VNYXAuZ2V0KHRoaXMpIGFzIFRbXTtcblx0XHRcdG9Tb3VyY2UgPSBvU291cmNlTWFwPy5bb1NvdXJjZU1hcC5sZW5ndGggLSAxXTtcblx0XHR9XG5cdFx0bGV0IHRhcmdldENvbnRyb2w7XG5cdFx0aWYgKG9Tb3VyY2UgJiYgb1NvdXJjZS5pc0E8VD4oYXBpRlFOKSkge1xuXHRcdFx0dGFyZ2V0Q29udHJvbCA9IG9Tb3VyY2U7XG5cdFx0fVxuXHRcdHJldHVybiB0YXJnZXRDb250cm9sO1xuXHR9O1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCB3aGVuIGFuIHhtbEV2ZW50SGFuZGxlciBpcyBkZWZpbmVkLCB0aGUgYGdldEFQSWAgZnVuY3Rpb24gaXMgcHJvcGVybHkgYXNzaWduZWQuXG4gKlxuICogQHBhcmFtIHRhcmdldCBUaGUgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBzaG91bGQgaG9sZCB0aGUgc3RhdGljIGZ1bmN0aW9uc1xuICovXG5jb25zdCBlbnN1cmVHZXRBUEkgPSBmdW5jdGlvbiAodGFyZ2V0OiBVSTVBUElDb250cm9sKTogdm9pZCB7XG5cdGlmICghdGFyZ2V0Ll9fYXBpUmVnaXN0ZXJlZCkge1xuXHRcdHRhcmdldC5fX2FwaVJlZ2lzdGVyZWQgPSB0cnVlO1xuXHRcdHRhcmdldC5pbnN0YW5jZU1hcCA9IG5ldyBXZWFrTWFwPG9iamVjdCwgb2JqZWN0W10+KCk7XG5cdFx0dGFyZ2V0LnJlZ2lzdGVySW5zdGFuY2UgPSBmdW5jdGlvbiAoX2luc3RhbmNlOiBGdW5jdGlvbik6IHZvaWQge1xuXHRcdFx0aWYgKCF0aGlzLmluc3RhbmNlTWFwLmdldChfaW5zdGFuY2UuY29uc3RydWN0b3IpKSB7XG5cdFx0XHRcdHRoaXMuaW5zdGFuY2VNYXAuc2V0KF9pbnN0YW5jZS5jb25zdHJ1Y3RvciwgW10pO1xuXHRcdFx0fVxuXHRcdFx0KHRoaXMuaW5zdGFuY2VNYXAuZ2V0KF9pbnN0YW5jZS5jb25zdHJ1Y3RvcikgYXMgb2JqZWN0W10pLnB1c2goX2luc3RhbmNlKTtcblx0XHR9O1xuXHRcdHRhcmdldC5nZXRBUEkgPSBwcmVwYXJlR2V0QVBJRnVuY3Rpb24odGFyZ2V0KTtcblx0fVxufTtcblxuLyogI3JlZ2lvbiBDT05UUk9MTEVSIEVYVEVOU0lPTlMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgYW4gb3ZlcnJpZGUgZm9yIHRoZSBtZXRob2QgbmFtZSB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNwZWNpZmljIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9yIGJhc2UgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHBhcmFtIGV4dGVuc2lvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0aGF0IHdpbGwgYmUgb3ZlcnJpZGRlblxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldGhvZE92ZXJyaWRlKGV4dGVuc2lvbk5hbWU/OiBzdHJpbmcpOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5KSB7XG5cdFx0aWYgKCF0YXJnZXQub3ZlcnJpZGUpIHtcblx0XHRcdHRhcmdldC5vdmVycmlkZSA9IHt9O1xuXHRcdH1cblx0XHRpZiAoIXRhcmdldC5vdmVycmlkZXMpIHtcblx0XHRcdHRhcmdldC5vdmVycmlkZXMgPSB7fTtcblx0XHR9XG5cdFx0bGV0IGN1cnJlbnRUYXJnZXQgPSB0YXJnZXQub3ZlcnJpZGVzO1xuXHRcdGlmIChleHRlbnNpb25OYW1lKSB7XG5cdFx0XHRpZiAoIWN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uKSB7XG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uID0ge307XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uW2V4dGVuc2lvbk5hbWVdKSB7XG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uW2V4dGVuc2lvbk5hbWVdID0ge307XG5cdFx0XHR9XG5cdFx0XHRjdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldC5leHRlbnNpb25bZXh0ZW5zaW9uTmFtZV07XG5cdFx0fVxuXHRcdGN1cnJlbnRUYXJnZXRbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIEZ1bmN0aW9uPilbcHJvcGVydHlLZXkudG9TdHJpbmcoKV07XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBtZXRob2QgY2FuIGJlIGV4dGVuZGVkIGJ5IG90aGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGJhc2VkIG9uIHRoZSBkZWZpbmVkIG92ZXJyaWRlRXhlY3V0aW9uVHlwZS5cbiAqXG4gKiBAcGFyYW0gb3ZlcnJpZGVFeGVjdXRpb25UeXBlIFRoZSBPdmVycmlkZUV4ZWN1dGlvbiBkZWZpbmluZyB3aGVuIHRoZSBvdmVycmlkZSBzaG91bGQgcnVuIChCZWZvcmUgLyBBZnRlciAvIEluc3RlYWQpXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5zaWJsZShvdmVycmlkZUV4ZWN1dGlvblR5cGU/OiBPdmVycmlkZUV4ZWN1dGlvbiB8IFwiQWZ0ZXJBc3luY1wiIHwgXCJCZWZvcmVBc3luY1wiKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSkge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5vdmVycmlkZUV4ZWN1dGlvbiA9IG92ZXJyaWRlRXhlY3V0aW9uVHlwZSBhcyB1bmtub3duIGFzIE92ZXJyaWRlRXhlY3V0aW9uO1xuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIHdpbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlIGZvciBjb250cm9sbGVyIGV4dGVuc2lvbiB1c2FnZS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGljRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5wdWJsaWMgPSB0cnVlO1xuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCB3aWxsIGJlIG9ubHkgYXZhaWxhYmxlIGZvciBpbnRlcm5hbCB1c2FnZSBvZiB0aGUgY29udHJvbGxlciBleHRlbnNpb24uXG4gKlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLnB1YmxpYyA9IGZhbHNlO1xuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCBjYW5ub3QgYmUgZnVydGhlciBleHRlbmRlZCBieSBvdGhlciBjb250cm9sbGVyIGV4dGVuc2lvbi5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWxFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLmZpbmFsID0gdHJ1ZTtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbnN0YW50aWF0ZSBhIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHVuZGVyIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgbmFtZS5cbiAqXG4gKiBAcGFyYW0gZXh0ZW5zaW9uQ2xhc3MgVGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHRoYXQgd2lsbCBiZSBpbnN0YW50aWF0ZWRcbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzaW5nRXh0ZW5zaW9uKGV4dGVuc2lvbkNsYXNzOiB0eXBlb2YgQ29udHJvbGxlckV4dGVuc2lvbiB8IEZ1bmN0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cdFx0bWV0YWRhdGEuY29udHJvbGxlckV4dGVuc2lvbnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSBleHRlbnNpb25DbGFzcztcblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIEkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKiAjZW5kcmVnaW9uICovXG5cbi8qICNyZWdpb24gQ09OVFJPTCAqL1xuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcHJvcGVydHkgc2hhbGwgYmUgZGVjbGFyZWQgYXMgYW4gZXZlbnQgb24gdGhlIGNvbnRyb2wgbWV0YWRhdGEuXG4gKlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZlbnQoKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIGV2ZW50S2V5KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuZXZlbnRzW2V2ZW50S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5ldmVudHNbZXZlbnRLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZm9sbG93aW5nIHByb3BlcnR5IGluIHRoZSBjb250cm9sIG1ldGF0YWRhLlxuICpcbiAqIEBwYXJhbSBhdHRyaWJ1dGVEZWZpbml0aW9uIFRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHkoYXR0cmlidXRlRGVmaW5pdGlvbjogVUk1UHJvcGVydHlNZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmJpbmRhYmxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPSB0cnVlO1xuXHRcdH1cblx0XHRpZiAoYXR0cmlidXRlRGVmaW5pdGlvbi5pc0JpbmRpbmdJbmZvID09PSB0cnVlKSB7XG5cdFx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmJpbmRhYmxlID0gZmFsc2U7XG5cdFx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmdyb3VwID0gXCJEYXRhXCI7XG5cdFx0fVxuXHRcdGlmICghbWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV0pIHtcblx0XHRcdG1ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlLZXldID0gYXR0cmlidXRlRGVmaW5pdGlvbjtcblx0XHR9XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci53cml0YWJsZTtcblx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSA/Pz0gKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogRnVuY3Rpb24gfSkuaW5pdGlhbGl6ZXI/LigpO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbi8qKlxuICogRGVmaW5lcyBhbmQgY29uZmlndXJlIHRoZSBmb2xsb3dpbmcgYWdncmVnYXRpb24gaW4gdGhlIGNvbnRyb2wgbWV0YXRhZGEuXG4gKlxuICogQHBhcmFtIGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiBUaGUgYWdncmVnYXRpb24gZGVmaW5pdGlvblxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbjogVUk1QWdncmVnYXRpb25NZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24ubXVsdGlwbGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gVUk1IGRlZmF1bHRzIHRoaXMgdG8gdHJ1ZSBidXQgdGhpcyBpcyBqdXN0IHdlaXJkLi4uXG5cdFx0XHRhZ2dyZWdhdGlvbkRlZmluaXRpb24ubXVsdGlwbGUgPSBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKCFtZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcHJvcGVydHlLZXldKSB7XG5cdFx0XHRtZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcHJvcGVydHlLZXldID0gYWdncmVnYXRpb25EZWZpbml0aW9uO1xuXHRcdH1cblx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLmlzRGVmYXVsdCkge1xuXHRcdFx0bWV0YWRhdGEuZGVmYXVsdEFnZ3JlZ2F0aW9uID0gcHJvcGVydHlLZXk7XG5cdFx0fVxuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLjtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGFuZCBjb25maWd1cmUgdGhlIGZvbGxvd2luZyBhc3NvY2lhdGlvbiBpbiB0aGUgY29udHJvbCBtZXRhdGFkYS5cbiAqXG4gKiBAcGFyYW0gdWk1QXNzb2NpYXRpb25NZXRhZGF0YSBUaGUgZGVmaW5pdGlvbiBvZiB0aGUgYXNzb2NpYXRpb24uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NvY2lhdGlvbih1aTVBc3NvY2lhdGlvbk1ldGFkYXRhOiBVSTVBc3NvY2lhdGlvbk1ldGFkYXRhKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKCFtZXRhZGF0YS5hc3NvY2lhdGlvbnNbcHJvcGVydHlLZXldKSB7XG5cdFx0XHRtZXRhZGF0YS5hc3NvY2lhdGlvbnNbcHJvcGVydHlLZXldID0gdWk1QXNzb2NpYXRpb25NZXRhZGF0YTtcblx0XHR9XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci53cml0YWJsZTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgaSBkZWNsYXJlIGl0IGFzIHN1Y2guO1xufVxuXG4vKipcbiAqIERlZmluZXMgaW4gdGhlIG1ldGFkYXRhIHRoYXQgdGhpcyBjb250cm9sIGltcGxlbWVudHMgYSBzcGVjaWZpYyBpbnRlcmZhY2UuXG4gKlxuICogQHBhcmFtIGludGVyZmFjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGltcGxlbWVudGVkIGludGVyZmFjZVxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGltcGxlbWVudEludGVyZmFjZShpbnRlcmZhY2VOYW1lOiBzdHJpbmcpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblxuXHRcdG1ldGFkYXRhLmludGVyZmFjZXMucHVzaChpbnRlcmZhY2VOYW1lKTtcblx0fTtcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIG1ldGhvZCBzaG91bGQgYWxzbyBiZSBleHBvc2VkIHN0YXRpY2FsbHkgc28gd2UgY2FuIGNhbGwgaXQgZnJvbSBYTUwuXG4gKlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHhtbEV2ZW50SGFuZGxlcigpOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIHByb3BlcnR5a2V5KSB7XG5cdFx0Y29uc3QgY3VycmVudENvbnN0cnVjdG9yOiBVSTVBUElDb250cm9sID0gdGFyZ2V0LmNvbnN0cnVjdG9yIGFzIHVua25vd24gYXMgVUk1QVBJQ29udHJvbDtcblx0XHRlbnN1cmVHZXRBUEkoY3VycmVudENvbnN0cnVjdG9yKTtcblx0XHRjdXJyZW50Q29uc3RydWN0b3JbcHJvcGVydHlrZXkudG9TdHJpbmcoKV0gPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG5cdFx0XHRpZiAoYXJncyAmJiBhcmdzLmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBjdXJyZW50VGFyZ2V0ID0gY3VycmVudENvbnN0cnVjdG9yLmdldEFQSShhcmdzWzBdIGFzIFVJNUV2ZW50KTtcblx0XHRcdFx0Y3VycmVudFRhcmdldD8uW3Byb3BlcnR5a2V5LnRvU3RyaW5nKCldKC4uLmFyZ3MpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH07XG59XG5cbnR5cGUgVUk1Q29udHJvbEFuZE1vcmUgPSB0eXBlb2YgQ29udHJvbCAmXG5cdEZ1bmN0aW9uICYge1xuXHRcdHJlZ2lzdGVySW5zdGFuY2U/OiBGdW5jdGlvbjtcblx0XHRvdmVycmlkZT86IEZ1bmN0aW9uO1xuXHRcdHJlbmRlcmVyPzogdW5rbm93bjtcblx0XHRyZW5kZXI6IEZ1bmN0aW9uO1xuXHRcdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0fTtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIGNsYXNzIHNob3VsZCBkZWZpbmUgYSBVSTUgY29udHJvbCBvZiB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gKlxuICogQHBhcmFtIHNUYXJnZXQgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBVSTUgY2xhc3NcbiAqIEBwYXJhbSBtZXRhZGF0YURlZmluaXRpb24gSW5saW5lIG1ldGFkYXRhIGRlZmluaXRpb25cbiAqIEBwYXJhbSBmb3JjZURlZmluZUNhbGwgV2hldGhlciBhIGRlZmluZSBjYWxsIHNob3VsZCBiZSBhZGRlZCBmb3IgdGhpcywgdXNlZnVsIHdoZW4gZGVmaW5pbmcgc3ViIGNsYXNzZXNcbiAqIEByZXR1cm5zIEEgY2xhc3MgZGVjb3JhdG9yIHRoYXQgd2lsbCBjcmVhdGUgYSB1aTUgY2xhc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVVJNUNsYXNzKFxuXHRzVGFyZ2V0OiBzdHJpbmcsXG5cdG1ldGFkYXRhRGVmaW5pdGlvbj86IFBhcnRpYWw8VUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbj4sXG5cdGZvcmNlRGVmaW5lQ2FsbCA9IGZhbHNlXG4pOiBDbGFzc0RlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAoY29uc3RydWN0b3I6IFVJNUNvbnRyb2xBbmRNb3JlKSB7XG5cdFx0aWYgKCFjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGEpIHtcblx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YSA9IHt9O1xuXHRcdH1cblx0XHRpZiAobWV0YWRhdGFEZWZpbml0aW9uKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBtZXRhZGF0YURlZmluaXRpb24pIHtcblx0XHRcdFx0aWYgKGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldKSB7XG5cdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0pKSB7XG5cdFx0XHRcdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSA9IGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0bWV0YWRhdGFEZWZpbml0aW9uW2tleSBhcyBrZXlvZiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uXVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0gPSB7XG5cdFx0XHRcdFx0XHRcdC4uLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldLFxuXHRcdFx0XHRcdFx0XHQuLi4obWV0YWRhdGFEZWZpbml0aW9uW2tleSBhcyBrZXlvZiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uXSBhcyBvYmplY3QpXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSA9IG1ldGFkYXRhRGVmaW5pdGlvbltrZXkgYXMga2V5b2YgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbl07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJlZ2lzdGVyVUk1TWV0YWRhdGEoY29uc3RydWN0b3IsIHNUYXJnZXQsIGNvbnN0cnVjdG9yLnByb3RvdHlwZSwgZm9yY2VEZWZpbmVDYWxsKTtcblx0fSBhcyBDbGFzc0RlY29yYXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZmVyZW5jZTxUIGV4dGVuZHMgVUk1RWxlbWVudD4oKTogUmVmPFQ+IHtcblx0cmV0dXJuIHtcblx0XHRjdXJyZW50OiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBULFxuXHRcdHNldEN1cnJlbnQ6IGZ1bmN0aW9uIChvQ29udHJvbEluc3RhbmNlOiBUKTogdm9pZCB7XG5cdFx0XHR0aGlzLmN1cnJlbnQgPSBvQ29udHJvbEluc3RhbmNlO1xuXHRcdH1cblx0fTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBmb2xsb3dpbmcgb2JqZWN0IHdpbGwgaG9sZCBhIHJlZmVyZW5jZSB0byBhIGNvbnRyb2wgdGhyb3VnaCBqc3ggdGVtcGxhdGluZy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUmVmZXJlbmNlKCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cdFx0aWYgKEJhc2VPYmplY3QuaXNPYmplY3RBKHRhcmdldCwgXCJzYXAudWkuY29yZS5Db250cm9sXCIpKSB7XG5cdFx0XHRpZiAoIW1ldGFkYXRhLnJlZmVyZW5jZXNbcHJvcGVydHlLZXldKSB7XG5cdFx0XHRcdG1ldGFkYXRhLnJlZmVyZW5jZXNbcHJvcGVydHlLZXldID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0KHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplciA9IGNyZWF0ZVJlZmVyZW5jZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLjtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBoZWF2eSBsaWZ0aW5nIHRoYXQgd2lsbCB0YWtlIGNhcmUgb2YgY3JlYXRpbmcgdGhlIGNsYXNzIHByb3BlcnR5IGZvciB1aTUgdG8gdXNlLlxuICpcbiAqIEBwYXJhbSBjbGF6eiBUaGUgY2xhc3MgcHJvdG90eXBlXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gY3JlYXRlXG4gKiBAcGFyYW0gaW5PYmogVGhlIG1ldGFkYXRhIG9iamVjdFxuICogQHBhcmFtIGZvcmNlRGVmaW5lQ2FsbCBXaGV0aGVyIGEgZGVmaW5lIGNhbGwgc2hvdWxkIGJlIGFkZGVkIGZvciB0aGlzLCB1c2VmdWwgd2hlbiBkZWZpbmluZyBzdWIgY2xhc3Nlc1xuICogQHJldHVybnMgVGhlIG1ldGFkYXRhIGNsYXNzXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyVUk1TWV0YWRhdGEoXG5cdGNsYXp6OiBVSTVDb250cm9sQW5kTW9yZSxcblx0bmFtZTogc3RyaW5nLFxuXHRpbk9iajogVUk1Q29udHJvbGxlckRlZmluaXRpb24gfCBVSTVDb250cm9sRGVmaW5pdGlvbixcblx0Zm9yY2VEZWZpbmVDYWxsOiBib29sZWFuXG4pOiBGdW5jdGlvbiB7XG5cdGlmIChjbGF6ei5nZXRNZXRhZGF0YT8uKCkuaXNBKFwic2FwLnVpLmNvcmUubXZjLkNvbnRyb2xsZXJFeHRlbnNpb25cIikpIHtcblx0XHRPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbk9iaikuZm9yRWFjaCgob2JqTmFtZSkgPT4ge1xuXHRcdFx0Y29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaW5PYmosIG9iak5hbWUpO1xuXHRcdFx0aWYgKGRlc2NyaXB0b3IgJiYgIWRlc2NyaXB0b3IuZW51bWVyYWJsZSkge1xuXHRcdFx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdGNvbnN0IG9iajogYW55ID0ge307XG5cdG9iai5tZXRhZGF0YSA9IGluT2JqLm1ldGFkYXRhIHx8IHt9O1xuXHRvYmoub3ZlcnJpZGUgPSBpbk9iai5vdmVycmlkZTtcblx0b2JqLmNvbnN0cnVjdG9yID0gY2xheno7XG5cdG9iai5tZXRhZGF0YS5iYXNlVHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjbGF6ei5wcm90b3R5cGUpLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpO1xuXG5cdGlmICgoY2xheno/LmdldE1ldGFkYXRhKCkgYXMgdW5rbm93biBhcyB7IGdldFN0ZXJlb3R5cGU6IEZ1bmN0aW9uIH0pPy5nZXRTdGVyZW90eXBlKCkgPT09IFwiY29udHJvbFwiKSB7XG5cdFx0Y29uc3QgcmVuZGVyZXJEZWZpbml0aW9uID0gaW5PYmoucmVuZGVyZXIgfHwgY2xhenoucmVuZGVyZXIgfHwgY2xhenoucmVuZGVyO1xuXHRcdG9iai5yZW5kZXJlciA9IHsgYXBpVmVyc2lvbjogMiB9O1xuXHRcdGlmICh0eXBlb2YgcmVuZGVyZXJEZWZpbml0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdG9iai5yZW5kZXJlci5yZW5kZXIgPSByZW5kZXJlckRlZmluaXRpb247XG5cdFx0fSBlbHNlIGlmIChyZW5kZXJlckRlZmluaXRpb24gIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvYmoucmVuZGVyZXIgPSByZW5kZXJlckRlZmluaXRpb247XG5cdFx0fVxuXHR9XG5cdG9iai5tZXRhZGF0YS5pbnRlcmZhY2VzID0gaW5PYmoubWV0YWRhdGE/LmludGVyZmFjZXMgfHwgY2xhenoubWV0YWRhdGE/LmludGVyZmFjZXM7XG5cdE9iamVjdC5rZXlzKGNsYXp6LnByb3RvdHlwZSkuZm9yRWFjaCgoa2V5KSA9PiB7XG5cdFx0aWYgKGtleSAhPT0gXCJtZXRhZGF0YVwiKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRvYmpba2V5XSA9IGNsYXp6LnByb3RvdHlwZVtrZXldO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHQvLyBEbyBub3RoaW5nXG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRpZiAob2JqLm1ldGFkYXRhPy5jb250cm9sbGVyRXh0ZW5zaW9ucyAmJiBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEuY29udHJvbGxlckV4dGVuc2lvbnMpLmxlbmd0aCA+IDApIHtcblx0XHRmb3IgKGNvbnN0IGNFeHROYW1lIGluIG9iai5tZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9ucykge1xuXHRcdFx0b2JqW2NFeHROYW1lXSA9IG9iai5tZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9uc1tjRXh0TmFtZV07XG5cdFx0fVxuXHR9XG5cdGNvbnN0IG91dHB1dCA9IGNsYXp6LmV4dGVuZChuYW1lLCBvYmopIGFzIHR5cGVvZiBDb250cm9sICYgRnVuY3Rpb247XG5cdGNvbnN0IGZuSW5pdCA9IG91dHB1dC5wcm90b3R5cGUuaW5pdDtcblx0b3V0cHV0LnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuXHRcdGlmIChmbkluaXQpIHtcblx0XHRcdGZuSW5pdC5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHR9XG5cdFx0aWYgKGNsYXp6LnJlZ2lzdGVySW5zdGFuY2UpIHtcblx0XHRcdGNsYXp6LnJlZ2lzdGVySW5zdGFuY2UodGhpcyk7XG5cdFx0fVxuXHRcdHRoaXMubWV0YWRhdGEgPSBvYmoubWV0YWRhdGE7XG5cblx0XHRpZiAob2JqLm1ldGFkYXRhLnByb3BlcnRpZXMpIHtcblx0XHRcdGNvbnN0IGFQcm9wZXJ0eUtleXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEucHJvcGVydGllcyk7XG5cdFx0XHRhUHJvcGVydHlLZXlzLmZvckVhY2goKHByb3BlcnR5S2V5KSA9PiB7XG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5RGVmID0gb2JqLm1ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlLZXldO1xuXHRcdFx0XHRpZiAocHJvcGVydHlEZWYuaXNCaW5kaW5nSW5mbyA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzID8/PSB7fTtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYmluZGluZ1Byb3BlcnRpZXNbcHJvcGVydHlLZXldID0gdjtcblx0XHRcdFx0XHRcdFx0dGhpcy5tUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSB2O1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQoKTogdW5rbm93biB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BWYWx1ZSA9IHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XSA/PyB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4geyAuLi5wcm9wVmFsdWUgfTsgLy8gQ3JlYXRlIHNoYWxsb3cgY29weVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wVmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlLZXksIHYpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IHRydWU7XG5cdFx0XHRcdFx0dGhpc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eURlZi5kZWZhdWx0VmFsdWU7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IGZhbHNlO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLl9hcHBseWluZ1NldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFBZ2dyZWdhdGlvbktleXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zKTtcblx0XHRcdGFBZ2dyZWdhdGlvbktleXMuZm9yRWFjaCgoYWdncmVnYXRpb25LZXkpID0+IHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGFnZ3JlZ2F0aW9uS2V5LCB7XG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnNldEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uS2V5LCB2KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25Db250ZW50ID0gdGhpcy5nZXRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbktleSk7XG5cdFx0XHRcdFx0XHRpZiAob2JqLm1ldGFkYXRhLmFnZ3JlZ2F0aW9uc1thZ2dyZWdhdGlvbktleV0ubXVsdGlwbGUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ29udGVudCB8fCBbXTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhZ2dyZWdhdGlvbkNvbnRlbnQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgYUFzc29jaWF0aW9uS2V5cyA9IE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5hc3NvY2lhdGlvbnMpO1xuXHRcdFx0YUFzc29jaWF0aW9uS2V5cy5mb3JFYWNoKChhc3NvY2lhdGlvbktleSkgPT4ge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgYXNzb2NpYXRpb25LZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0c2V0OiAodjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0QXNzb2NpYXRpb24oYXNzb2NpYXRpb25LZXksIHYpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkNvbnRlbnQgPSB0aGlzLmdldEFzc29jaWF0aW9uKGFzc29jaWF0aW9uS2V5KTtcblx0XHRcdFx0XHRcdGlmIChvYmoubWV0YWRhdGEuYXNzb2NpYXRpb25zW2Fzc29jaWF0aW9uS2V5XS5tdWx0aXBsZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50IHx8IFtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ29udGVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChvYmoubWV0YWRhdGEucmVmZXJlbmNlcykge1xuXHRcdFx0Y29uc3QgcmVmZXJlbmNlUHJvcGVydGllcyA9IE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5yZWZlcmVuY2VzKTtcblx0XHRcdHJlZmVyZW5jZVByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHlLZXkpID0+IHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5S2V5LCB7XG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbHVlOiBjcmVhdGVSZWZlcmVuY2UoKVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAob2JqLm1ldGFkYXRhLm1ldGhvZHMpIHtcblx0XHRcdGZvciAoY29uc3QgbWV0aG9kTmFtZSBpbiBvYmoubWV0YWRhdGEubWV0aG9kcykge1xuXHRcdFx0XHRjb25zdCBtZXRob2REZWZpbml0aW9uID0gb2JqLm1ldGFkYXRhLm1ldGhvZHNbbWV0aG9kTmFtZV07XG5cdFx0XHRcdGlmIChtZXRob2REZWZpbml0aW9uLm92ZXJyaWRlRXhlY3V0aW9uID09PSBcIkFmdGVyQXN5bmNcIiB8fCBtZXRob2REZWZpbml0aW9uLm92ZXJyaWRlRXhlY3V0aW9uID09PSBcIkJlZm9yZUFzeW5jXCIpIHtcblx0XHRcdFx0XHRpZiAoIXRoaXMubWV0aG9kSG9sZGVyKSB7XG5cdFx0XHRcdFx0XHR0aGlzLm1ldGhvZEhvbGRlciA9IFtdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR0aGlzLm1ldGhvZEhvbGRlclttZXRob2ROYW1lXSA9IFt0aGlzW21ldGhvZE5hbWVdXTtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgbWV0aG9kTmFtZSwge1xuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2V0OiAodjogRnVuY3Rpb24pID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMubWV0aG9kSG9sZGVyW21ldGhvZE5hbWVdLnB1c2godik7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhc3luYyAoLi4ubWV0aG9kQXJnczogdW5rbm93bltdKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgbWV0aG9kQXJyYXlzID0gdGhpcy5tZXRob2RIb2xkZXJbbWV0aG9kTmFtZV07XG5cdFx0XHRcdFx0XHRcdFx0aWYgKG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQmVmb3JlQXN5bmNcIikge1xuXHRcdFx0XHRcdFx0XHRcdFx0bWV0aG9kQXJyYXlzLnJldmVyc2UoKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBhcmcgb2YgbWV0aG9kQXJyYXlzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRhd2FpdCBhcmcuYXBwbHkodGhpcywgbWV0aG9kQXJncyk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjbGF6ei5vdmVycmlkZSA9IGZ1bmN0aW9uIChvRXh0ZW5zaW9uOiB1bmtub3duKTogRnVuY3Rpb24ge1xuXHRcdGNvbnN0IHBvbCA9IHt9O1xuXHRcdChwb2wgYXMgRnVuY3Rpb24pLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IEZ1bmN0aW9uIHtcblx0XHRcdHJldHVybiBjbGF6ei5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHR9O1xuXHRcdGNvbnN0IG9DbGFzcyA9IChNZXRhZGF0YSBhcyB1bmtub3duIGFzIHsgY3JlYXRlQ2xhc3M6IEZ1bmN0aW9uIH0pLmNyZWF0ZUNsYXNzKFxuXHRcdFx0Y2xhenosXG5cdFx0XHRgYW5vbnltb3VzRXh0ZW5zaW9ufiR7dWlkKCl9YCxcblx0XHRcdHBvbCxcblx0XHRcdENvbnRyb2xsZXJNZXRhZGF0YVxuXHRcdCk7XG5cdFx0b0NsYXNzLmdldE1ldGFkYXRhKCkuX3N0YXRpY092ZXJyaWRlID0gb0V4dGVuc2lvbjtcblx0XHRvQ2xhc3MuZ2V0TWV0YWRhdGEoKS5fb3ZlcnJpZGUgPSAoY2xhenouZ2V0TWV0YWRhdGEoKSBhcyB7IF9vdmVycmlkZT86IHVua25vd24gfSkuX292ZXJyaWRlO1xuXHRcdHJldHVybiBvQ2xhc3M7XG5cdH07XG5cblx0T2JqZWN0UGF0aC5zZXQobmFtZSwgb3V0cHV0KTtcblxuXHRpZiAoZm9yY2VEZWZpbmVDYWxsKSB7XG5cdFx0c2FwLnVpLmRlZmluZShvdXRwdXQuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkucmVwbGFjZUFsbChcIi5cIiwgXCIvXCIpLCAoKSA9PiB7XG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIG91dHB1dDtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7RUE2SEEsTUFBTUEsY0FBYyxHQUFHLFVBQVVDLE1BQXNELEVBQWdDO0lBQ3RIQSxNQUFNLENBQUNDLFFBQVEsR0FBR0MsS0FBSyxDQUN0QjtNQUNDQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7TUFDeEJDLFVBQVUsRUFBRSxDQUFDLENBQUM7TUFDZEMsWUFBWSxFQUFFLENBQUMsQ0FBQztNQUNoQkMsVUFBVSxFQUFFLENBQUMsQ0FBQztNQUNkQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO01BQ2hCQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO01BQ1hDLE1BQU0sRUFBRSxDQUFDLENBQUM7TUFDVkMsVUFBVSxFQUFFO0lBQ2IsQ0FBQyxFQUNEVixNQUFNLENBQUNDLFFBQVEsSUFBSSxDQUFDLENBQUMsQ0FDVztJQUNqQyxPQUFPRCxNQUFNLENBQUNDLFFBQVE7RUFDdkIsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTVSxxQkFBcUIsQ0FBQ1gsTUFBcUIsRUFBRTtJQUNyRCxPQUFPLFVBRU5ZLE1BQWdCLEVBRUE7TUFBQSxJQURoQkMsTUFB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