babylonjs-materials 7.50.0 → 7.51.1

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.
@@ -12,488 +12,530 @@ return /******/ (() => { // webpackBootstrap
12
12
  /******/ "use strict";
13
13
  /******/ var __webpack_modules__ = ({
14
14
 
15
- /***/ "../../../dev/materials/src/custom/customMaterial.ts":
16
- /*!***********************************************************!*\
17
- !*** ../../../dev/materials/src/custom/customMaterial.ts ***!
18
- \***********************************************************/
19
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
15
+ /***/ "../../../../node_modules/tslib/tslib.es6.mjs":
16
+ /*!****************************************************!*\
17
+ !*** ../../../../node_modules/tslib/tslib.es6.mjs ***!
18
+ \****************************************************/
19
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
20
20
 
21
21
  __webpack_require__.r(__webpack_exports__);
22
22
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
23
- /* harmony export */ CustomMaterial: () => (/* binding */ CustomMaterial),
24
- /* harmony export */ CustomShaderStructure: () => (/* binding */ CustomShaderStructure),
25
- /* harmony export */ ShaderSpecialParts: () => (/* binding */ ShaderSpecialParts)
23
+ /* harmony export */ __addDisposableResource: () => (/* binding */ __addDisposableResource),
24
+ /* harmony export */ __assign: () => (/* binding */ __assign),
25
+ /* harmony export */ __asyncDelegator: () => (/* binding */ __asyncDelegator),
26
+ /* harmony export */ __asyncGenerator: () => (/* binding */ __asyncGenerator),
27
+ /* harmony export */ __asyncValues: () => (/* binding */ __asyncValues),
28
+ /* harmony export */ __await: () => (/* binding */ __await),
29
+ /* harmony export */ __awaiter: () => (/* binding */ __awaiter),
30
+ /* harmony export */ __classPrivateFieldGet: () => (/* binding */ __classPrivateFieldGet),
31
+ /* harmony export */ __classPrivateFieldIn: () => (/* binding */ __classPrivateFieldIn),
32
+ /* harmony export */ __classPrivateFieldSet: () => (/* binding */ __classPrivateFieldSet),
33
+ /* harmony export */ __createBinding: () => (/* binding */ __createBinding),
34
+ /* harmony export */ __decorate: () => (/* binding */ __decorate),
35
+ /* harmony export */ __disposeResources: () => (/* binding */ __disposeResources),
36
+ /* harmony export */ __esDecorate: () => (/* binding */ __esDecorate),
37
+ /* harmony export */ __exportStar: () => (/* binding */ __exportStar),
38
+ /* harmony export */ __extends: () => (/* binding */ __extends),
39
+ /* harmony export */ __generator: () => (/* binding */ __generator),
40
+ /* harmony export */ __importDefault: () => (/* binding */ __importDefault),
41
+ /* harmony export */ __importStar: () => (/* binding */ __importStar),
42
+ /* harmony export */ __makeTemplateObject: () => (/* binding */ __makeTemplateObject),
43
+ /* harmony export */ __metadata: () => (/* binding */ __metadata),
44
+ /* harmony export */ __param: () => (/* binding */ __param),
45
+ /* harmony export */ __propKey: () => (/* binding */ __propKey),
46
+ /* harmony export */ __read: () => (/* binding */ __read),
47
+ /* harmony export */ __rest: () => (/* binding */ __rest),
48
+ /* harmony export */ __rewriteRelativeImportExtension: () => (/* binding */ __rewriteRelativeImportExtension),
49
+ /* harmony export */ __runInitializers: () => (/* binding */ __runInitializers),
50
+ /* harmony export */ __setFunctionName: () => (/* binding */ __setFunctionName),
51
+ /* harmony export */ __spread: () => (/* binding */ __spread),
52
+ /* harmony export */ __spreadArray: () => (/* binding */ __spreadArray),
53
+ /* harmony export */ __spreadArrays: () => (/* binding */ __spreadArrays),
54
+ /* harmony export */ __values: () => (/* binding */ __values),
55
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
26
56
  /* harmony export */ });
27
- /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
28
- /* harmony import */ var babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Shaders/default.fragment */ "babylonjs/Materials/effect");
29
- /* harmony import */ var babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__);
57
+ /******************************************************************************
58
+ Copyright (c) Microsoft Corporation.
30
59
 
60
+ Permission to use, copy, modify, and/or distribute this software for any
61
+ purpose with or without fee is hereby granted.
31
62
 
63
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
64
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
65
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
66
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
67
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
68
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
69
+ PERFORMANCE OF THIS SOFTWARE.
70
+ ***************************************************************************** */
71
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
32
72
 
73
+ var extendStatics = function(d, b) {
74
+ extendStatics = Object.setPrototypeOf ||
75
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
76
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
77
+ return extendStatics(d, b);
78
+ };
33
79
 
80
+ function __extends(d, b) {
81
+ if (typeof b !== "function" && b !== null)
82
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
83
+ extendStatics(d, b);
84
+ function __() { this.constructor = d; }
85
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
86
+ }
34
87
 
88
+ var __assign = function() {
89
+ __assign = Object.assign || function __assign(t) {
90
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
91
+ s = arguments[i];
92
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
93
+ }
94
+ return t;
95
+ }
96
+ return __assign.apply(this, arguments);
97
+ }
35
98
 
99
+ function __rest(s, e) {
100
+ var t = {};
101
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
102
+ t[p] = s[p];
103
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
104
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
105
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
106
+ t[p[i]] = s[p[i]];
107
+ }
108
+ return t;
109
+ }
36
110
 
37
- /**
38
- * Structure of a custom shader
39
- */
40
- var CustomShaderStructure = /** @class */ (function () {
41
- function CustomShaderStructure() {
42
- }
43
- return CustomShaderStructure;
44
- }());
111
+ function __decorate(decorators, target, key, desc) {
112
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
113
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
114
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
115
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
116
+ }
45
117
 
46
- /**
47
- * Parts of a shader
48
- */
49
- var ShaderSpecialParts = /** @class */ (function () {
50
- function ShaderSpecialParts() {
51
- }
52
- return ShaderSpecialParts;
53
- }());
118
+ function __param(paramIndex, decorator) {
119
+ return function (target, key) { decorator(target, key, paramIndex); }
120
+ }
54
121
 
55
- /**
56
- * Customized material
57
- */
58
- var CustomMaterial = /** @class */ (function (_super) {
59
- (0,tslib__WEBPACK_IMPORTED_MODULE_1__.__extends)(CustomMaterial, _super);
60
- function CustomMaterial(name, scene) {
61
- var _this = _super.call(this, name, scene, true) || this;
62
- _this.CustomParts = new ShaderSpecialParts();
63
- _this.customShaderNameResolve = _this.Builder;
64
- _this.FragmentShader = babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore["defaultPixelShader"];
65
- _this.VertexShader = babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore["defaultVertexShader"];
66
- CustomMaterial.ShaderIndexer++;
67
- _this._createdShaderName = "custom_" + CustomMaterial.ShaderIndexer;
68
- return _this;
69
- }
70
- /**
71
- * Runs after the material is bound to a mesh
72
- * @param mesh mesh bound
73
- * @param effect bound effect used to render
74
- */
75
- CustomMaterial.prototype.AttachAfterBind = function (mesh, effect) {
76
- if (this._newUniformInstances) {
77
- for (var el in this._newUniformInstances) {
78
- var ea = el.toString().split("-");
79
- if (ea[0] == "vec2") {
80
- effect.setVector2(ea[1], this._newUniformInstances[el]);
81
- }
82
- else if (ea[0] == "vec3") {
83
- if (this._newUniformInstances[el] instanceof babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Color3) {
84
- effect.setColor3(ea[1], this._newUniformInstances[el]);
85
- }
86
- else {
87
- effect.setVector3(ea[1], this._newUniformInstances[el]);
88
- }
89
- }
90
- else if (ea[0] == "vec4") {
91
- if (this._newUniformInstances[el] instanceof babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Color4) {
92
- effect.setDirectColor4(ea[1], this._newUniformInstances[el]);
93
- }
94
- else {
95
- effect.setVector4(ea[1], this._newUniformInstances[el]);
96
- }
97
- effect.setVector4(ea[1], this._newUniformInstances[el]);
98
- }
99
- else if (ea[0] == "mat4") {
100
- effect.setMatrix(ea[1], this._newUniformInstances[el]);
101
- }
102
- else if (ea[0] == "float") {
103
- effect.setFloat(ea[1], this._newUniformInstances[el]);
104
- }
105
- }
106
- }
107
- if (this._newSamplerInstances) {
108
- for (var el in this._newSamplerInstances) {
109
- var ea = el.toString().split("-");
110
- if (ea[0] == "sampler2D" && this._newSamplerInstances[el].isReady && this._newSamplerInstances[el].isReady()) {
111
- effect.setTexture(ea[1], this._newSamplerInstances[el]);
112
- }
113
- }
114
- }
115
- };
116
- /**
117
- * @internal
118
- */
119
- CustomMaterial.prototype.ReviewUniform = function (name, arr) {
120
- if (name == "uniform" && this._newUniforms) {
121
- for (var ind = 0; ind < this._newUniforms.length; ind++) {
122
- if (this._customUniform[ind].indexOf("sampler") == -1) {
123
- arr.push(this._newUniforms[ind].replace(/\[\d*\]/g, ""));
124
- }
125
- }
126
- }
127
- if (name == "sampler" && this._newUniforms) {
128
- for (var ind = 0; ind < this._newUniforms.length; ind++) {
129
- if (this._customUniform[ind].indexOf("sampler") != -1) {
130
- arr.push(this._newUniforms[ind].replace(/\[\d*\]/g, ""));
131
- }
132
- }
133
- }
134
- return arr;
135
- };
136
- /**
137
- * Builds the material
138
- * @param shaderName name of the shader
139
- * @param uniforms list of uniforms
140
- * @param uniformBuffers list of uniform buffers
141
- * @param samplers list of samplers
142
- * @param defines list of defines
143
- * @param attributes list of attributes
144
- * @returns the shader name
145
- */
146
- CustomMaterial.prototype.Builder = function (shaderName, uniforms, uniformBuffers, samplers, defines, attributes) {
147
- if (attributes && this._customAttributes && this._customAttributes.length > 0) {
148
- attributes.push.apply(attributes, this._customAttributes);
149
- }
150
- this.ReviewUniform("uniform", uniforms);
151
- this.ReviewUniform("sampler", samplers);
152
- var name = this._createdShaderName;
153
- if (babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore[name + "VertexShader"] && babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore[name + "PixelShader"]) {
154
- return name;
155
- }
156
- babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore[name + "VertexShader"] = this._injectCustomCode(this.VertexShader, "vertex");
157
- babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore[name + "PixelShader"] = this._injectCustomCode(this.FragmentShader, "fragment");
158
- return name;
159
- };
160
- CustomMaterial.prototype._injectCustomCode = function (code, shaderType) {
161
- var customCode = this._getCustomCode(shaderType);
162
- for (var point in customCode) {
163
- var injectedCode = customCode[point];
164
- if (injectedCode && injectedCode.length > 0) {
165
- var fullPointName = "#define " + point;
166
- code = code.replace(fullPointName, "\n" + injectedCode + "\n" + fullPointName);
167
- }
168
- }
169
- return code;
170
- };
171
- CustomMaterial.prototype._getCustomCode = function (shaderType) {
172
- var _a, _b;
173
- if (shaderType === "vertex") {
174
- return {
175
- CUSTOM_VERTEX_BEGIN: this.CustomParts.Vertex_Begin,
176
- CUSTOM_VERTEX_DEFINITIONS: (((_a = this._customUniform) === null || _a === void 0 ? void 0 : _a.join("\n")) || "") + (this.CustomParts.Vertex_Definitions || ""),
177
- CUSTOM_VERTEX_MAIN_BEGIN: this.CustomParts.Vertex_MainBegin,
178
- CUSTOM_VERTEX_UPDATE_POSITION: this.CustomParts.Vertex_Before_PositionUpdated,
179
- CUSTOM_VERTEX_UPDATE_NORMAL: this.CustomParts.Vertex_Before_NormalUpdated,
180
- CUSTOM_VERTEX_MAIN_END: this.CustomParts.Vertex_MainEnd,
181
- CUSTOM_VERTEX_UPDATE_WORLDPOS: this.CustomParts.Vertex_After_WorldPosComputed,
182
- };
183
- }
184
- return {
185
- CUSTOM_FRAGMENT_BEGIN: this.CustomParts.Fragment_Begin,
186
- CUSTOM_FRAGMENT_DEFINITIONS: (((_b = this._customUniform) === null || _b === void 0 ? void 0 : _b.join("\n")) || "") + (this.CustomParts.Fragment_Definitions || ""),
187
- CUSTOM_FRAGMENT_MAIN_BEGIN: this.CustomParts.Fragment_MainBegin,
188
- CUSTOM_FRAGMENT_UPDATE_DIFFUSE: this.CustomParts.Fragment_Custom_Diffuse,
189
- CUSTOM_FRAGMENT_UPDATE_ALPHA: this.CustomParts.Fragment_Custom_Alpha,
190
- CUSTOM_FRAGMENT_BEFORE_LIGHTS: this.CustomParts.Fragment_Before_Lights,
191
- CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: this.CustomParts.Fragment_Before_FragColor,
192
- CUSTOM_FRAGMENT_MAIN_END: this.CustomParts.Fragment_MainEnd,
193
- CUSTOM_FRAGMENT_BEFORE_FOG: this.CustomParts.Fragment_Before_Fog,
194
- };
195
- };
196
- CustomMaterial.prototype._afterBind = function (mesh, effect, subMesh) {
197
- if (effect === void 0) { effect = null; }
198
- if (!effect) {
199
- return;
200
- }
201
- this.AttachAfterBind(mesh, effect);
202
- try {
203
- _super.prototype._afterBind.call(this, mesh, effect, subMesh);
204
- }
205
- catch (e) { }
206
- };
207
- /**
208
- * Adds a new uniform to the shader
209
- * @param name the name of the uniform to add
210
- * @param kind the type of the uniform to add
211
- * @param param the value of the uniform to add
212
- * @returns the current material
213
- */
214
- CustomMaterial.prototype.AddUniform = function (name, kind, param) {
215
- if (!this._customUniform) {
216
- this._customUniform = new Array();
217
- this._newUniforms = new Array();
218
- this._newSamplerInstances = {};
219
- this._newUniformInstances = {};
220
- }
221
- if (param) {
222
- if (kind.indexOf("sampler") != -1) {
223
- this._newSamplerInstances[kind + "-" + name] = param;
224
- }
225
- else {
226
- this._newUniformInstances[kind + "-" + name] = param;
227
- }
228
- }
229
- this._customUniform.push("uniform " + kind + " " + name + ";");
230
- this._newUniforms.push(name);
231
- return this;
232
- };
233
- /**
234
- * Adds a custom attribute
235
- * @param name the name of the attribute
236
- * @returns the current material
237
- */
238
- CustomMaterial.prototype.AddAttribute = function (name) {
239
- if (!this._customAttributes) {
240
- this._customAttributes = [];
241
- }
242
- this._customAttributes.push(name);
243
- return this;
244
- };
245
- /**
246
- * Sets the code on Fragment_Begin portion
247
- * @param shaderPart the code string
248
- * @returns the current material
249
- */
250
- CustomMaterial.prototype.Fragment_Begin = function (shaderPart) {
251
- this.CustomParts.Fragment_Begin = shaderPart;
252
- return this;
253
- };
254
- /**
255
- * Sets the code on Fragment_Definitions portion
256
- * @param shaderPart the code string
257
- * @returns the current material
258
- */
259
- CustomMaterial.prototype.Fragment_Definitions = function (shaderPart) {
260
- this.CustomParts.Fragment_Definitions = shaderPart;
261
- return this;
262
- };
263
- /**
264
- * Sets the code on Fragment_MainBegin portion
265
- * @param shaderPart the code string
266
- * @returns the current material
267
- */
268
- CustomMaterial.prototype.Fragment_MainBegin = function (shaderPart) {
269
- this.CustomParts.Fragment_MainBegin = shaderPart;
270
- return this;
271
- };
272
- /**
273
- * Sets the code on Fragment_MainEnd portion
274
- * @param shaderPart the code string
275
- * @returns the current material
276
- */
277
- CustomMaterial.prototype.Fragment_MainEnd = function (shaderPart) {
278
- this.CustomParts.Fragment_MainEnd = shaderPart;
279
- return this;
280
- };
281
- /**
282
- * Sets the code on Fragment_Custom_Diffuse portion
283
- * @param shaderPart the code string
284
- * @returns the current material
285
- */
286
- CustomMaterial.prototype.Fragment_Custom_Diffuse = function (shaderPart) {
287
- this.CustomParts.Fragment_Custom_Diffuse = shaderPart.replace("result", "diffuseColor");
288
- return this;
289
- };
290
- /**
291
- * Sets the code on Fragment_Custom_Alpha portion
292
- * @param shaderPart the code string
293
- * @returns the current material
294
- */
295
- CustomMaterial.prototype.Fragment_Custom_Alpha = function (shaderPart) {
296
- this.CustomParts.Fragment_Custom_Alpha = shaderPart.replace("result", "alpha");
297
- return this;
298
- };
299
- /**
300
- * Sets the code on Fragment_Before_Lights portion
301
- * @param shaderPart the code string
302
- * @returns the current material
303
- */
304
- CustomMaterial.prototype.Fragment_Before_Lights = function (shaderPart) {
305
- this.CustomParts.Fragment_Before_Lights = shaderPart;
306
- return this;
307
- };
308
- /**
309
- * Sets the code on Fragment_Before_Fog portion
310
- * @param shaderPart the code string
311
- * @returns the current material
312
- */
313
- CustomMaterial.prototype.Fragment_Before_Fog = function (shaderPart) {
314
- this.CustomParts.Fragment_Before_Fog = shaderPart;
315
- return this;
316
- };
317
- /**
318
- * Sets the code on Fragment_Before_FragColor portion
319
- * @param shaderPart the code string
320
- * @returns the current material
321
- */
322
- CustomMaterial.prototype.Fragment_Before_FragColor = function (shaderPart) {
323
- this.CustomParts.Fragment_Before_FragColor = shaderPart.replace("result", "color");
324
- return this;
325
- };
326
- /**
327
- * Sets the code on Vertex_Begin portion
328
- * @param shaderPart the code string
329
- * @returns the current material
330
- */
331
- CustomMaterial.prototype.Vertex_Begin = function (shaderPart) {
332
- this.CustomParts.Vertex_Begin = shaderPart;
333
- return this;
334
- };
335
- /**
336
- * Sets the code on Vertex_Definitions portion
337
- * @param shaderPart the code string
338
- * @returns the current material
339
- */
340
- CustomMaterial.prototype.Vertex_Definitions = function (shaderPart) {
341
- this.CustomParts.Vertex_Definitions = shaderPart;
342
- return this;
343
- };
344
- /**
345
- * Sets the code on Vertex_MainBegin portion
346
- * @param shaderPart the code string
347
- * @returns the current material
348
- */
349
- CustomMaterial.prototype.Vertex_MainBegin = function (shaderPart) {
350
- this.CustomParts.Vertex_MainBegin = shaderPart;
351
- return this;
352
- };
353
- /**
354
- * Sets the code on Vertex_Before_PositionUpdated portion
355
- * @param shaderPart the code string
356
- * @returns the current material
357
- */
358
- CustomMaterial.prototype.Vertex_Before_PositionUpdated = function (shaderPart) {
359
- this.CustomParts.Vertex_Before_PositionUpdated = shaderPart.replace("result", "positionUpdated");
360
- return this;
361
- };
362
- /**
363
- * Sets the code on Vertex_Before_NormalUpdated portion
364
- * @param shaderPart the code string
365
- * @returns the current material
366
- */
367
- CustomMaterial.prototype.Vertex_Before_NormalUpdated = function (shaderPart) {
368
- this.CustomParts.Vertex_Before_NormalUpdated = shaderPart.replace("result", "normalUpdated");
369
- return this;
370
- };
371
- /**
372
- * Sets the code on Vertex_After_WorldPosComputed portion
373
- * @param shaderPart the code string
374
- * @returns the current material
375
- */
376
- CustomMaterial.prototype.Vertex_After_WorldPosComputed = function (shaderPart) {
377
- this.CustomParts.Vertex_After_WorldPosComputed = shaderPart;
378
- return this;
379
- };
380
- /**
381
- * Sets the code on Vertex_MainEnd portion
382
- * @param shaderPart the code string
383
- * @returns the current material
384
- */
385
- CustomMaterial.prototype.Vertex_MainEnd = function (shaderPart) {
386
- this.CustomParts.Vertex_MainEnd = shaderPart;
387
- return this;
388
- };
389
- /**
390
- * Index for each created shader
391
- */
392
- CustomMaterial.ShaderIndexer = 1;
393
- return CustomMaterial;
394
- }(babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.StandardMaterial));
122
+ function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
123
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
124
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
125
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
126
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
127
+ var _, done = false;
128
+ for (var i = decorators.length - 1; i >= 0; i--) {
129
+ var context = {};
130
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
131
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
132
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
133
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
134
+ if (kind === "accessor") {
135
+ if (result === void 0) continue;
136
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
137
+ if (_ = accept(result.get)) descriptor.get = _;
138
+ if (_ = accept(result.set)) descriptor.set = _;
139
+ if (_ = accept(result.init)) initializers.unshift(_);
140
+ }
141
+ else if (_ = accept(result)) {
142
+ if (kind === "field") initializers.unshift(_);
143
+ else descriptor[key] = _;
144
+ }
145
+ }
146
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
147
+ done = true;
148
+ };
395
149
 
396
- (0,babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.RegisterClass)("BABYLON.CustomMaterial", CustomMaterial);
150
+ function __runInitializers(thisArg, initializers, value) {
151
+ var useValue = arguments.length > 2;
152
+ for (var i = 0; i < initializers.length; i++) {
153
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
154
+ }
155
+ return useValue ? value : void 0;
156
+ };
397
157
 
158
+ function __propKey(x) {
159
+ return typeof x === "symbol" ? x : "".concat(x);
160
+ };
398
161
 
399
- /***/ }),
162
+ function __setFunctionName(f, name, prefix) {
163
+ if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
164
+ return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
165
+ };
400
166
 
401
- /***/ "../../../dev/materials/src/custom/index.ts":
402
- /*!**************************************************!*\
403
- !*** ../../../dev/materials/src/custom/index.ts ***!
404
- \**************************************************/
405
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
167
+ function __metadata(metadataKey, metadataValue) {
168
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
169
+ }
406
170
 
407
- __webpack_require__.r(__webpack_exports__);
408
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
409
- /* harmony export */ CustomMaterial: () => (/* reexport safe */ _customMaterial__WEBPACK_IMPORTED_MODULE_0__.CustomMaterial),
410
- /* harmony export */ CustomShaderStructure: () => (/* reexport safe */ _customMaterial__WEBPACK_IMPORTED_MODULE_0__.CustomShaderStructure),
411
- /* harmony export */ PBRCustomMaterial: () => (/* reexport safe */ _pbrCustomMaterial__WEBPACK_IMPORTED_MODULE_1__.PBRCustomMaterial),
412
- /* harmony export */ ShaderAlbedoParts: () => (/* reexport safe */ _pbrCustomMaterial__WEBPACK_IMPORTED_MODULE_1__.ShaderAlbedoParts),
413
- /* harmony export */ ShaderAlebdoParts: () => (/* reexport safe */ _pbrCustomMaterial__WEBPACK_IMPORTED_MODULE_1__.ShaderAlebdoParts),
414
- /* harmony export */ ShaderSpecialParts: () => (/* reexport safe */ _customMaterial__WEBPACK_IMPORTED_MODULE_0__.ShaderSpecialParts)
415
- /* harmony export */ });
416
- /* harmony import */ var _customMaterial__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./customMaterial */ "../../../dev/materials/src/custom/customMaterial.ts");
417
- /* harmony import */ var _pbrCustomMaterial__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pbrCustomMaterial */ "../../../dev/materials/src/custom/pbrCustomMaterial.ts");
171
+ function __awaiter(thisArg, _arguments, P, generator) {
172
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
173
+ return new (P || (P = Promise))(function (resolve, reject) {
174
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
175
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
176
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
177
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
178
+ });
179
+ }
418
180
 
181
+ function __generator(thisArg, body) {
182
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
183
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
184
+ function verb(n) { return function (v) { return step([n, v]); }; }
185
+ function step(op) {
186
+ if (f) throw new TypeError("Generator is already executing.");
187
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
188
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
189
+ if (y = 0, t) op = [op[0] & 2, t.value];
190
+ switch (op[0]) {
191
+ case 0: case 1: t = op; break;
192
+ case 4: _.label++; return { value: op[1], done: false };
193
+ case 5: _.label++; y = op[1]; op = [0]; continue;
194
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
195
+ default:
196
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
197
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
198
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
199
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
200
+ if (t[2]) _.ops.pop();
201
+ _.trys.pop(); continue;
202
+ }
203
+ op = body.call(thisArg, _);
204
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
205
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
206
+ }
207
+ }
419
208
 
209
+ var __createBinding = Object.create ? (function(o, m, k, k2) {
210
+ if (k2 === undefined) k2 = k;
211
+ var desc = Object.getOwnPropertyDescriptor(m, k);
212
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
213
+ desc = { enumerable: true, get: function() { return m[k]; } };
214
+ }
215
+ Object.defineProperty(o, k2, desc);
216
+ }) : (function(o, m, k, k2) {
217
+ if (k2 === undefined) k2 = k;
218
+ o[k2] = m[k];
219
+ });
420
220
 
221
+ function __exportStar(m, o) {
222
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
223
+ }
421
224
 
422
- /***/ }),
225
+ function __values(o) {
226
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
227
+ if (m) return m.call(o);
228
+ if (o && typeof o.length === "number") return {
229
+ next: function () {
230
+ if (o && i >= o.length) o = void 0;
231
+ return { value: o && o[i++], done: !o };
232
+ }
233
+ };
234
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
235
+ }
423
236
 
424
- /***/ "../../../dev/materials/src/custom/pbrCustomMaterial.ts":
425
- /*!**************************************************************!*\
426
- !*** ../../../dev/materials/src/custom/pbrCustomMaterial.ts ***!
427
- \**************************************************************/
428
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
237
+ function __read(o, n) {
238
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
239
+ if (!m) return o;
240
+ var i = m.call(o), r, ar = [], e;
241
+ try {
242
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
243
+ }
244
+ catch (error) { e = { error: error }; }
245
+ finally {
246
+ try {
247
+ if (r && !r.done && (m = i["return"])) m.call(i);
248
+ }
249
+ finally { if (e) throw e.error; }
250
+ }
251
+ return ar;
252
+ }
429
253
 
430
- __webpack_require__.r(__webpack_exports__);
431
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
432
- /* harmony export */ PBRCustomMaterial: () => (/* binding */ PBRCustomMaterial),
433
- /* harmony export */ ShaderAlbedoParts: () => (/* binding */ ShaderAlbedoParts),
434
- /* harmony export */ ShaderAlebdoParts: () => (/* binding */ ShaderAlebdoParts)
435
- /* harmony export */ });
436
- /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
437
- /* harmony import */ var babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Shaders/pbr.fragment */ "babylonjs/Materials/effect");
438
- /* harmony import */ var babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__);
254
+ /** @deprecated */
255
+ function __spread() {
256
+ for (var ar = [], i = 0; i < arguments.length; i++)
257
+ ar = ar.concat(__read(arguments[i]));
258
+ return ar;
259
+ }
260
+
261
+ /** @deprecated */
262
+ function __spreadArrays() {
263
+ for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
264
+ for (var r = Array(s), k = 0, i = 0; i < il; i++)
265
+ for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
266
+ r[k] = a[j];
267
+ return r;
268
+ }
269
+
270
+ function __spreadArray(to, from, pack) {
271
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
272
+ if (ar || !(i in from)) {
273
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
274
+ ar[i] = from[i];
275
+ }
276
+ }
277
+ return to.concat(ar || Array.prototype.slice.call(from));
278
+ }
439
279
 
280
+ function __await(v) {
281
+ return this instanceof __await ? (this.v = v, this) : new __await(v);
282
+ }
440
283
 
284
+ function __asyncGenerator(thisArg, _arguments, generator) {
285
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
286
+ var g = generator.apply(thisArg, _arguments || []), i, q = [];
287
+ return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
288
+ function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
289
+ function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
290
+ function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
291
+ function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
292
+ function fulfill(value) { resume("next", value); }
293
+ function reject(value) { resume("throw", value); }
294
+ function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
295
+ }
441
296
 
297
+ function __asyncDelegator(o) {
298
+ var i, p;
299
+ return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
300
+ function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
301
+ }
442
302
 
303
+ function __asyncValues(o) {
304
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
305
+ var m = o[Symbol.asyncIterator], i;
306
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
307
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
308
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
309
+ }
443
310
 
311
+ function __makeTemplateObject(cooked, raw) {
312
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
313
+ return cooked;
314
+ };
444
315
 
316
+ var __setModuleDefault = Object.create ? (function(o, v) {
317
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
318
+ }) : function(o, v) {
319
+ o["default"] = v;
320
+ };
445
321
 
322
+ var ownKeys = function(o) {
323
+ ownKeys = Object.getOwnPropertyNames || function (o) {
324
+ var ar = [];
325
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
326
+ return ar;
327
+ };
328
+ return ownKeys(o);
329
+ };
446
330
 
447
- /**
448
- * Albedo parts of the shader
449
- */
450
- var ShaderAlbedoParts = /** @class */ (function () {
451
- function ShaderAlbedoParts() {
452
- }
453
- return ShaderAlbedoParts;
454
- }());
331
+ function __importStar(mod) {
332
+ if (mod && mod.__esModule) return mod;
333
+ var result = {};
334
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
335
+ __setModuleDefault(result, mod);
336
+ return result;
337
+ }
455
338
 
456
- /**
457
- * @deprecated use ShaderAlbedoParts instead.
458
- */
459
- var ShaderAlebdoParts = ShaderAlbedoParts;
460
- var PBRCustomMaterial = /** @class */ (function (_super) {
461
- (0,tslib__WEBPACK_IMPORTED_MODULE_1__.__extends)(PBRCustomMaterial, _super);
462
- function PBRCustomMaterial(name, scene) {
463
- var _this = _super.call(this, name, scene, true) || this;
464
- _this.CustomParts = new ShaderAlbedoParts();
465
- _this.customShaderNameResolve = _this.Builder;
466
- _this.FragmentShader = babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore["pbrPixelShader"];
467
- _this.VertexShader = babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore["pbrVertexShader"];
468
- _this.FragmentShader = _this.FragmentShader.replace(/#include<pbrBlockAlbedoOpacity>/g, babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.IncludesShadersStore["pbrBlockAlbedoOpacity"]);
469
- _this.FragmentShader = _this.FragmentShader.replace(/#include<pbrBlockReflectivity>/g, babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.IncludesShadersStore["pbrBlockReflectivity"]);
470
- _this.FragmentShader = _this.FragmentShader.replace(/#include<pbrBlockFinalColorComposition>/g, babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.IncludesShadersStore["pbrBlockFinalColorComposition"]);
471
- PBRCustomMaterial.ShaderIndexer++;
472
- _this._createdShaderName = "custompbr_" + PBRCustomMaterial.ShaderIndexer;
473
- return _this;
339
+ function __importDefault(mod) {
340
+ return (mod && mod.__esModule) ? mod : { default: mod };
341
+ }
342
+
343
+ function __classPrivateFieldGet(receiver, state, kind, f) {
344
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
345
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
346
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
347
+ }
348
+
349
+ function __classPrivateFieldSet(receiver, state, value, kind, f) {
350
+ if (kind === "m") throw new TypeError("Private method is not writable");
351
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
352
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
353
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
354
+ }
355
+
356
+ function __classPrivateFieldIn(state, receiver) {
357
+ if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
358
+ return typeof state === "function" ? receiver === state : state.has(receiver);
359
+ }
360
+
361
+ function __addDisposableResource(env, value, async) {
362
+ if (value !== null && value !== void 0) {
363
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
364
+ var dispose, inner;
365
+ if (async) {
366
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
367
+ dispose = value[Symbol.asyncDispose];
474
368
  }
475
- /**
476
- * Runs after the material is bound to a mesh
477
- * @param mesh mesh bound
478
- * @param effect bound effect used to render
479
- */
480
- PBRCustomMaterial.prototype.AttachAfterBind = function (mesh, effect) {
481
- if (this._newUniformInstances) {
482
- for (var el in this._newUniformInstances) {
483
- var ea = el.toString().split("-");
484
- if (ea[0] == "vec2") {
485
- effect.setVector2(ea[1], this._newUniformInstances[el]);
486
- }
487
- else if (ea[0] == "vec3") {
488
- if (this._newUniformInstances[el] instanceof babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Color3) {
489
- effect.setColor3(ea[1], this._newUniformInstances[el]);
490
- }
491
- else {
492
- effect.setVector3(ea[1], this._newUniformInstances[el]);
493
- }
494
- }
495
- else if (ea[0] == "vec4") {
496
- if (this._newUniformInstances[el] instanceof babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Color4) {
369
+ if (dispose === void 0) {
370
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
371
+ dispose = value[Symbol.dispose];
372
+ if (async) inner = dispose;
373
+ }
374
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
375
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
376
+ env.stack.push({ value: value, dispose: dispose, async: async });
377
+ }
378
+ else if (async) {
379
+ env.stack.push({ async: true });
380
+ }
381
+ return value;
382
+ }
383
+
384
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
385
+ var e = new Error(message);
386
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
387
+ };
388
+
389
+ function __disposeResources(env) {
390
+ function fail(e) {
391
+ env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
392
+ env.hasError = true;
393
+ }
394
+ var r, s = 0;
395
+ function next() {
396
+ while (r = env.stack.pop()) {
397
+ try {
398
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
399
+ if (r.dispose) {
400
+ var result = r.dispose.call(r.value);
401
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
402
+ }
403
+ else s |= 1;
404
+ }
405
+ catch (e) {
406
+ fail(e);
407
+ }
408
+ }
409
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
410
+ if (env.hasError) throw env.error;
411
+ }
412
+ return next();
413
+ }
414
+
415
+ function __rewriteRelativeImportExtension(path, preserveJsx) {
416
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
417
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
418
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
419
+ });
420
+ }
421
+ return path;
422
+ }
423
+
424
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
425
+ __extends,
426
+ __assign,
427
+ __rest,
428
+ __decorate,
429
+ __param,
430
+ __esDecorate,
431
+ __runInitializers,
432
+ __propKey,
433
+ __setFunctionName,
434
+ __metadata,
435
+ __awaiter,
436
+ __generator,
437
+ __createBinding,
438
+ __exportStar,
439
+ __values,
440
+ __read,
441
+ __spread,
442
+ __spreadArrays,
443
+ __spreadArray,
444
+ __await,
445
+ __asyncGenerator,
446
+ __asyncDelegator,
447
+ __asyncValues,
448
+ __makeTemplateObject,
449
+ __importStar,
450
+ __importDefault,
451
+ __classPrivateFieldGet,
452
+ __classPrivateFieldSet,
453
+ __classPrivateFieldIn,
454
+ __addDisposableResource,
455
+ __disposeResources,
456
+ __rewriteRelativeImportExtension,
457
+ });
458
+
459
+
460
+ /***/ }),
461
+
462
+ /***/ "../../../dev/materials/src/custom/customMaterial.ts":
463
+ /*!***********************************************************!*\
464
+ !*** ../../../dev/materials/src/custom/customMaterial.ts ***!
465
+ \***********************************************************/
466
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
467
+
468
+ __webpack_require__.r(__webpack_exports__);
469
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
470
+ /* harmony export */ CustomMaterial: () => (/* binding */ CustomMaterial),
471
+ /* harmony export */ CustomShaderStructure: () => (/* binding */ CustomShaderStructure),
472
+ /* harmony export */ ShaderSpecialParts: () => (/* binding */ ShaderSpecialParts)
473
+ /* harmony export */ });
474
+ /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
475
+ /* harmony import */ var babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Shaders/default.fragment */ "babylonjs/Materials/effect");
476
+ /* harmony import */ var babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__);
477
+
478
+
479
+
480
+
481
+
482
+
483
+
484
+ /**
485
+ * Structure of a custom shader
486
+ */
487
+ var CustomShaderStructure = /** @class */ (function () {
488
+ function CustomShaderStructure() {
489
+ }
490
+ return CustomShaderStructure;
491
+ }());
492
+
493
+ /**
494
+ * Parts of a shader
495
+ */
496
+ var ShaderSpecialParts = /** @class */ (function () {
497
+ function ShaderSpecialParts() {
498
+ }
499
+ return ShaderSpecialParts;
500
+ }());
501
+
502
+ /**
503
+ * Customized material
504
+ */
505
+ var CustomMaterial = /** @class */ (function (_super) {
506
+ (0,tslib__WEBPACK_IMPORTED_MODULE_1__.__extends)(CustomMaterial, _super);
507
+ function CustomMaterial(name, scene) {
508
+ var _this = _super.call(this, name, scene, true) || this;
509
+ _this.CustomParts = new ShaderSpecialParts();
510
+ _this.customShaderNameResolve = _this.Builder;
511
+ _this.FragmentShader = babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore["defaultPixelShader"];
512
+ _this.VertexShader = babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore["defaultVertexShader"];
513
+ CustomMaterial.ShaderIndexer++;
514
+ _this._createdShaderName = "custom_" + CustomMaterial.ShaderIndexer;
515
+ return _this;
516
+ }
517
+ /**
518
+ * Runs after the material is bound to a mesh
519
+ * @param mesh mesh bound
520
+ * @param effect bound effect used to render
521
+ */
522
+ CustomMaterial.prototype.AttachAfterBind = function (mesh, effect) {
523
+ if (this._newUniformInstances) {
524
+ for (var el in this._newUniformInstances) {
525
+ var ea = el.toString().split("-");
526
+ if (ea[0] == "vec2") {
527
+ effect.setVector2(ea[1], this._newUniformInstances[el]);
528
+ }
529
+ else if (ea[0] == "vec3") {
530
+ if (this._newUniformInstances[el] instanceof babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Color3) {
531
+ effect.setColor3(ea[1], this._newUniformInstances[el]);
532
+ }
533
+ else {
534
+ effect.setVector3(ea[1], this._newUniformInstances[el]);
535
+ }
536
+ }
537
+ else if (ea[0] == "vec4") {
538
+ if (this._newUniformInstances[el] instanceof babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Color4) {
497
539
  effect.setDirectColor4(ea[1], this._newUniformInstances[el]);
498
540
  }
499
541
  else {
@@ -521,7 +563,7 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
521
563
  /**
522
564
  * @internal
523
565
  */
524
- PBRCustomMaterial.prototype.ReviewUniform = function (name, arr) {
566
+ CustomMaterial.prototype.ReviewUniform = function (name, arr) {
525
567
  if (name == "uniform" && this._newUniforms) {
526
568
  for (var ind = 0; ind < this._newUniforms.length; ind++) {
527
569
  if (this._customUniform[ind].indexOf("sampler") == -1) {
@@ -546,22 +588,9 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
546
588
  * @param samplers list of samplers
547
589
  * @param defines list of defines
548
590
  * @param attributes list of attributes
549
- * @param options options to compile the shader
550
591
  * @returns the shader name
551
592
  */
552
- PBRCustomMaterial.prototype.Builder = function (shaderName, uniforms, uniformBuffers, samplers, defines, attributes, options) {
553
- if (options) {
554
- var currentProcessing_1 = options.processFinalCode;
555
- options.processFinalCode = function (type, code) {
556
- if (type === "vertex") {
557
- return currentProcessing_1 ? currentProcessing_1(type, code) : code;
558
- }
559
- var sci = new babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.ShaderCodeInliner(code);
560
- sci.inlineToken = "#define pbr_inline";
561
- sci.processCode();
562
- return currentProcessing_1 ? currentProcessing_1(type, sci.code) : sci.code;
563
- };
564
- }
593
+ CustomMaterial.prototype.Builder = function (shaderName, uniforms, uniformBuffers, samplers, defines, attributes) {
565
594
  if (attributes && this._customAttributes && this._customAttributes.length > 0) {
566
595
  attributes.push.apply(attributes, this._customAttributes);
567
596
  }
@@ -575,7 +604,7 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
575
604
  babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore[name + "PixelShader"] = this._injectCustomCode(this.FragmentShader, "fragment");
576
605
  return name;
577
606
  };
578
- PBRCustomMaterial.prototype._injectCustomCode = function (code, shaderType) {
607
+ CustomMaterial.prototype._injectCustomCode = function (code, shaderType) {
579
608
  var customCode = this._getCustomCode(shaderType);
580
609
  for (var point in customCode) {
581
610
  var injectedCode = customCode[point];
@@ -586,7 +615,7 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
586
615
  }
587
616
  return code;
588
617
  };
589
- PBRCustomMaterial.prototype._getCustomCode = function (shaderType) {
618
+ CustomMaterial.prototype._getCustomCode = function (shaderType) {
590
619
  var _a, _b;
591
620
  if (shaderType === "vertex") {
592
621
  return {
@@ -601,20 +630,17 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
601
630
  }
602
631
  return {
603
632
  CUSTOM_FRAGMENT_BEGIN: this.CustomParts.Fragment_Begin,
604
- CUSTOM_FRAGMENT_MAIN_BEGIN: this.CustomParts.Fragment_MainBegin,
605
633
  CUSTOM_FRAGMENT_DEFINITIONS: (((_b = this._customUniform) === null || _b === void 0 ? void 0 : _b.join("\n")) || "") + (this.CustomParts.Fragment_Definitions || ""),
606
- CUSTOM_FRAGMENT_UPDATE_ALBEDO: this.CustomParts.Fragment_Custom_Albedo,
634
+ CUSTOM_FRAGMENT_MAIN_BEGIN: this.CustomParts.Fragment_MainBegin,
635
+ CUSTOM_FRAGMENT_UPDATE_DIFFUSE: this.CustomParts.Fragment_Custom_Diffuse,
607
636
  CUSTOM_FRAGMENT_UPDATE_ALPHA: this.CustomParts.Fragment_Custom_Alpha,
608
637
  CUSTOM_FRAGMENT_BEFORE_LIGHTS: this.CustomParts.Fragment_Before_Lights,
609
- CUSTOM_FRAGMENT_UPDATE_METALLICROUGHNESS: this.CustomParts.Fragment_Custom_MetallicRoughness,
610
- CUSTOM_FRAGMENT_UPDATE_MICROSURFACE: this.CustomParts.Fragment_Custom_MicroSurface,
611
- CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION: this.CustomParts.Fragment_Before_FinalColorComposition,
612
638
  CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: this.CustomParts.Fragment_Before_FragColor,
613
639
  CUSTOM_FRAGMENT_MAIN_END: this.CustomParts.Fragment_MainEnd,
614
640
  CUSTOM_FRAGMENT_BEFORE_FOG: this.CustomParts.Fragment_Before_Fog,
615
641
  };
616
642
  };
617
- PBRCustomMaterial.prototype._afterBind = function (mesh, effect, subMesh) {
643
+ CustomMaterial.prototype._afterBind = function (mesh, effect, subMesh) {
618
644
  if (effect === void 0) { effect = null; }
619
645
  if (!effect) {
620
646
  return;
@@ -632,7 +658,7 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
632
658
  * @param param the value of the uniform to add
633
659
  * @returns the current material
634
660
  */
635
- PBRCustomMaterial.prototype.AddUniform = function (name, kind, param) {
661
+ CustomMaterial.prototype.AddUniform = function (name, kind, param) {
636
662
  if (!this._customUniform) {
637
663
  this._customUniform = new Array();
638
664
  this._newUniforms = new Array();
@@ -656,7 +682,7 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
656
682
  * @param name the name of the attribute
657
683
  * @returns the current material
658
684
  */
659
- PBRCustomMaterial.prototype.AddAttribute = function (name) {
685
+ CustomMaterial.prototype.AddAttribute = function (name) {
660
686
  if (!this._customAttributes) {
661
687
  this._customAttributes = [];
662
688
  }
@@ -668,7 +694,7 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
668
694
  * @param shaderPart the code string
669
695
  * @returns the current material
670
696
  */
671
- PBRCustomMaterial.prototype.Fragment_Begin = function (shaderPart) {
697
+ CustomMaterial.prototype.Fragment_Begin = function (shaderPart) {
672
698
  this.CustomParts.Fragment_Begin = shaderPart;
673
699
  return this;
674
700
  };
@@ -677,7 +703,7 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
677
703
  * @param shaderPart the code string
678
704
  * @returns the current material
679
705
  */
680
- PBRCustomMaterial.prototype.Fragment_Definitions = function (shaderPart) {
706
+ CustomMaterial.prototype.Fragment_Definitions = function (shaderPart) {
681
707
  this.CustomParts.Fragment_Definitions = shaderPart;
682
708
  return this;
683
709
  };
@@ -686,17 +712,26 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
686
712
  * @param shaderPart the code string
687
713
  * @returns the current material
688
714
  */
689
- PBRCustomMaterial.prototype.Fragment_MainBegin = function (shaderPart) {
715
+ CustomMaterial.prototype.Fragment_MainBegin = function (shaderPart) {
690
716
  this.CustomParts.Fragment_MainBegin = shaderPart;
691
717
  return this;
692
718
  };
693
719
  /**
694
- * Sets the code on Fragment_Custom_Albedo portion
720
+ * Sets the code on Fragment_MainEnd portion
695
721
  * @param shaderPart the code string
696
722
  * @returns the current material
697
723
  */
698
- PBRCustomMaterial.prototype.Fragment_Custom_Albedo = function (shaderPart) {
699
- this.CustomParts.Fragment_Custom_Albedo = shaderPart.replace("result", "surfaceAlbedo");
724
+ CustomMaterial.prototype.Fragment_MainEnd = function (shaderPart) {
725
+ this.CustomParts.Fragment_MainEnd = shaderPart;
726
+ return this;
727
+ };
728
+ /**
729
+ * Sets the code on Fragment_Custom_Diffuse portion
730
+ * @param shaderPart the code string
731
+ * @returns the current material
732
+ */
733
+ CustomMaterial.prototype.Fragment_Custom_Diffuse = function (shaderPart) {
734
+ this.CustomParts.Fragment_Custom_Diffuse = shaderPart.replace("result", "diffuseColor");
700
735
  return this;
701
736
  };
702
737
  /**
@@ -704,7 +739,7 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
704
739
  * @param shaderPart the code string
705
740
  * @returns the current material
706
741
  */
707
- PBRCustomMaterial.prototype.Fragment_Custom_Alpha = function (shaderPart) {
742
+ CustomMaterial.prototype.Fragment_Custom_Alpha = function (shaderPart) {
708
743
  this.CustomParts.Fragment_Custom_Alpha = shaderPart.replace("result", "alpha");
709
744
  return this;
710
745
  };
@@ -713,88 +748,52 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
713
748
  * @param shaderPart the code string
714
749
  * @returns the current material
715
750
  */
716
- PBRCustomMaterial.prototype.Fragment_Before_Lights = function (shaderPart) {
751
+ CustomMaterial.prototype.Fragment_Before_Lights = function (shaderPart) {
717
752
  this.CustomParts.Fragment_Before_Lights = shaderPart;
718
753
  return this;
719
754
  };
720
755
  /**
721
- * Sets the code on Fragment_Custom_MetallicRoughness portion
756
+ * Sets the code on Fragment_Before_Fog portion
722
757
  * @param shaderPart the code string
723
758
  * @returns the current material
724
759
  */
725
- PBRCustomMaterial.prototype.Fragment_Custom_MetallicRoughness = function (shaderPart) {
726
- this.CustomParts.Fragment_Custom_MetallicRoughness = shaderPart;
760
+ CustomMaterial.prototype.Fragment_Before_Fog = function (shaderPart) {
761
+ this.CustomParts.Fragment_Before_Fog = shaderPart;
727
762
  return this;
728
763
  };
729
764
  /**
730
- * Sets the code on Fragment_Custom_MicroSurface portion
765
+ * Sets the code on Fragment_Before_FragColor portion
731
766
  * @param shaderPart the code string
732
767
  * @returns the current material
733
768
  */
734
- PBRCustomMaterial.prototype.Fragment_Custom_MicroSurface = function (shaderPart) {
735
- this.CustomParts.Fragment_Custom_MicroSurface = shaderPart;
769
+ CustomMaterial.prototype.Fragment_Before_FragColor = function (shaderPart) {
770
+ this.CustomParts.Fragment_Before_FragColor = shaderPart.replace("result", "color");
736
771
  return this;
737
772
  };
738
773
  /**
739
- * Sets the code on Fragment_Before_Fog portion
774
+ * Sets the code on Vertex_Begin portion
740
775
  * @param shaderPart the code string
741
776
  * @returns the current material
742
777
  */
743
- PBRCustomMaterial.prototype.Fragment_Before_Fog = function (shaderPart) {
744
- this.CustomParts.Fragment_Before_Fog = shaderPart;
778
+ CustomMaterial.prototype.Vertex_Begin = function (shaderPart) {
779
+ this.CustomParts.Vertex_Begin = shaderPart;
745
780
  return this;
746
781
  };
747
782
  /**
748
- * Sets the code on Fragment_Before_FinalColorComposition portion
783
+ * Sets the code on Vertex_Definitions portion
749
784
  * @param shaderPart the code string
750
785
  * @returns the current material
751
786
  */
752
- PBRCustomMaterial.prototype.Fragment_Before_FinalColorComposition = function (shaderPart) {
753
- this.CustomParts.Fragment_Before_FinalColorComposition = shaderPart;
787
+ CustomMaterial.prototype.Vertex_Definitions = function (shaderPart) {
788
+ this.CustomParts.Vertex_Definitions = shaderPart;
754
789
  return this;
755
790
  };
756
791
  /**
757
- * Sets the code on Fragment_Before_FragColor portion
792
+ * Sets the code on Vertex_MainBegin portion
758
793
  * @param shaderPart the code string
759
794
  * @returns the current material
760
795
  */
761
- PBRCustomMaterial.prototype.Fragment_Before_FragColor = function (shaderPart) {
762
- this.CustomParts.Fragment_Before_FragColor = shaderPart.replace("result", "color");
763
- return this;
764
- };
765
- /**
766
- * Sets the code on Fragment_MainEnd portion
767
- * @param shaderPart the code string
768
- * @returns the current material
769
- */
770
- PBRCustomMaterial.prototype.Fragment_MainEnd = function (shaderPart) {
771
- this.CustomParts.Fragment_MainEnd = shaderPart;
772
- return this;
773
- };
774
- /**
775
- * Sets the code on Vertex_Begin portion
776
- * @param shaderPart the code string
777
- * @returns the current material
778
- */
779
- PBRCustomMaterial.prototype.Vertex_Begin = function (shaderPart) {
780
- this.CustomParts.Vertex_Begin = shaderPart;
781
- return this;
782
- };
783
- /**
784
- * Sets the code on Vertex_Definitions portion
785
- * @param shaderPart the code string
786
- * @returns the current material
787
- */
788
- PBRCustomMaterial.prototype.Vertex_Definitions = function (shaderPart) {
789
- this.CustomParts.Vertex_Definitions = shaderPart;
790
- return this;
791
- };
792
- /**
793
- * Sets the code on Vertex_MainBegin portion
794
- * @param shaderPart the code string
795
- * @returns the current material
796
- */
797
- PBRCustomMaterial.prototype.Vertex_MainBegin = function (shaderPart) {
796
+ CustomMaterial.prototype.Vertex_MainBegin = function (shaderPart) {
798
797
  this.CustomParts.Vertex_MainBegin = shaderPart;
799
798
  return this;
800
799
  };
@@ -803,7 +802,7 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
803
802
  * @param shaderPart the code string
804
803
  * @returns the current material
805
804
  */
806
- PBRCustomMaterial.prototype.Vertex_Before_PositionUpdated = function (shaderPart) {
805
+ CustomMaterial.prototype.Vertex_Before_PositionUpdated = function (shaderPart) {
807
806
  this.CustomParts.Vertex_Before_PositionUpdated = shaderPart.replace("result", "positionUpdated");
808
807
  return this;
809
808
  };
@@ -812,7 +811,7 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
812
811
  * @param shaderPart the code string
813
812
  * @returns the current material
814
813
  */
815
- PBRCustomMaterial.prototype.Vertex_Before_NormalUpdated = function (shaderPart) {
814
+ CustomMaterial.prototype.Vertex_Before_NormalUpdated = function (shaderPart) {
816
815
  this.CustomParts.Vertex_Before_NormalUpdated = shaderPart.replace("result", "normalUpdated");
817
816
  return this;
818
817
  };
@@ -821,7 +820,7 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
821
820
  * @param shaderPart the code string
822
821
  * @returns the current material
823
822
  */
824
- PBRCustomMaterial.prototype.Vertex_After_WorldPosComputed = function (shaderPart) {
823
+ CustomMaterial.prototype.Vertex_After_WorldPosComputed = function (shaderPart) {
825
824
  this.CustomParts.Vertex_After_WorldPosComputed = shaderPart;
826
825
  return this;
827
826
  };
@@ -830,509 +829,510 @@ var PBRCustomMaterial = /** @class */ (function (_super) {
830
829
  * @param shaderPart the code string
831
830
  * @returns the current material
832
831
  */
833
- PBRCustomMaterial.prototype.Vertex_MainEnd = function (shaderPart) {
832
+ CustomMaterial.prototype.Vertex_MainEnd = function (shaderPart) {
834
833
  this.CustomParts.Vertex_MainEnd = shaderPart;
835
834
  return this;
836
835
  };
837
836
  /**
838
837
  * Index for each created shader
839
838
  */
840
- PBRCustomMaterial.ShaderIndexer = 1;
841
- return PBRCustomMaterial;
842
- }(babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.PBRMaterial));
839
+ CustomMaterial.ShaderIndexer = 1;
840
+ return CustomMaterial;
841
+ }(babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.StandardMaterial));
843
842
 
844
- (0,babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.RegisterClass)("BABYLON.PBRCustomMaterial", PBRCustomMaterial);
843
+ (0,babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.RegisterClass)("BABYLON.CustomMaterial", CustomMaterial);
845
844
 
846
845
 
847
846
  /***/ }),
848
847
 
849
- /***/ "../../../lts/materials/src/legacy/legacy-custom.ts":
850
- /*!**********************************************************!*\
851
- !*** ../../../lts/materials/src/legacy/legacy-custom.ts ***!
852
- \**********************************************************/
848
+ /***/ "../../../dev/materials/src/custom/index.ts":
849
+ /*!**************************************************!*\
850
+ !*** ../../../dev/materials/src/custom/index.ts ***!
851
+ \**************************************************/
853
852
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
854
853
 
855
854
  __webpack_require__.r(__webpack_exports__);
856
855
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
857
- /* harmony export */ CustomMaterial: () => (/* reexport safe */ materials_custom_index__WEBPACK_IMPORTED_MODULE_0__.CustomMaterial),
858
- /* harmony export */ CustomShaderStructure: () => (/* reexport safe */ materials_custom_index__WEBPACK_IMPORTED_MODULE_0__.CustomShaderStructure),
859
- /* harmony export */ PBRCustomMaterial: () => (/* reexport safe */ materials_custom_index__WEBPACK_IMPORTED_MODULE_0__.PBRCustomMaterial),
860
- /* harmony export */ ShaderAlbedoParts: () => (/* reexport safe */ materials_custom_index__WEBPACK_IMPORTED_MODULE_0__.ShaderAlbedoParts),
861
- /* harmony export */ ShaderAlebdoParts: () => (/* reexport safe */ materials_custom_index__WEBPACK_IMPORTED_MODULE_0__.ShaderAlebdoParts),
862
- /* harmony export */ ShaderSpecialParts: () => (/* reexport safe */ materials_custom_index__WEBPACK_IMPORTED_MODULE_0__.ShaderSpecialParts)
856
+ /* harmony export */ CustomMaterial: () => (/* reexport safe */ _customMaterial__WEBPACK_IMPORTED_MODULE_0__.CustomMaterial),
857
+ /* harmony export */ CustomShaderStructure: () => (/* reexport safe */ _customMaterial__WEBPACK_IMPORTED_MODULE_0__.CustomShaderStructure),
858
+ /* harmony export */ PBRCustomMaterial: () => (/* reexport safe */ _pbrCustomMaterial__WEBPACK_IMPORTED_MODULE_1__.PBRCustomMaterial),
859
+ /* harmony export */ ShaderAlbedoParts: () => (/* reexport safe */ _pbrCustomMaterial__WEBPACK_IMPORTED_MODULE_1__.ShaderAlbedoParts),
860
+ /* harmony export */ ShaderAlebdoParts: () => (/* reexport safe */ _pbrCustomMaterial__WEBPACK_IMPORTED_MODULE_1__.ShaderAlebdoParts),
861
+ /* harmony export */ ShaderSpecialParts: () => (/* reexport safe */ _customMaterial__WEBPACK_IMPORTED_MODULE_0__.ShaderSpecialParts)
863
862
  /* harmony export */ });
864
- /* harmony import */ var materials_custom_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! materials/custom/index */ "../../../dev/materials/src/custom/index.ts");
865
- /* eslint-disable import/no-internal-modules */
866
-
867
- /**
868
- * This is the entry point for the UMD module.
869
- * The entry point for a future ESM package should be index.ts
870
- */
871
- var globalObject = typeof __webpack_require__.g !== "undefined" ? __webpack_require__.g : typeof window !== "undefined" ? window : undefined;
872
- if (typeof globalObject !== "undefined") {
873
- for (var key in materials_custom_index__WEBPACK_IMPORTED_MODULE_0__) {
874
- globalObject.BABYLON[key] = materials_custom_index__WEBPACK_IMPORTED_MODULE_0__[key];
875
- }
876
- }
877
-
878
-
863
+ /* harmony import */ var _customMaterial__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./customMaterial */ "../../../dev/materials/src/custom/customMaterial.ts");
864
+ /* harmony import */ var _pbrCustomMaterial__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pbrCustomMaterial */ "../../../dev/materials/src/custom/pbrCustomMaterial.ts");
879
865
 
880
- /***/ }),
881
866
 
882
- /***/ "babylonjs/Materials/effect":
883
- /*!****************************************************************************************************!*\
884
- !*** external {"root":"BABYLON","commonjs":"babylonjs","commonjs2":"babylonjs","amd":"babylonjs"} ***!
885
- \****************************************************************************************************/
886
- /***/ ((module) => {
887
867
 
888
- module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Materials_effect__;
889
868
 
890
869
  /***/ }),
891
870
 
892
- /***/ "../../../../node_modules/tslib/tslib.es6.mjs":
893
- /*!****************************************************!*\
894
- !*** ../../../../node_modules/tslib/tslib.es6.mjs ***!
895
- \****************************************************/
896
- /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
871
+ /***/ "../../../dev/materials/src/custom/pbrCustomMaterial.ts":
872
+ /*!**************************************************************!*\
873
+ !*** ../../../dev/materials/src/custom/pbrCustomMaterial.ts ***!
874
+ \**************************************************************/
875
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
897
876
 
898
877
  __webpack_require__.r(__webpack_exports__);
899
878
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
900
- /* harmony export */ __addDisposableResource: () => (/* binding */ __addDisposableResource),
901
- /* harmony export */ __assign: () => (/* binding */ __assign),
902
- /* harmony export */ __asyncDelegator: () => (/* binding */ __asyncDelegator),
903
- /* harmony export */ __asyncGenerator: () => (/* binding */ __asyncGenerator),
904
- /* harmony export */ __asyncValues: () => (/* binding */ __asyncValues),
905
- /* harmony export */ __await: () => (/* binding */ __await),
906
- /* harmony export */ __awaiter: () => (/* binding */ __awaiter),
907
- /* harmony export */ __classPrivateFieldGet: () => (/* binding */ __classPrivateFieldGet),
908
- /* harmony export */ __classPrivateFieldIn: () => (/* binding */ __classPrivateFieldIn),
909
- /* harmony export */ __classPrivateFieldSet: () => (/* binding */ __classPrivateFieldSet),
910
- /* harmony export */ __createBinding: () => (/* binding */ __createBinding),
911
- /* harmony export */ __decorate: () => (/* binding */ __decorate),
912
- /* harmony export */ __disposeResources: () => (/* binding */ __disposeResources),
913
- /* harmony export */ __esDecorate: () => (/* binding */ __esDecorate),
914
- /* harmony export */ __exportStar: () => (/* binding */ __exportStar),
915
- /* harmony export */ __extends: () => (/* binding */ __extends),
916
- /* harmony export */ __generator: () => (/* binding */ __generator),
917
- /* harmony export */ __importDefault: () => (/* binding */ __importDefault),
918
- /* harmony export */ __importStar: () => (/* binding */ __importStar),
919
- /* harmony export */ __makeTemplateObject: () => (/* binding */ __makeTemplateObject),
920
- /* harmony export */ __metadata: () => (/* binding */ __metadata),
921
- /* harmony export */ __param: () => (/* binding */ __param),
922
- /* harmony export */ __propKey: () => (/* binding */ __propKey),
923
- /* harmony export */ __read: () => (/* binding */ __read),
924
- /* harmony export */ __rest: () => (/* binding */ __rest),
925
- /* harmony export */ __rewriteRelativeImportExtension: () => (/* binding */ __rewriteRelativeImportExtension),
926
- /* harmony export */ __runInitializers: () => (/* binding */ __runInitializers),
927
- /* harmony export */ __setFunctionName: () => (/* binding */ __setFunctionName),
928
- /* harmony export */ __spread: () => (/* binding */ __spread),
929
- /* harmony export */ __spreadArray: () => (/* binding */ __spreadArray),
930
- /* harmony export */ __spreadArrays: () => (/* binding */ __spreadArrays),
931
- /* harmony export */ __values: () => (/* binding */ __values),
932
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
879
+ /* harmony export */ PBRCustomMaterial: () => (/* binding */ PBRCustomMaterial),
880
+ /* harmony export */ ShaderAlbedoParts: () => (/* binding */ ShaderAlbedoParts),
881
+ /* harmony export */ ShaderAlebdoParts: () => (/* binding */ ShaderAlebdoParts)
933
882
  /* harmony export */ });
934
- /******************************************************************************
935
- Copyright (c) Microsoft Corporation.
936
-
937
- Permission to use, copy, modify, and/or distribute this software for any
938
- purpose with or without fee is hereby granted.
939
-
940
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
941
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
942
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
943
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
944
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
945
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
946
- PERFORMANCE OF THIS SOFTWARE.
947
- ***************************************************************************** */
948
- /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
949
-
950
- var extendStatics = function(d, b) {
951
- extendStatics = Object.setPrototypeOf ||
952
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
953
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
954
- return extendStatics(d, b);
955
- };
956
-
957
- function __extends(d, b) {
958
- if (typeof b !== "function" && b !== null)
959
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
960
- extendStatics(d, b);
961
- function __() { this.constructor = d; }
962
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
963
- }
883
+ /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
884
+ /* harmony import */ var babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Shaders/pbr.fragment */ "babylonjs/Materials/effect");
885
+ /* harmony import */ var babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__);
964
886
 
965
- var __assign = function() {
966
- __assign = Object.assign || function __assign(t) {
967
- for (var s, i = 1, n = arguments.length; i < n; i++) {
968
- s = arguments[i];
969
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
970
- }
971
- return t;
972
- }
973
- return __assign.apply(this, arguments);
974
- }
975
887
 
976
- function __rest(s, e) {
977
- var t = {};
978
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
979
- t[p] = s[p];
980
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
981
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
982
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
983
- t[p[i]] = s[p[i]];
984
- }
985
- return t;
986
- }
987
888
 
988
- function __decorate(decorators, target, key, desc) {
989
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
990
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
991
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
992
- return c > 3 && r && Object.defineProperty(target, key, r), r;
993
- }
994
889
 
995
- function __param(paramIndex, decorator) {
996
- return function (target, key) { decorator(target, key, paramIndex); }
997
- }
998
890
 
999
- function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
1000
- function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
1001
- var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
1002
- var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
1003
- var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
1004
- var _, done = false;
1005
- for (var i = decorators.length - 1; i >= 0; i--) {
1006
- var context = {};
1007
- for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
1008
- for (var p in contextIn.access) context.access[p] = contextIn.access[p];
1009
- context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
1010
- var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
1011
- if (kind === "accessor") {
1012
- if (result === void 0) continue;
1013
- if (result === null || typeof result !== "object") throw new TypeError("Object expected");
1014
- if (_ = accept(result.get)) descriptor.get = _;
1015
- if (_ = accept(result.set)) descriptor.set = _;
1016
- if (_ = accept(result.init)) initializers.unshift(_);
1017
- }
1018
- else if (_ = accept(result)) {
1019
- if (kind === "field") initializers.unshift(_);
1020
- else descriptor[key] = _;
1021
- }
1022
- }
1023
- if (target) Object.defineProperty(target, contextIn.name, descriptor);
1024
- done = true;
1025
- };
1026
891
 
1027
- function __runInitializers(thisArg, initializers, value) {
1028
- var useValue = arguments.length > 2;
1029
- for (var i = 0; i < initializers.length; i++) {
1030
- value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
1031
- }
1032
- return useValue ? value : void 0;
1033
- };
1034
892
 
1035
- function __propKey(x) {
1036
- return typeof x === "symbol" ? x : "".concat(x);
1037
- };
1038
893
 
1039
- function __setFunctionName(f, name, prefix) {
1040
- if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
1041
- return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
1042
- };
894
+ /**
895
+ * Albedo parts of the shader
896
+ */
897
+ var ShaderAlbedoParts = /** @class */ (function () {
898
+ function ShaderAlbedoParts() {
899
+ }
900
+ return ShaderAlbedoParts;
901
+ }());
1043
902
 
1044
- function __metadata(metadataKey, metadataValue) {
1045
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
1046
- }
1047
-
1048
- function __awaiter(thisArg, _arguments, P, generator) {
1049
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1050
- return new (P || (P = Promise))(function (resolve, reject) {
1051
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
1052
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
1053
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1054
- step((generator = generator.apply(thisArg, _arguments || [])).next());
1055
- });
1056
- }
1057
-
1058
- function __generator(thisArg, body) {
1059
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
1060
- return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
1061
- function verb(n) { return function (v) { return step([n, v]); }; }
1062
- function step(op) {
1063
- if (f) throw new TypeError("Generator is already executing.");
1064
- while (g && (g = 0, op[0] && (_ = 0)), _) try {
1065
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
1066
- if (y = 0, t) op = [op[0] & 2, t.value];
1067
- switch (op[0]) {
1068
- case 0: case 1: t = op; break;
1069
- case 4: _.label++; return { value: op[1], done: false };
1070
- case 5: _.label++; y = op[1]; op = [0]; continue;
1071
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
1072
- default:
1073
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
1074
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
1075
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
1076
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
1077
- if (t[2]) _.ops.pop();
1078
- _.trys.pop(); continue;
1079
- }
1080
- op = body.call(thisArg, _);
1081
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
1082
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
1083
- }
1084
- }
1085
-
1086
- var __createBinding = Object.create ? (function(o, m, k, k2) {
1087
- if (k2 === undefined) k2 = k;
1088
- var desc = Object.getOwnPropertyDescriptor(m, k);
1089
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
1090
- desc = { enumerable: true, get: function() { return m[k]; } };
1091
- }
1092
- Object.defineProperty(o, k2, desc);
1093
- }) : (function(o, m, k, k2) {
1094
- if (k2 === undefined) k2 = k;
1095
- o[k2] = m[k];
1096
- });
1097
-
1098
- function __exportStar(m, o) {
1099
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
1100
- }
1101
-
1102
- function __values(o) {
1103
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
1104
- if (m) return m.call(o);
1105
- if (o && typeof o.length === "number") return {
1106
- next: function () {
1107
- if (o && i >= o.length) o = void 0;
1108
- return { value: o && o[i++], done: !o };
1109
- }
1110
- };
1111
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
1112
- }
1113
-
1114
- function __read(o, n) {
1115
- var m = typeof Symbol === "function" && o[Symbol.iterator];
1116
- if (!m) return o;
1117
- var i = m.call(o), r, ar = [], e;
1118
- try {
1119
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
1120
- }
1121
- catch (error) { e = { error: error }; }
1122
- finally {
1123
- try {
1124
- if (r && !r.done && (m = i["return"])) m.call(i);
1125
- }
1126
- finally { if (e) throw e.error; }
1127
- }
1128
- return ar;
1129
- }
1130
-
1131
- /** @deprecated */
1132
- function __spread() {
1133
- for (var ar = [], i = 0; i < arguments.length; i++)
1134
- ar = ar.concat(__read(arguments[i]));
1135
- return ar;
1136
- }
1137
-
1138
- /** @deprecated */
1139
- function __spreadArrays() {
1140
- for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
1141
- for (var r = Array(s), k = 0, i = 0; i < il; i++)
1142
- for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
1143
- r[k] = a[j];
1144
- return r;
1145
- }
1146
-
1147
- function __spreadArray(to, from, pack) {
1148
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
1149
- if (ar || !(i in from)) {
1150
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
1151
- ar[i] = from[i];
1152
- }
1153
- }
1154
- return to.concat(ar || Array.prototype.slice.call(from));
1155
- }
1156
-
1157
- function __await(v) {
1158
- return this instanceof __await ? (this.v = v, this) : new __await(v);
1159
- }
1160
-
1161
- function __asyncGenerator(thisArg, _arguments, generator) {
1162
- if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
1163
- var g = generator.apply(thisArg, _arguments || []), i, q = [];
1164
- return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
1165
- function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
1166
- function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }
1167
- function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
1168
- function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
1169
- function fulfill(value) { resume("next", value); }
1170
- function reject(value) { resume("throw", value); }
1171
- function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
1172
- }
1173
-
1174
- function __asyncDelegator(o) {
1175
- var i, p;
1176
- return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
1177
- function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
1178
- }
1179
-
1180
- function __asyncValues(o) {
1181
- if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
1182
- var m = o[Symbol.asyncIterator], i;
1183
- return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
1184
- function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
1185
- function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
1186
- }
1187
-
1188
- function __makeTemplateObject(cooked, raw) {
1189
- if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
1190
- return cooked;
1191
- };
1192
-
1193
- var __setModuleDefault = Object.create ? (function(o, v) {
1194
- Object.defineProperty(o, "default", { enumerable: true, value: v });
1195
- }) : function(o, v) {
1196
- o["default"] = v;
1197
- };
1198
-
1199
- var ownKeys = function(o) {
1200
- ownKeys = Object.getOwnPropertyNames || function (o) {
1201
- var ar = [];
1202
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
1203
- return ar;
1204
- };
1205
- return ownKeys(o);
1206
- };
903
+ /**
904
+ * @deprecated use ShaderAlbedoParts instead.
905
+ */
906
+ var ShaderAlebdoParts = ShaderAlbedoParts;
907
+ var PBRCustomMaterial = /** @class */ (function (_super) {
908
+ (0,tslib__WEBPACK_IMPORTED_MODULE_1__.__extends)(PBRCustomMaterial, _super);
909
+ function PBRCustomMaterial(name, scene) {
910
+ var _this = _super.call(this, name, scene, true) || this;
911
+ _this.CustomParts = new ShaderAlbedoParts();
912
+ _this.customShaderNameResolve = _this.Builder;
913
+ _this.FragmentShader = babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore["pbrPixelShader"];
914
+ _this.VertexShader = babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore["pbrVertexShader"];
915
+ _this.FragmentShader = _this.FragmentShader.replace(/#include<pbrBlockAlbedoOpacity>/g, babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.IncludesShadersStore["pbrBlockAlbedoOpacity"]);
916
+ _this.FragmentShader = _this.FragmentShader.replace(/#include<pbrBlockReflectivity>/g, babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.IncludesShadersStore["pbrBlockReflectivity"]);
917
+ _this.FragmentShader = _this.FragmentShader.replace(/#include<pbrBlockFinalColorComposition>/g, babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.IncludesShadersStore["pbrBlockFinalColorComposition"]);
918
+ PBRCustomMaterial.ShaderIndexer++;
919
+ _this._createdShaderName = "custompbr_" + PBRCustomMaterial.ShaderIndexer;
920
+ return _this;
921
+ }
922
+ /**
923
+ * Runs after the material is bound to a mesh
924
+ * @param mesh mesh bound
925
+ * @param effect bound effect used to render
926
+ */
927
+ PBRCustomMaterial.prototype.AttachAfterBind = function (mesh, effect) {
928
+ if (this._newUniformInstances) {
929
+ for (var el in this._newUniformInstances) {
930
+ var ea = el.toString().split("-");
931
+ if (ea[0] == "vec2") {
932
+ effect.setVector2(ea[1], this._newUniformInstances[el]);
933
+ }
934
+ else if (ea[0] == "vec3") {
935
+ if (this._newUniformInstances[el] instanceof babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Color3) {
936
+ effect.setColor3(ea[1], this._newUniformInstances[el]);
937
+ }
938
+ else {
939
+ effect.setVector3(ea[1], this._newUniformInstances[el]);
940
+ }
941
+ }
942
+ else if (ea[0] == "vec4") {
943
+ if (this._newUniformInstances[el] instanceof babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Color4) {
944
+ effect.setDirectColor4(ea[1], this._newUniformInstances[el]);
945
+ }
946
+ else {
947
+ effect.setVector4(ea[1], this._newUniformInstances[el]);
948
+ }
949
+ effect.setVector4(ea[1], this._newUniformInstances[el]);
950
+ }
951
+ else if (ea[0] == "mat4") {
952
+ effect.setMatrix(ea[1], this._newUniformInstances[el]);
953
+ }
954
+ else if (ea[0] == "float") {
955
+ effect.setFloat(ea[1], this._newUniformInstances[el]);
956
+ }
957
+ }
958
+ }
959
+ if (this._newSamplerInstances) {
960
+ for (var el in this._newSamplerInstances) {
961
+ var ea = el.toString().split("-");
962
+ if (ea[0] == "sampler2D" && this._newSamplerInstances[el].isReady && this._newSamplerInstances[el].isReady()) {
963
+ effect.setTexture(ea[1], this._newSamplerInstances[el]);
964
+ }
965
+ }
966
+ }
967
+ };
968
+ /**
969
+ * @internal
970
+ */
971
+ PBRCustomMaterial.prototype.ReviewUniform = function (name, arr) {
972
+ if (name == "uniform" && this._newUniforms) {
973
+ for (var ind = 0; ind < this._newUniforms.length; ind++) {
974
+ if (this._customUniform[ind].indexOf("sampler") == -1) {
975
+ arr.push(this._newUniforms[ind].replace(/\[\d*\]/g, ""));
976
+ }
977
+ }
978
+ }
979
+ if (name == "sampler" && this._newUniforms) {
980
+ for (var ind = 0; ind < this._newUniforms.length; ind++) {
981
+ if (this._customUniform[ind].indexOf("sampler") != -1) {
982
+ arr.push(this._newUniforms[ind].replace(/\[\d*\]/g, ""));
983
+ }
984
+ }
985
+ }
986
+ return arr;
987
+ };
988
+ /**
989
+ * Builds the material
990
+ * @param shaderName name of the shader
991
+ * @param uniforms list of uniforms
992
+ * @param uniformBuffers list of uniform buffers
993
+ * @param samplers list of samplers
994
+ * @param defines list of defines
995
+ * @param attributes list of attributes
996
+ * @param options options to compile the shader
997
+ * @returns the shader name
998
+ */
999
+ PBRCustomMaterial.prototype.Builder = function (shaderName, uniforms, uniformBuffers, samplers, defines, attributes, options) {
1000
+ if (options) {
1001
+ var currentProcessing_1 = options.processFinalCode;
1002
+ options.processFinalCode = function (type, code) {
1003
+ if (type === "vertex") {
1004
+ return currentProcessing_1 ? currentProcessing_1(type, code) : code;
1005
+ }
1006
+ var sci = new babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.ShaderCodeInliner(code);
1007
+ sci.inlineToken = "#define pbr_inline";
1008
+ sci.processCode();
1009
+ return currentProcessing_1 ? currentProcessing_1(type, sci.code) : sci.code;
1010
+ };
1011
+ }
1012
+ if (attributes && this._customAttributes && this._customAttributes.length > 0) {
1013
+ attributes.push.apply(attributes, this._customAttributes);
1014
+ }
1015
+ this.ReviewUniform("uniform", uniforms);
1016
+ this.ReviewUniform("sampler", samplers);
1017
+ var name = this._createdShaderName;
1018
+ if (babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore[name + "VertexShader"] && babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore[name + "PixelShader"]) {
1019
+ return name;
1020
+ }
1021
+ babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore[name + "VertexShader"] = this._injectCustomCode(this.VertexShader, "vertex");
1022
+ babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.Effect.ShadersStore[name + "PixelShader"] = this._injectCustomCode(this.FragmentShader, "fragment");
1023
+ return name;
1024
+ };
1025
+ PBRCustomMaterial.prototype._injectCustomCode = function (code, shaderType) {
1026
+ var customCode = this._getCustomCode(shaderType);
1027
+ for (var point in customCode) {
1028
+ var injectedCode = customCode[point];
1029
+ if (injectedCode && injectedCode.length > 0) {
1030
+ var fullPointName = "#define " + point;
1031
+ code = code.replace(fullPointName, "\n" + injectedCode + "\n" + fullPointName);
1032
+ }
1033
+ }
1034
+ return code;
1035
+ };
1036
+ PBRCustomMaterial.prototype._getCustomCode = function (shaderType) {
1037
+ var _a, _b;
1038
+ if (shaderType === "vertex") {
1039
+ return {
1040
+ CUSTOM_VERTEX_BEGIN: this.CustomParts.Vertex_Begin,
1041
+ CUSTOM_VERTEX_DEFINITIONS: (((_a = this._customUniform) === null || _a === void 0 ? void 0 : _a.join("\n")) || "") + (this.CustomParts.Vertex_Definitions || ""),
1042
+ CUSTOM_VERTEX_MAIN_BEGIN: this.CustomParts.Vertex_MainBegin,
1043
+ CUSTOM_VERTEX_UPDATE_POSITION: this.CustomParts.Vertex_Before_PositionUpdated,
1044
+ CUSTOM_VERTEX_UPDATE_NORMAL: this.CustomParts.Vertex_Before_NormalUpdated,
1045
+ CUSTOM_VERTEX_MAIN_END: this.CustomParts.Vertex_MainEnd,
1046
+ CUSTOM_VERTEX_UPDATE_WORLDPOS: this.CustomParts.Vertex_After_WorldPosComputed,
1047
+ };
1048
+ }
1049
+ return {
1050
+ CUSTOM_FRAGMENT_BEGIN: this.CustomParts.Fragment_Begin,
1051
+ CUSTOM_FRAGMENT_MAIN_BEGIN: this.CustomParts.Fragment_MainBegin,
1052
+ CUSTOM_FRAGMENT_DEFINITIONS: (((_b = this._customUniform) === null || _b === void 0 ? void 0 : _b.join("\n")) || "") + (this.CustomParts.Fragment_Definitions || ""),
1053
+ CUSTOM_FRAGMENT_UPDATE_ALBEDO: this.CustomParts.Fragment_Custom_Albedo,
1054
+ CUSTOM_FRAGMENT_UPDATE_ALPHA: this.CustomParts.Fragment_Custom_Alpha,
1055
+ CUSTOM_FRAGMENT_BEFORE_LIGHTS: this.CustomParts.Fragment_Before_Lights,
1056
+ CUSTOM_FRAGMENT_UPDATE_METALLICROUGHNESS: this.CustomParts.Fragment_Custom_MetallicRoughness,
1057
+ CUSTOM_FRAGMENT_UPDATE_MICROSURFACE: this.CustomParts.Fragment_Custom_MicroSurface,
1058
+ CUSTOM_FRAGMENT_BEFORE_FINALCOLORCOMPOSITION: this.CustomParts.Fragment_Before_FinalColorComposition,
1059
+ CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: this.CustomParts.Fragment_Before_FragColor,
1060
+ CUSTOM_FRAGMENT_MAIN_END: this.CustomParts.Fragment_MainEnd,
1061
+ CUSTOM_FRAGMENT_BEFORE_FOG: this.CustomParts.Fragment_Before_Fog,
1062
+ };
1063
+ };
1064
+ PBRCustomMaterial.prototype._afterBind = function (mesh, effect, subMesh) {
1065
+ if (effect === void 0) { effect = null; }
1066
+ if (!effect) {
1067
+ return;
1068
+ }
1069
+ this.AttachAfterBind(mesh, effect);
1070
+ try {
1071
+ _super.prototype._afterBind.call(this, mesh, effect, subMesh);
1072
+ }
1073
+ catch (e) { }
1074
+ };
1075
+ /**
1076
+ * Adds a new uniform to the shader
1077
+ * @param name the name of the uniform to add
1078
+ * @param kind the type of the uniform to add
1079
+ * @param param the value of the uniform to add
1080
+ * @returns the current material
1081
+ */
1082
+ PBRCustomMaterial.prototype.AddUniform = function (name, kind, param) {
1083
+ if (!this._customUniform) {
1084
+ this._customUniform = new Array();
1085
+ this._newUniforms = new Array();
1086
+ this._newSamplerInstances = {};
1087
+ this._newUniformInstances = {};
1088
+ }
1089
+ if (param) {
1090
+ if (kind.indexOf("sampler") != -1) {
1091
+ this._newSamplerInstances[kind + "-" + name] = param;
1092
+ }
1093
+ else {
1094
+ this._newUniformInstances[kind + "-" + name] = param;
1095
+ }
1096
+ }
1097
+ this._customUniform.push("uniform " + kind + " " + name + ";");
1098
+ this._newUniforms.push(name);
1099
+ return this;
1100
+ };
1101
+ /**
1102
+ * Adds a custom attribute
1103
+ * @param name the name of the attribute
1104
+ * @returns the current material
1105
+ */
1106
+ PBRCustomMaterial.prototype.AddAttribute = function (name) {
1107
+ if (!this._customAttributes) {
1108
+ this._customAttributes = [];
1109
+ }
1110
+ this._customAttributes.push(name);
1111
+ return this;
1112
+ };
1113
+ /**
1114
+ * Sets the code on Fragment_Begin portion
1115
+ * @param shaderPart the code string
1116
+ * @returns the current material
1117
+ */
1118
+ PBRCustomMaterial.prototype.Fragment_Begin = function (shaderPart) {
1119
+ this.CustomParts.Fragment_Begin = shaderPart;
1120
+ return this;
1121
+ };
1122
+ /**
1123
+ * Sets the code on Fragment_Definitions portion
1124
+ * @param shaderPart the code string
1125
+ * @returns the current material
1126
+ */
1127
+ PBRCustomMaterial.prototype.Fragment_Definitions = function (shaderPart) {
1128
+ this.CustomParts.Fragment_Definitions = shaderPart;
1129
+ return this;
1130
+ };
1131
+ /**
1132
+ * Sets the code on Fragment_MainBegin portion
1133
+ * @param shaderPart the code string
1134
+ * @returns the current material
1135
+ */
1136
+ PBRCustomMaterial.prototype.Fragment_MainBegin = function (shaderPart) {
1137
+ this.CustomParts.Fragment_MainBegin = shaderPart;
1138
+ return this;
1139
+ };
1140
+ /**
1141
+ * Sets the code on Fragment_Custom_Albedo portion
1142
+ * @param shaderPart the code string
1143
+ * @returns the current material
1144
+ */
1145
+ PBRCustomMaterial.prototype.Fragment_Custom_Albedo = function (shaderPart) {
1146
+ this.CustomParts.Fragment_Custom_Albedo = shaderPart.replace("result", "surfaceAlbedo");
1147
+ return this;
1148
+ };
1149
+ /**
1150
+ * Sets the code on Fragment_Custom_Alpha portion
1151
+ * @param shaderPart the code string
1152
+ * @returns the current material
1153
+ */
1154
+ PBRCustomMaterial.prototype.Fragment_Custom_Alpha = function (shaderPart) {
1155
+ this.CustomParts.Fragment_Custom_Alpha = shaderPart.replace("result", "alpha");
1156
+ return this;
1157
+ };
1158
+ /**
1159
+ * Sets the code on Fragment_Before_Lights portion
1160
+ * @param shaderPart the code string
1161
+ * @returns the current material
1162
+ */
1163
+ PBRCustomMaterial.prototype.Fragment_Before_Lights = function (shaderPart) {
1164
+ this.CustomParts.Fragment_Before_Lights = shaderPart;
1165
+ return this;
1166
+ };
1167
+ /**
1168
+ * Sets the code on Fragment_Custom_MetallicRoughness portion
1169
+ * @param shaderPart the code string
1170
+ * @returns the current material
1171
+ */
1172
+ PBRCustomMaterial.prototype.Fragment_Custom_MetallicRoughness = function (shaderPart) {
1173
+ this.CustomParts.Fragment_Custom_MetallicRoughness = shaderPart;
1174
+ return this;
1175
+ };
1176
+ /**
1177
+ * Sets the code on Fragment_Custom_MicroSurface portion
1178
+ * @param shaderPart the code string
1179
+ * @returns the current material
1180
+ */
1181
+ PBRCustomMaterial.prototype.Fragment_Custom_MicroSurface = function (shaderPart) {
1182
+ this.CustomParts.Fragment_Custom_MicroSurface = shaderPart;
1183
+ return this;
1184
+ };
1185
+ /**
1186
+ * Sets the code on Fragment_Before_Fog portion
1187
+ * @param shaderPart the code string
1188
+ * @returns the current material
1189
+ */
1190
+ PBRCustomMaterial.prototype.Fragment_Before_Fog = function (shaderPart) {
1191
+ this.CustomParts.Fragment_Before_Fog = shaderPart;
1192
+ return this;
1193
+ };
1194
+ /**
1195
+ * Sets the code on Fragment_Before_FinalColorComposition portion
1196
+ * @param shaderPart the code string
1197
+ * @returns the current material
1198
+ */
1199
+ PBRCustomMaterial.prototype.Fragment_Before_FinalColorComposition = function (shaderPart) {
1200
+ this.CustomParts.Fragment_Before_FinalColorComposition = shaderPart;
1201
+ return this;
1202
+ };
1203
+ /**
1204
+ * Sets the code on Fragment_Before_FragColor portion
1205
+ * @param shaderPart the code string
1206
+ * @returns the current material
1207
+ */
1208
+ PBRCustomMaterial.prototype.Fragment_Before_FragColor = function (shaderPart) {
1209
+ this.CustomParts.Fragment_Before_FragColor = shaderPart.replace("result", "color");
1210
+ return this;
1211
+ };
1212
+ /**
1213
+ * Sets the code on Fragment_MainEnd portion
1214
+ * @param shaderPart the code string
1215
+ * @returns the current material
1216
+ */
1217
+ PBRCustomMaterial.prototype.Fragment_MainEnd = function (shaderPart) {
1218
+ this.CustomParts.Fragment_MainEnd = shaderPart;
1219
+ return this;
1220
+ };
1221
+ /**
1222
+ * Sets the code on Vertex_Begin portion
1223
+ * @param shaderPart the code string
1224
+ * @returns the current material
1225
+ */
1226
+ PBRCustomMaterial.prototype.Vertex_Begin = function (shaderPart) {
1227
+ this.CustomParts.Vertex_Begin = shaderPart;
1228
+ return this;
1229
+ };
1230
+ /**
1231
+ * Sets the code on Vertex_Definitions portion
1232
+ * @param shaderPart the code string
1233
+ * @returns the current material
1234
+ */
1235
+ PBRCustomMaterial.prototype.Vertex_Definitions = function (shaderPart) {
1236
+ this.CustomParts.Vertex_Definitions = shaderPart;
1237
+ return this;
1238
+ };
1239
+ /**
1240
+ * Sets the code on Vertex_MainBegin portion
1241
+ * @param shaderPart the code string
1242
+ * @returns the current material
1243
+ */
1244
+ PBRCustomMaterial.prototype.Vertex_MainBegin = function (shaderPart) {
1245
+ this.CustomParts.Vertex_MainBegin = shaderPart;
1246
+ return this;
1247
+ };
1248
+ /**
1249
+ * Sets the code on Vertex_Before_PositionUpdated portion
1250
+ * @param shaderPart the code string
1251
+ * @returns the current material
1252
+ */
1253
+ PBRCustomMaterial.prototype.Vertex_Before_PositionUpdated = function (shaderPart) {
1254
+ this.CustomParts.Vertex_Before_PositionUpdated = shaderPart.replace("result", "positionUpdated");
1255
+ return this;
1256
+ };
1257
+ /**
1258
+ * Sets the code on Vertex_Before_NormalUpdated portion
1259
+ * @param shaderPart the code string
1260
+ * @returns the current material
1261
+ */
1262
+ PBRCustomMaterial.prototype.Vertex_Before_NormalUpdated = function (shaderPart) {
1263
+ this.CustomParts.Vertex_Before_NormalUpdated = shaderPart.replace("result", "normalUpdated");
1264
+ return this;
1265
+ };
1266
+ /**
1267
+ * Sets the code on Vertex_After_WorldPosComputed portion
1268
+ * @param shaderPart the code string
1269
+ * @returns the current material
1270
+ */
1271
+ PBRCustomMaterial.prototype.Vertex_After_WorldPosComputed = function (shaderPart) {
1272
+ this.CustomParts.Vertex_After_WorldPosComputed = shaderPart;
1273
+ return this;
1274
+ };
1275
+ /**
1276
+ * Sets the code on Vertex_MainEnd portion
1277
+ * @param shaderPart the code string
1278
+ * @returns the current material
1279
+ */
1280
+ PBRCustomMaterial.prototype.Vertex_MainEnd = function (shaderPart) {
1281
+ this.CustomParts.Vertex_MainEnd = shaderPart;
1282
+ return this;
1283
+ };
1284
+ /**
1285
+ * Index for each created shader
1286
+ */
1287
+ PBRCustomMaterial.ShaderIndexer = 1;
1288
+ return PBRCustomMaterial;
1289
+ }(babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.PBRMaterial));
1207
1290
 
1208
- function __importStar(mod) {
1209
- if (mod && mod.__esModule) return mod;
1210
- var result = {};
1211
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
1212
- __setModuleDefault(result, mod);
1213
- return result;
1214
- }
1291
+ (0,babylonjs_Materials_effect__WEBPACK_IMPORTED_MODULE_0__.RegisterClass)("BABYLON.PBRCustomMaterial", PBRCustomMaterial);
1215
1292
 
1216
- function __importDefault(mod) {
1217
- return (mod && mod.__esModule) ? mod : { default: mod };
1218
- }
1219
1293
 
1220
- function __classPrivateFieldGet(receiver, state, kind, f) {
1221
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
1222
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
1223
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
1224
- }
1294
+ /***/ }),
1225
1295
 
1226
- function __classPrivateFieldSet(receiver, state, value, kind, f) {
1227
- if (kind === "m") throw new TypeError("Private method is not writable");
1228
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
1229
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
1230
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
1231
- }
1296
+ /***/ "../../../lts/materials/src/legacy/legacy-custom.ts":
1297
+ /*!**********************************************************!*\
1298
+ !*** ../../../lts/materials/src/legacy/legacy-custom.ts ***!
1299
+ \**********************************************************/
1300
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1232
1301
 
1233
- function __classPrivateFieldIn(state, receiver) {
1234
- if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
1235
- return typeof state === "function" ? receiver === state : state.has(receiver);
1236
- }
1302
+ __webpack_require__.r(__webpack_exports__);
1303
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1304
+ /* harmony export */ CustomMaterial: () => (/* reexport safe */ materials_custom_index__WEBPACK_IMPORTED_MODULE_0__.CustomMaterial),
1305
+ /* harmony export */ CustomShaderStructure: () => (/* reexport safe */ materials_custom_index__WEBPACK_IMPORTED_MODULE_0__.CustomShaderStructure),
1306
+ /* harmony export */ PBRCustomMaterial: () => (/* reexport safe */ materials_custom_index__WEBPACK_IMPORTED_MODULE_0__.PBRCustomMaterial),
1307
+ /* harmony export */ ShaderAlbedoParts: () => (/* reexport safe */ materials_custom_index__WEBPACK_IMPORTED_MODULE_0__.ShaderAlbedoParts),
1308
+ /* harmony export */ ShaderAlebdoParts: () => (/* reexport safe */ materials_custom_index__WEBPACK_IMPORTED_MODULE_0__.ShaderAlebdoParts),
1309
+ /* harmony export */ ShaderSpecialParts: () => (/* reexport safe */ materials_custom_index__WEBPACK_IMPORTED_MODULE_0__.ShaderSpecialParts)
1310
+ /* harmony export */ });
1311
+ /* harmony import */ var materials_custom_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! materials/custom/index */ "../../../dev/materials/src/custom/index.ts");
1312
+ /* eslint-disable import/no-internal-modules */
1237
1313
 
1238
- function __addDisposableResource(env, value, async) {
1239
- if (value !== null && value !== void 0) {
1240
- if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
1241
- var dispose, inner;
1242
- if (async) {
1243
- if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
1244
- dispose = value[Symbol.asyncDispose];
1245
- }
1246
- if (dispose === void 0) {
1247
- if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
1248
- dispose = value[Symbol.dispose];
1249
- if (async) inner = dispose;
1314
+ /**
1315
+ * This is the entry point for the UMD module.
1316
+ * The entry point for a future ESM package should be index.ts
1317
+ */
1318
+ var globalObject = typeof __webpack_require__.g !== "undefined" ? __webpack_require__.g : typeof window !== "undefined" ? window : undefined;
1319
+ if (typeof globalObject !== "undefined") {
1320
+ for (var key in materials_custom_index__WEBPACK_IMPORTED_MODULE_0__) {
1321
+ globalObject.BABYLON[key] = materials_custom_index__WEBPACK_IMPORTED_MODULE_0__[key];
1250
1322
  }
1251
- if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
1252
- if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
1253
- env.stack.push({ value: value, dispose: dispose, async: async });
1254
- }
1255
- else if (async) {
1256
- env.stack.push({ async: true });
1257
- }
1258
- return value;
1259
1323
  }
1260
1324
 
1261
- var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
1262
- var e = new Error(message);
1263
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
1264
- };
1265
1325
 
1266
- function __disposeResources(env) {
1267
- function fail(e) {
1268
- env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
1269
- env.hasError = true;
1270
- }
1271
- var r, s = 0;
1272
- function next() {
1273
- while (r = env.stack.pop()) {
1274
- try {
1275
- if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
1276
- if (r.dispose) {
1277
- var result = r.dispose.call(r.value);
1278
- if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
1279
- }
1280
- else s |= 1;
1281
- }
1282
- catch (e) {
1283
- fail(e);
1284
- }
1285
- }
1286
- if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
1287
- if (env.hasError) throw env.error;
1288
- }
1289
- return next();
1290
- }
1291
1326
 
1292
- function __rewriteRelativeImportExtension(path, preserveJsx) {
1293
- if (typeof path === "string" && /^\.\.?\//.test(path)) {
1294
- return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
1295
- return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
1296
- });
1297
- }
1298
- return path;
1299
- }
1327
+ /***/ }),
1300
1328
 
1301
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
1302
- __extends,
1303
- __assign,
1304
- __rest,
1305
- __decorate,
1306
- __param,
1307
- __esDecorate,
1308
- __runInitializers,
1309
- __propKey,
1310
- __setFunctionName,
1311
- __metadata,
1312
- __awaiter,
1313
- __generator,
1314
- __createBinding,
1315
- __exportStar,
1316
- __values,
1317
- __read,
1318
- __spread,
1319
- __spreadArrays,
1320
- __spreadArray,
1321
- __await,
1322
- __asyncGenerator,
1323
- __asyncDelegator,
1324
- __asyncValues,
1325
- __makeTemplateObject,
1326
- __importStar,
1327
- __importDefault,
1328
- __classPrivateFieldGet,
1329
- __classPrivateFieldSet,
1330
- __classPrivateFieldIn,
1331
- __addDisposableResource,
1332
- __disposeResources,
1333
- __rewriteRelativeImportExtension,
1334
- });
1329
+ /***/ "babylonjs/Materials/effect":
1330
+ /*!****************************************************************************************************!*\
1331
+ !*** external {"root":"BABYLON","commonjs":"babylonjs","commonjs2":"babylonjs","amd":"babylonjs"} ***!
1332
+ \****************************************************************************************************/
1333
+ /***/ ((module) => {
1335
1334
 
1335
+ module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Materials_effect__;
1336
1336
 
1337
1337
  /***/ })
1338
1338
 
@@ -1439,4 +1439,4 @@ __webpack_exports__ = __webpack_exports__["default"];
1439
1439
  /******/ })()
1440
1440
  ;
1441
1441
  });
1442
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi5jdXN0b21NYXRlcmlhbC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1JBO0FBRUE7QUFHQTtBQUNBO0FBSUE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFVQTtBQUFBO0FBQ0E7QUFBQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQXVFQTtBQUFBOztBQUVBOztBQUVBO0FBQ0E7QUFBQTtBQThLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUNBO0FBN0lBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBY0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBM1lBOztBQUVBO0FBQ0E7QUF5WUE7QUFBQTtBQTdZQTtBQStZQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlmQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNDQTtBQUVBO0FBR0E7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBb0ZBO0FBQUE7O0FBRUE7O0FBRUE7QUFDQTtBQUVBO0FBQUE7QUF1TUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFDQTtBQTFLQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBVUE7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFrQkE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdGNBOztBQUVBO0FBQ0E7QUFvY0E7QUFBQTtBQXhjQTtBQTBjQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMWpCQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FDZEE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDaFpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL01BVEVSSUFMUy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vTUFURVJJQUxTLy4uLy4uLy4uL2Rldi9tYXRlcmlhbHMvc3JjL2N1c3RvbS9jdXN0b21NYXRlcmlhbC50cyIsIndlYnBhY2s6Ly9NQVRFUklBTFMvLi4vLi4vLi4vZGV2L21hdGVyaWFscy9zcmMvY3VzdG9tL2luZGV4LnRzIiwid2VicGFjazovL01BVEVSSUFMUy8uLi8uLi8uLi9kZXYvbWF0ZXJpYWxzL3NyYy9jdXN0b20vcGJyQ3VzdG9tTWF0ZXJpYWwudHMiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTLy4uLy4uLy4uL2x0cy9tYXRlcmlhbHMvc3JjL2xlZ2FjeS9sZWdhY3ktY3VzdG9tLnRzIiwid2VicGFjazovL01BVEVSSUFMUy9leHRlcm5hbCB1bWQge1wicm9vdFwiOlwiQkFCWUxPTlwiLFwiY29tbW9uanNcIjpcImJhYnlsb25qc1wiLFwiY29tbW9uanMyXCI6XCJiYWJ5bG9uanNcIixcImFtZFwiOlwiYmFieWxvbmpzXCJ9Iiwid2VicGFjazovL01BVEVSSUFMUy8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2Lm1qcyIsIndlYnBhY2s6Ly9NQVRFUklBTFMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL01BVEVSSUFMUy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTLy4vc3JjL2N1c3RvbS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJiYWJ5bG9uanNcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJiYWJ5bG9uanMtbWF0ZXJpYWxzXCIsIFtcImJhYnlsb25qc1wiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJiYWJ5bG9uanMtbWF0ZXJpYWxzXCJdID0gZmFjdG9yeShyZXF1aXJlKFwiYmFieWxvbmpzXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJNQVRFUklBTFNcIl0gPSBmYWN0b3J5KHJvb3RbXCJCQUJZTE9OXCJdKTtcbn0pKCh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdGhpcyksIChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NYXRlcmlhbHNfZWZmZWN0X18pID0+IHtcbnJldHVybiAiLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL2VmZmVjdFwiO1xyXG5pbXBvcnQgdHlwZSB7IE1hdGVyaWFsRGVmaW5lcyB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9tYXRlcmlhbERlZmluZXNcIjtcclxuaW1wb3J0IHsgU3RhbmRhcmRNYXRlcmlhbCB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9zdGFuZGFyZE1hdGVyaWFsXCI7XHJcbmltcG9ydCB0eXBlIHsgTWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9tZXNoXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBSZWdpc3RlckNsYXNzIH0gZnJvbSBcImNvcmUvTWlzYy90eXBlU3RvcmVcIjtcclxuaW1wb3J0IHsgQ29sb3IzLCBDb2xvcjQgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLmNvbG9yXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5pbXBvcnQgdHlwZSB7IFN1Yk1lc2ggfSBmcm9tIFwiY29yZS9NZXNoZXMvc3ViTWVzaFwiO1xyXG5cclxuaW1wb3J0IFwiY29yZS9TaGFkZXJzL2RlZmF1bHQudmVydGV4XCI7XHJcbmltcG9ydCBcImNvcmUvU2hhZGVycy9kZWZhdWx0LmZyYWdtZW50XCI7XHJcblxyXG4vKipcclxuICogU3RydWN0dXJlIG9mIGEgY3VzdG9tIHNoYWRlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEN1c3RvbVNoYWRlclN0cnVjdHVyZSB7XHJcbiAgICAvKipcclxuICAgICAqIEZyYWdtZW50IHN0b3JlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudFN0b3JlOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFZlcnRleCBzdG9yZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4U3RvcmU6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQYXJ0cyBvZiBhIHNoYWRlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNoYWRlclNwZWNpYWxQYXJ0cyB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCZWdpbm5pbmcgb2YgdGhlIGZyYWdtZW50IHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVnaW46IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogVmFyaWFibGUgZGVmaW5pdGlvbnMgb2YgdGhlIGZyYWdtZW50IHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfRGVmaW5pdGlvbnM6IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogQmVnaW5uaW5nIG9mIHRoZSBmcmFnbWVudCBtYWluIGZ1bmN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9NYWluQmVnaW46IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogRW5kIG9mIHRoZSBmcmFnbWVudCBtYWluIGZ1bmN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9NYWluRW5kOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaWZmdXNlIGNvbG9yIGNhbGN1bGF0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9DdXN0b21fRGlmZnVzZTogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBCZWZvcmUgbGlnaHRuaW5nIGNvbXB1dGF0aW9uc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVmb3JlX0xpZ2h0czogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBCZWZvcmUgZm9nIGNvbXB1dGF0aW9uc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVmb3JlX0ZvZzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbHBoYSBjYWxjdWxhdGlvbnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0N1c3RvbV9BbHBoYTogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBCZWZvcmUgZnJhZyBjb2xvciBpcyBhc3NpZ25lZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVmb3JlX0ZyYWdDb2xvcjogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBCZWdpbm5pbmcgb2YgdGhlIHZlcnRleCBzaGFkZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9CZWdpbjogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBWYXJpYWJsZSBkZWZpbml0aW9ucyBvZiB0aGUgdmVydGV4IHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0RlZmluaXRpb25zOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0IG9mIHRoZSBtYWluIGZ1bmN0aW9uIG9mIHRoZSB2ZXJ0ZXggc2hhZGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfTWFpbkJlZ2luOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCZWZvcmUgdGhlIHdvcmxkIHBvc2l0aW9uIGNvbXB1dGF0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfQmVmb3JlX1Bvc2l0aW9uVXBkYXRlZDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmVmb3JlIHRoZSBub3JtYWwgY29tcHV0YXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9CZWZvcmVfTm9ybWFsVXBkYXRlZDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWZ0ZXIgdGhlIHdvcmxkIHBvc2l0aW9uIGhhcyBiZWVuIGNvbXB1dGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfQWZ0ZXJfV29ybGRQb3NDb21wdXRlZDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFpbiBlbmQgb2YgdGhlIHZlcnRleCBzaGFkZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9NYWluRW5kOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDdXN0b21pemVkIG1hdGVyaWFsXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ3VzdG9tTWF0ZXJpYWwgZXh0ZW5kcyBTdGFuZGFyZE1hdGVyaWFsIHtcclxuICAgIC8qKlxyXG4gICAgICogSW5kZXggZm9yIGVhY2ggY3JlYXRlZCBzaGFkZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBTaGFkZXJJbmRleGVyID0gMTtcclxuICAgIC8qKlxyXG4gICAgICogQ3VzdG9tIHNoYWRlciBzdHJ1Y3R1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIEN1c3RvbVBhcnRzOiBTaGFkZXJTcGVjaWFsUGFydHM7XHJcbiAgICAvKipcclxuICAgICAqIE5hbWUgb2YgdGhlIHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgX2NyZWF0ZWRTaGFkZXJOYW1lOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIExpc3Qgb2YgY3VzdG9tIHVuaWZvcm1zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBfY3VzdG9tVW5pZm9ybTogc3RyaW5nW107XHJcbiAgICAvKipcclxuICAgICAqIE5hbWVzIG9mIHRoZSBuZXcgdW5pZm9ybXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIF9uZXdVbmlmb3Jtczogc3RyaW5nW107XHJcbiAgICAvKipcclxuICAgICAqIEluc3RhbmNlcyBvZiB0aGUgbmV3IHVuaWZvcm0gb2JqZWN0c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgX25ld1VuaWZvcm1JbnN0YW5jZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbnN0YW5jZXMgb2YgdGhlIG5ldyBzYW1wbGVyIG9iamVjdHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIF9uZXdTYW1wbGVySW5zdGFuY2VzOiB7IFtuYW1lOiBzdHJpbmddOiBUZXh0dXJlIH07XHJcbiAgICAvKipcclxuICAgICAqIExpc3Qgb2YgdGhlIGN1c3RvbSBhdHRyaWJ1dGVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBfY3VzdG9tQXR0cmlidXRlczogc3RyaW5nW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGcmFnbWVudCBzaGFkZXIgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudFNoYWRlcjogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJ0ZXggc2hhZGVyIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4U2hhZGVyOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSdW5zIGFmdGVyIHRoZSBtYXRlcmlhbCBpcyBib3VuZCB0byBhIG1lc2hcclxuICAgICAqIEBwYXJhbSBtZXNoIG1lc2ggYm91bmRcclxuICAgICAqIEBwYXJhbSBlZmZlY3QgYm91bmQgZWZmZWN0IHVzZWQgdG8gcmVuZGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBdHRhY2hBZnRlckJpbmQobWVzaDogTWVzaCB8IHVuZGVmaW5lZCwgZWZmZWN0OiBFZmZlY3QpIHtcclxuICAgICAgICBpZiAodGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlcykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsIGluIHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVhID0gZWwudG9TdHJpbmcoKS5zcGxpdChcIi1cIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWFbMF0gPT0gXCJ2ZWMyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBlZmZlY3Quc2V0VmVjdG9yMihlYVsxXSwgdGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlc1tlbF0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlYVswXSA9PSBcInZlYzNcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzW2VsXSBpbnN0YW5jZW9mIENvbG9yMykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3Quc2V0Q29sb3IzKGVhWzFdLCB0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzW2VsXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LnNldFZlY3RvcjMoZWFbMV0sIHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXNbZWxdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVhWzBdID09IFwidmVjNFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXNbZWxdIGluc3RhbmNlb2YgQ29sb3I0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC5zZXREaXJlY3RDb2xvcjQoZWFbMV0sIHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXNbZWxdKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3Quc2V0VmVjdG9yNChlYVsxXSwgdGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlc1tlbF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlZmZlY3Quc2V0VmVjdG9yNChlYVsxXSwgdGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlc1tlbF0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlYVswXSA9PSBcIm1hdDRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdC5zZXRNYXRyaXgoZWFbMV0sIHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXNbZWxdKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWFbMF0gPT0gXCJmbG9hdFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0LnNldEZsb2F0KGVhWzFdLCB0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzW2VsXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX25ld1NhbXBsZXJJbnN0YW5jZXMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBpbiB0aGlzLl9uZXdTYW1wbGVySW5zdGFuY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlYSA9IGVsLnRvU3RyaW5nKCkuc3BsaXQoXCItXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVhWzBdID09IFwic2FtcGxlcjJEXCIgJiYgdGhpcy5fbmV3U2FtcGxlckluc3RhbmNlc1tlbF0uaXNSZWFkeSAmJiB0aGlzLl9uZXdTYW1wbGVySW5zdGFuY2VzW2VsXS5pc1JlYWR5KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBlZmZlY3Quc2V0VGV4dHVyZShlYVsxXSwgdGhpcy5fbmV3U2FtcGxlckluc3RhbmNlc1tlbF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZXZpZXdVbmlmb3JtKG5hbWU6IHN0cmluZywgYXJyOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcclxuICAgICAgICBpZiAobmFtZSA9PSBcInVuaWZvcm1cIiAmJiB0aGlzLl9uZXdVbmlmb3Jtcykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpbmQgPSAwOyBpbmQgPCB0aGlzLl9uZXdVbmlmb3Jtcy5sZW5ndGg7IGluZCsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3VzdG9tVW5pZm9ybVtpbmRdLmluZGV4T2YoXCJzYW1wbGVyXCIpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2godGhpcy5fbmV3VW5pZm9ybXNbaW5kXS5yZXBsYWNlKC9cXFtcXGQqXFxdL2csIFwiXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmFtZSA9PSBcInNhbXBsZXJcIiAmJiB0aGlzLl9uZXdVbmlmb3Jtcykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpbmQgPSAwOyBpbmQgPCB0aGlzLl9uZXdVbmlmb3Jtcy5sZW5ndGg7IGluZCsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3VzdG9tVW5pZm9ybVtpbmRdLmluZGV4T2YoXCJzYW1wbGVyXCIpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2godGhpcy5fbmV3VW5pZm9ybXNbaW5kXS5yZXBsYWNlKC9cXFtcXGQqXFxdL2csIFwiXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVpbGRzIHRoZSBtYXRlcmlhbFxyXG4gICAgICogQHBhcmFtIHNoYWRlck5hbWUgbmFtZSBvZiB0aGUgc2hhZGVyXHJcbiAgICAgKiBAcGFyYW0gdW5pZm9ybXMgbGlzdCBvZiB1bmlmb3Jtc1xyXG4gICAgICogQHBhcmFtIHVuaWZvcm1CdWZmZXJzIGxpc3Qgb2YgdW5pZm9ybSBidWZmZXJzXHJcbiAgICAgKiBAcGFyYW0gc2FtcGxlcnMgbGlzdCBvZiBzYW1wbGVyc1xyXG4gICAgICogQHBhcmFtIGRlZmluZXMgbGlzdCBvZiBkZWZpbmVzXHJcbiAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBsaXN0IG9mIGF0dHJpYnV0ZXNcclxuICAgICAqIEByZXR1cm5zIHRoZSBzaGFkZXIgbmFtZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQnVpbGRlcihzaGFkZXJOYW1lOiBzdHJpbmcsIHVuaWZvcm1zOiBzdHJpbmdbXSwgdW5pZm9ybUJ1ZmZlcnM6IHN0cmluZ1tdLCBzYW1wbGVyczogc3RyaW5nW10sIGRlZmluZXM6IE1hdGVyaWFsRGVmaW5lcyB8IHN0cmluZ1tdLCBhdHRyaWJ1dGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzICYmIHRoaXMuX2N1c3RvbUF0dHJpYnV0ZXMgJiYgdGhpcy5fY3VzdG9tQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaCguLi50aGlzLl9jdXN0b21BdHRyaWJ1dGVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuUmV2aWV3VW5pZm9ybShcInVuaWZvcm1cIiwgdW5pZm9ybXMpO1xyXG4gICAgICAgIHRoaXMuUmV2aWV3VW5pZm9ybShcInNhbXBsZXJcIiwgc2FtcGxlcnMpO1xyXG5cclxuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5fY3JlYXRlZFNoYWRlck5hbWU7XHJcblxyXG4gICAgICAgIGlmIChFZmZlY3QuU2hhZGVyc1N0b3JlW25hbWUgKyBcIlZlcnRleFNoYWRlclwiXSAmJiBFZmZlY3QuU2hhZGVyc1N0b3JlW25hbWUgKyBcIlBpeGVsU2hhZGVyXCJdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBFZmZlY3QuU2hhZGVyc1N0b3JlW25hbWUgKyBcIlZlcnRleFNoYWRlclwiXSA9IHRoaXMuX2luamVjdEN1c3RvbUNvZGUodGhpcy5WZXJ0ZXhTaGFkZXIsIFwidmVydGV4XCIpO1xyXG4gICAgICAgIEVmZmVjdC5TaGFkZXJzU3RvcmVbbmFtZSArIFwiUGl4ZWxTaGFkZXJcIl0gPSB0aGlzLl9pbmplY3RDdXN0b21Db2RlKHRoaXMuRnJhZ21lbnRTaGFkZXIsIFwiZnJhZ21lbnRcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaW5qZWN0Q3VzdG9tQ29kZShjb2RlOiBzdHJpbmcsIHNoYWRlclR5cGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tQ29kZSA9IHRoaXMuX2dldEN1c3RvbUNvZGUoc2hhZGVyVHlwZSk7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgaW4gY3VzdG9tQ29kZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpbmplY3RlZENvZGUgPSBjdXN0b21Db2RlW3BvaW50XTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmplY3RlZENvZGUgJiYgaW5qZWN0ZWRDb2RlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxQb2ludE5hbWUgPSBcIiNkZWZpbmUgXCIgKyBwb2ludDtcclxuICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UoZnVsbFBvaW50TmFtZSwgXCJcXG5cIiArIGluamVjdGVkQ29kZSArIFwiXFxuXCIgKyBmdWxsUG9pbnROYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9nZXRDdXN0b21Db2RlKHNoYWRlclR5cGU6IHN0cmluZyk6IHsgW3BvaW50TmFtZTogc3RyaW5nXTogc3RyaW5nIH0ge1xyXG4gICAgICAgIGlmIChzaGFkZXJUeXBlID09PSBcInZlcnRleFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBDVVNUT01fVkVSVEVYX0JFR0lOOiB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9CZWdpbixcclxuICAgICAgICAgICAgICAgIENVU1RPTV9WRVJURVhfREVGSU5JVElPTlM6ICh0aGlzLl9jdXN0b21Vbmlmb3JtPy5qb2luKFwiXFxuXCIpIHx8IFwiXCIpICsgKHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0RlZmluaXRpb25zIHx8IFwiXCIpLFxyXG4gICAgICAgICAgICAgICAgQ1VTVE9NX1ZFUlRFWF9NQUlOX0JFR0lOOiB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9NYWluQmVnaW4sXHJcbiAgICAgICAgICAgICAgICBDVVNUT01fVkVSVEVYX1VQREFURV9QT1NJVElPTjogdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfQmVmb3JlX1Bvc2l0aW9uVXBkYXRlZCxcclxuICAgICAgICAgICAgICAgIENVU1RPTV9WRVJURVhfVVBEQVRFX05PUk1BTDogdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfQmVmb3JlX05vcm1hbFVwZGF0ZWQsXHJcbiAgICAgICAgICAgICAgICBDVVNUT01fVkVSVEVYX01BSU5fRU5EOiB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9NYWluRW5kLFxyXG4gICAgICAgICAgICAgICAgQ1VTVE9NX1ZFUlRFWF9VUERBVEVfV09STERQT1M6IHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9CRUdJTjogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9CZWdpbixcclxuICAgICAgICAgICAgQ1VTVE9NX0ZSQUdNRU5UX0RFRklOSVRJT05TOiAodGhpcy5fY3VzdG9tVW5pZm9ybT8uam9pbihcIlxcblwiKSB8fCBcIlwiKSArICh0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0RlZmluaXRpb25zIHx8IFwiXCIpLFxyXG4gICAgICAgICAgICBDVVNUT01fRlJBR01FTlRfTUFJTl9CRUdJTjogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9NYWluQmVnaW4sXHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9VUERBVEVfRElGRlVTRTogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9DdXN0b21fRGlmZnVzZSxcclxuICAgICAgICAgICAgQ1VTVE9NX0ZSQUdNRU5UX1VQREFURV9BTFBIQTogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9DdXN0b21fQWxwaGEsXHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9CRUZPUkVfTElHSFRTOiB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0JlZm9yZV9MaWdodHMsXHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9CRUZPUkVfRlJBR0NPTE9SOiB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0JlZm9yZV9GcmFnQ29sb3IsXHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9NQUlOX0VORDogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9NYWluRW5kLFxyXG4gICAgICAgICAgICBDVVNUT01fRlJBR01FTlRfQkVGT1JFX0ZPRzogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9CZWZvcmVfRm9nLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzY2VuZT86IFNjZW5lKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2NlbmUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMgPSBuZXcgU2hhZGVyU3BlY2lhbFBhcnRzKCk7XHJcbiAgICAgICAgdGhpcy5jdXN0b21TaGFkZXJOYW1lUmVzb2x2ZSA9IHRoaXMuQnVpbGRlcjtcclxuXHJcbiAgICAgICAgdGhpcy5GcmFnbWVudFNoYWRlciA9IEVmZmVjdC5TaGFkZXJzU3RvcmVbXCJkZWZhdWx0UGl4ZWxTaGFkZXJcIl07XHJcbiAgICAgICAgdGhpcy5WZXJ0ZXhTaGFkZXIgPSBFZmZlY3QuU2hhZGVyc1N0b3JlW1wiZGVmYXVsdFZlcnRleFNoYWRlclwiXTtcclxuXHJcbiAgICAgICAgQ3VzdG9tTWF0ZXJpYWwuU2hhZGVySW5kZXhlcisrO1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZWRTaGFkZXJOYW1lID0gXCJjdXN0b21fXCIgKyBDdXN0b21NYXRlcmlhbC5TaGFkZXJJbmRleGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBfYWZ0ZXJCaW5kKG1lc2g/OiBNZXNoLCBlZmZlY3Q6IE51bGxhYmxlPEVmZmVjdD4gPSBudWxsLCBzdWJNZXNoPzogU3ViTWVzaCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZWZmZWN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5BdHRhY2hBZnRlckJpbmQobWVzaCwgZWZmZWN0KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzdXBlci5fYWZ0ZXJCaW5kKG1lc2gsIGVmZmVjdCwgc3ViTWVzaCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge31cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgdW5pZm9ybSB0byB0aGUgc2hhZGVyXHJcbiAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdW5pZm9ybSB0byBhZGRcclxuICAgICAqIEBwYXJhbSBraW5kIHRoZSB0eXBlIG9mIHRoZSB1bmlmb3JtIHRvIGFkZFxyXG4gICAgICogQHBhcmFtIHBhcmFtIHRoZSB2YWx1ZSBvZiB0aGUgdW5pZm9ybSB0byBhZGRcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRVbmlmb3JtKG5hbWU6IHN0cmluZywga2luZDogc3RyaW5nLCBwYXJhbTogYW55KTogQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIGlmICghdGhpcy5fY3VzdG9tVW5pZm9ybSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jdXN0b21Vbmlmb3JtID0gbmV3IEFycmF5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX25ld1VuaWZvcm1zID0gbmV3IEFycmF5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX25ld1NhbXBsZXJJbnN0YW5jZXMgPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlcyA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGFyYW0pIHtcclxuICAgICAgICAgICAgaWYgKGtpbmQuaW5kZXhPZihcInNhbXBsZXJcIikgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICg8YW55PnRoaXMuX25ld1NhbXBsZXJJbnN0YW5jZXMpW2tpbmQgKyBcIi1cIiArIG5hbWVdID0gcGFyYW07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAoPGFueT50aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzKVtraW5kICsgXCItXCIgKyBuYW1lXSA9IHBhcmFtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2N1c3RvbVVuaWZvcm0ucHVzaChcInVuaWZvcm0gXCIgKyBraW5kICsgXCIgXCIgKyBuYW1lICsgXCI7XCIpO1xyXG4gICAgICAgIHRoaXMuX25ld1VuaWZvcm1zLnB1c2gobmFtZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIGN1c3RvbSBhdHRyaWJ1dGVcclxuICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGVcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRBdHRyaWJ1dGUobmFtZTogc3RyaW5nKTogQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIGlmICghdGhpcy5fY3VzdG9tQXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICB0aGlzLl9jdXN0b21BdHRyaWJ1dGVzID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jdXN0b21BdHRyaWJ1dGVzLnB1c2gobmFtZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBGcmFnbWVudF9CZWdpbiBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9CZWdpbihzaGFkZXJQYXJ0OiBzdHJpbmcpOiBDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9CZWdpbiA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X0RlZmluaXRpb25zIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0RlZmluaXRpb25zKHNoYWRlclBhcnQ6IHN0cmluZyk6IEN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0RlZmluaXRpb25zID0gc2hhZGVyUGFydDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gRnJhZ21lbnRfTWFpbkJlZ2luIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X01haW5CZWdpbihzaGFkZXJQYXJ0OiBzdHJpbmcpOiBDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9NYWluQmVnaW4gPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBGcmFnbWVudF9NYWluRW5kIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X01haW5FbmQoc2hhZGVyUGFydDogc3RyaW5nKTogQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfTWFpbkVuZCA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X0N1c3RvbV9EaWZmdXNlIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0N1c3RvbV9EaWZmdXNlKHNoYWRlclBhcnQ6IHN0cmluZyk6IEN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0N1c3RvbV9EaWZmdXNlID0gc2hhZGVyUGFydC5yZXBsYWNlKFwicmVzdWx0XCIsIFwiZGlmZnVzZUNvbG9yXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBGcmFnbWVudF9DdXN0b21fQWxwaGEgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQ3VzdG9tX0FscGhhKHNoYWRlclBhcnQ6IHN0cmluZyk6IEN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0N1c3RvbV9BbHBoYSA9IHNoYWRlclBhcnQucmVwbGFjZShcInJlc3VsdFwiLCBcImFscGhhXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBGcmFnbWVudF9CZWZvcmVfTGlnaHRzIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0JlZm9yZV9MaWdodHMoc2hhZGVyUGFydDogc3RyaW5nKTogQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfQmVmb3JlX0xpZ2h0cyA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X0JlZm9yZV9Gb2cgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVmb3JlX0ZvZyhzaGFkZXJQYXJ0OiBzdHJpbmcpOiBDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9CZWZvcmVfRm9nID0gc2hhZGVyUGFydDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gRnJhZ21lbnRfQmVmb3JlX0ZyYWdDb2xvciBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9CZWZvcmVfRnJhZ0NvbG9yKHNoYWRlclBhcnQ6IHN0cmluZyk6IEN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0JlZm9yZV9GcmFnQ29sb3IgPSBzaGFkZXJQYXJ0LnJlcGxhY2UoXCJyZXN1bHRcIiwgXCJjb2xvclwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gVmVydGV4X0JlZ2luIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9CZWdpbihzaGFkZXJQYXJ0OiBzdHJpbmcpOiBDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfQmVnaW4gPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBWZXJ0ZXhfRGVmaW5pdGlvbnMgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0RlZmluaXRpb25zKHNoYWRlclBhcnQ6IHN0cmluZyk6IEN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9EZWZpbml0aW9ucyA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIFZlcnRleF9NYWluQmVnaW4gcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X01haW5CZWdpbihzaGFkZXJQYXJ0OiBzdHJpbmcpOiBDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfTWFpbkJlZ2luID0gc2hhZGVyUGFydDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gVmVydGV4X0JlZm9yZV9Qb3NpdGlvblVwZGF0ZWQgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0JlZm9yZV9Qb3NpdGlvblVwZGF0ZWQoc2hhZGVyUGFydDogc3RyaW5nKTogQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0JlZm9yZV9Qb3NpdGlvblVwZGF0ZWQgPSBzaGFkZXJQYXJ0LnJlcGxhY2UoXCJyZXN1bHRcIiwgXCJwb3NpdGlvblVwZGF0ZWRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIFZlcnRleF9CZWZvcmVfTm9ybWFsVXBkYXRlZCBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfQmVmb3JlX05vcm1hbFVwZGF0ZWQoc2hhZGVyUGFydDogc3RyaW5nKTogQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0JlZm9yZV9Ob3JtYWxVcGRhdGVkID0gc2hhZGVyUGFydC5yZXBsYWNlKFwicmVzdWx0XCIsIFwibm9ybWFsVXBkYXRlZFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQoc2hhZGVyUGFydDogc3RyaW5nKTogQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQgPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBWZXJ0ZXhfTWFpbkVuZCBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfTWFpbkVuZChzaGFkZXJQYXJ0OiBzdHJpbmcpOiBDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfTWFpbkVuZCA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLkN1c3RvbU1hdGVyaWFsXCIsIEN1c3RvbU1hdGVyaWFsKTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vY3VzdG9tTWF0ZXJpYWxcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vcGJyQ3VzdG9tTWF0ZXJpYWxcIjtcclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXHJcbmltcG9ydCB0eXBlIHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9lZmZlY3RcIjtcclxuaW1wb3J0IHR5cGUgeyBNYXRlcmlhbERlZmluZXMgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvbWF0ZXJpYWxEZWZpbmVzXCI7XHJcbmltcG9ydCB7IFBCUk1hdGVyaWFsIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1BCUi9wYnJNYXRlcmlhbFwiO1xyXG5pbXBvcnQgdHlwZSB7IE1lc2ggfSBmcm9tIFwiY29yZS9NZXNoZXMvbWVzaFwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB7IFNoYWRlckNvZGVJbmxpbmVyIH0gZnJvbSBcImNvcmUvRW5naW5lcy9Qcm9jZXNzb3JzL3NoYWRlckNvZGVJbmxpbmVyXCI7XHJcbmltcG9ydCB0eXBlIHsgSUN1c3RvbVNoYWRlck5hbWVSZXNvbHZlT3B0aW9ucyB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9tYXRlcmlhbFwiO1xyXG5pbXBvcnQgeyBDb2xvcjMsIENvbG9yNCB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcbmltcG9ydCB0eXBlIHsgU3ViTWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9zdWJNZXNoXCI7XHJcblxyXG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvcGJyLnZlcnRleFwiO1xyXG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvcGJyLmZyYWdtZW50XCI7XHJcblxyXG4vKipcclxuICogQWxiZWRvIHBhcnRzIG9mIHRoZSBzaGFkZXJcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaGFkZXJBbGJlZG9QYXJ0cyB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCZWdpbm5pbmcgb2YgdGhlIGZyYWdtZW50IHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVnaW46IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogRnJhZ21lbnQgZGVmaW5pdGlvbnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0RlZmluaXRpb25zOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIEJlZ2lubmluZyBvZiB0aGUgbWFpbiBmdW5jdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfTWFpbkJlZ2luOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIEVuZCBvZiBtYWluIGZ1bmN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9NYWluRW5kOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbGJlZG8gY29sb3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0N1c3RvbV9BbGJlZG86IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogTGlnaHRzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9CZWZvcmVfTGlnaHRzOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIE1ldGFsbGljIGFuZCByb3VnaG5lc3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0N1c3RvbV9NZXRhbGxpY1JvdWdobmVzczogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBNaWNyb3N1cmZhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0N1c3RvbV9NaWNyb1N1cmZhY2U6IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogRm9nIGNvbXB1dGF0aW9uc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVmb3JlX0ZvZzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbHBoYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQ3VzdG9tX0FscGhhOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIENvbG9yIGNvbXBvc2l0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9CZWZvcmVfRmluYWxDb2xvckNvbXBvc2l0aW9uOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIEZyYWdtZW50IGNvbG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9CZWZvcmVfRnJhZ0NvbG9yOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCZWdpbm5pbmcgb2YgdmVydGV4IHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0JlZ2luOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFZlcnRleCBkZWZpbml0aW9uc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0RlZmluaXRpb25zOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFZlcnRleCBtYWluIGJlZ2luXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfTWFpbkJlZ2luOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJ0ZXggYmVmb3JlIHBvc2l0aW9uIHVwZGF0ZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9CZWZvcmVfUG9zaXRpb25VcGRhdGVkOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJ0ZXggYmVmb3JlIG5vcm1hbCB1cGRhdGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfQmVmb3JlX05vcm1hbFVwZGF0ZWQ6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcnRleCBhZnRlciB3b3JsZCBwb3MgY29tcHV0ZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9BZnRlcl9Xb3JsZFBvc0NvbXB1dGVkOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJ0ZXggbWFpbiBlbmRcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9NYWluRW5kOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVwcmVjYXRlZCB1c2UgU2hhZGVyQWxiZWRvUGFydHMgaW5zdGVhZC5cclxuICovXHJcbmV4cG9ydCBjb25zdCBTaGFkZXJBbGViZG9QYXJ0cyA9IFNoYWRlckFsYmVkb1BhcnRzO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBCUkN1c3RvbU1hdGVyaWFsIGV4dGVuZHMgUEJSTWF0ZXJpYWwge1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRleCBmb3IgZWFjaCBjcmVhdGVkIHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNoYWRlckluZGV4ZXIgPSAxO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDdXN0b20gc2hhZGVyIHN0cnVjdHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ3VzdG9tUGFydHM6IFNoYWRlckFsYmVkb1BhcnRzO1xyXG4gICAgLyoqXHJcbiAgICAgKiBOYW1lIG9mIHRoZSBzaGFkZXJcclxuICAgICAqL1xyXG4gICAgX2NyZWF0ZWRTaGFkZXJOYW1lOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIExpc3Qgb2YgY3VzdG9tIHVuaWZvcm1zXHJcbiAgICAgKi9cclxuICAgIF9jdXN0b21Vbmlmb3JtOiBzdHJpbmdbXTtcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgdGhlIG5ldyB1bmlmb3Jtc1xyXG4gICAgICovXHJcbiAgICBfbmV3VW5pZm9ybXM6IHN0cmluZ1tdO1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbnN0YW5jZXMgb2YgdGhlIG5ldyB1bmlmb3JtIG9iamVjdHNcclxuICAgICAqL1xyXG4gICAgX25ld1VuaWZvcm1JbnN0YW5jZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbnN0YW5jZXMgb2YgdGhlIG5ldyBzYW1wbGVyIG9iamVjdHNcclxuICAgICAqL1xyXG4gICAgX25ld1NhbXBsZXJJbnN0YW5jZXM6IHsgW25hbWU6IHN0cmluZ106IFRleHR1cmUgfTtcclxuICAgIC8qKlxyXG4gICAgICogTGlzdCBvZiB0aGUgY3VzdG9tIGF0dHJpYnV0ZXNcclxuICAgICAqL1xyXG4gICAgX2N1c3RvbUF0dHJpYnV0ZXM6IHN0cmluZ1tdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnJhZ21lbnQgc2hhZGVyIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRTaGFkZXI6IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogVmVydGV4IHNoYWRlciBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleFNoYWRlcjogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUnVucyBhZnRlciB0aGUgbWF0ZXJpYWwgaXMgYm91bmQgdG8gYSBtZXNoXHJcbiAgICAgKiBAcGFyYW0gbWVzaCBtZXNoIGJvdW5kXHJcbiAgICAgKiBAcGFyYW0gZWZmZWN0IGJvdW5kIGVmZmVjdCB1c2VkIHRvIHJlbmRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQXR0YWNoQWZ0ZXJCaW5kKG1lc2g6IE1lc2ggfCB1bmRlZmluZWQsIGVmZmVjdDogRWZmZWN0KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBpbiB0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlYSA9IGVsLnRvU3RyaW5nKCkuc3BsaXQoXCItXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVhWzBdID09IFwidmVjMlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0LnNldFZlY3RvcjIoZWFbMV0sIHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXNbZWxdKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWFbMF0gPT0gXCJ2ZWMzXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlc1tlbF0gaW5zdGFuY2VvZiBDb2xvcjMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LnNldENvbG9yMyhlYVsxXSwgdGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlc1tlbF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC5zZXRWZWN0b3IzKGVhWzFdLCB0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzW2VsXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlYVswXSA9PSBcInZlYzRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzW2VsXSBpbnN0YW5jZW9mIENvbG9yNCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3Quc2V0RGlyZWN0Q29sb3I0KGVhWzFdLCB0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzW2VsXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LnNldFZlY3RvcjQoZWFbMV0sIHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXNbZWxdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0LnNldFZlY3RvcjQoZWFbMV0sIHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXNbZWxdKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWFbMF0gPT0gXCJtYXQ0XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBlZmZlY3Quc2V0TWF0cml4KGVhWzFdLCB0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzW2VsXSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVhWzBdID09IFwiZmxvYXRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdC5zZXRGbG9hdChlYVsxXSwgdGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlc1tlbF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9uZXdTYW1wbGVySW5zdGFuY2VzKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgaW4gdGhpcy5fbmV3U2FtcGxlckluc3RhbmNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWEgPSBlbC50b1N0cmluZygpLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChlYVswXSA9PSBcInNhbXBsZXIyRFwiICYmIHRoaXMuX25ld1NhbXBsZXJJbnN0YW5jZXNbZWxdLmlzUmVhZHkgJiYgdGhpcy5fbmV3U2FtcGxlckluc3RhbmNlc1tlbF0uaXNSZWFkeSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0LnNldFRleHR1cmUoZWFbMV0sIHRoaXMuX25ld1NhbXBsZXJJbnN0YW5jZXNbZWxdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmV2aWV3VW5pZm9ybShuYW1lOiBzdHJpbmcsIGFycjogc3RyaW5nW10pOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgaWYgKG5hbWUgPT0gXCJ1bmlmb3JtXCIgJiYgdGhpcy5fbmV3VW5pZm9ybXMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgdGhpcy5fbmV3VW5pZm9ybXMubGVuZ3RoOyBpbmQrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1c3RvbVVuaWZvcm1baW5kXS5pbmRleE9mKFwic2FtcGxlclwiKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuX25ld1VuaWZvcm1zW2luZF0ucmVwbGFjZSgvXFxbXFxkKlxcXS9nLCBcIlwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5hbWUgPT0gXCJzYW1wbGVyXCIgJiYgdGhpcy5fbmV3VW5pZm9ybXMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgdGhpcy5fbmV3VW5pZm9ybXMubGVuZ3RoOyBpbmQrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1c3RvbVVuaWZvcm1baW5kXS5pbmRleE9mKFwic2FtcGxlclwiKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuX25ld1VuaWZvcm1zW2luZF0ucmVwbGFjZSgvXFxbXFxkKlxcXS9nLCBcIlwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFycjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1aWxkcyB0aGUgbWF0ZXJpYWxcclxuICAgICAqIEBwYXJhbSBzaGFkZXJOYW1lIG5hbWUgb2YgdGhlIHNoYWRlclxyXG4gICAgICogQHBhcmFtIHVuaWZvcm1zIGxpc3Qgb2YgdW5pZm9ybXNcclxuICAgICAqIEBwYXJhbSB1bmlmb3JtQnVmZmVycyBsaXN0IG9mIHVuaWZvcm0gYnVmZmVyc1xyXG4gICAgICogQHBhcmFtIHNhbXBsZXJzIGxpc3Qgb2Ygc2FtcGxlcnNcclxuICAgICAqIEBwYXJhbSBkZWZpbmVzIGxpc3Qgb2YgZGVmaW5lc1xyXG4gICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgbGlzdCBvZiBhdHRyaWJ1dGVzXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIHRvIGNvbXBpbGUgdGhlIHNoYWRlclxyXG4gICAgICogQHJldHVybnMgdGhlIHNoYWRlciBuYW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBCdWlsZGVyKFxyXG4gICAgICAgIHNoYWRlck5hbWU6IHN0cmluZyxcclxuICAgICAgICB1bmlmb3Jtczogc3RyaW5nW10sXHJcbiAgICAgICAgdW5pZm9ybUJ1ZmZlcnM6IHN0cmluZ1tdLFxyXG4gICAgICAgIHNhbXBsZXJzOiBzdHJpbmdbXSxcclxuICAgICAgICBkZWZpbmVzOiBNYXRlcmlhbERlZmluZXMgfCBzdHJpbmdbXSxcclxuICAgICAgICBhdHRyaWJ1dGVzPzogc3RyaW5nW10sXHJcbiAgICAgICAgb3B0aW9ucz86IElDdXN0b21TaGFkZXJOYW1lUmVzb2x2ZU9wdGlvbnNcclxuICAgICk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudFByb2Nlc3NpbmcgPSBvcHRpb25zLnByb2Nlc3NGaW5hbENvZGU7XHJcbiAgICAgICAgICAgIG9wdGlvbnMucHJvY2Vzc0ZpbmFsQ29kZSA9ICh0eXBlOiBzdHJpbmcsIGNvZGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwidmVydGV4XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFByb2Nlc3NpbmcgPyBjdXJyZW50UHJvY2Vzc2luZyh0eXBlLCBjb2RlKSA6IGNvZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY2kgPSBuZXcgU2hhZGVyQ29kZUlubGluZXIoY29kZSk7XHJcbiAgICAgICAgICAgICAgICBzY2kuaW5saW5lVG9rZW4gPSBcIiNkZWZpbmUgcGJyX2lubGluZVwiO1xyXG4gICAgICAgICAgICAgICAgc2NpLnByb2Nlc3NDb2RlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFByb2Nlc3NpbmcgPyBjdXJyZW50UHJvY2Vzc2luZyh0eXBlLCBzY2kuY29kZSkgOiBzY2kuY29kZTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzICYmIHRoaXMuX2N1c3RvbUF0dHJpYnV0ZXMgJiYgdGhpcy5fY3VzdG9tQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaCguLi50aGlzLl9jdXN0b21BdHRyaWJ1dGVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuUmV2aWV3VW5pZm9ybShcInVuaWZvcm1cIiwgdW5pZm9ybXMpO1xyXG4gICAgICAgIHRoaXMuUmV2aWV3VW5pZm9ybShcInNhbXBsZXJcIiwgc2FtcGxlcnMpO1xyXG5cclxuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5fY3JlYXRlZFNoYWRlck5hbWU7XHJcblxyXG4gICAgICAgIGlmIChFZmZlY3QuU2hhZGVyc1N0b3JlW25hbWUgKyBcIlZlcnRleFNoYWRlclwiXSAmJiBFZmZlY3QuU2hhZGVyc1N0b3JlW25hbWUgKyBcIlBpeGVsU2hhZGVyXCJdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBFZmZlY3QuU2hhZGVyc1N0b3JlW25hbWUgKyBcIlZlcnRleFNoYWRlclwiXSA9IHRoaXMuX2luamVjdEN1c3RvbUNvZGUodGhpcy5WZXJ0ZXhTaGFkZXIsIFwidmVydGV4XCIpO1xyXG4gICAgICAgIEVmZmVjdC5TaGFkZXJzU3RvcmVbbmFtZSArIFwiUGl4ZWxTaGFkZXJcIl0gPSB0aGlzLl9pbmplY3RDdXN0b21Db2RlKHRoaXMuRnJhZ21lbnRTaGFkZXIsIFwiZnJhZ21lbnRcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaW5qZWN0Q3VzdG9tQ29kZShjb2RlOiBzdHJpbmcsIHNoYWRlclR5cGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tQ29kZSA9IHRoaXMuX2dldEN1c3RvbUNvZGUoc2hhZGVyVHlwZSk7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgaW4gY3VzdG9tQ29kZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpbmplY3RlZENvZGUgPSBjdXN0b21Db2RlW3BvaW50XTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmplY3RlZENvZGUgJiYgaW5qZWN0ZWRDb2RlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxQb2ludE5hbWUgPSBcIiNkZWZpbmUgXCIgKyBwb2ludDtcclxuICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UoZnVsbFBvaW50TmFtZSwgXCJcXG5cIiArIGluamVjdGVkQ29kZSArIFwiXFxuXCIgKyBmdWxsUG9pbnROYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9nZXRDdXN0b21Db2RlKHNoYWRlclR5cGU6IHN0cmluZyk6IHsgW3BvaW50TmFtZTogc3RyaW5nXTogc3RyaW5nIH0ge1xyXG4gICAgICAgIGlmIChzaGFkZXJUeXBlID09PSBcInZlcnRleFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBDVVNUT01fVkVSVEVYX0JFR0lOOiB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9CZWdpbixcclxuICAgICAgICAgICAgICAgIENVU1RPTV9WRVJURVhfREVGSU5JVElPTlM6ICh0aGlzLl9jdXN0b21Vbmlmb3JtPy5qb2luKFwiXFxuXCIpIHx8IFwiXCIpICsgKHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0RlZmluaXRpb25zIHx8IFwiXCIpLFxyXG4gICAgICAgICAgICAgICAgQ1VTVE9NX1ZFUlRFWF9NQUlOX0JFR0lOOiB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9NYWluQmVnaW4sXHJcbiAgICAgICAgICAgICAgICBDVVNUT01fVkVSVEVYX1VQREFURV9QT1NJVElPTjogdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfQmVmb3JlX1Bvc2l0aW9uVXBkYXRlZCxcclxuICAgICAgICAgICAgICAgIENVU1RPTV9WRVJURVhfVVBEQVRFX05PUk1BTDogdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfQmVmb3JlX05vcm1hbFVwZGF0ZWQsXHJcbiAgICAgICAgICAgICAgICBDVVNUT01fVkVSVEVYX01BSU5fRU5EOiB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9NYWluRW5kLFxyXG4gICAgICAgICAgICAgICAgQ1VTVE9NX1ZFUlRFWF9VUERBVEVfV09STERQT1M6IHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9CRUdJTjogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9CZWdpbixcclxuICAgICAgICAgICAgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fQkVHSU46IHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfTWFpbkJlZ2luLFxyXG4gICAgICAgICAgICBDVVNUT01fRlJBR01FTlRfREVGSU5JVElPTlM6ICh0aGlzLl9jdXN0b21Vbmlmb3JtPy5qb2luKFwiXFxuXCIpIHx8IFwiXCIpICsgKHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfRGVmaW5pdGlvbnMgfHwgXCJcIiksXHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9VUERBVEVfQUxCRURPOiB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0N1c3RvbV9BbGJlZG8sXHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9VUERBVEVfQUxQSEE6IHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfQ3VzdG9tX0FscGhhLFxyXG4gICAgICAgICAgICBDVVNUT01fRlJBR01FTlRfQkVGT1JFX0xJR0hUUzogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9CZWZvcmVfTGlnaHRzLFxyXG4gICAgICAgICAgICBDVVNUT01fRlJBR01FTlRfVVBEQVRFX01FVEFMTElDUk9VR0hORVNTOiB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0N1c3RvbV9NZXRhbGxpY1JvdWdobmVzcyxcclxuICAgICAgICAgICAgQ1VTVE9NX0ZSQUdNRU5UX1VQREFURV9NSUNST1NVUkZBQ0U6IHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfQ3VzdG9tX01pY3JvU3VyZmFjZSxcclxuICAgICAgICAgICAgQ1VTVE9NX0ZSQUdNRU5UX0JFRk9SRV9GSU5BTENPTE9SQ09NUE9TSVRJT046IHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfQmVmb3JlX0ZpbmFsQ29sb3JDb21wb3NpdGlvbixcclxuICAgICAgICAgICAgQ1VTVE9NX0ZSQUdNRU5UX0JFRk9SRV9GUkFHQ09MT1I6IHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfQmVmb3JlX0ZyYWdDb2xvcixcclxuICAgICAgICAgICAgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fRU5EOiB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X01haW5FbmQsXHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9CRUZPUkVfRk9HOiB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0JlZm9yZV9Gb2csXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNjZW5lPzogU2NlbmUpIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzY2VuZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cyA9IG5ldyBTaGFkZXJBbGJlZG9QYXJ0cygpO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tU2hhZGVyTmFtZVJlc29sdmUgPSB0aGlzLkJ1aWxkZXI7XHJcblxyXG4gICAgICAgIHRoaXMuRnJhZ21lbnRTaGFkZXIgPSBFZmZlY3QuU2hhZGVyc1N0b3JlW1wicGJyUGl4ZWxTaGFkZXJcIl07XHJcbiAgICAgICAgdGhpcy5WZXJ0ZXhTaGFkZXIgPSBFZmZlY3QuU2hhZGVyc1N0b3JlW1wicGJyVmVydGV4U2hhZGVyXCJdO1xyXG5cclxuICAgICAgICB0aGlzLkZyYWdtZW50U2hhZGVyID0gdGhpcy5GcmFnbWVudFNoYWRlci5yZXBsYWNlKC8jaW5jbHVkZTxwYnJCbG9ja0FsYmVkb09wYWNpdHk+L2csIEVmZmVjdC5JbmNsdWRlc1NoYWRlcnNTdG9yZVtcInBickJsb2NrQWxiZWRvT3BhY2l0eVwiXSk7XHJcbiAgICAgICAgdGhpcy5GcmFnbWVudFNoYWRlciA9IHRoaXMuRnJhZ21lbnRTaGFkZXIucmVwbGFjZSgvI2luY2x1ZGU8cGJyQmxvY2tSZWZsZWN0aXZpdHk+L2csIEVmZmVjdC5JbmNsdWRlc1NoYWRlcnNTdG9yZVtcInBickJsb2NrUmVmbGVjdGl2aXR5XCJdKTtcclxuICAgICAgICB0aGlzLkZyYWdtZW50U2hhZGVyID0gdGhpcy5GcmFnbWVudFNoYWRlci5yZXBsYWNlKC8jaW5jbHVkZTxwYnJCbG9ja0ZpbmFsQ29sb3JDb21wb3NpdGlvbj4vZywgRWZmZWN0LkluY2x1ZGVzU2hhZGVyc1N0b3JlW1wicGJyQmxvY2tGaW5hbENvbG9yQ29tcG9zaXRpb25cIl0pO1xyXG5cclxuICAgICAgICBQQlJDdXN0b21NYXRlcmlhbC5TaGFkZXJJbmRleGVyKys7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlZFNoYWRlck5hbWUgPSBcImN1c3RvbXBicl9cIiArIFBCUkN1c3RvbU1hdGVyaWFsLlNoYWRlckluZGV4ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIF9hZnRlckJpbmQobWVzaD86IE1lc2gsIGVmZmVjdDogTnVsbGFibGU8RWZmZWN0PiA9IG51bGwsIHN1Yk1lc2g/OiBTdWJNZXNoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFlZmZlY3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkF0dGFjaEFmdGVyQmluZChtZXNoLCBlZmZlY3QpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHN1cGVyLl9hZnRlckJpbmQobWVzaCwgZWZmZWN0LCBzdWJNZXNoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5ldyB1bmlmb3JtIHRvIHRoZSBzaGFkZXJcclxuICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGFkZFxyXG4gICAgICogQHBhcmFtIGtpbmQgdGhlIHR5cGUgb2YgdGhlIHVuaWZvcm0gdG8gYWRkXHJcbiAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIHZhbHVlIG9mIHRoZSB1bmlmb3JtIHRvIGFkZFxyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZFVuaWZvcm0obmFtZTogc3RyaW5nLCBraW5kOiBzdHJpbmcsIHBhcmFtOiBhbnkpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jdXN0b21Vbmlmb3JtKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbVVuaWZvcm0gPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICAgICAgdGhpcy5fbmV3VW5pZm9ybXMgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICAgICAgdGhpcy5fbmV3U2FtcGxlckluc3RhbmNlcyA9IHt9O1xyXG4gICAgICAgICAgICB0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYXJhbSkge1xyXG4gICAgICAgICAgICBpZiAoa2luZC5pbmRleE9mKFwic2FtcGxlclwiKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgKDxhbnk+dGhpcy5fbmV3U2FtcGxlckluc3RhbmNlcylba2luZCArIFwiLVwiICsgbmFtZV0gPSBwYXJhbTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICg8YW55PnRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXMpW2tpbmQgKyBcIi1cIiArIG5hbWVdID0gcGFyYW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY3VzdG9tVW5pZm9ybS5wdXNoKFwidW5pZm9ybSBcIiArIGtpbmQgKyBcIiBcIiArIG5hbWUgKyBcIjtcIik7XHJcbiAgICAgICAgdGhpcy5fbmV3VW5pZm9ybXMucHVzaChuYW1lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgY3VzdG9tIGF0dHJpYnV0ZVxyXG4gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZVxyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jdXN0b21BdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbUF0dHJpYnV0ZXMgPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2N1c3RvbUF0dHJpYnV0ZXMucHVzaChuYW1lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X0JlZ2luIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0JlZ2luKHNoYWRlclBhcnQ6IHN0cmluZyk6IFBCUkN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0JlZ2luID0gc2hhZGVyUGFydDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gRnJhZ21lbnRfRGVmaW5pdGlvbnMgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfRGVmaW5pdGlvbnMoc2hhZGVyUGFydDogc3RyaW5nKTogUEJSQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfRGVmaW5pdGlvbnMgPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBGcmFnbWVudF9NYWluQmVnaW4gcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfTWFpbkJlZ2luKHNoYWRlclBhcnQ6IHN0cmluZyk6IFBCUkN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X01haW5CZWdpbiA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X0N1c3RvbV9BbGJlZG8gcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQ3VzdG9tX0FsYmVkbyhzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9DdXN0b21fQWxiZWRvID0gc2hhZGVyUGFydC5yZXBsYWNlKFwicmVzdWx0XCIsIFwic3VyZmFjZUFsYmVkb1wiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gRnJhZ21lbnRfQ3VzdG9tX0FscGhhIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0N1c3RvbV9BbHBoYShzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9DdXN0b21fQWxwaGEgPSBzaGFkZXJQYXJ0LnJlcGxhY2UoXCJyZXN1bHRcIiwgXCJhbHBoYVwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gRnJhZ21lbnRfQmVmb3JlX0xpZ2h0cyBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9CZWZvcmVfTGlnaHRzKHNoYWRlclBhcnQ6IHN0cmluZyk6IFBCUkN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0JlZm9yZV9MaWdodHMgPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBGcmFnbWVudF9DdXN0b21fTWV0YWxsaWNSb3VnaG5lc3MgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQ3VzdG9tX01ldGFsbGljUm91Z2huZXNzKHNoYWRlclBhcnQ6IHN0cmluZyk6IFBCUkN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0N1c3RvbV9NZXRhbGxpY1JvdWdobmVzcyA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X0N1c3RvbV9NaWNyb1N1cmZhY2UgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQ3VzdG9tX01pY3JvU3VyZmFjZShzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9DdXN0b21fTWljcm9TdXJmYWNlID0gc2hhZGVyUGFydDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gRnJhZ21lbnRfQmVmb3JlX0ZvZyBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9CZWZvcmVfRm9nKHNoYWRlclBhcnQ6IHN0cmluZyk6IFBCUkN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0JlZm9yZV9Gb2cgPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBGcmFnbWVudF9CZWZvcmVfRmluYWxDb2xvckNvbXBvc2l0aW9uIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0JlZm9yZV9GaW5hbENvbG9yQ29tcG9zaXRpb24oc2hhZGVyUGFydDogc3RyaW5nKTogUEJSQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfQmVmb3JlX0ZpbmFsQ29sb3JDb21wb3NpdGlvbiA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X0JlZm9yZV9GcmFnQ29sb3IgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVmb3JlX0ZyYWdDb2xvcihzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9CZWZvcmVfRnJhZ0NvbG9yID0gc2hhZGVyUGFydC5yZXBsYWNlKFwicmVzdWx0XCIsIFwiY29sb3JcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X01haW5FbmQgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfTWFpbkVuZChzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9NYWluRW5kID0gc2hhZGVyUGFydDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gVmVydGV4X0JlZ2luIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9CZWdpbihzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfQmVnaW4gPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBWZXJ0ZXhfRGVmaW5pdGlvbnMgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0RlZmluaXRpb25zKHNoYWRlclBhcnQ6IHN0cmluZyk6IFBCUkN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9EZWZpbml0aW9ucyA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIFZlcnRleF9NYWluQmVnaW4gcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X01haW5CZWdpbihzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfTWFpbkJlZ2luID0gc2hhZGVyUGFydDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gVmVydGV4X0JlZm9yZV9Qb3NpdGlvblVwZGF0ZWQgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0JlZm9yZV9Qb3NpdGlvblVwZGF0ZWQoc2hhZGVyUGFydDogc3RyaW5nKTogUEJSQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0JlZm9yZV9Qb3NpdGlvblVwZGF0ZWQgPSBzaGFkZXJQYXJ0LnJlcGxhY2UoXCJyZXN1bHRcIiwgXCJwb3NpdGlvblVwZGF0ZWRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIFZlcnRleF9CZWZvcmVfTm9ybWFsVXBkYXRlZCBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfQmVmb3JlX05vcm1hbFVwZGF0ZWQoc2hhZGVyUGFydDogc3RyaW5nKTogUEJSQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0JlZm9yZV9Ob3JtYWxVcGRhdGVkID0gc2hhZGVyUGFydC5yZXBsYWNlKFwicmVzdWx0XCIsIFwibm9ybWFsVXBkYXRlZFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQoc2hhZGVyUGFydDogc3RyaW5nKTogUEJSQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQgPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBWZXJ0ZXhfTWFpbkVuZCBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfTWFpbkVuZChzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfTWFpbkVuZCA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLlBCUkN1c3RvbU1hdGVyaWFsXCIsIFBCUkN1c3RvbU1hdGVyaWFsKTtcclxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgKi9cclxuaW1wb3J0ICogYXMgTWF0TGliIGZyb20gXCJtYXRlcmlhbHMvY3VzdG9tL2luZGV4XCI7XHJcblxyXG4vKipcclxuICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBVTUQgbW9kdWxlLlxyXG4gKiBUaGUgZW50cnkgcG9pbnQgZm9yIGEgZnV0dXJlIEVTTSBwYWNrYWdlIHNob3VsZCBiZSBpbmRleC50c1xyXG4gKi9cclxuY29uc3QgZ2xvYmFsT2JqZWN0ID0gdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XHJcbmlmICh0eXBlb2YgZ2xvYmFsT2JqZWN0ICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBNYXRMaWIpIHtcclxuICAgICAgICAoPGFueT5nbG9iYWxPYmplY3QpLkJBQllMT05ba2V5XSA9ICg8YW55Pk1hdExpYilba2V5XTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0ICogZnJvbSBcIm1hdGVyaWFscy9jdXN0b20vaW5kZXhcIjtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NYXRlcmlhbHNfZWZmZWN0X187IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xuXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcbiAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbn1cblxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xuICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHQ7XG4gIH1cbiAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xuICB2YXIgdCA9IHt9O1xuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxuICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgIH1cbiAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XG4gIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXNEZWNvcmF0ZShjdG9yLCBkZXNjcmlwdG9ySW4sIGRlY29yYXRvcnMsIGNvbnRleHRJbiwgaW5pdGlhbGl6ZXJzLCBleHRyYUluaXRpYWxpemVycykge1xuICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cbiAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcbiAgdmFyIHRhcmdldCA9ICFkZXNjcmlwdG9ySW4gJiYgY3RvciA/IGNvbnRleHRJbltcInN0YXRpY1wiXSA/IGN0b3IgOiBjdG9yLnByb3RvdHlwZSA6IG51bGw7XG4gIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xuICB2YXIgXywgZG9uZSA9IGZhbHNlO1xuICBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4uYWNjZXNzKSBjb250ZXh0LmFjY2Vzc1twXSA9IGNvbnRleHRJbi5hY2Nlc3NbcF07XG4gICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xuICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XG4gICAgICBpZiAoa2luZCA9PT0gXCJhY2Nlc3NvclwiKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmdldCkpIGRlc2NyaXB0b3IuZ2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcbiAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgICAgICBlbHNlIGRlc2NyaXB0b3Jba2V5XSA9IF87XG4gICAgICB9XG4gIH1cbiAgaWYgKHRhcmdldCkgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgY29udGV4dEluLm5hbWUsIGRlc2NyaXB0b3IpO1xuICBkb25lID0gdHJ1ZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XG4gIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGluaXRpYWxpemVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xuICB9XG4gIHJldHVybiB1c2VWYWx1ZSA/IHZhbHVlIDogdm9pZCAwO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcHJvcEtleSh4KSB7XG4gIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcbiAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGYsIFwibmFtZVwiLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHByZWZpeCA/IFwiXCIuY29uY2F0KHByZWZpeCwgXCIgXCIsIG5hbWUpIDogbmFtZSB9KTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XG4gIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEl0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpO1xuICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XG4gIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XG4gICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xuICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XG4gICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufVxuXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xuICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgfVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgb1trMl0gPSBtW2tdO1xufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xuICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XG4gIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xuICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICB9XG4gIH07XG4gIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XG4gIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFtKSByZXR1cm4gbztcbiAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gIHRyeSB7XG4gICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgfVxuICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgZmluYWxseSB7XG4gICAgICB0cnkge1xuICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gIH1cbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcbiAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXG4gICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XG4gIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xuICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXG4gICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcbiAgICAgICAgICByW2tdID0gYVtqXTtcbiAgcmV0dXJuIHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XG4gIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XG4gICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcbiAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xuICByZXR1cm4gaSA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBBc3luY0l0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBBc3luY0l0ZXJhdG9yIDogT2JqZWN0KS5wcm90b3R5cGUpLCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIsIGF3YWl0UmV0dXJuKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxuICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgcmV0dXJuIGNvb2tlZDtcbn07XG5cbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbnZhciBvd25LZXlzID0gZnVuY3Rpb24obykge1xuICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcbiAgICB2YXIgYXIgPSBbXTtcbiAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xuICAgIHJldHVybiBhcjtcbiAgfTtcbiAgcmV0dXJuIG93bktleXMobyk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xuICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayA9IG93bktleXMobW9kKSwgaSA9IDA7IGkgPCBrLmxlbmd0aDsgaSsrKSBpZiAoa1tpXSAhPT0gXCJkZWZhdWx0XCIpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwga1tpXSk7XG4gIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XG4gIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgZGVmYXVsdDogbW9kIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHJlY2VpdmVyLCBzdGF0ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4ga2luZCA9PT0gXCJtXCIgPyBmIDoga2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIpIDogZiA/IGYudmFsdWUgOiBzdGF0ZS5nZXQocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgc3RhdGUsIHZhbHVlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgc2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB3cml0ZSBwcml2YXRlIG1lbWJlciB0byBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHJlY2VpdmVyID09PSBudWxsIHx8ICh0eXBlb2YgcmVjZWl2ZXIgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHJlY2VpdmVyICE9PSBcImZ1bmN0aW9uXCIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHVzZSAnaW4nIG9wZXJhdG9yIG9uIG5vbi1vYmplY3RcIik7XG4gIHJldHVybiB0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyID09PSBzdGF0ZSA6IHN0YXRlLmhhcyhyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZShlbnYsIHZhbHVlLCBhc3luYykge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xuICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIGlmICghU3ltYm9sLmFzeW5jRGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0Rpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAoZGlzcG9zZSA9PT0gdm9pZCAwKSB7XG4gICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgZGlzcG9zZSA9IHZhbHVlW1N5bWJvbC5kaXNwb3NlXTtcbiAgICAgIGlmIChhc3luYykgaW5uZXIgPSBkaXNwb3NlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgaWYgKGlubmVyKSBkaXNwb3NlID0gZnVuY3Rpb24oKSB7IHRyeSB7IGlubmVyLmNhbGwodGhpcyk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOyB9IH07XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIHZhciByLCBzID0gMDtcbiAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XG4gICAgICAgIGlmIChyLmRpc3Bvc2UpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gci5kaXNwb3NlLmNhbGwoci52YWx1ZSk7XG4gICAgICAgICAgaWYgKHIuYXN5bmMpIHJldHVybiBzIHw9IDIsIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4obmV4dCwgZnVuY3Rpb24oZSkgeyBmYWlsKGUpOyByZXR1cm4gbmV4dCgpOyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHMgfD0gMTtcbiAgICAgIH1cbiAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgIGZhaWwoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzID09PSAxKSByZXR1cm4gZW52Lmhhc0Vycm9yID8gUHJvbWlzZS5yZWplY3QoZW52LmVycm9yKSA6IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIGlmIChlbnYuaGFzRXJyb3IpIHRocm93IGVudi5lcnJvcjtcbiAgfVxuICByZXR1cm4gbmV4dCgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aCwgcHJlc2VydmVKc3gpIHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiICYmIC9eXFwuXFwuP1xcLy8udGVzdChwYXRoKSkge1xuICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFwuKHRzeCkkfCgoPzpcXC5kKT8pKCg/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcbiAgICAgICAgICByZXR1cm4gdHN4ID8gcHJlc2VydmVKc3ggPyBcIi5qc3hcIiA6IFwiLmpzXCIgOiBkICYmICghZXh0IHx8ICFjbSkgPyBtIDogKGQgKyBleHQgKyBcIi5cIiArIGNtLnRvTG93ZXJDYXNlKCkgKyBcImpzXCIpO1xuICAgICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgX19leHRlbmRzLFxuICBfX2Fzc2lnbixcbiAgX19yZXN0LFxuICBfX2RlY29yYXRlLFxuICBfX3BhcmFtLFxuICBfX2VzRGVjb3JhdGUsXG4gIF9fcnVuSW5pdGlhbGl6ZXJzLFxuICBfX3Byb3BLZXksXG4gIF9fc2V0RnVuY3Rpb25OYW1lLFxuICBfX21ldGFkYXRhLFxuICBfX2F3YWl0ZXIsXG4gIF9fZ2VuZXJhdG9yLFxuICBfX2NyZWF0ZUJpbmRpbmcsXG4gIF9fZXhwb3J0U3RhcixcbiAgX192YWx1ZXMsXG4gIF9fcmVhZCxcbiAgX19zcHJlYWQsXG4gIF9fc3ByZWFkQXJyYXlzLFxuICBfX3NwcmVhZEFycmF5LFxuICBfX2F3YWl0LFxuICBfX2FzeW5jR2VuZXJhdG9yLFxuICBfX2FzeW5jRGVsZWdhdG9yLFxuICBfX2FzeW5jVmFsdWVzLFxuICBfX21ha2VUZW1wbGF0ZU9iamVjdCxcbiAgX19pbXBvcnRTdGFyLFxuICBfX2ltcG9ydERlZmF1bHQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRJbixcbiAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXG4gIF9fZGlzcG9zZVJlc291cmNlcyxcbiAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sXG59O1xuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0ICogYXMgbWF0ZXJpYWxzIGZyb20gXCJAbHRzL21hdGVyaWFscy9sZWdhY3kvbGVnYWN5LWN1c3RvbVwiO1xyXG5leHBvcnQgeyBtYXRlcmlhbHMgfTtcclxuZXhwb3J0IGRlZmF1bHQgbWF0ZXJpYWxzO1xyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
1442
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi5jdXN0b21NYXRlcmlhbC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOVlBO0FBRUE7QUFHQTtBQUNBO0FBSUE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFVQTtBQUFBO0FBQ0E7QUFBQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQXVFQTtBQUFBOztBQUVBOztBQUVBO0FBQ0E7QUFBQTtBQThLQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBOztBQUNBO0FBN0lBOzs7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7OztBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBY0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBM1lBOztBQUVBO0FBQ0E7QUF5WUE7QUFBQTtBQTdZQTtBQStZQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlmQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNDQTtBQUVBO0FBR0E7QUFDQTtBQUVBO0FBSUE7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBb0ZBO0FBQUE7O0FBRUE7O0FBRUE7QUFDQTtBQUVBO0FBQUE7QUF1TUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTs7QUFDQTtBQTFLQTs7OztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBOzs7Ozs7Ozs7O0FBVUE7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFrQkE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdGNBOztBQUVBO0FBQ0E7QUFvY0E7QUFBQTtBQXhjQTtBQTBjQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMWpCQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7Ozs7Ozs7Ozs7O0FDZEE7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL01BVEVSSUFMUy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vTUFURVJJQUxTLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwid2VicGFjazovL01BVEVSSUFMUy8uLi8uLi8uLi9kZXYvbWF0ZXJpYWxzL3NyYy9jdXN0b20vY3VzdG9tTWF0ZXJpYWwudHMiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTLy4uLy4uLy4uL2Rldi9tYXRlcmlhbHMvc3JjL2N1c3RvbS9pbmRleC50cyIsIndlYnBhY2s6Ly9NQVRFUklBTFMvLi4vLi4vLi4vZGV2L21hdGVyaWFscy9zcmMvY3VzdG9tL3BickN1c3RvbU1hdGVyaWFsLnRzIiwid2VicGFjazovL01BVEVSSUFMUy8uLi8uLi8uLi9sdHMvbWF0ZXJpYWxzL3NyYy9sZWdhY3kvbGVnYWN5LWN1c3RvbS50cyIsIndlYnBhY2s6Ly9NQVRFUklBTFMvZXh0ZXJuYWwgdW1kIHtcInJvb3RcIjpcIkJBQllMT05cIixcImNvbW1vbmpzXCI6XCJiYWJ5bG9uanNcIixcImNvbW1vbmpzMlwiOlwiYmFieWxvbmpzXCIsXCJhbWRcIjpcImJhYnlsb25qc1wifSIsIndlYnBhY2s6Ly9NQVRFUklBTFMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL01BVEVSSUFMUy93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vTUFURVJJQUxTLy4vc3JjL2N1c3RvbS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJiYWJ5bG9uanNcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJiYWJ5bG9uanMtbWF0ZXJpYWxzXCIsIFtcImJhYnlsb25qc1wiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJiYWJ5bG9uanMtbWF0ZXJpYWxzXCJdID0gZmFjdG9yeShyZXF1aXJlKFwiYmFieWxvbmpzXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJNQVRFUklBTFNcIl0gPSBmYWN0b3J5KHJvb3RbXCJCQUJZTE9OXCJdKTtcbn0pKCh0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdGhpcyksIChfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NYXRlcmlhbHNfZWZmZWN0X18pID0+IHtcbnJldHVybiAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cblxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XG4gIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgZnVuY3Rpb24gc3RlcChvcCkge1xuICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcbiAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xuICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cbiAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICB9XG59XG5cbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XG4gICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xuICB9XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICBvW2syXSA9IG1ba107XG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XG4gIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcbiAgICAgIH1cbiAgfTtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcbiAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICBpZiAoIW0pIHJldHVybiBvO1xuICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgdHJ5IHtcbiAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICB9XG4gIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgfVxuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xuICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcbiAgcmV0dXJuIGFyO1xufVxuXG4vKiogQGRlcHJlY2F0ZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcbiAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XG4gIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcbiAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxuICAgICAgICAgIHJba10gPSBhW2pdO1xuICByZXR1cm4gcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcbiAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xuICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgIH1cbiAgfVxuICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xuICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XG4gIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpZiAoZ1tuXSkgeyBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyBpZiAoZikgaVtuXSA9IGYoaVtuXSk7IH0gfVxuICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XG4gIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxuICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZShcIm5leHRcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XG4gIHZhciBpLCBwO1xuICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XG4gIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG4gIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XG4gIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcbiAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxuICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xuICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxuICByZXR1cm4gY29va2VkO1xufTtcblxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgb1tcImRlZmF1bHRcIl0gPSB2O1xufTtcblxudmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7XG4gIG93bktleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiAobykge1xuICAgIHZhciBhciA9IFtdO1xuICAgIGZvciAodmFyIGsgaW4gbykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBrKSkgYXJbYXIubGVuZ3RoXSA9IGs7XG4gICAgcmV0dXJuIGFyO1xuICB9O1xuICByZXR1cm4gb3duS2V5cyhvKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSBcImRlZmF1bHRcIikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTtcbiAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0RGVmYXVsdChtb2QpIHtcbiAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIGdldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgcmVhZCBwcml2YXRlIG1lbWJlciBmcm9tIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwibVwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBtZXRob2QgaXMgbm90IHdyaXRhYmxlXCIpO1xuICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBzZXR0ZXJcIik7XG4gIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XG4gIHJldHVybiAoa2luZCA9PT0gXCJhXCIgPyBmLmNhbGwocmVjZWl2ZXIsIHZhbHVlKSA6IGYgPyBmLnZhbHVlID0gdmFsdWUgOiBzdGF0ZS5zZXQocmVjZWl2ZXIsIHZhbHVlKSksIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEluKHN0YXRlLCByZWNlaXZlcikge1xuICBpZiAocmVjZWl2ZXIgPT09IG51bGwgfHwgKHR5cGVvZiByZWNlaXZlciAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgcmVjZWl2ZXIgIT09IFwiZnVuY3Rpb25cIikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgdXNlICdpbicgb3BlcmF0b3Igb24gbm9uLW9iamVjdFwiKTtcbiAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZC5cIik7XG4gICAgdmFyIGRpc3Bvc2UsIGlubmVyO1xuICAgIGlmIChhc3luYykge1xuICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmFzeW5jRGlzcG9zZV07XG4gICAgfVxuICAgIGlmIChkaXNwb3NlID09PSB2b2lkIDApIHtcbiAgICAgIGlmICghU3ltYm9sLmRpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuZGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgICAgaWYgKGFzeW5jKSBpbm5lciA9IGRpc3Bvc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZGlzcG9zZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IG5vdCBkaXNwb3NhYmxlLlwiKTtcbiAgICBpZiAoaW5uZXIpIGRpc3Bvc2UgPSBmdW5jdGlvbigpIHsgdHJ5IHsgaW5uZXIuY2FsbCh0aGlzKTsgfSBjYXRjaCAoZSkgeyByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7IH0gfTtcbiAgICBlbnYuc3RhY2sucHVzaCh7IHZhbHVlOiB2YWx1ZSwgZGlzcG9zZTogZGlzcG9zZSwgYXN5bmM6IGFzeW5jIH0pO1xuICB9XG4gIGVsc2UgaWYgKGFzeW5jKSB7XG4gICAgZW52LnN0YWNrLnB1c2goeyBhc3luYzogdHJ1ZSB9KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbnZhciBfU3VwcHJlc3NlZEVycm9yID0gdHlwZW9mIFN1cHByZXNzZWRFcnJvciA9PT0gXCJmdW5jdGlvblwiID8gU3VwcHJlc3NlZEVycm9yIDogZnVuY3Rpb24gKGVycm9yLCBzdXBwcmVzc2VkLCBtZXNzYWdlKSB7XG4gIHZhciBlID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcbiAgZnVuY3Rpb24gZmFpbChlKSB7XG4gICAgZW52LmVycm9yID0gZW52Lmhhc0Vycm9yID8gbmV3IF9TdXBwcmVzc2VkRXJyb3IoZSwgZW52LmVycm9yLCBcIkFuIGVycm9yIHdhcyBzdXBwcmVzc2VkIGR1cmluZyBkaXNwb3NhbC5cIikgOiBlO1xuICAgIGVudi5oYXNFcnJvciA9IHRydWU7XG4gIH1cbiAgdmFyIHIsIHMgPSAwO1xuICBmdW5jdGlvbiBuZXh0KCkge1xuICAgIHdoaWxlIChyID0gZW52LnN0YWNrLnBvcCgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIXIuYXN5bmMgJiYgcyA9PT0gMSkgcmV0dXJuIHMgPSAwLCBlbnYuc3RhY2sucHVzaChyKSwgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihuZXh0KTtcbiAgICAgICAgaWYgKHIuZGlzcG9zZSkge1xuICAgICAgICAgIHZhciByZXN1bHQgPSByLmRpc3Bvc2UuY2FsbChyLnZhbHVlKTtcbiAgICAgICAgICBpZiAoci5hc3luYykgcmV0dXJuIHMgfD0gMiwgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgcyB8PSAxO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgZmFpbChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMgPT09IDEpIHJldHVybiBlbnYuaGFzRXJyb3IgPyBQcm9taXNlLnJlamVjdChlbnYuZXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgaWYgKGVudi5oYXNFcnJvcikgdGhyb3cgZW52LmVycm9yO1xuICB9XG4gIHJldHVybiBuZXh0KCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbihwYXRoLCBwcmVzZXJ2ZUpzeCkge1xuICBpZiAodHlwZW9mIHBhdGggPT09IFwic3RyaW5nXCIgJiYgL15cXC5cXC4/XFwvLy50ZXN0KHBhdGgpKSB7XG4gICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC4odHN4KSR8KCg/OlxcLmQpPykoKD86XFwuW14uL10rPyk/KVxcLihbY21dPyl0cyQvaSwgZnVuY3Rpb24gKG0sIHRzeCwgZCwgZXh0LCBjbSkge1xuICAgICAgICAgIHJldHVybiB0c3ggPyBwcmVzZXJ2ZUpzeCA/IFwiLmpzeFwiIDogXCIuanNcIiA6IGQgJiYgKCFleHQgfHwgIWNtKSA/IG0gOiAoZCArIGV4dCArIFwiLlwiICsgY20udG9Mb3dlckNhc2UoKSArIFwianNcIik7XG4gICAgICB9KTtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBfX2V4dGVuZHMsXG4gIF9fYXNzaWduLFxuICBfX3Jlc3QsXG4gIF9fZGVjb3JhdGUsXG4gIF9fcGFyYW0sXG4gIF9fZXNEZWNvcmF0ZSxcbiAgX19ydW5Jbml0aWFsaXplcnMsXG4gIF9fcHJvcEtleSxcbiAgX19zZXRGdW5jdGlvbk5hbWUsXG4gIF9fbWV0YWRhdGEsXG4gIF9fYXdhaXRlcixcbiAgX19nZW5lcmF0b3IsXG4gIF9fY3JlYXRlQmluZGluZyxcbiAgX19leHBvcnRTdGFyLFxuICBfX3ZhbHVlcyxcbiAgX19yZWFkLFxuICBfX3NwcmVhZCxcbiAgX19zcHJlYWRBcnJheXMsXG4gIF9fc3ByZWFkQXJyYXksXG4gIF9fYXdhaXQsXG4gIF9fYXN5bmNHZW5lcmF0b3IsXG4gIF9fYXN5bmNEZWxlZ2F0b3IsXG4gIF9fYXN5bmNWYWx1ZXMsXG4gIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxuICBfX2ltcG9ydFN0YXIsXG4gIF9faW1wb3J0RGVmYXVsdCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxuICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcbiAgX19kaXNwb3NlUmVzb3VyY2VzLFxuICBfX3Jld3JpdGVSZWxhdGl2ZUltcG9ydEV4dGVuc2lvbixcbn07XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgRWZmZWN0IH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL2VmZmVjdFwiO1xyXG5pbXBvcnQgdHlwZSB7IE1hdGVyaWFsRGVmaW5lcyB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9tYXRlcmlhbERlZmluZXNcIjtcclxuaW1wb3J0IHsgU3RhbmRhcmRNYXRlcmlhbCB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9zdGFuZGFyZE1hdGVyaWFsXCI7XHJcbmltcG9ydCB0eXBlIHsgTWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9tZXNoXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBSZWdpc3RlckNsYXNzIH0gZnJvbSBcImNvcmUvTWlzYy90eXBlU3RvcmVcIjtcclxuaW1wb3J0IHsgQ29sb3IzLCBDb2xvcjQgfSBmcm9tIFwiY29yZS9NYXRocy9tYXRoLmNvbG9yXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5pbXBvcnQgdHlwZSB7IFN1Yk1lc2ggfSBmcm9tIFwiY29yZS9NZXNoZXMvc3ViTWVzaFwiO1xyXG5cclxuaW1wb3J0IFwiY29yZS9TaGFkZXJzL2RlZmF1bHQudmVydGV4XCI7XHJcbmltcG9ydCBcImNvcmUvU2hhZGVycy9kZWZhdWx0LmZyYWdtZW50XCI7XHJcblxyXG4vKipcclxuICogU3RydWN0dXJlIG9mIGEgY3VzdG9tIHNoYWRlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEN1c3RvbVNoYWRlclN0cnVjdHVyZSB7XHJcbiAgICAvKipcclxuICAgICAqIEZyYWdtZW50IHN0b3JlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudFN0b3JlOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFZlcnRleCBzdG9yZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4U3RvcmU6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBQYXJ0cyBvZiBhIHNoYWRlclxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFNoYWRlclNwZWNpYWxQYXJ0cyB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCZWdpbm5pbmcgb2YgdGhlIGZyYWdtZW50IHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVnaW46IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogVmFyaWFibGUgZGVmaW5pdGlvbnMgb2YgdGhlIGZyYWdtZW50IHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfRGVmaW5pdGlvbnM6IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogQmVnaW5uaW5nIG9mIHRoZSBmcmFnbWVudCBtYWluIGZ1bmN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9NYWluQmVnaW46IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogRW5kIG9mIHRoZSBmcmFnbWVudCBtYWluIGZ1bmN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9NYWluRW5kOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEaWZmdXNlIGNvbG9yIGNhbGN1bGF0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9DdXN0b21fRGlmZnVzZTogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBCZWZvcmUgbGlnaHRuaW5nIGNvbXB1dGF0aW9uc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVmb3JlX0xpZ2h0czogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBCZWZvcmUgZm9nIGNvbXB1dGF0aW9uc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVmb3JlX0ZvZzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbHBoYSBjYWxjdWxhdGlvbnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0N1c3RvbV9BbHBoYTogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBCZWZvcmUgZnJhZyBjb2xvciBpcyBhc3NpZ25lZFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVmb3JlX0ZyYWdDb2xvcjogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBCZWdpbm5pbmcgb2YgdGhlIHZlcnRleCBzaGFkZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9CZWdpbjogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBWYXJpYWJsZSBkZWZpbml0aW9ucyBvZiB0aGUgdmVydGV4IHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0RlZmluaXRpb25zOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFN0YXJ0IG9mIHRoZSBtYWluIGZ1bmN0aW9uIG9mIHRoZSB2ZXJ0ZXggc2hhZGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfTWFpbkJlZ2luOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCZWZvcmUgdGhlIHdvcmxkIHBvc2l0aW9uIGNvbXB1dGF0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfQmVmb3JlX1Bvc2l0aW9uVXBkYXRlZDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQmVmb3JlIHRoZSBub3JtYWwgY29tcHV0YXRpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9CZWZvcmVfTm9ybWFsVXBkYXRlZDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWZ0ZXIgdGhlIHdvcmxkIHBvc2l0aW9uIGhhcyBiZWVuIGNvbXB1dGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfQWZ0ZXJfV29ybGRQb3NDb21wdXRlZDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFpbiBlbmQgb2YgdGhlIHZlcnRleCBzaGFkZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9NYWluRW5kOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDdXN0b21pemVkIG1hdGVyaWFsXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgQ3VzdG9tTWF0ZXJpYWwgZXh0ZW5kcyBTdGFuZGFyZE1hdGVyaWFsIHtcclxuICAgIC8qKlxyXG4gICAgICogSW5kZXggZm9yIGVhY2ggY3JlYXRlZCBzaGFkZXJcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBTaGFkZXJJbmRleGVyID0gMTtcclxuICAgIC8qKlxyXG4gICAgICogQ3VzdG9tIHNoYWRlciBzdHJ1Y3R1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIEN1c3RvbVBhcnRzOiBTaGFkZXJTcGVjaWFsUGFydHM7XHJcbiAgICAvKipcclxuICAgICAqIE5hbWUgb2YgdGhlIHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgX2NyZWF0ZWRTaGFkZXJOYW1lOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIExpc3Qgb2YgY3VzdG9tIHVuaWZvcm1zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBfY3VzdG9tVW5pZm9ybTogc3RyaW5nW107XHJcbiAgICAvKipcclxuICAgICAqIE5hbWVzIG9mIHRoZSBuZXcgdW5pZm9ybXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIF9uZXdVbmlmb3Jtczogc3RyaW5nW107XHJcbiAgICAvKipcclxuICAgICAqIEluc3RhbmNlcyBvZiB0aGUgbmV3IHVuaWZvcm0gb2JqZWN0c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgX25ld1VuaWZvcm1JbnN0YW5jZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbnN0YW5jZXMgb2YgdGhlIG5ldyBzYW1wbGVyIG9iamVjdHNcclxuICAgICAqL1xyXG4gICAgcHVibGljIF9uZXdTYW1wbGVySW5zdGFuY2VzOiB7IFtuYW1lOiBzdHJpbmddOiBUZXh0dXJlIH07XHJcbiAgICAvKipcclxuICAgICAqIExpc3Qgb2YgdGhlIGN1c3RvbSBhdHRyaWJ1dGVzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBfY3VzdG9tQXR0cmlidXRlczogc3RyaW5nW107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGcmFnbWVudCBzaGFkZXIgc3RyaW5nXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudFNoYWRlcjogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJ0ZXggc2hhZGVyIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4U2hhZGVyOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSdW5zIGFmdGVyIHRoZSBtYXRlcmlhbCBpcyBib3VuZCB0byBhIG1lc2hcclxuICAgICAqIEBwYXJhbSBtZXNoIG1lc2ggYm91bmRcclxuICAgICAqIEBwYXJhbSBlZmZlY3QgYm91bmQgZWZmZWN0IHVzZWQgdG8gcmVuZGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBdHRhY2hBZnRlckJpbmQobWVzaDogTWVzaCB8IHVuZGVmaW5lZCwgZWZmZWN0OiBFZmZlY3QpIHtcclxuICAgICAgICBpZiAodGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlcykge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsIGluIHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVhID0gZWwudG9TdHJpbmcoKS5zcGxpdChcIi1cIik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWFbMF0gPT0gXCJ2ZWMyXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBlZmZlY3Quc2V0VmVjdG9yMihlYVsxXSwgdGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlc1tlbF0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlYVswXSA9PSBcInZlYzNcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzW2VsXSBpbnN0YW5jZW9mIENvbG9yMykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3Quc2V0Q29sb3IzKGVhWzFdLCB0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzW2VsXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LnNldFZlY3RvcjMoZWFbMV0sIHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXNbZWxdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVhWzBdID09IFwidmVjNFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXNbZWxdIGluc3RhbmNlb2YgQ29sb3I0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC5zZXREaXJlY3RDb2xvcjQoZWFbMV0sIHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXNbZWxdKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3Quc2V0VmVjdG9yNChlYVsxXSwgdGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlc1tlbF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlZmZlY3Quc2V0VmVjdG9yNChlYVsxXSwgdGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlc1tlbF0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlYVswXSA9PSBcIm1hdDRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdC5zZXRNYXRyaXgoZWFbMV0sIHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXNbZWxdKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWFbMF0gPT0gXCJmbG9hdFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0LnNldEZsb2F0KGVhWzFdLCB0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzW2VsXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX25ld1NhbXBsZXJJbnN0YW5jZXMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBpbiB0aGlzLl9uZXdTYW1wbGVySW5zdGFuY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlYSA9IGVsLnRvU3RyaW5nKCkuc3BsaXQoXCItXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVhWzBdID09IFwic2FtcGxlcjJEXCIgJiYgdGhpcy5fbmV3U2FtcGxlckluc3RhbmNlc1tlbF0uaXNSZWFkeSAmJiB0aGlzLl9uZXdTYW1wbGVySW5zdGFuY2VzW2VsXS5pc1JlYWR5KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBlZmZlY3Quc2V0VGV4dHVyZShlYVsxXSwgdGhpcy5fbmV3U2FtcGxlckluc3RhbmNlc1tlbF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGludGVybmFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBSZXZpZXdVbmlmb3JtKG5hbWU6IHN0cmluZywgYXJyOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcclxuICAgICAgICBpZiAobmFtZSA9PSBcInVuaWZvcm1cIiAmJiB0aGlzLl9uZXdVbmlmb3Jtcykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpbmQgPSAwOyBpbmQgPCB0aGlzLl9uZXdVbmlmb3Jtcy5sZW5ndGg7IGluZCsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3VzdG9tVW5pZm9ybVtpbmRdLmluZGV4T2YoXCJzYW1wbGVyXCIpID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2godGhpcy5fbmV3VW5pZm9ybXNbaW5kXS5yZXBsYWNlKC9cXFtcXGQqXFxdL2csIFwiXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobmFtZSA9PSBcInNhbXBsZXJcIiAmJiB0aGlzLl9uZXdVbmlmb3Jtcykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpbmQgPSAwOyBpbmQgPCB0aGlzLl9uZXdVbmlmb3Jtcy5sZW5ndGg7IGluZCsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY3VzdG9tVW5pZm9ybVtpbmRdLmluZGV4T2YoXCJzYW1wbGVyXCIpICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2godGhpcy5fbmV3VW5pZm9ybXNbaW5kXS5yZXBsYWNlKC9cXFtcXGQqXFxdL2csIFwiXCIpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQnVpbGRzIHRoZSBtYXRlcmlhbFxyXG4gICAgICogQHBhcmFtIHNoYWRlck5hbWUgbmFtZSBvZiB0aGUgc2hhZGVyXHJcbiAgICAgKiBAcGFyYW0gdW5pZm9ybXMgbGlzdCBvZiB1bmlmb3Jtc1xyXG4gICAgICogQHBhcmFtIHVuaWZvcm1CdWZmZXJzIGxpc3Qgb2YgdW5pZm9ybSBidWZmZXJzXHJcbiAgICAgKiBAcGFyYW0gc2FtcGxlcnMgbGlzdCBvZiBzYW1wbGVyc1xyXG4gICAgICogQHBhcmFtIGRlZmluZXMgbGlzdCBvZiBkZWZpbmVzXHJcbiAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBsaXN0IG9mIGF0dHJpYnV0ZXNcclxuICAgICAqIEByZXR1cm5zIHRoZSBzaGFkZXIgbmFtZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQnVpbGRlcihzaGFkZXJOYW1lOiBzdHJpbmcsIHVuaWZvcm1zOiBzdHJpbmdbXSwgdW5pZm9ybUJ1ZmZlcnM6IHN0cmluZ1tdLCBzYW1wbGVyczogc3RyaW5nW10sIGRlZmluZXM6IE1hdGVyaWFsRGVmaW5lcyB8IHN0cmluZ1tdLCBhdHRyaWJ1dGVzPzogc3RyaW5nW10pOiBzdHJpbmcge1xyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzICYmIHRoaXMuX2N1c3RvbUF0dHJpYnV0ZXMgJiYgdGhpcy5fY3VzdG9tQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaCguLi50aGlzLl9jdXN0b21BdHRyaWJ1dGVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuUmV2aWV3VW5pZm9ybShcInVuaWZvcm1cIiwgdW5pZm9ybXMpO1xyXG4gICAgICAgIHRoaXMuUmV2aWV3VW5pZm9ybShcInNhbXBsZXJcIiwgc2FtcGxlcnMpO1xyXG5cclxuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5fY3JlYXRlZFNoYWRlck5hbWU7XHJcblxyXG4gICAgICAgIGlmIChFZmZlY3QuU2hhZGVyc1N0b3JlW25hbWUgKyBcIlZlcnRleFNoYWRlclwiXSAmJiBFZmZlY3QuU2hhZGVyc1N0b3JlW25hbWUgKyBcIlBpeGVsU2hhZGVyXCJdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBFZmZlY3QuU2hhZGVyc1N0b3JlW25hbWUgKyBcIlZlcnRleFNoYWRlclwiXSA9IHRoaXMuX2luamVjdEN1c3RvbUNvZGUodGhpcy5WZXJ0ZXhTaGFkZXIsIFwidmVydGV4XCIpO1xyXG4gICAgICAgIEVmZmVjdC5TaGFkZXJzU3RvcmVbbmFtZSArIFwiUGl4ZWxTaGFkZXJcIl0gPSB0aGlzLl9pbmplY3RDdXN0b21Db2RlKHRoaXMuRnJhZ21lbnRTaGFkZXIsIFwiZnJhZ21lbnRcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaW5qZWN0Q3VzdG9tQ29kZShjb2RlOiBzdHJpbmcsIHNoYWRlclR5cGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tQ29kZSA9IHRoaXMuX2dldEN1c3RvbUNvZGUoc2hhZGVyVHlwZSk7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgaW4gY3VzdG9tQ29kZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpbmplY3RlZENvZGUgPSBjdXN0b21Db2RlW3BvaW50XTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmplY3RlZENvZGUgJiYgaW5qZWN0ZWRDb2RlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxQb2ludE5hbWUgPSBcIiNkZWZpbmUgXCIgKyBwb2ludDtcclxuICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UoZnVsbFBvaW50TmFtZSwgXCJcXG5cIiArIGluamVjdGVkQ29kZSArIFwiXFxuXCIgKyBmdWxsUG9pbnROYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9nZXRDdXN0b21Db2RlKHNoYWRlclR5cGU6IHN0cmluZyk6IHsgW3BvaW50TmFtZTogc3RyaW5nXTogc3RyaW5nIH0ge1xyXG4gICAgICAgIGlmIChzaGFkZXJUeXBlID09PSBcInZlcnRleFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBDVVNUT01fVkVSVEVYX0JFR0lOOiB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9CZWdpbixcclxuICAgICAgICAgICAgICAgIENVU1RPTV9WRVJURVhfREVGSU5JVElPTlM6ICh0aGlzLl9jdXN0b21Vbmlmb3JtPy5qb2luKFwiXFxuXCIpIHx8IFwiXCIpICsgKHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0RlZmluaXRpb25zIHx8IFwiXCIpLFxyXG4gICAgICAgICAgICAgICAgQ1VTVE9NX1ZFUlRFWF9NQUlOX0JFR0lOOiB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9NYWluQmVnaW4sXHJcbiAgICAgICAgICAgICAgICBDVVNUT01fVkVSVEVYX1VQREFURV9QT1NJVElPTjogdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfQmVmb3JlX1Bvc2l0aW9uVXBkYXRlZCxcclxuICAgICAgICAgICAgICAgIENVU1RPTV9WRVJURVhfVVBEQVRFX05PUk1BTDogdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfQmVmb3JlX05vcm1hbFVwZGF0ZWQsXHJcbiAgICAgICAgICAgICAgICBDVVNUT01fVkVSVEVYX01BSU5fRU5EOiB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9NYWluRW5kLFxyXG4gICAgICAgICAgICAgICAgQ1VTVE9NX1ZFUlRFWF9VUERBVEVfV09STERQT1M6IHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9CRUdJTjogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9CZWdpbixcclxuICAgICAgICAgICAgQ1VTVE9NX0ZSQUdNRU5UX0RFRklOSVRJT05TOiAodGhpcy5fY3VzdG9tVW5pZm9ybT8uam9pbihcIlxcblwiKSB8fCBcIlwiKSArICh0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0RlZmluaXRpb25zIHx8IFwiXCIpLFxyXG4gICAgICAgICAgICBDVVNUT01fRlJBR01FTlRfTUFJTl9CRUdJTjogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9NYWluQmVnaW4sXHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9VUERBVEVfRElGRlVTRTogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9DdXN0b21fRGlmZnVzZSxcclxuICAgICAgICAgICAgQ1VTVE9NX0ZSQUdNRU5UX1VQREFURV9BTFBIQTogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9DdXN0b21fQWxwaGEsXHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9CRUZPUkVfTElHSFRTOiB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0JlZm9yZV9MaWdodHMsXHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9CRUZPUkVfRlJBR0NPTE9SOiB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0JlZm9yZV9GcmFnQ29sb3IsXHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9NQUlOX0VORDogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9NYWluRW5kLFxyXG4gICAgICAgICAgICBDVVNUT01fRlJBR01FTlRfQkVGT1JFX0ZPRzogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9CZWZvcmVfRm9nLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzY2VuZT86IFNjZW5lKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2NlbmUsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMgPSBuZXcgU2hhZGVyU3BlY2lhbFBhcnRzKCk7XHJcbiAgICAgICAgdGhpcy5jdXN0b21TaGFkZXJOYW1lUmVzb2x2ZSA9IHRoaXMuQnVpbGRlcjtcclxuXHJcbiAgICAgICAgdGhpcy5GcmFnbWVudFNoYWRlciA9IEVmZmVjdC5TaGFkZXJzU3RvcmVbXCJkZWZhdWx0UGl4ZWxTaGFkZXJcIl07XHJcbiAgICAgICAgdGhpcy5WZXJ0ZXhTaGFkZXIgPSBFZmZlY3QuU2hhZGVyc1N0b3JlW1wiZGVmYXVsdFZlcnRleFNoYWRlclwiXTtcclxuXHJcbiAgICAgICAgQ3VzdG9tTWF0ZXJpYWwuU2hhZGVySW5kZXhlcisrO1xyXG4gICAgICAgIHRoaXMuX2NyZWF0ZWRTaGFkZXJOYW1lID0gXCJjdXN0b21fXCIgKyBDdXN0b21NYXRlcmlhbC5TaGFkZXJJbmRleGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBfYWZ0ZXJCaW5kKG1lc2g/OiBNZXNoLCBlZmZlY3Q6IE51bGxhYmxlPEVmZmVjdD4gPSBudWxsLCBzdWJNZXNoPzogU3ViTWVzaCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghZWZmZWN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5BdHRhY2hBZnRlckJpbmQobWVzaCwgZWZmZWN0KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBzdXBlci5fYWZ0ZXJCaW5kKG1lc2gsIGVmZmVjdCwgc3ViTWVzaCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge31cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBuZXcgdW5pZm9ybSB0byB0aGUgc2hhZGVyXHJcbiAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgdW5pZm9ybSB0byBhZGRcclxuICAgICAqIEBwYXJhbSBraW5kIHRoZSB0eXBlIG9mIHRoZSB1bmlmb3JtIHRvIGFkZFxyXG4gICAgICogQHBhcmFtIHBhcmFtIHRoZSB2YWx1ZSBvZiB0aGUgdW5pZm9ybSB0byBhZGRcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRVbmlmb3JtKG5hbWU6IHN0cmluZywga2luZDogc3RyaW5nLCBwYXJhbTogYW55KTogQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIGlmICghdGhpcy5fY3VzdG9tVW5pZm9ybSkge1xyXG4gICAgICAgICAgICB0aGlzLl9jdXN0b21Vbmlmb3JtID0gbmV3IEFycmF5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX25ld1VuaWZvcm1zID0gbmV3IEFycmF5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX25ld1NhbXBsZXJJbnN0YW5jZXMgPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlcyA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocGFyYW0pIHtcclxuICAgICAgICAgICAgaWYgKGtpbmQuaW5kZXhPZihcInNhbXBsZXJcIikgIT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICg8YW55PnRoaXMuX25ld1NhbXBsZXJJbnN0YW5jZXMpW2tpbmQgKyBcIi1cIiArIG5hbWVdID0gcGFyYW07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAoPGFueT50aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzKVtraW5kICsgXCItXCIgKyBuYW1lXSA9IHBhcmFtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2N1c3RvbVVuaWZvcm0ucHVzaChcInVuaWZvcm0gXCIgKyBraW5kICsgXCIgXCIgKyBuYW1lICsgXCI7XCIpO1xyXG4gICAgICAgIHRoaXMuX25ld1VuaWZvcm1zLnB1c2gobmFtZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIGN1c3RvbSBhdHRyaWJ1dGVcclxuICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGVcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBBZGRBdHRyaWJ1dGUobmFtZTogc3RyaW5nKTogQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIGlmICghdGhpcy5fY3VzdG9tQXR0cmlidXRlcykge1xyXG4gICAgICAgICAgICB0aGlzLl9jdXN0b21BdHRyaWJ1dGVzID0gW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jdXN0b21BdHRyaWJ1dGVzLnB1c2gobmFtZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBGcmFnbWVudF9CZWdpbiBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9CZWdpbihzaGFkZXJQYXJ0OiBzdHJpbmcpOiBDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9CZWdpbiA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X0RlZmluaXRpb25zIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0RlZmluaXRpb25zKHNoYWRlclBhcnQ6IHN0cmluZyk6IEN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0RlZmluaXRpb25zID0gc2hhZGVyUGFydDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gRnJhZ21lbnRfTWFpbkJlZ2luIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X01haW5CZWdpbihzaGFkZXJQYXJ0OiBzdHJpbmcpOiBDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9NYWluQmVnaW4gPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBGcmFnbWVudF9NYWluRW5kIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X01haW5FbmQoc2hhZGVyUGFydDogc3RyaW5nKTogQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfTWFpbkVuZCA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X0N1c3RvbV9EaWZmdXNlIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0N1c3RvbV9EaWZmdXNlKHNoYWRlclBhcnQ6IHN0cmluZyk6IEN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0N1c3RvbV9EaWZmdXNlID0gc2hhZGVyUGFydC5yZXBsYWNlKFwicmVzdWx0XCIsIFwiZGlmZnVzZUNvbG9yXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBGcmFnbWVudF9DdXN0b21fQWxwaGEgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQ3VzdG9tX0FscGhhKHNoYWRlclBhcnQ6IHN0cmluZyk6IEN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0N1c3RvbV9BbHBoYSA9IHNoYWRlclBhcnQucmVwbGFjZShcInJlc3VsdFwiLCBcImFscGhhXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBGcmFnbWVudF9CZWZvcmVfTGlnaHRzIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0JlZm9yZV9MaWdodHMoc2hhZGVyUGFydDogc3RyaW5nKTogQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfQmVmb3JlX0xpZ2h0cyA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X0JlZm9yZV9Gb2cgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVmb3JlX0ZvZyhzaGFkZXJQYXJ0OiBzdHJpbmcpOiBDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9CZWZvcmVfRm9nID0gc2hhZGVyUGFydDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gRnJhZ21lbnRfQmVmb3JlX0ZyYWdDb2xvciBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9CZWZvcmVfRnJhZ0NvbG9yKHNoYWRlclBhcnQ6IHN0cmluZyk6IEN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0JlZm9yZV9GcmFnQ29sb3IgPSBzaGFkZXJQYXJ0LnJlcGxhY2UoXCJyZXN1bHRcIiwgXCJjb2xvclwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gVmVydGV4X0JlZ2luIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9CZWdpbihzaGFkZXJQYXJ0OiBzdHJpbmcpOiBDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfQmVnaW4gPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBWZXJ0ZXhfRGVmaW5pdGlvbnMgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0RlZmluaXRpb25zKHNoYWRlclBhcnQ6IHN0cmluZyk6IEN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9EZWZpbml0aW9ucyA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIFZlcnRleF9NYWluQmVnaW4gcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X01haW5CZWdpbihzaGFkZXJQYXJ0OiBzdHJpbmcpOiBDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfTWFpbkJlZ2luID0gc2hhZGVyUGFydDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gVmVydGV4X0JlZm9yZV9Qb3NpdGlvblVwZGF0ZWQgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0JlZm9yZV9Qb3NpdGlvblVwZGF0ZWQoc2hhZGVyUGFydDogc3RyaW5nKTogQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0JlZm9yZV9Qb3NpdGlvblVwZGF0ZWQgPSBzaGFkZXJQYXJ0LnJlcGxhY2UoXCJyZXN1bHRcIiwgXCJwb3NpdGlvblVwZGF0ZWRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIFZlcnRleF9CZWZvcmVfTm9ybWFsVXBkYXRlZCBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfQmVmb3JlX05vcm1hbFVwZGF0ZWQoc2hhZGVyUGFydDogc3RyaW5nKTogQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0JlZm9yZV9Ob3JtYWxVcGRhdGVkID0gc2hhZGVyUGFydC5yZXBsYWNlKFwicmVzdWx0XCIsIFwibm9ybWFsVXBkYXRlZFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQoc2hhZGVyUGFydDogc3RyaW5nKTogQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQgPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBWZXJ0ZXhfTWFpbkVuZCBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfTWFpbkVuZChzaGFkZXJQYXJ0OiBzdHJpbmcpOiBDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfTWFpbkVuZCA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLkN1c3RvbU1hdGVyaWFsXCIsIEN1c3RvbU1hdGVyaWFsKTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vY3VzdG9tTWF0ZXJpYWxcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vcGJyQ3VzdG9tTWF0ZXJpYWxcIjtcclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uICovXHJcbmltcG9ydCB0eXBlIHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB7IEVmZmVjdCB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9lZmZlY3RcIjtcclxuaW1wb3J0IHR5cGUgeyBNYXRlcmlhbERlZmluZXMgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvbWF0ZXJpYWxEZWZpbmVzXCI7XHJcbmltcG9ydCB7IFBCUk1hdGVyaWFsIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1BCUi9wYnJNYXRlcmlhbFwiO1xyXG5pbXBvcnQgdHlwZSB7IE1lc2ggfSBmcm9tIFwiY29yZS9NZXNoZXMvbWVzaFwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB7IFNoYWRlckNvZGVJbmxpbmVyIH0gZnJvbSBcImNvcmUvRW5naW5lcy9Qcm9jZXNzb3JzL3NoYWRlckNvZGVJbmxpbmVyXCI7XHJcbmltcG9ydCB0eXBlIHsgSUN1c3RvbVNoYWRlck5hbWVSZXNvbHZlT3B0aW9ucyB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9tYXRlcmlhbFwiO1xyXG5pbXBvcnQgeyBDb2xvcjMsIENvbG9yNCB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcbmltcG9ydCB0eXBlIHsgU3ViTWVzaCB9IGZyb20gXCJjb3JlL01lc2hlcy9zdWJNZXNoXCI7XHJcblxyXG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvcGJyLnZlcnRleFwiO1xyXG5pbXBvcnQgXCJjb3JlL1NoYWRlcnMvcGJyLmZyYWdtZW50XCI7XHJcblxyXG4vKipcclxuICogQWxiZWRvIHBhcnRzIG9mIHRoZSBzaGFkZXJcclxuICovXHJcbmV4cG9ydCBjbGFzcyBTaGFkZXJBbGJlZG9QYXJ0cyB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCZWdpbm5pbmcgb2YgdGhlIGZyYWdtZW50IHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVnaW46IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogRnJhZ21lbnQgZGVmaW5pdGlvbnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0RlZmluaXRpb25zOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIEJlZ2lubmluZyBvZiB0aGUgbWFpbiBmdW5jdGlvblxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfTWFpbkJlZ2luOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIEVuZCBvZiBtYWluIGZ1bmN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9NYWluRW5kOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbGJlZG8gY29sb3JcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0N1c3RvbV9BbGJlZG86IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogTGlnaHRzXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9CZWZvcmVfTGlnaHRzOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIE1ldGFsbGljIGFuZCByb3VnaG5lc3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0N1c3RvbV9NZXRhbGxpY1JvdWdobmVzczogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBNaWNyb3N1cmZhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0N1c3RvbV9NaWNyb1N1cmZhY2U6IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogRm9nIGNvbXB1dGF0aW9uc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVmb3JlX0ZvZzogc3RyaW5nO1xyXG4gICAgLyoqXHJcbiAgICAgKiBBbHBoYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQ3VzdG9tX0FscGhhOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIENvbG9yIGNvbXBvc2l0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9CZWZvcmVfRmluYWxDb2xvckNvbXBvc2l0aW9uOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIEZyYWdtZW50IGNvbG9yXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9CZWZvcmVfRnJhZ0NvbG9yOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBCZWdpbm5pbmcgb2YgdmVydGV4IHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0JlZ2luOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFZlcnRleCBkZWZpbml0aW9uc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0RlZmluaXRpb25zOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIFZlcnRleCBtYWluIGJlZ2luXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfTWFpbkJlZ2luOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJ0ZXggYmVmb3JlIHBvc2l0aW9uIHVwZGF0ZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9CZWZvcmVfUG9zaXRpb25VcGRhdGVkOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJ0ZXggYmVmb3JlIG5vcm1hbCB1cGRhdGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfQmVmb3JlX05vcm1hbFVwZGF0ZWQ6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFZlcnRleCBhZnRlciB3b3JsZCBwb3MgY29tcHV0ZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9BZnRlcl9Xb3JsZFBvc0NvbXB1dGVkOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWZXJ0ZXggbWFpbiBlbmRcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9NYWluRW5kOiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAZGVwcmVjYXRlZCB1c2UgU2hhZGVyQWxiZWRvUGFydHMgaW5zdGVhZC5cclxuICovXHJcbmV4cG9ydCBjb25zdCBTaGFkZXJBbGViZG9QYXJ0cyA9IFNoYWRlckFsYmVkb1BhcnRzO1xyXG5cclxuZXhwb3J0IGNsYXNzIFBCUkN1c3RvbU1hdGVyaWFsIGV4dGVuZHMgUEJSTWF0ZXJpYWwge1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRleCBmb3IgZWFjaCBjcmVhdGVkIHNoYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIFNoYWRlckluZGV4ZXIgPSAxO1xyXG4gICAgLyoqXHJcbiAgICAgKiBDdXN0b20gc2hhZGVyIHN0cnVjdHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQ3VzdG9tUGFydHM6IFNoYWRlckFsYmVkb1BhcnRzO1xyXG4gICAgLyoqXHJcbiAgICAgKiBOYW1lIG9mIHRoZSBzaGFkZXJcclxuICAgICAqL1xyXG4gICAgX2NyZWF0ZWRTaGFkZXJOYW1lOiBzdHJpbmc7XHJcbiAgICAvKipcclxuICAgICAqIExpc3Qgb2YgY3VzdG9tIHVuaWZvcm1zXHJcbiAgICAgKi9cclxuICAgIF9jdXN0b21Vbmlmb3JtOiBzdHJpbmdbXTtcclxuICAgIC8qKlxyXG4gICAgICogTmFtZXMgb2YgdGhlIG5ldyB1bmlmb3Jtc1xyXG4gICAgICovXHJcbiAgICBfbmV3VW5pZm9ybXM6IHN0cmluZ1tdO1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbnN0YW5jZXMgb2YgdGhlIG5ldyB1bmlmb3JtIG9iamVjdHNcclxuICAgICAqL1xyXG4gICAgX25ld1VuaWZvcm1JbnN0YW5jZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBJbnN0YW5jZXMgb2YgdGhlIG5ldyBzYW1wbGVyIG9iamVjdHNcclxuICAgICAqL1xyXG4gICAgX25ld1NhbXBsZXJJbnN0YW5jZXM6IHsgW25hbWU6IHN0cmluZ106IFRleHR1cmUgfTtcclxuICAgIC8qKlxyXG4gICAgICogTGlzdCBvZiB0aGUgY3VzdG9tIGF0dHJpYnV0ZXNcclxuICAgICAqL1xyXG4gICAgX2N1c3RvbUF0dHJpYnV0ZXM6IHN0cmluZ1tdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnJhZ21lbnQgc2hhZGVyIHN0cmluZ1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRTaGFkZXI6IHN0cmluZztcclxuICAgIC8qKlxyXG4gICAgICogVmVydGV4IHNoYWRlciBzdHJpbmdcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleFNoYWRlcjogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUnVucyBhZnRlciB0aGUgbWF0ZXJpYWwgaXMgYm91bmQgdG8gYSBtZXNoXHJcbiAgICAgKiBAcGFyYW0gbWVzaCBtZXNoIGJvdW5kXHJcbiAgICAgKiBAcGFyYW0gZWZmZWN0IGJvdW5kIGVmZmVjdCB1c2VkIHRvIHJlbmRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgQXR0YWNoQWZ0ZXJCaW5kKG1lc2g6IE1lc2ggfCB1bmRlZmluZWQsIGVmZmVjdDogRWZmZWN0KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXMpIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBlbCBpbiB0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlYSA9IGVsLnRvU3RyaW5nKCkuc3BsaXQoXCItXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVhWzBdID09IFwidmVjMlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0LnNldFZlY3RvcjIoZWFbMV0sIHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXNbZWxdKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWFbMF0gPT0gXCJ2ZWMzXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlc1tlbF0gaW5zdGFuY2VvZiBDb2xvcjMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LnNldENvbG9yMyhlYVsxXSwgdGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlc1tlbF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdC5zZXRWZWN0b3IzKGVhWzFdLCB0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzW2VsXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlYVswXSA9PSBcInZlYzRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzW2VsXSBpbnN0YW5jZW9mIENvbG9yNCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3Quc2V0RGlyZWN0Q29sb3I0KGVhWzFdLCB0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzW2VsXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LnNldFZlY3RvcjQoZWFbMV0sIHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXNbZWxdKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0LnNldFZlY3RvcjQoZWFbMV0sIHRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXNbZWxdKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWFbMF0gPT0gXCJtYXQ0XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBlZmZlY3Quc2V0TWF0cml4KGVhWzFdLCB0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzW2VsXSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVhWzBdID09IFwiZmxvYXRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdC5zZXRGbG9hdChlYVsxXSwgdGhpcy5fbmV3VW5pZm9ybUluc3RhbmNlc1tlbF0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9uZXdTYW1wbGVySW5zdGFuY2VzKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZWwgaW4gdGhpcy5fbmV3U2FtcGxlckluc3RhbmNlcykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWEgPSBlbC50b1N0cmluZygpLnNwbGl0KFwiLVwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChlYVswXSA9PSBcInNhbXBsZXIyRFwiICYmIHRoaXMuX25ld1NhbXBsZXJJbnN0YW5jZXNbZWxdLmlzUmVhZHkgJiYgdGhpcy5fbmV3U2FtcGxlckluc3RhbmNlc1tlbF0uaXNSZWFkeSgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZWZmZWN0LnNldFRleHR1cmUoZWFbMV0sIHRoaXMuX25ld1NhbXBsZXJJbnN0YW5jZXNbZWxdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBpbnRlcm5hbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgUmV2aWV3VW5pZm9ybShuYW1lOiBzdHJpbmcsIGFycjogc3RyaW5nW10pOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgaWYgKG5hbWUgPT0gXCJ1bmlmb3JtXCIgJiYgdGhpcy5fbmV3VW5pZm9ybXMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgdGhpcy5fbmV3VW5pZm9ybXMubGVuZ3RoOyBpbmQrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1c3RvbVVuaWZvcm1baW5kXS5pbmRleE9mKFwic2FtcGxlclwiKSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuX25ld1VuaWZvcm1zW2luZF0ucmVwbGFjZSgvXFxbXFxkKlxcXS9nLCBcIlwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG5hbWUgPT0gXCJzYW1wbGVyXCIgJiYgdGhpcy5fbmV3VW5pZm9ybXMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW5kID0gMDsgaW5kIDwgdGhpcy5fbmV3VW5pZm9ybXMubGVuZ3RoOyBpbmQrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1c3RvbVVuaWZvcm1baW5kXS5pbmRleE9mKFwic2FtcGxlclwiKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuX25ld1VuaWZvcm1zW2luZF0ucmVwbGFjZSgvXFxbXFxkKlxcXS9nLCBcIlwiKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFycjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEJ1aWxkcyB0aGUgbWF0ZXJpYWxcclxuICAgICAqIEBwYXJhbSBzaGFkZXJOYW1lIG5hbWUgb2YgdGhlIHNoYWRlclxyXG4gICAgICogQHBhcmFtIHVuaWZvcm1zIGxpc3Qgb2YgdW5pZm9ybXNcclxuICAgICAqIEBwYXJhbSB1bmlmb3JtQnVmZmVycyBsaXN0IG9mIHVuaWZvcm0gYnVmZmVyc1xyXG4gICAgICogQHBhcmFtIHNhbXBsZXJzIGxpc3Qgb2Ygc2FtcGxlcnNcclxuICAgICAqIEBwYXJhbSBkZWZpbmVzIGxpc3Qgb2YgZGVmaW5lc1xyXG4gICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgbGlzdCBvZiBhdHRyaWJ1dGVzXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIHRvIGNvbXBpbGUgdGhlIHNoYWRlclxyXG4gICAgICogQHJldHVybnMgdGhlIHNoYWRlciBuYW1lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBCdWlsZGVyKFxyXG4gICAgICAgIHNoYWRlck5hbWU6IHN0cmluZyxcclxuICAgICAgICB1bmlmb3Jtczogc3RyaW5nW10sXHJcbiAgICAgICAgdW5pZm9ybUJ1ZmZlcnM6IHN0cmluZ1tdLFxyXG4gICAgICAgIHNhbXBsZXJzOiBzdHJpbmdbXSxcclxuICAgICAgICBkZWZpbmVzOiBNYXRlcmlhbERlZmluZXMgfCBzdHJpbmdbXSxcclxuICAgICAgICBhdHRyaWJ1dGVzPzogc3RyaW5nW10sXHJcbiAgICAgICAgb3B0aW9ucz86IElDdXN0b21TaGFkZXJOYW1lUmVzb2x2ZU9wdGlvbnNcclxuICAgICk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudFByb2Nlc3NpbmcgPSBvcHRpb25zLnByb2Nlc3NGaW5hbENvZGU7XHJcbiAgICAgICAgICAgIG9wdGlvbnMucHJvY2Vzc0ZpbmFsQ29kZSA9ICh0eXBlOiBzdHJpbmcsIGNvZGU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09IFwidmVydGV4XCIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFByb2Nlc3NpbmcgPyBjdXJyZW50UHJvY2Vzc2luZyh0eXBlLCBjb2RlKSA6IGNvZGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY2kgPSBuZXcgU2hhZGVyQ29kZUlubGluZXIoY29kZSk7XHJcbiAgICAgICAgICAgICAgICBzY2kuaW5saW5lVG9rZW4gPSBcIiNkZWZpbmUgcGJyX2lubGluZVwiO1xyXG4gICAgICAgICAgICAgICAgc2NpLnByb2Nlc3NDb2RlKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFByb2Nlc3NpbmcgPyBjdXJyZW50UHJvY2Vzc2luZyh0eXBlLCBzY2kuY29kZSkgOiBzY2kuY29kZTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzICYmIHRoaXMuX2N1c3RvbUF0dHJpYnV0ZXMgJiYgdGhpcy5fY3VzdG9tQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMucHVzaCguLi50aGlzLl9jdXN0b21BdHRyaWJ1dGVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuUmV2aWV3VW5pZm9ybShcInVuaWZvcm1cIiwgdW5pZm9ybXMpO1xyXG4gICAgICAgIHRoaXMuUmV2aWV3VW5pZm9ybShcInNhbXBsZXJcIiwgc2FtcGxlcnMpO1xyXG5cclxuICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5fY3JlYXRlZFNoYWRlck5hbWU7XHJcblxyXG4gICAgICAgIGlmIChFZmZlY3QuU2hhZGVyc1N0b3JlW25hbWUgKyBcIlZlcnRleFNoYWRlclwiXSAmJiBFZmZlY3QuU2hhZGVyc1N0b3JlW25hbWUgKyBcIlBpeGVsU2hhZGVyXCJdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBFZmZlY3QuU2hhZGVyc1N0b3JlW25hbWUgKyBcIlZlcnRleFNoYWRlclwiXSA9IHRoaXMuX2luamVjdEN1c3RvbUNvZGUodGhpcy5WZXJ0ZXhTaGFkZXIsIFwidmVydGV4XCIpO1xyXG4gICAgICAgIEVmZmVjdC5TaGFkZXJzU3RvcmVbbmFtZSArIFwiUGl4ZWxTaGFkZXJcIl0gPSB0aGlzLl9pbmplY3RDdXN0b21Db2RlKHRoaXMuRnJhZ21lbnRTaGFkZXIsIFwiZnJhZ21lbnRcIik7XHJcblxyXG4gICAgICAgIHJldHVybiBuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfaW5qZWN0Q3VzdG9tQ29kZShjb2RlOiBzdHJpbmcsIHNoYWRlclR5cGU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tQ29kZSA9IHRoaXMuX2dldEN1c3RvbUNvZGUoc2hhZGVyVHlwZSk7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcG9pbnQgaW4gY3VzdG9tQ29kZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpbmplY3RlZENvZGUgPSBjdXN0b21Db2RlW3BvaW50XTtcclxuXHJcbiAgICAgICAgICAgIGlmIChpbmplY3RlZENvZGUgJiYgaW5qZWN0ZWRDb2RlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxQb2ludE5hbWUgPSBcIiNkZWZpbmUgXCIgKyBwb2ludDtcclxuICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlLnJlcGxhY2UoZnVsbFBvaW50TmFtZSwgXCJcXG5cIiArIGluamVjdGVkQ29kZSArIFwiXFxuXCIgKyBmdWxsUG9pbnROYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9nZXRDdXN0b21Db2RlKHNoYWRlclR5cGU6IHN0cmluZyk6IHsgW3BvaW50TmFtZTogc3RyaW5nXTogc3RyaW5nIH0ge1xyXG4gICAgICAgIGlmIChzaGFkZXJUeXBlID09PSBcInZlcnRleFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBDVVNUT01fVkVSVEVYX0JFR0lOOiB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9CZWdpbixcclxuICAgICAgICAgICAgICAgIENVU1RPTV9WRVJURVhfREVGSU5JVElPTlM6ICh0aGlzLl9jdXN0b21Vbmlmb3JtPy5qb2luKFwiXFxuXCIpIHx8IFwiXCIpICsgKHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0RlZmluaXRpb25zIHx8IFwiXCIpLFxyXG4gICAgICAgICAgICAgICAgQ1VTVE9NX1ZFUlRFWF9NQUlOX0JFR0lOOiB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9NYWluQmVnaW4sXHJcbiAgICAgICAgICAgICAgICBDVVNUT01fVkVSVEVYX1VQREFURV9QT1NJVElPTjogdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfQmVmb3JlX1Bvc2l0aW9uVXBkYXRlZCxcclxuICAgICAgICAgICAgICAgIENVU1RPTV9WRVJURVhfVVBEQVRFX05PUk1BTDogdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfQmVmb3JlX05vcm1hbFVwZGF0ZWQsXHJcbiAgICAgICAgICAgICAgICBDVVNUT01fVkVSVEVYX01BSU5fRU5EOiB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9NYWluRW5kLFxyXG4gICAgICAgICAgICAgICAgQ1VTVE9NX1ZFUlRFWF9VUERBVEVfV09STERQT1M6IHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9CRUdJTjogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9CZWdpbixcclxuICAgICAgICAgICAgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fQkVHSU46IHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfTWFpbkJlZ2luLFxyXG4gICAgICAgICAgICBDVVNUT01fRlJBR01FTlRfREVGSU5JVElPTlM6ICh0aGlzLl9jdXN0b21Vbmlmb3JtPy5qb2luKFwiXFxuXCIpIHx8IFwiXCIpICsgKHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfRGVmaW5pdGlvbnMgfHwgXCJcIiksXHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9VUERBVEVfQUxCRURPOiB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0N1c3RvbV9BbGJlZG8sXHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9VUERBVEVfQUxQSEE6IHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfQ3VzdG9tX0FscGhhLFxyXG4gICAgICAgICAgICBDVVNUT01fRlJBR01FTlRfQkVGT1JFX0xJR0hUUzogdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9CZWZvcmVfTGlnaHRzLFxyXG4gICAgICAgICAgICBDVVNUT01fRlJBR01FTlRfVVBEQVRFX01FVEFMTElDUk9VR0hORVNTOiB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0N1c3RvbV9NZXRhbGxpY1JvdWdobmVzcyxcclxuICAgICAgICAgICAgQ1VTVE9NX0ZSQUdNRU5UX1VQREFURV9NSUNST1NVUkZBQ0U6IHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfQ3VzdG9tX01pY3JvU3VyZmFjZSxcclxuICAgICAgICAgICAgQ1VTVE9NX0ZSQUdNRU5UX0JFRk9SRV9GSU5BTENPTE9SQ09NUE9TSVRJT046IHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfQmVmb3JlX0ZpbmFsQ29sb3JDb21wb3NpdGlvbixcclxuICAgICAgICAgICAgQ1VTVE9NX0ZSQUdNRU5UX0JFRk9SRV9GUkFHQ09MT1I6IHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfQmVmb3JlX0ZyYWdDb2xvcixcclxuICAgICAgICAgICAgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fRU5EOiB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X01haW5FbmQsXHJcbiAgICAgICAgICAgIENVU1RPTV9GUkFHTUVOVF9CRUZPUkVfRk9HOiB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0JlZm9yZV9Gb2csXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNjZW5lPzogU2NlbmUpIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzY2VuZSwgdHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cyA9IG5ldyBTaGFkZXJBbGJlZG9QYXJ0cygpO1xyXG4gICAgICAgIHRoaXMuY3VzdG9tU2hhZGVyTmFtZVJlc29sdmUgPSB0aGlzLkJ1aWxkZXI7XHJcblxyXG4gICAgICAgIHRoaXMuRnJhZ21lbnRTaGFkZXIgPSBFZmZlY3QuU2hhZGVyc1N0b3JlW1wicGJyUGl4ZWxTaGFkZXJcIl07XHJcbiAgICAgICAgdGhpcy5WZXJ0ZXhTaGFkZXIgPSBFZmZlY3QuU2hhZGVyc1N0b3JlW1wicGJyVmVydGV4U2hhZGVyXCJdO1xyXG5cclxuICAgICAgICB0aGlzLkZyYWdtZW50U2hhZGVyID0gdGhpcy5GcmFnbWVudFNoYWRlci5yZXBsYWNlKC8jaW5jbHVkZTxwYnJCbG9ja0FsYmVkb09wYWNpdHk+L2csIEVmZmVjdC5JbmNsdWRlc1NoYWRlcnNTdG9yZVtcInBickJsb2NrQWxiZWRvT3BhY2l0eVwiXSk7XHJcbiAgICAgICAgdGhpcy5GcmFnbWVudFNoYWRlciA9IHRoaXMuRnJhZ21lbnRTaGFkZXIucmVwbGFjZSgvI2luY2x1ZGU8cGJyQmxvY2tSZWZsZWN0aXZpdHk+L2csIEVmZmVjdC5JbmNsdWRlc1NoYWRlcnNTdG9yZVtcInBickJsb2NrUmVmbGVjdGl2aXR5XCJdKTtcclxuICAgICAgICB0aGlzLkZyYWdtZW50U2hhZGVyID0gdGhpcy5GcmFnbWVudFNoYWRlci5yZXBsYWNlKC8jaW5jbHVkZTxwYnJCbG9ja0ZpbmFsQ29sb3JDb21wb3NpdGlvbj4vZywgRWZmZWN0LkluY2x1ZGVzU2hhZGVyc1N0b3JlW1wicGJyQmxvY2tGaW5hbENvbG9yQ29tcG9zaXRpb25cIl0pO1xyXG5cclxuICAgICAgICBQQlJDdXN0b21NYXRlcmlhbC5TaGFkZXJJbmRleGVyKys7XHJcbiAgICAgICAgdGhpcy5fY3JlYXRlZFNoYWRlck5hbWUgPSBcImN1c3RvbXBicl9cIiArIFBCUkN1c3RvbU1hdGVyaWFsLlNoYWRlckluZGV4ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIF9hZnRlckJpbmQobWVzaD86IE1lc2gsIGVmZmVjdDogTnVsbGFibGU8RWZmZWN0PiA9IG51bGwsIHN1Yk1lc2g/OiBTdWJNZXNoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCFlZmZlY3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLkF0dGFjaEFmdGVyQmluZChtZXNoLCBlZmZlY3QpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHN1cGVyLl9hZnRlckJpbmQobWVzaCwgZWZmZWN0LCBzdWJNZXNoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIG5ldyB1bmlmb3JtIHRvIHRoZSBzaGFkZXJcclxuICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtIHRvIGFkZFxyXG4gICAgICogQHBhcmFtIGtpbmQgdGhlIHR5cGUgb2YgdGhlIHVuaWZvcm0gdG8gYWRkXHJcbiAgICAgKiBAcGFyYW0gcGFyYW0gdGhlIHZhbHVlIG9mIHRoZSB1bmlmb3JtIHRvIGFkZFxyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZFVuaWZvcm0obmFtZTogc3RyaW5nLCBraW5kOiBzdHJpbmcsIHBhcmFtOiBhbnkpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jdXN0b21Vbmlmb3JtKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbVVuaWZvcm0gPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICAgICAgdGhpcy5fbmV3VW5pZm9ybXMgPSBuZXcgQXJyYXkoKTtcclxuICAgICAgICAgICAgdGhpcy5fbmV3U2FtcGxlckluc3RhbmNlcyA9IHt9O1xyXG4gICAgICAgICAgICB0aGlzLl9uZXdVbmlmb3JtSW5zdGFuY2VzID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChwYXJhbSkge1xyXG4gICAgICAgICAgICBpZiAoa2luZC5pbmRleE9mKFwic2FtcGxlclwiKSAhPSAtMSkge1xyXG4gICAgICAgICAgICAgICAgKDxhbnk+dGhpcy5fbmV3U2FtcGxlckluc3RhbmNlcylba2luZCArIFwiLVwiICsgbmFtZV0gPSBwYXJhbTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICg8YW55PnRoaXMuX25ld1VuaWZvcm1JbnN0YW5jZXMpW2tpbmQgKyBcIi1cIiArIG5hbWVdID0gcGFyYW07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY3VzdG9tVW5pZm9ybS5wdXNoKFwidW5pZm9ybSBcIiArIGtpbmQgKyBcIiBcIiArIG5hbWUgKyBcIjtcIik7XHJcbiAgICAgICAgdGhpcy5fbmV3VW5pZm9ybXMucHVzaChuYW1lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgY3VzdG9tIGF0dHJpYnV0ZVxyXG4gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZVxyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEFkZEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jdXN0b21BdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2N1c3RvbUF0dHJpYnV0ZXMgPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2N1c3RvbUF0dHJpYnV0ZXMucHVzaChuYW1lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X0JlZ2luIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0JlZ2luKHNoYWRlclBhcnQ6IHN0cmluZyk6IFBCUkN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0JlZ2luID0gc2hhZGVyUGFydDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gRnJhZ21lbnRfRGVmaW5pdGlvbnMgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfRGVmaW5pdGlvbnMoc2hhZGVyUGFydDogc3RyaW5nKTogUEJSQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfRGVmaW5pdGlvbnMgPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBGcmFnbWVudF9NYWluQmVnaW4gcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfTWFpbkJlZ2luKHNoYWRlclBhcnQ6IHN0cmluZyk6IFBCUkN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X01haW5CZWdpbiA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X0N1c3RvbV9BbGJlZG8gcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQ3VzdG9tX0FsYmVkbyhzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9DdXN0b21fQWxiZWRvID0gc2hhZGVyUGFydC5yZXBsYWNlKFwicmVzdWx0XCIsIFwic3VyZmFjZUFsYmVkb1wiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gRnJhZ21lbnRfQ3VzdG9tX0FscGhhIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0N1c3RvbV9BbHBoYShzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9DdXN0b21fQWxwaGEgPSBzaGFkZXJQYXJ0LnJlcGxhY2UoXCJyZXN1bHRcIiwgXCJhbHBoYVwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gRnJhZ21lbnRfQmVmb3JlX0xpZ2h0cyBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9CZWZvcmVfTGlnaHRzKHNoYWRlclBhcnQ6IHN0cmluZyk6IFBCUkN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0JlZm9yZV9MaWdodHMgPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBGcmFnbWVudF9DdXN0b21fTWV0YWxsaWNSb3VnaG5lc3MgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQ3VzdG9tX01ldGFsbGljUm91Z2huZXNzKHNoYWRlclBhcnQ6IHN0cmluZyk6IFBCUkN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0N1c3RvbV9NZXRhbGxpY1JvdWdobmVzcyA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X0N1c3RvbV9NaWNyb1N1cmZhY2UgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQ3VzdG9tX01pY3JvU3VyZmFjZShzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9DdXN0b21fTWljcm9TdXJmYWNlID0gc2hhZGVyUGFydDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gRnJhZ21lbnRfQmVmb3JlX0ZvZyBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBGcmFnbWVudF9CZWZvcmVfRm9nKHNoYWRlclBhcnQ6IHN0cmluZyk6IFBCUkN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLkZyYWdtZW50X0JlZm9yZV9Gb2cgPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBGcmFnbWVudF9CZWZvcmVfRmluYWxDb2xvckNvbXBvc2l0aW9uIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIEZyYWdtZW50X0JlZm9yZV9GaW5hbENvbG9yQ29tcG9zaXRpb24oc2hhZGVyUGFydDogc3RyaW5nKTogUEJSQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuRnJhZ21lbnRfQmVmb3JlX0ZpbmFsQ29sb3JDb21wb3NpdGlvbiA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X0JlZm9yZV9GcmFnQ29sb3IgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfQmVmb3JlX0ZyYWdDb2xvcihzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9CZWZvcmVfRnJhZ0NvbG9yID0gc2hhZGVyUGFydC5yZXBsYWNlKFwicmVzdWx0XCIsIFwiY29sb3JcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIEZyYWdtZW50X01haW5FbmQgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgRnJhZ21lbnRfTWFpbkVuZChzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5GcmFnbWVudF9NYWluRW5kID0gc2hhZGVyUGFydDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gVmVydGV4X0JlZ2luIHBvcnRpb25cclxuICAgICAqIEBwYXJhbSBzaGFkZXJQYXJ0IHRoZSBjb2RlIHN0cmluZ1xyXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgbWF0ZXJpYWxcclxuICAgICAqL1xyXG4gICAgcHVibGljIFZlcnRleF9CZWdpbihzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfQmVnaW4gPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBWZXJ0ZXhfRGVmaW5pdGlvbnMgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0RlZmluaXRpb25zKHNoYWRlclBhcnQ6IHN0cmluZyk6IFBCUkN1c3RvbU1hdGVyaWFsIHtcclxuICAgICAgICB0aGlzLkN1c3RvbVBhcnRzLlZlcnRleF9EZWZpbml0aW9ucyA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIFZlcnRleF9NYWluQmVnaW4gcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X01haW5CZWdpbihzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfTWFpbkJlZ2luID0gc2hhZGVyUGFydDtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gVmVydGV4X0JlZm9yZV9Qb3NpdGlvblVwZGF0ZWQgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0JlZm9yZV9Qb3NpdGlvblVwZGF0ZWQoc2hhZGVyUGFydDogc3RyaW5nKTogUEJSQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0JlZm9yZV9Qb3NpdGlvblVwZGF0ZWQgPSBzaGFkZXJQYXJ0LnJlcGxhY2UoXCJyZXN1bHRcIiwgXCJwb3NpdGlvblVwZGF0ZWRcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSBjb2RlIG9uIFZlcnRleF9CZWZvcmVfTm9ybWFsVXBkYXRlZCBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfQmVmb3JlX05vcm1hbFVwZGF0ZWQoc2hhZGVyUGFydDogc3RyaW5nKTogUEJSQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0JlZm9yZV9Ob3JtYWxVcGRhdGVkID0gc2hhZGVyUGFydC5yZXBsYWNlKFwicmVzdWx0XCIsIFwibm9ybWFsVXBkYXRlZFwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGNvZGUgb24gVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQgcG9ydGlvblxyXG4gICAgICogQHBhcmFtIHNoYWRlclBhcnQgdGhlIGNvZGUgc3RyaW5nXHJcbiAgICAgKiBAcmV0dXJucyB0aGUgY3VycmVudCBtYXRlcmlhbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQoc2hhZGVyUGFydDogc3RyaW5nKTogUEJSQ3VzdG9tTWF0ZXJpYWwge1xyXG4gICAgICAgIHRoaXMuQ3VzdG9tUGFydHMuVmVydGV4X0FmdGVyX1dvcmxkUG9zQ29tcHV0ZWQgPSBzaGFkZXJQYXJ0O1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgY29kZSBvbiBWZXJ0ZXhfTWFpbkVuZCBwb3J0aW9uXHJcbiAgICAgKiBAcGFyYW0gc2hhZGVyUGFydCB0aGUgY29kZSBzdHJpbmdcclxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IG1hdGVyaWFsXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBWZXJ0ZXhfTWFpbkVuZChzaGFkZXJQYXJ0OiBzdHJpbmcpOiBQQlJDdXN0b21NYXRlcmlhbCB7XHJcbiAgICAgICAgdGhpcy5DdXN0b21QYXJ0cy5WZXJ0ZXhfTWFpbkVuZCA9IHNoYWRlclBhcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLlBCUkN1c3RvbU1hdGVyaWFsXCIsIFBCUkN1c3RvbU1hdGVyaWFsKTtcclxuIiwiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWludGVybmFsLW1vZHVsZXMgKi9cclxuaW1wb3J0ICogYXMgTWF0TGliIGZyb20gXCJtYXRlcmlhbHMvY3VzdG9tL2luZGV4XCI7XHJcblxyXG4vKipcclxuICogVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBVTUQgbW9kdWxlLlxyXG4gKiBUaGUgZW50cnkgcG9pbnQgZm9yIGEgZnV0dXJlIEVTTSBwYWNrYWdlIHNob3VsZCBiZSBpbmRleC50c1xyXG4gKi9cclxuY29uc3QgZ2xvYmFsT2JqZWN0ID0gdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB1bmRlZmluZWQ7XHJcbmlmICh0eXBlb2YgZ2xvYmFsT2JqZWN0ICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBNYXRMaWIpIHtcclxuICAgICAgICAoPGFueT5nbG9iYWxPYmplY3QpLkJBQllMT05ba2V5XSA9ICg8YW55Pk1hdExpYilba2V5XTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0ICogZnJvbSBcIm1hdGVyaWFscy9jdXN0b20vaW5kZXhcIjtcclxuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2JhYnlsb25qc19NYXRlcmlhbHNfZWZmZWN0X187IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0ICogYXMgbWF0ZXJpYWxzIGZyb20gXCJAbHRzL21hdGVyaWFscy9sZWdhY3kvbGVnYWN5LWN1c3RvbVwiO1xyXG5leHBvcnQgeyBtYXRlcmlhbHMgfTtcclxuZXhwb3J0IGRlZmF1bHQgbWF0ZXJpYWxzO1xyXG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=