babylonjs-procedural-textures 7.50.0 → 7.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/babylon.brickProceduralTexture.js +202 -202
- package/babylon.cloudProceduralTexture.js +202 -202
- package/babylon.fireProceduralTexture.js +625 -625
- package/babylon.grassProceduralTexture.js +178 -178
- package/babylon.marbleProceduralTexture.js +202 -202
- package/babylon.normalMapProceduralTexture.js +167 -167
- package/babylon.perlinNoiseProceduralTexture.js +167 -167
- package/babylon.roadProceduralTexture.js +154 -154
- package/babylon.starfieldProceduralTexture.js +677 -677
- package/babylon.woodProceduralTexture.js +170 -170
- package/babylonjs.proceduralTextures.js +801 -801
- package/package.json +2 -2
|
@@ -12,365 +12,812 @@ return /******/ (() => { // webpackBootstrap
|
|
|
12
12
|
/******/ "use strict";
|
|
13
13
|
/******/ var __webpack_modules__ = ({
|
|
14
14
|
|
|
15
|
-
/***/ "
|
|
16
|
-
|
|
17
|
-
!***
|
|
18
|
-
|
|
19
|
-
/***/ ((
|
|
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 */
|
|
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__)
|
|
24
56
|
/* harmony export */ });
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
// Do not edit.
|
|
57
|
+
/******************************************************************************
|
|
58
|
+
Copyright (c) Microsoft Corporation.
|
|
28
59
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
// Sideeffect
|
|
32
|
-
babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name] = shader;
|
|
33
|
-
/** @internal */
|
|
34
|
-
var brickProceduralTexturePixelShader = { name: name, shader: shader };
|
|
60
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
61
|
+
purpose with or without fee is hereby granted.
|
|
35
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 */
|
|
36
72
|
|
|
37
|
-
|
|
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
|
+
};
|
|
38
79
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
+
}
|
|
44
87
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
+
}
|
|
53
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
|
+
}
|
|
54
110
|
|
|
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
|
+
}
|
|
55
117
|
|
|
118
|
+
function __param(paramIndex, decorator) {
|
|
119
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
120
|
+
}
|
|
56
121
|
|
|
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
|
+
};
|
|
57
149
|
|
|
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
|
+
};
|
|
58
157
|
|
|
158
|
+
function __propKey(x) {
|
|
159
|
+
return typeof x === "symbol" ? x : "".concat(x);
|
|
160
|
+
};
|
|
59
161
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
var _this = _super.call(this, name, size, "brickProceduralTexture", scene, fallbackTexture, generateMipMaps) || this;
|
|
65
|
-
_this._numberOfBricksHeight = 15;
|
|
66
|
-
_this._numberOfBricksWidth = 5;
|
|
67
|
-
_this._jointColor = new babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.Color3(0.72, 0.72, 0.72);
|
|
68
|
-
_this._brickColor = new babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.Color3(0.77, 0.47, 0.4);
|
|
69
|
-
_this.updateShaderUniforms();
|
|
70
|
-
return _this;
|
|
71
|
-
}
|
|
72
|
-
BrickProceduralTexture.prototype.updateShaderUniforms = function () {
|
|
73
|
-
this.setFloat("numberOfBricksHeight", this._numberOfBricksHeight);
|
|
74
|
-
this.setFloat("numberOfBricksWidth", this._numberOfBricksWidth);
|
|
75
|
-
this.setColor3("brickColor", this._brickColor);
|
|
76
|
-
this.setColor3("jointColor", this._jointColor);
|
|
77
|
-
};
|
|
78
|
-
Object.defineProperty(BrickProceduralTexture.prototype, "numberOfBricksHeight", {
|
|
79
|
-
get: function () {
|
|
80
|
-
return this._numberOfBricksHeight;
|
|
81
|
-
},
|
|
82
|
-
set: function (value) {
|
|
83
|
-
this._numberOfBricksHeight = value;
|
|
84
|
-
this.updateShaderUniforms();
|
|
85
|
-
},
|
|
86
|
-
enumerable: false,
|
|
87
|
-
configurable: true
|
|
88
|
-
});
|
|
89
|
-
Object.defineProperty(BrickProceduralTexture.prototype, "numberOfBricksWidth", {
|
|
90
|
-
get: function () {
|
|
91
|
-
return this._numberOfBricksWidth;
|
|
92
|
-
},
|
|
93
|
-
set: function (value) {
|
|
94
|
-
this._numberOfBricksWidth = value;
|
|
95
|
-
this.updateShaderUniforms();
|
|
96
|
-
},
|
|
97
|
-
enumerable: false,
|
|
98
|
-
configurable: true
|
|
99
|
-
});
|
|
100
|
-
Object.defineProperty(BrickProceduralTexture.prototype, "jointColor", {
|
|
101
|
-
get: function () {
|
|
102
|
-
return this._jointColor;
|
|
103
|
-
},
|
|
104
|
-
set: function (value) {
|
|
105
|
-
this._jointColor = value;
|
|
106
|
-
this.updateShaderUniforms();
|
|
107
|
-
},
|
|
108
|
-
enumerable: false,
|
|
109
|
-
configurable: true
|
|
110
|
-
});
|
|
111
|
-
Object.defineProperty(BrickProceduralTexture.prototype, "brickColor", {
|
|
112
|
-
get: function () {
|
|
113
|
-
return this._brickColor;
|
|
114
|
-
},
|
|
115
|
-
set: function (value) {
|
|
116
|
-
this._brickColor = value;
|
|
117
|
-
this.updateShaderUniforms();
|
|
118
|
-
},
|
|
119
|
-
enumerable: false,
|
|
120
|
-
configurable: true
|
|
121
|
-
});
|
|
122
|
-
/**
|
|
123
|
-
* Serializes this brick procedural texture
|
|
124
|
-
* @returns a serialized brick procedural texture object
|
|
125
|
-
*/
|
|
126
|
-
BrickProceduralTexture.prototype.serialize = function () {
|
|
127
|
-
var serializationObject = babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.SerializationHelper.Serialize(this, _super.prototype.serialize.call(this));
|
|
128
|
-
serializationObject.customType = "BABYLON.BrickProceduralTexture";
|
|
129
|
-
return serializationObject;
|
|
130
|
-
};
|
|
131
|
-
/**
|
|
132
|
-
* Creates a Brick Procedural Texture from parsed brick procedural texture data
|
|
133
|
-
* @param parsedTexture defines parsed texture data
|
|
134
|
-
* @param scene defines the current scene
|
|
135
|
-
* @param rootUrl defines the root URL containing brick procedural texture information
|
|
136
|
-
* @returns a parsed Brick Procedural Texture
|
|
137
|
-
*/
|
|
138
|
-
BrickProceduralTexture.Parse = function (parsedTexture, scene, rootUrl) {
|
|
139
|
-
var texture = babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.SerializationHelper.Parse(function () { return new BrickProceduralTexture(parsedTexture.name, parsedTexture._size, scene, undefined, parsedTexture._generateMipMaps); }, parsedTexture, scene, rootUrl);
|
|
140
|
-
return texture;
|
|
141
|
-
};
|
|
142
|
-
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
143
|
-
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serialize)()
|
|
144
|
-
], BrickProceduralTexture.prototype, "numberOfBricksHeight", null);
|
|
145
|
-
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
146
|
-
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serialize)()
|
|
147
|
-
], BrickProceduralTexture.prototype, "numberOfBricksWidth", null);
|
|
148
|
-
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
149
|
-
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serializeAsColor3)()
|
|
150
|
-
], BrickProceduralTexture.prototype, "jointColor", null);
|
|
151
|
-
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
152
|
-
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serializeAsColor3)()
|
|
153
|
-
], BrickProceduralTexture.prototype, "brickColor", null);
|
|
154
|
-
return BrickProceduralTexture;
|
|
155
|
-
}(babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.ProceduralTexture));
|
|
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
|
+
};
|
|
156
166
|
|
|
157
|
-
(
|
|
167
|
+
function __metadata(metadataKey, metadataValue) {
|
|
168
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
|
|
169
|
+
}
|
|
158
170
|
|
|
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
|
+
}
|
|
159
180
|
|
|
160
|
-
|
|
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
|
+
}
|
|
161
208
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
+
});
|
|
167
220
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
/* harmony export */ });
|
|
172
|
-
/* harmony import */ var _brickProceduralTexture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./brickProceduralTexture */ "../../../dev/proceduralTextures/src/brick/brickProceduralTexture.ts");
|
|
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
|
+
}
|
|
173
224
|
|
|
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
|
+
}
|
|
174
236
|
|
|
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
|
+
}
|
|
175
253
|
|
|
176
|
-
|
|
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
|
+
}
|
|
177
260
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
+
}
|
|
183
269
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
+
}
|
|
191
279
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name] = shader;
|
|
196
|
-
/** @internal */
|
|
197
|
-
var cloudProceduralTexturePixelShader = { name: name, shader: shader };
|
|
280
|
+
function __await(v) {
|
|
281
|
+
return this instanceof __await ? (this.v = v, this) : new __await(v);
|
|
282
|
+
}
|
|
198
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
|
+
}
|
|
199
296
|
|
|
200
|
-
|
|
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
|
+
}
|
|
201
302
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
+
}
|
|
207
310
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
311
|
+
function __makeTemplateObject(cooked, raw) {
|
|
312
|
+
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
313
|
+
return cooked;
|
|
314
|
+
};
|
|
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
|
+
};
|
|
216
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
|
+
};
|
|
217
330
|
|
|
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
|
+
}
|
|
218
338
|
|
|
339
|
+
function __importDefault(mod) {
|
|
340
|
+
return (mod && mod.__esModule) ? mod : { default: mod };
|
|
341
|
+
}
|
|
219
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
|
+
}
|
|
220
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
|
+
}
|
|
221
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
|
+
}
|
|
222
360
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
_this._amplitude = 1;
|
|
231
|
-
_this._numOctaves = 4;
|
|
232
|
-
_this.updateShaderUniforms();
|
|
233
|
-
return _this;
|
|
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];
|
|
234
368
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
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/proceduralTextures/src/brick/brickProceduralTexture.fragment.ts":
|
|
463
|
+
/*!************************************************************************************!*\
|
|
464
|
+
!*** ../../../dev/proceduralTextures/src/brick/brickProceduralTexture.fragment.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 */ brickProceduralTexturePixelShader: () => (/* binding */ brickProceduralTexturePixelShader)
|
|
471
|
+
/* harmony export */ });
|
|
472
|
+
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Engines/shaderStore */ "babylonjs/Misc/decorators");
|
|
473
|
+
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__);
|
|
474
|
+
// Do not edit.
|
|
475
|
+
|
|
476
|
+
var name = "brickProceduralTexturePixelShader";
|
|
477
|
+
var shader = "precision highp float;varying vec2 vPosition;varying vec2 vUV;uniform float numberOfBricksHeight;uniform float numberOfBricksWidth;uniform vec3 brickColor;uniform vec3 jointColor;float rand(vec2 n) {return fract(cos(dot(n,vec2(12.9898,4.1414)))*43758.5453);}\nfloat noise(vec2 n) {const vec2 d=vec2(0.0,1.0);vec2 b=floor(n),f=smoothstep(vec2(0.0),vec2(1.0),fract(n));return mix(mix(rand(b),rand(b+d.yx),f.x),mix(rand(b+d.xy),rand(b+d.yy),f.x),f.y);}\nfloat fbm(vec2 n) {float total=0.0,amplitude=1.0;for (int i=0; i<4; i++) {total+=noise(n)*amplitude;n+=n;amplitude*=0.5;}\nreturn total;}\nfloat roundF(float number){return sign(number)*floor(abs(number)+0.5);}\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void)\n{float brickW=1.0/numberOfBricksWidth;float brickH=1.0/numberOfBricksHeight;float jointWPercentage=0.01;float jointHPercentage=0.05;vec3 color=brickColor;float yi=vUV.y/brickH;float nyi=roundF(yi);float xi=vUV.x/brickW;if (mod(floor(yi),2.0)==0.0){xi=xi-0.5;}\nfloat nxi=roundF(xi);vec2 brickvUV=vec2((xi-floor(xi))/brickH,(yi-floor(yi))/ brickW);if (yi<nyi+jointHPercentage && yi>nyi-jointHPercentage){color=mix(jointColor,vec3(0.37,0.25,0.25),(yi-nyi)/jointHPercentage+0.2);}\nelse if (xi<nxi+jointWPercentage && xi>nxi-jointWPercentage){color=mix(jointColor,vec3(0.44,0.44,0.44),(xi-nxi)/jointWPercentage+0.2);}\nelse {float brickColorSwitch=mod(floor(yi)+floor(xi),3.0);if (brickColorSwitch==0.0)\ncolor=mix(color,vec3(0.33,0.33,0.33),0.3);else if (brickColorSwitch==2.0)\ncolor=mix(color,vec3(0.11,0.11,0.11),0.3);}\ngl_FragColor=vec4(color,1.0);}";
|
|
478
|
+
// Sideeffect
|
|
479
|
+
babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name] = shader;
|
|
480
|
+
/** @internal */
|
|
481
|
+
var brickProceduralTexturePixelShader = { name: name, shader: shader };
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
/***/ }),
|
|
485
|
+
|
|
486
|
+
/***/ "../../../dev/proceduralTextures/src/brick/brickProceduralTexture.ts":
|
|
487
|
+
/*!***************************************************************************!*\
|
|
488
|
+
!*** ../../../dev/proceduralTextures/src/brick/brickProceduralTexture.ts ***!
|
|
489
|
+
\***************************************************************************/
|
|
490
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
491
|
+
|
|
492
|
+
__webpack_require__.r(__webpack_exports__);
|
|
493
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
494
|
+
/* harmony export */ BrickProceduralTexture: () => (/* binding */ BrickProceduralTexture)
|
|
495
|
+
/* harmony export */ });
|
|
496
|
+
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
|
|
497
|
+
/* harmony import */ var babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Misc/decorators");
|
|
498
|
+
/* harmony import */ var babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__);
|
|
499
|
+
/* harmony import */ var _brickProceduralTexture_fragment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./brickProceduralTexture.fragment */ "../../../dev/proceduralTextures/src/brick/brickProceduralTexture.fragment.ts");
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
var BrickProceduralTexture = /** @class */ (function (_super) {
|
|
508
|
+
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__extends)(BrickProceduralTexture, _super);
|
|
509
|
+
function BrickProceduralTexture(name, size, scene, fallbackTexture, generateMipMaps) {
|
|
510
|
+
if (scene === void 0) { scene = null; }
|
|
511
|
+
var _this = _super.call(this, name, size, "brickProceduralTexture", scene, fallbackTexture, generateMipMaps) || this;
|
|
512
|
+
_this._numberOfBricksHeight = 15;
|
|
513
|
+
_this._numberOfBricksWidth = 5;
|
|
514
|
+
_this._jointColor = new babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.Color3(0.72, 0.72, 0.72);
|
|
515
|
+
_this._brickColor = new babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.Color3(0.77, 0.47, 0.4);
|
|
516
|
+
_this.updateShaderUniforms();
|
|
517
|
+
return _this;
|
|
518
|
+
}
|
|
519
|
+
BrickProceduralTexture.prototype.updateShaderUniforms = function () {
|
|
520
|
+
this.setFloat("numberOfBricksHeight", this._numberOfBricksHeight);
|
|
521
|
+
this.setFloat("numberOfBricksWidth", this._numberOfBricksWidth);
|
|
522
|
+
this.setColor3("brickColor", this._brickColor);
|
|
523
|
+
this.setColor3("jointColor", this._jointColor);
|
|
524
|
+
};
|
|
525
|
+
Object.defineProperty(BrickProceduralTexture.prototype, "numberOfBricksHeight", {
|
|
526
|
+
get: function () {
|
|
527
|
+
return this._numberOfBricksHeight;
|
|
528
|
+
},
|
|
529
|
+
set: function (value) {
|
|
530
|
+
this._numberOfBricksHeight = value;
|
|
531
|
+
this.updateShaderUniforms();
|
|
532
|
+
},
|
|
533
|
+
enumerable: false,
|
|
534
|
+
configurable: true
|
|
251
535
|
});
|
|
252
|
-
Object.defineProperty(
|
|
536
|
+
Object.defineProperty(BrickProceduralTexture.prototype, "numberOfBricksWidth", {
|
|
253
537
|
get: function () {
|
|
254
|
-
return this.
|
|
538
|
+
return this._numberOfBricksWidth;
|
|
255
539
|
},
|
|
256
540
|
set: function (value) {
|
|
257
|
-
this.
|
|
541
|
+
this._numberOfBricksWidth = value;
|
|
258
542
|
this.updateShaderUniforms();
|
|
259
543
|
},
|
|
260
544
|
enumerable: false,
|
|
261
545
|
configurable: true
|
|
262
546
|
});
|
|
263
|
-
Object.defineProperty(
|
|
547
|
+
Object.defineProperty(BrickProceduralTexture.prototype, "jointColor", {
|
|
264
548
|
get: function () {
|
|
265
|
-
return this.
|
|
549
|
+
return this._jointColor;
|
|
266
550
|
},
|
|
267
551
|
set: function (value) {
|
|
268
|
-
this.
|
|
552
|
+
this._jointColor = value;
|
|
269
553
|
this.updateShaderUniforms();
|
|
270
554
|
},
|
|
271
555
|
enumerable: false,
|
|
272
556
|
configurable: true
|
|
273
557
|
});
|
|
274
|
-
Object.defineProperty(
|
|
558
|
+
Object.defineProperty(BrickProceduralTexture.prototype, "brickColor", {
|
|
275
559
|
get: function () {
|
|
276
|
-
return this.
|
|
560
|
+
return this._brickColor;
|
|
277
561
|
},
|
|
278
562
|
set: function (value) {
|
|
279
|
-
this.
|
|
563
|
+
this._brickColor = value;
|
|
280
564
|
this.updateShaderUniforms();
|
|
281
565
|
},
|
|
282
566
|
enumerable: false,
|
|
283
567
|
configurable: true
|
|
284
568
|
});
|
|
285
569
|
/**
|
|
286
|
-
* Serializes this
|
|
287
|
-
* @returns a serialized
|
|
570
|
+
* Serializes this brick procedural texture
|
|
571
|
+
* @returns a serialized brick procedural texture object
|
|
288
572
|
*/
|
|
289
|
-
|
|
573
|
+
BrickProceduralTexture.prototype.serialize = function () {
|
|
290
574
|
var serializationObject = babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.SerializationHelper.Serialize(this, _super.prototype.serialize.call(this));
|
|
291
|
-
serializationObject.customType = "BABYLON.
|
|
575
|
+
serializationObject.customType = "BABYLON.BrickProceduralTexture";
|
|
292
576
|
return serializationObject;
|
|
293
577
|
};
|
|
294
578
|
/**
|
|
295
|
-
* Creates a
|
|
579
|
+
* Creates a Brick Procedural Texture from parsed brick procedural texture data
|
|
296
580
|
* @param parsedTexture defines parsed texture data
|
|
297
581
|
* @param scene defines the current scene
|
|
298
|
-
* @param rootUrl defines the root URL containing
|
|
299
|
-
* @returns a parsed
|
|
582
|
+
* @param rootUrl defines the root URL containing brick procedural texture information
|
|
583
|
+
* @returns a parsed Brick Procedural Texture
|
|
300
584
|
*/
|
|
301
|
-
|
|
302
|
-
var texture = babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.SerializationHelper.Parse(function () { return new
|
|
585
|
+
BrickProceduralTexture.Parse = function (parsedTexture, scene, rootUrl) {
|
|
586
|
+
var texture = babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.SerializationHelper.Parse(function () { return new BrickProceduralTexture(parsedTexture.name, parsedTexture._size, scene, undefined, parsedTexture._generateMipMaps); }, parsedTexture, scene, rootUrl);
|
|
303
587
|
return texture;
|
|
304
588
|
};
|
|
305
|
-
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
306
|
-
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serializeAsColor4)()
|
|
307
|
-
], CloudProceduralTexture.prototype, "skyColor", null);
|
|
308
|
-
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
309
|
-
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serializeAsColor4)()
|
|
310
|
-
], CloudProceduralTexture.prototype, "cloudColor", null);
|
|
311
589
|
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
312
590
|
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serialize)()
|
|
313
|
-
],
|
|
591
|
+
], BrickProceduralTexture.prototype, "numberOfBricksHeight", null);
|
|
314
592
|
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
315
593
|
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serialize)()
|
|
316
|
-
],
|
|
317
|
-
|
|
594
|
+
], BrickProceduralTexture.prototype, "numberOfBricksWidth", null);
|
|
595
|
+
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
596
|
+
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serializeAsColor3)()
|
|
597
|
+
], BrickProceduralTexture.prototype, "jointColor", null);
|
|
598
|
+
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
599
|
+
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serializeAsColor3)()
|
|
600
|
+
], BrickProceduralTexture.prototype, "brickColor", null);
|
|
601
|
+
return BrickProceduralTexture;
|
|
318
602
|
}(babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.ProceduralTexture));
|
|
319
603
|
|
|
320
|
-
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.RegisterClass)("BABYLON.
|
|
604
|
+
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.RegisterClass)("BABYLON.BrickProceduralTexture", BrickProceduralTexture);
|
|
321
605
|
|
|
322
606
|
|
|
323
607
|
/***/ }),
|
|
324
608
|
|
|
325
|
-
/***/ "../../../dev/proceduralTextures/src/
|
|
609
|
+
/***/ "../../../dev/proceduralTextures/src/brick/index.ts":
|
|
326
610
|
/*!**********************************************************!*\
|
|
327
|
-
!*** ../../../dev/proceduralTextures/src/
|
|
611
|
+
!*** ../../../dev/proceduralTextures/src/brick/index.ts ***!
|
|
328
612
|
\**********************************************************/
|
|
329
613
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
330
614
|
|
|
331
615
|
__webpack_require__.r(__webpack_exports__);
|
|
332
616
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
333
|
-
/* harmony export */
|
|
617
|
+
/* harmony export */ BrickProceduralTexture: () => (/* reexport safe */ _brickProceduralTexture__WEBPACK_IMPORTED_MODULE_0__.BrickProceduralTexture)
|
|
334
618
|
/* harmony export */ });
|
|
335
|
-
/* harmony import */ var
|
|
619
|
+
/* harmony import */ var _brickProceduralTexture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./brickProceduralTexture */ "../../../dev/proceduralTextures/src/brick/brickProceduralTexture.ts");
|
|
336
620
|
|
|
337
621
|
|
|
338
622
|
|
|
339
623
|
/***/ }),
|
|
340
624
|
|
|
341
|
-
/***/ "../../../dev/proceduralTextures/src/
|
|
342
|
-
|
|
343
|
-
!*** ../../../dev/proceduralTextures/src/
|
|
344
|
-
|
|
625
|
+
/***/ "../../../dev/proceduralTextures/src/cloud/cloudProceduralTexture.fragment.ts":
|
|
626
|
+
/*!************************************************************************************!*\
|
|
627
|
+
!*** ../../../dev/proceduralTextures/src/cloud/cloudProceduralTexture.fragment.ts ***!
|
|
628
|
+
\************************************************************************************/
|
|
345
629
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
346
630
|
|
|
347
631
|
__webpack_require__.r(__webpack_exports__);
|
|
348
632
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
349
|
-
/* harmony export */
|
|
633
|
+
/* harmony export */ cloudProceduralTexturePixelShader: () => (/* binding */ cloudProceduralTexturePixelShader)
|
|
350
634
|
/* harmony export */ });
|
|
351
635
|
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Engines/shaderStore */ "babylonjs/Misc/decorators");
|
|
352
636
|
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__);
|
|
353
637
|
// Do not edit.
|
|
354
638
|
|
|
355
|
-
var name = "
|
|
356
|
-
var shader = "precision highp float;
|
|
639
|
+
var name = "cloudProceduralTexturePixelShader";
|
|
640
|
+
var shader = "precision highp float;varying vec2 vUV;uniform vec4 skyColor;uniform vec4 cloudColor;uniform float amplitude;uniform int numOctaves;float rand(vec2 n) {return fract(cos(dot(n,vec2(12.9898,4.1414)))*43758.5453);}\nfloat noise(vec2 n) {const vec2 d=vec2(0.0,1.0);vec2 b=floor(n),f=smoothstep(vec2(0.0),vec2(1.0),fract(n));return mix(mix(rand(b),rand(b+d.yx),f.x),mix(rand(b+d.xy),rand(b+d.yy),f.x),f.y);}\nfloat fbm(vec2 n) {float total=0.0,ampl=amplitude;\n#ifdef WEBGL2\nfor (int i=0; i<numOctaves; i++) {\n#else\nfor (int i=0; i<4; i++) {\n#endif\ntotal+=noise(n)*ampl;n+=n;ampl*=0.5;}\nreturn total;}\nvoid main() {vec2 p=vUV*12.0;vec4 c=mix(skyColor,cloudColor,fbm(p));gl_FragColor=c;}\n";
|
|
357
641
|
// Sideeffect
|
|
358
642
|
babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name] = shader;
|
|
359
643
|
/** @internal */
|
|
360
|
-
var
|
|
644
|
+
var cloudProceduralTexturePixelShader = { name: name, shader: shader };
|
|
361
645
|
|
|
362
646
|
|
|
363
647
|
/***/ }),
|
|
364
648
|
|
|
365
|
-
/***/ "../../../dev/proceduralTextures/src/
|
|
366
|
-
|
|
367
|
-
!*** ../../../dev/proceduralTextures/src/
|
|
368
|
-
|
|
649
|
+
/***/ "../../../dev/proceduralTextures/src/cloud/cloudProceduralTexture.ts":
|
|
650
|
+
/*!***************************************************************************!*\
|
|
651
|
+
!*** ../../../dev/proceduralTextures/src/cloud/cloudProceduralTexture.ts ***!
|
|
652
|
+
\***************************************************************************/
|
|
369
653
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
370
654
|
|
|
371
655
|
__webpack_require__.r(__webpack_exports__);
|
|
372
656
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
373
|
-
/* harmony export */
|
|
657
|
+
/* harmony export */ CloudProceduralTexture: () => (/* binding */ CloudProceduralTexture)
|
|
658
|
+
/* harmony export */ });
|
|
659
|
+
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
|
|
660
|
+
/* harmony import */ var babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Misc/decorators");
|
|
661
|
+
/* harmony import */ var babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__);
|
|
662
|
+
/* harmony import */ var _cloudProceduralTexture_fragment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./cloudProceduralTexture.fragment */ "../../../dev/proceduralTextures/src/cloud/cloudProceduralTexture.fragment.ts");
|
|
663
|
+
|
|
664
|
+
|
|
665
|
+
|
|
666
|
+
|
|
667
|
+
|
|
668
|
+
|
|
669
|
+
|
|
670
|
+
var CloudProceduralTexture = /** @class */ (function (_super) {
|
|
671
|
+
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__extends)(CloudProceduralTexture, _super);
|
|
672
|
+
function CloudProceduralTexture(name, size, scene, fallbackTexture, generateMipMaps) {
|
|
673
|
+
if (scene === void 0) { scene = null; }
|
|
674
|
+
var _this = _super.call(this, name, size, "cloudProceduralTexture", scene, fallbackTexture, generateMipMaps) || this;
|
|
675
|
+
_this._skyColor = new babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.Color4(0.15, 0.68, 1.0, 1.0);
|
|
676
|
+
_this._cloudColor = new babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.Color4(1, 1, 1, 1.0);
|
|
677
|
+
_this._amplitude = 1;
|
|
678
|
+
_this._numOctaves = 4;
|
|
679
|
+
_this.updateShaderUniforms();
|
|
680
|
+
return _this;
|
|
681
|
+
}
|
|
682
|
+
CloudProceduralTexture.prototype.updateShaderUniforms = function () {
|
|
683
|
+
this.setColor4("skyColor", this._skyColor);
|
|
684
|
+
this.setColor4("cloudColor", this._cloudColor);
|
|
685
|
+
this.setFloat("amplitude", this._amplitude);
|
|
686
|
+
this.setInt("numOctaves", this._numOctaves);
|
|
687
|
+
};
|
|
688
|
+
Object.defineProperty(CloudProceduralTexture.prototype, "skyColor", {
|
|
689
|
+
get: function () {
|
|
690
|
+
return this._skyColor;
|
|
691
|
+
},
|
|
692
|
+
set: function (value) {
|
|
693
|
+
this._skyColor = value;
|
|
694
|
+
this.updateShaderUniforms();
|
|
695
|
+
},
|
|
696
|
+
enumerable: false,
|
|
697
|
+
configurable: true
|
|
698
|
+
});
|
|
699
|
+
Object.defineProperty(CloudProceduralTexture.prototype, "cloudColor", {
|
|
700
|
+
get: function () {
|
|
701
|
+
return this._cloudColor;
|
|
702
|
+
},
|
|
703
|
+
set: function (value) {
|
|
704
|
+
this._cloudColor = value;
|
|
705
|
+
this.updateShaderUniforms();
|
|
706
|
+
},
|
|
707
|
+
enumerable: false,
|
|
708
|
+
configurable: true
|
|
709
|
+
});
|
|
710
|
+
Object.defineProperty(CloudProceduralTexture.prototype, "amplitude", {
|
|
711
|
+
get: function () {
|
|
712
|
+
return this._amplitude;
|
|
713
|
+
},
|
|
714
|
+
set: function (value) {
|
|
715
|
+
this._amplitude = value;
|
|
716
|
+
this.updateShaderUniforms();
|
|
717
|
+
},
|
|
718
|
+
enumerable: false,
|
|
719
|
+
configurable: true
|
|
720
|
+
});
|
|
721
|
+
Object.defineProperty(CloudProceduralTexture.prototype, "numOctaves", {
|
|
722
|
+
get: function () {
|
|
723
|
+
return this._numOctaves;
|
|
724
|
+
},
|
|
725
|
+
set: function (value) {
|
|
726
|
+
this._numOctaves = value;
|
|
727
|
+
this.updateShaderUniforms();
|
|
728
|
+
},
|
|
729
|
+
enumerable: false,
|
|
730
|
+
configurable: true
|
|
731
|
+
});
|
|
732
|
+
/**
|
|
733
|
+
* Serializes this cloud procedural texture
|
|
734
|
+
* @returns a serialized cloud procedural texture object
|
|
735
|
+
*/
|
|
736
|
+
CloudProceduralTexture.prototype.serialize = function () {
|
|
737
|
+
var serializationObject = babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.SerializationHelper.Serialize(this, _super.prototype.serialize.call(this));
|
|
738
|
+
serializationObject.customType = "BABYLON.CloudProceduralTexture";
|
|
739
|
+
return serializationObject;
|
|
740
|
+
};
|
|
741
|
+
/**
|
|
742
|
+
* Creates a Cloud Procedural Texture from parsed cloud procedural texture data
|
|
743
|
+
* @param parsedTexture defines parsed texture data
|
|
744
|
+
* @param scene defines the current scene
|
|
745
|
+
* @param rootUrl defines the root URL containing cloud procedural texture information
|
|
746
|
+
* @returns a parsed Cloud Procedural Texture
|
|
747
|
+
*/
|
|
748
|
+
CloudProceduralTexture.Parse = function (parsedTexture, scene, rootUrl) {
|
|
749
|
+
var texture = babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.SerializationHelper.Parse(function () { return new CloudProceduralTexture(parsedTexture.name, parsedTexture._size, scene, undefined, parsedTexture._generateMipMaps); }, parsedTexture, scene, rootUrl);
|
|
750
|
+
return texture;
|
|
751
|
+
};
|
|
752
|
+
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
753
|
+
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serializeAsColor4)()
|
|
754
|
+
], CloudProceduralTexture.prototype, "skyColor", null);
|
|
755
|
+
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
756
|
+
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serializeAsColor4)()
|
|
757
|
+
], CloudProceduralTexture.prototype, "cloudColor", null);
|
|
758
|
+
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
759
|
+
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serialize)()
|
|
760
|
+
], CloudProceduralTexture.prototype, "amplitude", null);
|
|
761
|
+
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
762
|
+
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serialize)()
|
|
763
|
+
], CloudProceduralTexture.prototype, "numOctaves", null);
|
|
764
|
+
return CloudProceduralTexture;
|
|
765
|
+
}(babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.ProceduralTexture));
|
|
766
|
+
|
|
767
|
+
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.RegisterClass)("BABYLON.CloudProceduralTexture", CloudProceduralTexture);
|
|
768
|
+
|
|
769
|
+
|
|
770
|
+
/***/ }),
|
|
771
|
+
|
|
772
|
+
/***/ "../../../dev/proceduralTextures/src/cloud/index.ts":
|
|
773
|
+
/*!**********************************************************!*\
|
|
774
|
+
!*** ../../../dev/proceduralTextures/src/cloud/index.ts ***!
|
|
775
|
+
\**********************************************************/
|
|
776
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
777
|
+
|
|
778
|
+
__webpack_require__.r(__webpack_exports__);
|
|
779
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
780
|
+
/* harmony export */ CloudProceduralTexture: () => (/* reexport safe */ _cloudProceduralTexture__WEBPACK_IMPORTED_MODULE_0__.CloudProceduralTexture)
|
|
781
|
+
/* harmony export */ });
|
|
782
|
+
/* harmony import */ var _cloudProceduralTexture__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./cloudProceduralTexture */ "../../../dev/proceduralTextures/src/cloud/cloudProceduralTexture.ts");
|
|
783
|
+
|
|
784
|
+
|
|
785
|
+
|
|
786
|
+
/***/ }),
|
|
787
|
+
|
|
788
|
+
/***/ "../../../dev/proceduralTextures/src/fire/fireProceduralTexture.fragment.ts":
|
|
789
|
+
/*!**********************************************************************************!*\
|
|
790
|
+
!*** ../../../dev/proceduralTextures/src/fire/fireProceduralTexture.fragment.ts ***!
|
|
791
|
+
\**********************************************************************************/
|
|
792
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
793
|
+
|
|
794
|
+
__webpack_require__.r(__webpack_exports__);
|
|
795
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
796
|
+
/* harmony export */ fireProceduralTexturePixelShader: () => (/* binding */ fireProceduralTexturePixelShader)
|
|
797
|
+
/* harmony export */ });
|
|
798
|
+
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Engines/shaderStore */ "babylonjs/Misc/decorators");
|
|
799
|
+
/* harmony import */ var babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__);
|
|
800
|
+
// Do not edit.
|
|
801
|
+
|
|
802
|
+
var name = "fireProceduralTexturePixelShader";
|
|
803
|
+
var shader = "precision highp float;uniform float time;uniform vec3 c1;uniform vec3 c2;uniform vec3 c3;uniform vec3 c4;uniform vec3 c5;uniform vec3 c6;uniform vec2 speed;uniform float shift;uniform float alphaThreshold;varying vec2 vUV;float rand(vec2 n) {return fract(cos(dot(n,vec2(12.9898,4.1414)))*43758.5453);}\nfloat noise(vec2 n) {const vec2 d=vec2(0.0,1.0);vec2 b=floor(n),f=smoothstep(vec2(0.0),vec2(1.0),fract(n));return mix(mix(rand(b),rand(b+d.yx),f.x),mix(rand(b+d.xy),rand(b+d.yy),f.x),f.y);}\nfloat fbm(vec2 n) {float total=0.0,amplitude=1.0;for (int i=0; i<4; i++) {total+=noise(n)*amplitude;n+=n;amplitude*=0.5;}\nreturn total;}\nvoid main() {vec2 p=vUV*8.0;float q=fbm(p-time*0.1);vec2 r=vec2(fbm(p+q+time*speed.x-p.x-p.y),fbm(p+q-time*speed.y));vec3 c=mix(c1,c2,fbm(p+r))+mix(c3,c4,r.x)-mix(c5,c6,r.y);vec3 color=c*cos(shift*vUV.y);float luminance=dot(color.rgb,vec3(0.3,0.59,0.11));gl_FragColor=vec4(color,luminance*alphaThreshold+(1.0-alphaThreshold));}";
|
|
804
|
+
// Sideeffect
|
|
805
|
+
babylonjs_Engines_shaderStore__WEBPACK_IMPORTED_MODULE_0__.ShaderStore.ShadersStore[name] = shader;
|
|
806
|
+
/** @internal */
|
|
807
|
+
var fireProceduralTexturePixelShader = { name: name, shader: shader };
|
|
808
|
+
|
|
809
|
+
|
|
810
|
+
/***/ }),
|
|
811
|
+
|
|
812
|
+
/***/ "../../../dev/proceduralTextures/src/fire/fireProceduralTexture.ts":
|
|
813
|
+
/*!*************************************************************************!*\
|
|
814
|
+
!*** ../../../dev/proceduralTextures/src/fire/fireProceduralTexture.ts ***!
|
|
815
|
+
\*************************************************************************/
|
|
816
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
817
|
+
|
|
818
|
+
__webpack_require__.r(__webpack_exports__);
|
|
819
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
820
|
+
/* harmony export */ FireProceduralTexture: () => (/* binding */ FireProceduralTexture)
|
|
374
821
|
/* harmony export */ });
|
|
375
822
|
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
|
|
376
823
|
/* harmony import */ var babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Misc/decorators");
|
|
@@ -1603,582 +2050,135 @@ var woodProceduralTexturePixelShader = { name: name, shader: shader };
|
|
|
1603
2050
|
__webpack_require__.r(__webpack_exports__);
|
|
1604
2051
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1605
2052
|
/* harmony export */ WoodProceduralTexture: () => (/* binding */ WoodProceduralTexture)
|
|
1606
|
-
/* harmony export */ });
|
|
1607
|
-
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
|
|
1608
|
-
/* harmony import */ var babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Misc/decorators");
|
|
1609
|
-
/* harmony import */ var babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__);
|
|
1610
|
-
/* harmony import */ var _woodProceduralTexture_fragment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./woodProceduralTexture.fragment */ "../../../dev/proceduralTextures/src/wood/woodProceduralTexture.fragment.ts");
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
var WoodProceduralTexture = /** @class */ (function (_super) {
|
|
1619
|
-
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__extends)(WoodProceduralTexture, _super);
|
|
1620
|
-
function WoodProceduralTexture(name, size, scene, fallbackTexture, generateMipMaps) {
|
|
1621
|
-
if (scene === void 0) { scene = null; }
|
|
1622
|
-
var _this = _super.call(this, name, size, "woodProceduralTexture", scene, fallbackTexture, generateMipMaps) || this;
|
|
1623
|
-
_this._ampScale = 100.0;
|
|
1624
|
-
_this._woodColor = new babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.Color3(0.32, 0.17, 0.09);
|
|
1625
|
-
_this.updateShaderUniforms();
|
|
1626
|
-
return _this;
|
|
1627
|
-
}
|
|
1628
|
-
WoodProceduralTexture.prototype.updateShaderUniforms = function () {
|
|
1629
|
-
this.setFloat("ampScale", this._ampScale);
|
|
1630
|
-
this.setColor3("woodColor", this._woodColor);
|
|
1631
|
-
};
|
|
1632
|
-
Object.defineProperty(WoodProceduralTexture.prototype, "ampScale", {
|
|
1633
|
-
get: function () {
|
|
1634
|
-
return this._ampScale;
|
|
1635
|
-
},
|
|
1636
|
-
set: function (value) {
|
|
1637
|
-
this._ampScale = value;
|
|
1638
|
-
this.updateShaderUniforms();
|
|
1639
|
-
},
|
|
1640
|
-
enumerable: false,
|
|
1641
|
-
configurable: true
|
|
1642
|
-
});
|
|
1643
|
-
Object.defineProperty(WoodProceduralTexture.prototype, "woodColor", {
|
|
1644
|
-
get: function () {
|
|
1645
|
-
return this._woodColor;
|
|
1646
|
-
},
|
|
1647
|
-
set: function (value) {
|
|
1648
|
-
this._woodColor = value;
|
|
1649
|
-
this.updateShaderUniforms();
|
|
1650
|
-
},
|
|
1651
|
-
enumerable: false,
|
|
1652
|
-
configurable: true
|
|
1653
|
-
});
|
|
1654
|
-
/**
|
|
1655
|
-
* Serializes this wood procedural texture
|
|
1656
|
-
* @returns a serialized wood procedural texture object
|
|
1657
|
-
*/
|
|
1658
|
-
WoodProceduralTexture.prototype.serialize = function () {
|
|
1659
|
-
var serializationObject = babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.SerializationHelper.Serialize(this, _super.prototype.serialize.call(this));
|
|
1660
|
-
serializationObject.customType = "BABYLON.WoodProceduralTexture";
|
|
1661
|
-
return serializationObject;
|
|
1662
|
-
};
|
|
1663
|
-
/**
|
|
1664
|
-
* Creates a Wood Procedural Texture from parsed wood procedural texture data
|
|
1665
|
-
* @param parsedTexture defines parsed texture data
|
|
1666
|
-
* @param scene defines the current scene
|
|
1667
|
-
* @param rootUrl defines the root URL containing wood procedural texture information
|
|
1668
|
-
* @returns a parsed Wood Procedural Texture
|
|
1669
|
-
*/
|
|
1670
|
-
WoodProceduralTexture.Parse = function (parsedTexture, scene, rootUrl) {
|
|
1671
|
-
var texture = babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.SerializationHelper.Parse(function () { return new WoodProceduralTexture(parsedTexture.name, parsedTexture._size, scene, undefined, parsedTexture._generateMipMaps); }, parsedTexture, scene, rootUrl);
|
|
1672
|
-
return texture;
|
|
1673
|
-
};
|
|
1674
|
-
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
1675
|
-
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serialize)()
|
|
1676
|
-
], WoodProceduralTexture.prototype, "ampScale", null);
|
|
1677
|
-
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
1678
|
-
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serializeAsColor3)()
|
|
1679
|
-
], WoodProceduralTexture.prototype, "woodColor", null);
|
|
1680
|
-
return WoodProceduralTexture;
|
|
1681
|
-
}(babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.ProceduralTexture));
|
|
1682
|
-
|
|
1683
|
-
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.RegisterClass)("BABYLON.WoodProceduralTexture", WoodProceduralTexture);
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
/***/ }),
|
|
1687
|
-
|
|
1688
|
-
/***/ "../../../lts/proceduralTextures/src/legacy/legacy.ts":
|
|
1689
|
-
/*!************************************************************!*\
|
|
1690
|
-
!*** ../../../lts/proceduralTextures/src/legacy/legacy.ts ***!
|
|
1691
|
-
\************************************************************/
|
|
1692
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1693
|
-
|
|
1694
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1695
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1696
|
-
/* harmony export */ BrickProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.BrickProceduralTexture),
|
|
1697
|
-
/* harmony export */ CloudProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.CloudProceduralTexture),
|
|
1698
|
-
/* harmony export */ FireProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.FireProceduralTexture),
|
|
1699
|
-
/* harmony export */ GrassProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.GrassProceduralTexture),
|
|
1700
|
-
/* harmony export */ MarbleProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.MarbleProceduralTexture),
|
|
1701
|
-
/* harmony export */ NormalMapProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.NormalMapProceduralTexture),
|
|
1702
|
-
/* harmony export */ PerlinNoiseProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.PerlinNoiseProceduralTexture),
|
|
1703
|
-
/* harmony export */ RoadProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.RoadProceduralTexture),
|
|
1704
|
-
/* harmony export */ StarfieldProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.StarfieldProceduralTexture),
|
|
1705
|
-
/* harmony export */ WoodProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.WoodProceduralTexture)
|
|
1706
|
-
/* harmony export */ });
|
|
1707
|
-
/* harmony import */ var procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! procedural-textures/index */ "../../../dev/proceduralTextures/src/index.ts");
|
|
1708
|
-
/* eslint-disable import/no-internal-modules */
|
|
1709
|
-
|
|
1710
|
-
/**
|
|
1711
|
-
* Legacy support, defining window.BABYLON.GridMaterial... (global variable).
|
|
1712
|
-
*
|
|
1713
|
-
* This is the entry point for the UMD module.
|
|
1714
|
-
* The entry point for a future ESM package should be index.ts
|
|
1715
|
-
*/
|
|
1716
|
-
var globalObject = typeof __webpack_require__.g !== "undefined" ? __webpack_require__.g : typeof window !== "undefined" ? window : undefined;
|
|
1717
|
-
if (typeof globalObject !== "undefined") {
|
|
1718
|
-
globalObject.BABYLON = globalObject.BABYLON || {};
|
|
1719
|
-
for (var mat in procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__) {
|
|
1720
|
-
globalObject.BABYLON[mat] = procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__[mat];
|
|
1721
|
-
}
|
|
1722
|
-
}
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
/***/ }),
|
|
1727
|
-
|
|
1728
|
-
/***/ "babylonjs/Misc/decorators":
|
|
1729
|
-
/*!****************************************************************************************************!*\
|
|
1730
|
-
!*** external {"root":"BABYLON","commonjs":"babylonjs","commonjs2":"babylonjs","amd":"babylonjs"} ***!
|
|
1731
|
-
\****************************************************************************************************/
|
|
1732
|
-
/***/ ((module) => {
|
|
1733
|
-
|
|
1734
|
-
module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Misc_decorators__;
|
|
1735
|
-
|
|
1736
|
-
/***/ }),
|
|
1737
|
-
|
|
1738
|
-
/***/ "../../../../node_modules/tslib/tslib.es6.mjs":
|
|
1739
|
-
/*!****************************************************!*\
|
|
1740
|
-
!*** ../../../../node_modules/tslib/tslib.es6.mjs ***!
|
|
1741
|
-
\****************************************************/
|
|
1742
|
-
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
|
|
1743
|
-
|
|
1744
|
-
__webpack_require__.r(__webpack_exports__);
|
|
1745
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
1746
|
-
/* harmony export */ __addDisposableResource: () => (/* binding */ __addDisposableResource),
|
|
1747
|
-
/* harmony export */ __assign: () => (/* binding */ __assign),
|
|
1748
|
-
/* harmony export */ __asyncDelegator: () => (/* binding */ __asyncDelegator),
|
|
1749
|
-
/* harmony export */ __asyncGenerator: () => (/* binding */ __asyncGenerator),
|
|
1750
|
-
/* harmony export */ __asyncValues: () => (/* binding */ __asyncValues),
|
|
1751
|
-
/* harmony export */ __await: () => (/* binding */ __await),
|
|
1752
|
-
/* harmony export */ __awaiter: () => (/* binding */ __awaiter),
|
|
1753
|
-
/* harmony export */ __classPrivateFieldGet: () => (/* binding */ __classPrivateFieldGet),
|
|
1754
|
-
/* harmony export */ __classPrivateFieldIn: () => (/* binding */ __classPrivateFieldIn),
|
|
1755
|
-
/* harmony export */ __classPrivateFieldSet: () => (/* binding */ __classPrivateFieldSet),
|
|
1756
|
-
/* harmony export */ __createBinding: () => (/* binding */ __createBinding),
|
|
1757
|
-
/* harmony export */ __decorate: () => (/* binding */ __decorate),
|
|
1758
|
-
/* harmony export */ __disposeResources: () => (/* binding */ __disposeResources),
|
|
1759
|
-
/* harmony export */ __esDecorate: () => (/* binding */ __esDecorate),
|
|
1760
|
-
/* harmony export */ __exportStar: () => (/* binding */ __exportStar),
|
|
1761
|
-
/* harmony export */ __extends: () => (/* binding */ __extends),
|
|
1762
|
-
/* harmony export */ __generator: () => (/* binding */ __generator),
|
|
1763
|
-
/* harmony export */ __importDefault: () => (/* binding */ __importDefault),
|
|
1764
|
-
/* harmony export */ __importStar: () => (/* binding */ __importStar),
|
|
1765
|
-
/* harmony export */ __makeTemplateObject: () => (/* binding */ __makeTemplateObject),
|
|
1766
|
-
/* harmony export */ __metadata: () => (/* binding */ __metadata),
|
|
1767
|
-
/* harmony export */ __param: () => (/* binding */ __param),
|
|
1768
|
-
/* harmony export */ __propKey: () => (/* binding */ __propKey),
|
|
1769
|
-
/* harmony export */ __read: () => (/* binding */ __read),
|
|
1770
|
-
/* harmony export */ __rest: () => (/* binding */ __rest),
|
|
1771
|
-
/* harmony export */ __rewriteRelativeImportExtension: () => (/* binding */ __rewriteRelativeImportExtension),
|
|
1772
|
-
/* harmony export */ __runInitializers: () => (/* binding */ __runInitializers),
|
|
1773
|
-
/* harmony export */ __setFunctionName: () => (/* binding */ __setFunctionName),
|
|
1774
|
-
/* harmony export */ __spread: () => (/* binding */ __spread),
|
|
1775
|
-
/* harmony export */ __spreadArray: () => (/* binding */ __spreadArray),
|
|
1776
|
-
/* harmony export */ __spreadArrays: () => (/* binding */ __spreadArrays),
|
|
1777
|
-
/* harmony export */ __values: () => (/* binding */ __values),
|
|
1778
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
1779
|
-
/* harmony export */ });
|
|
1780
|
-
/******************************************************************************
|
|
1781
|
-
Copyright (c) Microsoft Corporation.
|
|
1782
|
-
|
|
1783
|
-
Permission to use, copy, modify, and/or distribute this software for any
|
|
1784
|
-
purpose with or without fee is hereby granted.
|
|
1785
|
-
|
|
1786
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
1787
|
-
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
1788
|
-
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
1789
|
-
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
1790
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
1791
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
1792
|
-
PERFORMANCE OF THIS SOFTWARE.
|
|
1793
|
-
***************************************************************************** */
|
|
1794
|
-
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
1795
|
-
|
|
1796
|
-
var extendStatics = function(d, b) {
|
|
1797
|
-
extendStatics = Object.setPrototypeOf ||
|
|
1798
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
1799
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
1800
|
-
return extendStatics(d, b);
|
|
1801
|
-
};
|
|
1802
|
-
|
|
1803
|
-
function __extends(d, b) {
|
|
1804
|
-
if (typeof b !== "function" && b !== null)
|
|
1805
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
1806
|
-
extendStatics(d, b);
|
|
1807
|
-
function __() { this.constructor = d; }
|
|
1808
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
1809
|
-
}
|
|
1810
|
-
|
|
1811
|
-
var __assign = function() {
|
|
1812
|
-
__assign = Object.assign || function __assign(t) {
|
|
1813
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
1814
|
-
s = arguments[i];
|
|
1815
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
1816
|
-
}
|
|
1817
|
-
return t;
|
|
1818
|
-
}
|
|
1819
|
-
return __assign.apply(this, arguments);
|
|
1820
|
-
}
|
|
1821
|
-
|
|
1822
|
-
function __rest(s, e) {
|
|
1823
|
-
var t = {};
|
|
1824
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
1825
|
-
t[p] = s[p];
|
|
1826
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
1827
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
1828
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
1829
|
-
t[p[i]] = s[p[i]];
|
|
1830
|
-
}
|
|
1831
|
-
return t;
|
|
1832
|
-
}
|
|
1833
|
-
|
|
1834
|
-
function __decorate(decorators, target, key, desc) {
|
|
1835
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1836
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1837
|
-
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;
|
|
1838
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1839
|
-
}
|
|
1840
|
-
|
|
1841
|
-
function __param(paramIndex, decorator) {
|
|
1842
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
1843
|
-
}
|
|
1844
|
-
|
|
1845
|
-
function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
1846
|
-
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
1847
|
-
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
1848
|
-
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
1849
|
-
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
1850
|
-
var _, done = false;
|
|
1851
|
-
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
1852
|
-
var context = {};
|
|
1853
|
-
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
1854
|
-
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
1855
|
-
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
1856
|
-
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
1857
|
-
if (kind === "accessor") {
|
|
1858
|
-
if (result === void 0) continue;
|
|
1859
|
-
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
1860
|
-
if (_ = accept(result.get)) descriptor.get = _;
|
|
1861
|
-
if (_ = accept(result.set)) descriptor.set = _;
|
|
1862
|
-
if (_ = accept(result.init)) initializers.unshift(_);
|
|
1863
|
-
}
|
|
1864
|
-
else if (_ = accept(result)) {
|
|
1865
|
-
if (kind === "field") initializers.unshift(_);
|
|
1866
|
-
else descriptor[key] = _;
|
|
1867
|
-
}
|
|
1868
|
-
}
|
|
1869
|
-
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
1870
|
-
done = true;
|
|
1871
|
-
};
|
|
1872
|
-
|
|
1873
|
-
function __runInitializers(thisArg, initializers, value) {
|
|
1874
|
-
var useValue = arguments.length > 2;
|
|
1875
|
-
for (var i = 0; i < initializers.length; i++) {
|
|
1876
|
-
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
1877
|
-
}
|
|
1878
|
-
return useValue ? value : void 0;
|
|
1879
|
-
};
|
|
1880
|
-
|
|
1881
|
-
function __propKey(x) {
|
|
1882
|
-
return typeof x === "symbol" ? x : "".concat(x);
|
|
1883
|
-
};
|
|
1884
|
-
|
|
1885
|
-
function __setFunctionName(f, name, prefix) {
|
|
1886
|
-
if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
|
|
1887
|
-
return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
|
|
1888
|
-
};
|
|
1889
|
-
|
|
1890
|
-
function __metadata(metadataKey, metadataValue) {
|
|
1891
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
|
|
1892
|
-
}
|
|
1893
|
-
|
|
1894
|
-
function __awaiter(thisArg, _arguments, P, generator) {
|
|
1895
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
1896
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
1897
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
1898
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
1899
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
1900
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
1901
|
-
});
|
|
1902
|
-
}
|
|
1903
|
-
|
|
1904
|
-
function __generator(thisArg, body) {
|
|
1905
|
-
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);
|
|
1906
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
1907
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
1908
|
-
function step(op) {
|
|
1909
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
1910
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
1911
|
-
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;
|
|
1912
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
1913
|
-
switch (op[0]) {
|
|
1914
|
-
case 0: case 1: t = op; break;
|
|
1915
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
1916
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
1917
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
1918
|
-
default:
|
|
1919
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
1920
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
1921
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
1922
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
1923
|
-
if (t[2]) _.ops.pop();
|
|
1924
|
-
_.trys.pop(); continue;
|
|
1925
|
-
}
|
|
1926
|
-
op = body.call(thisArg, _);
|
|
1927
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
1928
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
1929
|
-
}
|
|
1930
|
-
}
|
|
1931
|
-
|
|
1932
|
-
var __createBinding = Object.create ? (function(o, m, k, k2) {
|
|
1933
|
-
if (k2 === undefined) k2 = k;
|
|
1934
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
1935
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
1936
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
1937
|
-
}
|
|
1938
|
-
Object.defineProperty(o, k2, desc);
|
|
1939
|
-
}) : (function(o, m, k, k2) {
|
|
1940
|
-
if (k2 === undefined) k2 = k;
|
|
1941
|
-
o[k2] = m[k];
|
|
1942
|
-
});
|
|
1943
|
-
|
|
1944
|
-
function __exportStar(m, o) {
|
|
1945
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);
|
|
1946
|
-
}
|
|
1947
|
-
|
|
1948
|
-
function __values(o) {
|
|
1949
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
1950
|
-
if (m) return m.call(o);
|
|
1951
|
-
if (o && typeof o.length === "number") return {
|
|
1952
|
-
next: function () {
|
|
1953
|
-
if (o && i >= o.length) o = void 0;
|
|
1954
|
-
return { value: o && o[i++], done: !o };
|
|
1955
|
-
}
|
|
1956
|
-
};
|
|
1957
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
1958
|
-
}
|
|
1959
|
-
|
|
1960
|
-
function __read(o, n) {
|
|
1961
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
1962
|
-
if (!m) return o;
|
|
1963
|
-
var i = m.call(o), r, ar = [], e;
|
|
1964
|
-
try {
|
|
1965
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
1966
|
-
}
|
|
1967
|
-
catch (error) { e = { error: error }; }
|
|
1968
|
-
finally {
|
|
1969
|
-
try {
|
|
1970
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
1971
|
-
}
|
|
1972
|
-
finally { if (e) throw e.error; }
|
|
1973
|
-
}
|
|
1974
|
-
return ar;
|
|
1975
|
-
}
|
|
1976
|
-
|
|
1977
|
-
/** @deprecated */
|
|
1978
|
-
function __spread() {
|
|
1979
|
-
for (var ar = [], i = 0; i < arguments.length; i++)
|
|
1980
|
-
ar = ar.concat(__read(arguments[i]));
|
|
1981
|
-
return ar;
|
|
1982
|
-
}
|
|
1983
|
-
|
|
1984
|
-
/** @deprecated */
|
|
1985
|
-
function __spreadArrays() {
|
|
1986
|
-
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
|
|
1987
|
-
for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
|
1988
|
-
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
|
1989
|
-
r[k] = a[j];
|
|
1990
|
-
return r;
|
|
1991
|
-
}
|
|
1992
|
-
|
|
1993
|
-
function __spreadArray(to, from, pack) {
|
|
1994
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
1995
|
-
if (ar || !(i in from)) {
|
|
1996
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
1997
|
-
ar[i] = from[i];
|
|
1998
|
-
}
|
|
1999
|
-
}
|
|
2000
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
2001
|
-
}
|
|
2002
|
-
|
|
2003
|
-
function __await(v) {
|
|
2004
|
-
return this instanceof __await ? (this.v = v, this) : new __await(v);
|
|
2005
|
-
}
|
|
2006
|
-
|
|
2007
|
-
function __asyncGenerator(thisArg, _arguments, generator) {
|
|
2008
|
-
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
2009
|
-
var g = generator.apply(thisArg, _arguments || []), i, q = [];
|
|
2010
|
-
return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;
|
|
2011
|
-
function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }
|
|
2012
|
-
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]); } }
|
|
2013
|
-
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
|
|
2014
|
-
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
|
|
2015
|
-
function fulfill(value) { resume("next", value); }
|
|
2016
|
-
function reject(value) { resume("throw", value); }
|
|
2017
|
-
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
|
|
2018
|
-
}
|
|
2053
|
+
/* harmony export */ });
|
|
2054
|
+
/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! tslib */ "../../../../node_modules/tslib/tslib.es6.mjs");
|
|
2055
|
+
/* harmony import */ var babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! babylonjs/Misc/typeStore */ "babylonjs/Misc/decorators");
|
|
2056
|
+
/* harmony import */ var babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__);
|
|
2057
|
+
/* harmony import */ var _woodProceduralTexture_fragment__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./woodProceduralTexture.fragment */ "../../../dev/proceduralTextures/src/wood/woodProceduralTexture.fragment.ts");
|
|
2019
2058
|
|
|
2020
|
-
function __asyncDelegator(o) {
|
|
2021
|
-
var i, p;
|
|
2022
|
-
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
|
|
2023
|
-
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; }
|
|
2024
|
-
}
|
|
2025
2059
|
|
|
2026
|
-
function __asyncValues(o) {
|
|
2027
|
-
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
2028
|
-
var m = o[Symbol.asyncIterator], i;
|
|
2029
|
-
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);
|
|
2030
|
-
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); }); }; }
|
|
2031
|
-
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
|
|
2032
|
-
}
|
|
2033
2060
|
|
|
2034
|
-
function __makeTemplateObject(cooked, raw) {
|
|
2035
|
-
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
2036
|
-
return cooked;
|
|
2037
|
-
};
|
|
2038
2061
|
|
|
2039
|
-
var __setModuleDefault = Object.create ? (function(o, v) {
|
|
2040
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
2041
|
-
}) : function(o, v) {
|
|
2042
|
-
o["default"] = v;
|
|
2043
|
-
};
|
|
2044
2062
|
|
|
2045
|
-
var ownKeys = function(o) {
|
|
2046
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
2047
|
-
var ar = [];
|
|
2048
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
2049
|
-
return ar;
|
|
2050
|
-
};
|
|
2051
|
-
return ownKeys(o);
|
|
2052
|
-
};
|
|
2053
2063
|
|
|
2054
|
-
function __importStar(mod) {
|
|
2055
|
-
if (mod && mod.__esModule) return mod;
|
|
2056
|
-
var result = {};
|
|
2057
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
2058
|
-
__setModuleDefault(result, mod);
|
|
2059
|
-
return result;
|
|
2060
|
-
}
|
|
2061
2064
|
|
|
2062
|
-
function
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
+
var WoodProceduralTexture = /** @class */ (function (_super) {
|
|
2066
|
+
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__extends)(WoodProceduralTexture, _super);
|
|
2067
|
+
function WoodProceduralTexture(name, size, scene, fallbackTexture, generateMipMaps) {
|
|
2068
|
+
if (scene === void 0) { scene = null; }
|
|
2069
|
+
var _this = _super.call(this, name, size, "woodProceduralTexture", scene, fallbackTexture, generateMipMaps) || this;
|
|
2070
|
+
_this._ampScale = 100.0;
|
|
2071
|
+
_this._woodColor = new babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.Color3(0.32, 0.17, 0.09);
|
|
2072
|
+
_this.updateShaderUniforms();
|
|
2073
|
+
return _this;
|
|
2074
|
+
}
|
|
2075
|
+
WoodProceduralTexture.prototype.updateShaderUniforms = function () {
|
|
2076
|
+
this.setFloat("ampScale", this._ampScale);
|
|
2077
|
+
this.setColor3("woodColor", this._woodColor);
|
|
2078
|
+
};
|
|
2079
|
+
Object.defineProperty(WoodProceduralTexture.prototype, "ampScale", {
|
|
2080
|
+
get: function () {
|
|
2081
|
+
return this._ampScale;
|
|
2082
|
+
},
|
|
2083
|
+
set: function (value) {
|
|
2084
|
+
this._ampScale = value;
|
|
2085
|
+
this.updateShaderUniforms();
|
|
2086
|
+
},
|
|
2087
|
+
enumerable: false,
|
|
2088
|
+
configurable: true
|
|
2089
|
+
});
|
|
2090
|
+
Object.defineProperty(WoodProceduralTexture.prototype, "woodColor", {
|
|
2091
|
+
get: function () {
|
|
2092
|
+
return this._woodColor;
|
|
2093
|
+
},
|
|
2094
|
+
set: function (value) {
|
|
2095
|
+
this._woodColor = value;
|
|
2096
|
+
this.updateShaderUniforms();
|
|
2097
|
+
},
|
|
2098
|
+
enumerable: false,
|
|
2099
|
+
configurable: true
|
|
2100
|
+
});
|
|
2101
|
+
/**
|
|
2102
|
+
* Serializes this wood procedural texture
|
|
2103
|
+
* @returns a serialized wood procedural texture object
|
|
2104
|
+
*/
|
|
2105
|
+
WoodProceduralTexture.prototype.serialize = function () {
|
|
2106
|
+
var serializationObject = babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.SerializationHelper.Serialize(this, _super.prototype.serialize.call(this));
|
|
2107
|
+
serializationObject.customType = "BABYLON.WoodProceduralTexture";
|
|
2108
|
+
return serializationObject;
|
|
2109
|
+
};
|
|
2110
|
+
/**
|
|
2111
|
+
* Creates a Wood Procedural Texture from parsed wood procedural texture data
|
|
2112
|
+
* @param parsedTexture defines parsed texture data
|
|
2113
|
+
* @param scene defines the current scene
|
|
2114
|
+
* @param rootUrl defines the root URL containing wood procedural texture information
|
|
2115
|
+
* @returns a parsed Wood Procedural Texture
|
|
2116
|
+
*/
|
|
2117
|
+
WoodProceduralTexture.Parse = function (parsedTexture, scene, rootUrl) {
|
|
2118
|
+
var texture = babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.SerializationHelper.Parse(function () { return new WoodProceduralTexture(parsedTexture.name, parsedTexture._size, scene, undefined, parsedTexture._generateMipMaps); }, parsedTexture, scene, rootUrl);
|
|
2119
|
+
return texture;
|
|
2120
|
+
};
|
|
2121
|
+
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
2122
|
+
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serialize)()
|
|
2123
|
+
], WoodProceduralTexture.prototype, "ampScale", null);
|
|
2124
|
+
(0,tslib__WEBPACK_IMPORTED_MODULE_2__.__decorate)([
|
|
2125
|
+
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.serializeAsColor3)()
|
|
2126
|
+
], WoodProceduralTexture.prototype, "woodColor", null);
|
|
2127
|
+
return WoodProceduralTexture;
|
|
2128
|
+
}(babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.ProceduralTexture));
|
|
2065
2129
|
|
|
2066
|
-
|
|
2067
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
2068
|
-
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");
|
|
2069
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
2070
|
-
}
|
|
2130
|
+
(0,babylonjs_Misc_decorators__WEBPACK_IMPORTED_MODULE_0__.RegisterClass)("BABYLON.WoodProceduralTexture", WoodProceduralTexture);
|
|
2071
2131
|
|
|
2072
|
-
function __classPrivateFieldSet(receiver, state, value, kind, f) {
|
|
2073
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
2074
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
2075
|
-
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");
|
|
2076
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
2077
|
-
}
|
|
2078
2132
|
|
|
2079
|
-
|
|
2080
|
-
if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object");
|
|
2081
|
-
return typeof state === "function" ? receiver === state : state.has(receiver);
|
|
2082
|
-
}
|
|
2133
|
+
/***/ }),
|
|
2083
2134
|
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
2090
|
-
dispose = value[Symbol.asyncDispose];
|
|
2091
|
-
}
|
|
2092
|
-
if (dispose === void 0) {
|
|
2093
|
-
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
2094
|
-
dispose = value[Symbol.dispose];
|
|
2095
|
-
if (async) inner = dispose;
|
|
2096
|
-
}
|
|
2097
|
-
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
2098
|
-
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
2099
|
-
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
2100
|
-
}
|
|
2101
|
-
else if (async) {
|
|
2102
|
-
env.stack.push({ async: true });
|
|
2103
|
-
}
|
|
2104
|
-
return value;
|
|
2105
|
-
}
|
|
2135
|
+
/***/ "../../../lts/proceduralTextures/src/legacy/legacy.ts":
|
|
2136
|
+
/*!************************************************************!*\
|
|
2137
|
+
!*** ../../../lts/proceduralTextures/src/legacy/legacy.ts ***!
|
|
2138
|
+
\************************************************************/
|
|
2139
|
+
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2106
2140
|
|
|
2107
|
-
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
|
|
2141
|
+
__webpack_require__.r(__webpack_exports__);
|
|
2142
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
2143
|
+
/* harmony export */ BrickProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.BrickProceduralTexture),
|
|
2144
|
+
/* harmony export */ CloudProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.CloudProceduralTexture),
|
|
2145
|
+
/* harmony export */ FireProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.FireProceduralTexture),
|
|
2146
|
+
/* harmony export */ GrassProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.GrassProceduralTexture),
|
|
2147
|
+
/* harmony export */ MarbleProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.MarbleProceduralTexture),
|
|
2148
|
+
/* harmony export */ NormalMapProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.NormalMapProceduralTexture),
|
|
2149
|
+
/* harmony export */ PerlinNoiseProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.PerlinNoiseProceduralTexture),
|
|
2150
|
+
/* harmony export */ RoadProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.RoadProceduralTexture),
|
|
2151
|
+
/* harmony export */ StarfieldProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.StarfieldProceduralTexture),
|
|
2152
|
+
/* harmony export */ WoodProceduralTexture: () => (/* reexport safe */ procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__.WoodProceduralTexture)
|
|
2153
|
+
/* harmony export */ });
|
|
2154
|
+
/* harmony import */ var procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! procedural-textures/index */ "../../../dev/proceduralTextures/src/index.ts");
|
|
2155
|
+
/* eslint-disable import/no-internal-modules */
|
|
2111
2156
|
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
|
|
2117
|
-
|
|
2118
|
-
|
|
2119
|
-
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
var result = r.dispose.call(r.value);
|
|
2124
|
-
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
2125
|
-
}
|
|
2126
|
-
else s |= 1;
|
|
2127
|
-
}
|
|
2128
|
-
catch (e) {
|
|
2129
|
-
fail(e);
|
|
2130
|
-
}
|
|
2157
|
+
/**
|
|
2158
|
+
* Legacy support, defining window.BABYLON.GridMaterial... (global variable).
|
|
2159
|
+
*
|
|
2160
|
+
* This is the entry point for the UMD module.
|
|
2161
|
+
* The entry point for a future ESM package should be index.ts
|
|
2162
|
+
*/
|
|
2163
|
+
var globalObject = typeof __webpack_require__.g !== "undefined" ? __webpack_require__.g : typeof window !== "undefined" ? window : undefined;
|
|
2164
|
+
if (typeof globalObject !== "undefined") {
|
|
2165
|
+
globalObject.BABYLON = globalObject.BABYLON || {};
|
|
2166
|
+
for (var mat in procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__) {
|
|
2167
|
+
globalObject.BABYLON[mat] = procedural_textures_index__WEBPACK_IMPORTED_MODULE_0__[mat];
|
|
2131
2168
|
}
|
|
2132
|
-
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
2133
|
-
if (env.hasError) throw env.error;
|
|
2134
|
-
}
|
|
2135
|
-
return next();
|
|
2136
2169
|
}
|
|
2137
2170
|
|
|
2138
|
-
function __rewriteRelativeImportExtension(path, preserveJsx) {
|
|
2139
|
-
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
2140
|
-
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
2141
|
-
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
2142
|
-
});
|
|
2143
|
-
}
|
|
2144
|
-
return path;
|
|
2145
|
-
}
|
|
2146
2171
|
|
|
2147
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
|
|
2148
|
-
__extends,
|
|
2149
|
-
__assign,
|
|
2150
|
-
__rest,
|
|
2151
|
-
__decorate,
|
|
2152
|
-
__param,
|
|
2153
|
-
__esDecorate,
|
|
2154
|
-
__runInitializers,
|
|
2155
|
-
__propKey,
|
|
2156
|
-
__setFunctionName,
|
|
2157
|
-
__metadata,
|
|
2158
|
-
__awaiter,
|
|
2159
|
-
__generator,
|
|
2160
|
-
__createBinding,
|
|
2161
|
-
__exportStar,
|
|
2162
|
-
__values,
|
|
2163
|
-
__read,
|
|
2164
|
-
__spread,
|
|
2165
|
-
__spreadArrays,
|
|
2166
|
-
__spreadArray,
|
|
2167
|
-
__await,
|
|
2168
|
-
__asyncGenerator,
|
|
2169
|
-
__asyncDelegator,
|
|
2170
|
-
__asyncValues,
|
|
2171
|
-
__makeTemplateObject,
|
|
2172
|
-
__importStar,
|
|
2173
|
-
__importDefault,
|
|
2174
|
-
__classPrivateFieldGet,
|
|
2175
|
-
__classPrivateFieldSet,
|
|
2176
|
-
__classPrivateFieldIn,
|
|
2177
|
-
__addDisposableResource,
|
|
2178
|
-
__disposeResources,
|
|
2179
|
-
__rewriteRelativeImportExtension,
|
|
2180
|
-
});
|
|
2181
2172
|
|
|
2173
|
+
/***/ }),
|
|
2174
|
+
|
|
2175
|
+
/***/ "babylonjs/Misc/decorators":
|
|
2176
|
+
/*!****************************************************************************************************!*\
|
|
2177
|
+
!*** external {"root":"BABYLON","commonjs":"babylonjs","commonjs2":"babylonjs","amd":"babylonjs"} ***!
|
|
2178
|
+
\****************************************************************************************************/
|
|
2179
|
+
/***/ ((module) => {
|
|
2180
|
+
|
|
2181
|
+
module.exports = __WEBPACK_EXTERNAL_MODULE_babylonjs_Misc_decorators__;
|
|
2182
2182
|
|
|
2183
2183
|
/***/ })
|
|
2184
2184
|
|
|
@@ -2285,4 +2285,4 @@ __webpack_exports__ = __webpack_exports__["default"];
|
|
|
2285
2285
|
/******/ })()
|
|
2286
2286
|
;
|
|
2287
2287
|
});
|
|
2288
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbmpzLnByb2NlZHVyYWxUZXh0dXJlcy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUVBO0FBQ0E7QUFjQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFBQTtBQU1BO0FBQUE7QUFDQTtBQU5BO0FBQ0E7QUFDQTtBQUNBO0FBSUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQU9BOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQWxFQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFtQ0E7QUFBQTtBQXRGQTtBQXdGQTs7Ozs7Ozs7Ozs7Ozs7OztBQ25HQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBRUE7QUFDQTtBQVlBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25CQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFFQTtBQUFBO0FBTUE7QUFBQTtBQUNBO0FBTkE7QUFDQTtBQUNBO0FBQ0E7QUFJQTs7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBT0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBbEVBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQW1DQTtBQUFBO0FBdEZBO0FBd0ZBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbkdBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFFQTtBQUFBO0FBT0E7QUFBQTtBQUNBO0FBUEE7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQUE7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBSkE7QUFNQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQU9BOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQXRGQTtBQURBO0FBR0E7QUFnQkE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBK0NBO0FBQUE7QUExSUE7QUE0SUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4SkE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFVQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqQkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFBQTtBQUlBO0FBQUE7QUFDQTtBQUhBO0FBS0E7QUFFQTs7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFoREE7QUFEQTtBQUdBO0FBK0NBO0FBQUE7QUE5RUE7QUFnRkE7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzRkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFrQkE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekJBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFHQTtBQUVBO0FBQUE7QUFNQTtBQUFBO0FBQ0E7QUFOQTtBQUNBO0FBQ0E7QUFDQTtBQUlBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFsRUE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBbUNBO0FBQUE7QUF0RkE7QUF3RkE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuR0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNaQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFBQTtBQUdBO0FBQUE7QUFDQTtBQUNBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFwQ0E7QUFEQTtBQUdBO0FBbUNBO0FBQUE7QUF0RUE7QUF3RUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRkE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFpREE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeERBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUFBO0FBWUE7QUFBQTtBQUNBO0FBWEE7QUFHQTtBQUdBO0FBRUE7QUFJQTs7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBcEVBO0FBREE7QUFDQTtBQUdBO0FBREE7QUFDQTtBQUdBO0FBREE7QUFDQTtBQStEQTtBQUFBO0FBdkVBO0FBeUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbEZBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFFQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEJBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQUE7QUFHQTtBQUFBO0FBQ0E7QUFIQTtBQUlBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFwQ0E7QUFEQTtBQUdBO0FBbUNBO0FBQUE7QUFsREE7QUFvREE7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5REE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkJBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUFBO0FBYUE7QUFBQTtBQUNBO0FBYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBT0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBeElBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQW1DQTtBQUFBO0FBMUtBO0FBNEtBOzs7Ozs7Ozs7Ozs7Ozs7O0FDckxBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFFQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakJBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQUE7QUFJQTtBQUFBO0FBQ0E7QUFKQTtBQUNBO0FBSUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUE5Q0E7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBbUNBO0FBQUE7QUE5REE7QUFnRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxRUE7QUFDQTtBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUNqQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7O0FDaFpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2JyaWNrL2JyaWNrUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnQudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2JyaWNrL2JyaWNrUHJvY2VkdXJhbFRleHR1cmUudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2JyaWNrL2luZGV4LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9jbG91ZC9jbG91ZFByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9jbG91ZC9jbG91ZFByb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9jbG91ZC9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvZmlyZS9maXJlUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnQudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2ZpcmUvZmlyZVByb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9maXJlL2luZGV4LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9ncmFzcy9ncmFzc1Byb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9ncmFzcy9ncmFzc1Byb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9ncmFzcy9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL21hcmJsZS9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvbWFyYmxlL21hcmJsZVByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9tYXJibGUvbWFyYmxlUHJvY2VkdXJhbFRleHR1cmUudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL25vcm1hbE1hcC9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvbm9ybWFsTWFwL25vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9ub3JtYWxNYXAvbm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmUudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL3Blcmxpbk5vaXNlL2luZGV4LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9wZXJsaW5Ob2lzZS9wZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9wZXJsaW5Ob2lzZS9wZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9yb2FkL2luZGV4LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9yb2FkL3JvYWRQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvcm9hZC9yb2FkUHJvY2VkdXJhbFRleHR1cmUudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL3N0YXJmaWVsZC9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvc3RhcmZpZWxkL3N0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9zdGFyZmllbGQvc3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmUudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL3dvb2QvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL3dvb2Qvd29vZFByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy93b29kL3dvb2RQcm9jZWR1cmFsVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vbHRzL3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvbGVnYWN5L2xlZ2FjeS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvZXh0ZXJuYWwgdW1kIHtcInJvb3RcIjpcIkJBQllMT05cIixcImNvbW1vbmpzXCI6XCJiYWJ5bG9uanNcIixcImNvbW1vbmpzMlwiOlwiYmFieWxvbmpzXCIsXCJhbWRcIjpcImJhYnlsb25qc1wifSIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5tanMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJiYWJ5bG9uanNcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJiYWJ5bG9uanMtcHJvY2VkdXJhbC10ZXh0dXJlc1wiLCBbXCJiYWJ5bG9uanNcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiYmFieWxvbmpzLXByb2NlZHVyYWwtdGV4dHVyZXNcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJiYWJ5bG9uanNcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlBST0NFRFVSQUxURVhUVVJFU1wiXSA9IGZhY3Rvcnkocm9vdFtcIkJBQllMT05cIl0pO1xufSkoKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0aGlzKSwgKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYmFieWxvbmpzX01pc2NfZGVjb3JhdG9yc19fKSA9PiB7XG5yZXR1cm4gIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwiYnJpY2tQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3ZhcnlpbmcgdmVjMiB2UG9zaXRpb247dmFyeWluZyB2ZWMyIHZVVjt1bmlmb3JtIGZsb2F0IG51bWJlck9mQnJpY2tzSGVpZ2h0O3VuaWZvcm0gZmxvYXQgbnVtYmVyT2ZCcmlja3NXaWR0aDt1bmlmb3JtIHZlYzMgYnJpY2tDb2xvcjt1bmlmb3JtIHZlYzMgam9pbnRDb2xvcjtmbG9hdCByYW5kKHZlYzIgbikge3JldHVybiBmcmFjdChjb3MoZG90KG4sdmVjMigxMi45ODk4LDQuMTQxNCkpKSo0Mzc1OC41NDUzKTt9XG5mbG9hdCBub2lzZSh2ZWMyIG4pIHtjb25zdCB2ZWMyIGQ9dmVjMigwLjAsMS4wKTt2ZWMyIGI9Zmxvb3IobiksZj1zbW9vdGhzdGVwKHZlYzIoMC4wKSx2ZWMyKDEuMCksZnJhY3QobikpO3JldHVybiBtaXgobWl4KHJhbmQoYikscmFuZChiK2QueXgpLGYueCksbWl4KHJhbmQoYitkLnh5KSxyYW5kKGIrZC55eSksZi54KSxmLnkpO31cbmZsb2F0IGZibSh2ZWMyIG4pIHtmbG9hdCB0b3RhbD0wLjAsYW1wbGl0dWRlPTEuMDtmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7dG90YWwrPW5vaXNlKG4pKmFtcGxpdHVkZTtuKz1uO2FtcGxpdHVkZSo9MC41O31cbnJldHVybiB0b3RhbDt9XG5mbG9hdCByb3VuZEYoZmxvYXQgbnVtYmVyKXtyZXR1cm4gc2lnbihudW1iZXIpKmZsb29yKGFicyhudW1iZXIpKzAuNSk7fVxuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfREVGSU5JVElPTlNcbnZvaWQgbWFpbih2b2lkKVxue2Zsb2F0IGJyaWNrVz0xLjAvbnVtYmVyT2ZCcmlja3NXaWR0aDtmbG9hdCBicmlja0g9MS4wL251bWJlck9mQnJpY2tzSGVpZ2h0O2Zsb2F0IGpvaW50V1BlcmNlbnRhZ2U9MC4wMTtmbG9hdCBqb2ludEhQZXJjZW50YWdlPTAuMDU7dmVjMyBjb2xvcj1icmlja0NvbG9yO2Zsb2F0IHlpPXZVVi55L2JyaWNrSDtmbG9hdCBueWk9cm91bmRGKHlpKTtmbG9hdCB4aT12VVYueC9icmlja1c7aWYgKG1vZChmbG9vcih5aSksMi4wKT09MC4wKXt4aT14aS0wLjU7fVxuZmxvYXQgbnhpPXJvdW5kRih4aSk7dmVjMiBicmlja3ZVVj12ZWMyKCh4aS1mbG9vcih4aSkpL2JyaWNrSCwoeWktZmxvb3IoeWkpKS8gYnJpY2tXKTtpZiAoeWk8bnlpK2pvaW50SFBlcmNlbnRhZ2UgJiYgeWk+bnlpLWpvaW50SFBlcmNlbnRhZ2Upe2NvbG9yPW1peChqb2ludENvbG9yLHZlYzMoMC4zNywwLjI1LDAuMjUpLCh5aS1ueWkpL2pvaW50SFBlcmNlbnRhZ2UrMC4yKTt9XG5lbHNlIGlmICh4aTxueGkram9pbnRXUGVyY2VudGFnZSAmJiB4aT5ueGktam9pbnRXUGVyY2VudGFnZSl7Y29sb3I9bWl4KGpvaW50Q29sb3IsdmVjMygwLjQ0LDAuNDQsMC40NCksKHhpLW54aSkvam9pbnRXUGVyY2VudGFnZSswLjIpO31cbmVsc2Uge2Zsb2F0IGJyaWNrQ29sb3JTd2l0Y2g9bW9kKGZsb29yKHlpKStmbG9vcih4aSksMy4wKTtpZiAoYnJpY2tDb2xvclN3aXRjaD09MC4wKVxuY29sb3I9bWl4KGNvbG9yLHZlYzMoMC4zMywwLjMzLDAuMzMpLDAuMyk7ZWxzZSBpZiAoYnJpY2tDb2xvclN3aXRjaD09Mi4wKVxuY29sb3I9bWl4KGNvbG9yLHZlYzMoMC4xMSwwLjExLDAuMTEpLDAuMyk7fVxuZ2xfRnJhZ0NvbG9yPXZlYzQoY29sb3IsMS4wKTt9YDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBicmlja1Byb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiaW1wb3J0IHsgc2VyaWFsaXplLCBzZXJpYWxpemVBc0NvbG9yMyB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHsgQ29sb3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC5jb2xvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5cclxuaW1wb3J0IFwiLi9icmlja1Byb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQnJpY2tQcm9jZWR1cmFsVGV4dHVyZSBleHRlbmRzIFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgIHByaXZhdGUgX251bWJlck9mQnJpY2tzSGVpZ2h0OiBudW1iZXIgPSAxNTtcclxuICAgIHByaXZhdGUgX251bWJlck9mQnJpY2tzV2lkdGg6IG51bWJlciA9IDU7XHJcbiAgICBwcml2YXRlIF9qb2ludENvbG9yID0gbmV3IENvbG9yMygwLjcyLCAwLjcyLCAwLjcyKTtcclxuICAgIHByaXZhdGUgX2JyaWNrQ29sb3IgPSBuZXcgQ29sb3IzKDAuNzcsIDAuNDcsIDAuNCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJicmlja1Byb2NlZHVyYWxUZXh0dXJlXCIsIHNjZW5lLCBmYWxsYmFja1RleHR1cmUsIGdlbmVyYXRlTWlwTWFwcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTaGFkZXJVbmlmb3JtcygpIHtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwibnVtYmVyT2ZCcmlja3NIZWlnaHRcIiwgdGhpcy5fbnVtYmVyT2ZCcmlja3NIZWlnaHQpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJudW1iZXJPZkJyaWNrc1dpZHRoXCIsIHRoaXMuX251bWJlck9mQnJpY2tzV2lkdGgpO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiYnJpY2tDb2xvclwiLCB0aGlzLl9icmlja0NvbG9yKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImpvaW50Q29sb3JcIiwgdGhpcy5fam9pbnRDb2xvcik7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IG51bWJlck9mQnJpY2tzSGVpZ2h0KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck9mQnJpY2tzSGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgbnVtYmVyT2ZCcmlja3NIZWlnaHQodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX251bWJlck9mQnJpY2tzSGVpZ2h0ID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBudW1iZXJPZkJyaWNrc1dpZHRoKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck9mQnJpY2tzV2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBudW1iZXJPZkJyaWNrc1dpZHRoKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9udW1iZXJPZkJyaWNrc1dpZHRoID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemVBc0NvbG9yMygpXHJcbiAgICBwdWJsaWMgZ2V0IGpvaW50Q29sb3IoKTogQ29sb3IzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fam9pbnRDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGpvaW50Q29sb3IodmFsdWU6IENvbG9yMykge1xyXG4gICAgICAgIHRoaXMuX2pvaW50Q29sb3IgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzQ29sb3IzKClcclxuICAgIHB1YmxpYyBnZXQgYnJpY2tDb2xvcigpOiBDb2xvcjMge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9icmlja0NvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYnJpY2tDb2xvcih2YWx1ZTogQ29sb3IzKSB7XHJcbiAgICAgICAgdGhpcy5fYnJpY2tDb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGl6ZXMgdGhpcyBicmljayBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCBicmljayBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5Ccmlja1Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEJyaWNrIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCBicmljayBwcm9jZWR1cmFsIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHBhcnNlZFRleHR1cmUgZGVmaW5lcyBwYXJzZWQgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgY3VycmVudCBzY2VuZVxyXG4gICAgICogQHBhcmFtIHJvb3RVcmwgZGVmaW5lcyB0aGUgcm9vdCBVUkwgY29udGFpbmluZyBicmljayBwcm9jZWR1cmFsIHRleHR1cmUgaW5mb3JtYXRpb25cclxuICAgICAqIEByZXR1cm5zIGEgcGFyc2VkIEJyaWNrIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBCcmlja1Byb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IEJyaWNrUHJvY2VkdXJhbFRleHR1cmUocGFyc2VkVGV4dHVyZS5uYW1lLCBwYXJzZWRUZXh0dXJlLl9zaXplLCBzY2VuZSwgdW5kZWZpbmVkLCBwYXJzZWRUZXh0dXJlLl9nZW5lcmF0ZU1pcE1hcHMpLFxyXG4gICAgICAgICAgICBwYXJzZWRUZXh0dXJlLFxyXG4gICAgICAgICAgICBzY2VuZSxcclxuICAgICAgICAgICAgcm9vdFVybFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWdpc3RlckNsYXNzKFwiQkFCWUxPTi5Ccmlja1Byb2NlZHVyYWxUZXh0dXJlXCIsIEJyaWNrUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9icmlja1Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcImNsb3VkUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHByZWNpc2lvbiBoaWdocCBmbG9hdDt2YXJ5aW5nIHZlYzIgdlVWO3VuaWZvcm0gdmVjNCBza3lDb2xvcjt1bmlmb3JtIHZlYzQgY2xvdWRDb2xvcjt1bmlmb3JtIGZsb2F0IGFtcGxpdHVkZTt1bmlmb3JtIGludCBudW1PY3RhdmVzO2Zsb2F0IHJhbmQodmVjMiBuKSB7cmV0dXJuIGZyYWN0KGNvcyhkb3Qobix2ZWMyKDEyLjk4OTgsNC4xNDE0KSkpKjQzNzU4LjU0NTMpO31cbmZsb2F0IG5vaXNlKHZlYzIgbikge2NvbnN0IHZlYzIgZD12ZWMyKDAuMCwxLjApO3ZlYzIgYj1mbG9vcihuKSxmPXNtb290aHN0ZXAodmVjMigwLjApLHZlYzIoMS4wKSxmcmFjdChuKSk7cmV0dXJuIG1peChtaXgocmFuZChiKSxyYW5kKGIrZC55eCksZi54KSxtaXgocmFuZChiK2QueHkpLHJhbmQoYitkLnl5KSxmLngpLGYueSk7fVxuZmxvYXQgZmJtKHZlYzIgbikge2Zsb2F0IHRvdGFsPTAuMCxhbXBsPWFtcGxpdHVkZTtcbiNpZmRlZiBXRUJHTDJcbmZvciAoaW50IGk9MDsgaTxudW1PY3RhdmVzOyBpKyspIHtcbiNlbHNlXG5mb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7XG4jZW5kaWZcbnRvdGFsKz1ub2lzZShuKSphbXBsO24rPW47YW1wbCo9MC41O31cbnJldHVybiB0b3RhbDt9XG52b2lkIG1haW4oKSB7dmVjMiBwPXZVVioxMi4wO3ZlYzQgYz1taXgoc2t5Q29sb3IsY2xvdWRDb2xvcixmYm0ocCkpO2dsX0ZyYWdDb2xvcj1jO31cbmA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3QgY2xvdWRQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImltcG9ydCB7IHNlcmlhbGl6ZSwgc2VyaWFsaXplQXNDb2xvcjQgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB7IENvbG9yNCB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJhbFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvUHJvY2VkdXJhbHMvcHJvY2VkdXJhbFRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuXHJcbmltcG9ydCBcIi4vY2xvdWRQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENsb3VkUHJvY2VkdXJhbFRleHR1cmUgZXh0ZW5kcyBQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICBwcml2YXRlIF9za3lDb2xvciA9IG5ldyBDb2xvcjQoMC4xNSwgMC42OCwgMS4wLCAxLjApO1xyXG4gICAgcHJpdmF0ZSBfY2xvdWRDb2xvciA9IG5ldyBDb2xvcjQoMSwgMSwgMSwgMS4wKTtcclxuICAgIHByaXZhdGUgX2FtcGxpdHVkZSA9IDE7XHJcbiAgICBwcml2YXRlIF9udW1PY3RhdmVzID0gNDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNpemU6IG51bWJlciwgc2NlbmU6IE51bGxhYmxlPFNjZW5lPiA9IG51bGwsIGZhbGxiYWNrVGV4dHVyZT86IFRleHR1cmUsIGdlbmVyYXRlTWlwTWFwcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzaXplLCBcImNsb3VkUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3I0KFwic2t5Q29sb3JcIiwgdGhpcy5fc2t5Q29sb3IpO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3I0KFwiY2xvdWRDb2xvclwiLCB0aGlzLl9jbG91ZENvbG9yKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiYW1wbGl0dWRlXCIsIHRoaXMuX2FtcGxpdHVkZSk7XHJcbiAgICAgICAgdGhpcy5zZXRJbnQoXCJudW1PY3RhdmVzXCIsIHRoaXMuX251bU9jdGF2ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemVBc0NvbG9yNCgpXHJcbiAgICBwdWJsaWMgZ2V0IHNreUNvbG9yKCk6IENvbG9yNCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NreUNvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2t5Q29sb3IodmFsdWU6IENvbG9yNCkge1xyXG4gICAgICAgIHRoaXMuX3NreUNvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemVBc0NvbG9yNCgpXHJcbiAgICBwdWJsaWMgZ2V0IGNsb3VkQ29sb3IoKTogQ29sb3I0IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2xvdWRDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGNsb3VkQ29sb3IodmFsdWU6IENvbG9yNCkge1xyXG4gICAgICAgIHRoaXMuX2Nsb3VkQ29sb3IgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGFtcGxpdHVkZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hbXBsaXR1ZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBhbXBsaXR1ZGUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2FtcGxpdHVkZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgbnVtT2N0YXZlcygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9udW1PY3RhdmVzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgbnVtT2N0YXZlcyh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fbnVtT2N0YXZlcyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGl6ZXMgdGhpcyBjbG91ZCBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCBjbG91ZCBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5DbG91ZFByb2NlZHVyYWxUZXh0dXJlXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIENsb3VkIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCBjbG91ZCBwcm9jZWR1cmFsIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHBhcnNlZFRleHR1cmUgZGVmaW5lcyBwYXJzZWQgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgY3VycmVudCBzY2VuZVxyXG4gICAgICogQHBhcmFtIHJvb3RVcmwgZGVmaW5lcyB0aGUgcm9vdCBVUkwgY29udGFpbmluZyBjbG91ZCBwcm9jZWR1cmFsIHRleHR1cmUgaW5mb3JtYXRpb25cclxuICAgICAqIEByZXR1cm5zIGEgcGFyc2VkIENsb3VkIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBDbG91ZFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IENsb3VkUHJvY2VkdXJhbFRleHR1cmUocGFyc2VkVGV4dHVyZS5uYW1lLCBwYXJzZWRUZXh0dXJlLl9zaXplLCBzY2VuZSwgdW5kZWZpbmVkLCBwYXJzZWRUZXh0dXJlLl9nZW5lcmF0ZU1pcE1hcHMpLFxyXG4gICAgICAgICAgICBwYXJzZWRUZXh0dXJlLFxyXG4gICAgICAgICAgICBzY2VuZSxcclxuICAgICAgICAgICAgcm9vdFVybFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWdpc3RlckNsYXNzKFwiQkFCWUxPTi5DbG91ZFByb2NlZHVyYWxUZXh0dXJlXCIsIENsb3VkUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9jbG91ZFByb2NlZHVyYWxUZXh0dXJlXCI7XHJcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcImZpcmVQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3VuaWZvcm0gZmxvYXQgdGltZTt1bmlmb3JtIHZlYzMgYzE7dW5pZm9ybSB2ZWMzIGMyO3VuaWZvcm0gdmVjMyBjMzt1bmlmb3JtIHZlYzMgYzQ7dW5pZm9ybSB2ZWMzIGM1O3VuaWZvcm0gdmVjMyBjNjt1bmlmb3JtIHZlYzIgc3BlZWQ7dW5pZm9ybSBmbG9hdCBzaGlmdDt1bmlmb3JtIGZsb2F0IGFscGhhVGhyZXNob2xkO3ZhcnlpbmcgdmVjMiB2VVY7ZmxvYXQgcmFuZCh2ZWMyIG4pIHtyZXR1cm4gZnJhY3QoY29zKGRvdChuLHZlYzIoMTIuOTg5OCw0LjE0MTQpKSkqNDM3NTguNTQ1Myk7fVxuZmxvYXQgbm9pc2UodmVjMiBuKSB7Y29uc3QgdmVjMiBkPXZlYzIoMC4wLDEuMCk7dmVjMiBiPWZsb29yKG4pLGY9c21vb3Roc3RlcCh2ZWMyKDAuMCksdmVjMigxLjApLGZyYWN0KG4pKTtyZXR1cm4gbWl4KG1peChyYW5kKGIpLHJhbmQoYitkLnl4KSxmLngpLG1peChyYW5kKGIrZC54eSkscmFuZChiK2QueXkpLGYueCksZi55KTt9XG5mbG9hdCBmYm0odmVjMiBuKSB7ZmxvYXQgdG90YWw9MC4wLGFtcGxpdHVkZT0xLjA7Zm9yIChpbnQgaT0wOyBpPDQ7IGkrKykge3RvdGFsKz1ub2lzZShuKSphbXBsaXR1ZGU7bis9bjthbXBsaXR1ZGUqPTAuNTt9XG5yZXR1cm4gdG90YWw7fVxudm9pZCBtYWluKCkge3ZlYzIgcD12VVYqOC4wO2Zsb2F0IHE9ZmJtKHAtdGltZSowLjEpO3ZlYzIgcj12ZWMyKGZibShwK3ErdGltZSpzcGVlZC54LXAueC1wLnkpLGZibShwK3EtdGltZSpzcGVlZC55KSk7dmVjMyBjPW1peChjMSxjMixmYm0ocCtyKSkrbWl4KGMzLGM0LHIueCktbWl4KGM1LGM2LHIueSk7dmVjMyBjb2xvcj1jKmNvcyhzaGlmdCp2VVYueSk7ZmxvYXQgbHVtaW5hbmNlPWRvdChjb2xvci5yZ2IsdmVjMygwLjMsMC41OSwwLjExKSk7Z2xfRnJhZ0NvbG9yPXZlYzQoY29sb3IsbHVtaW5hbmNlKmFscGhhVGhyZXNob2xkKygxLjAtYWxwaGFUaHJlc2hvbGQpKTt9YDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBmaXJlUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgeyBzZXJpYWxpemUsIHNlcmlhbGl6ZUFzVmVjdG9yMiB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gXCJjb3JlL01hdGhzL21hdGgudmVjdG9yXCI7XHJcbmltcG9ydCB7IENvbG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJhbFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvUHJvY2VkdXJhbHMvcHJvY2VkdXJhbFRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuXHJcbmltcG9ydCBcIi4vZmlyZVByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRmlyZVByb2NlZHVyYWxUZXh0dXJlIGV4dGVuZHMgUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgcHJpdmF0ZSBfdGltZTogbnVtYmVyID0gMC4wO1xyXG4gICAgcHJpdmF0ZSBfc3BlZWQgPSBuZXcgVmVjdG9yMigwLjUsIDAuMyk7XHJcbiAgICBwcml2YXRlIF9hdXRvR2VuZXJhdGVUaW1lOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX2ZpcmVDb2xvcnM6IENvbG9yM1tdO1xyXG4gICAgcHJpdmF0ZSBfYWxwaGFUaHJlc2hvbGQ6IG51bWJlciA9IDAuNTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNpemU6IG51bWJlciwgc2NlbmU6IE51bGxhYmxlPFNjZW5lPiA9IG51bGwsIGZhbGxiYWNrVGV4dHVyZT86IFRleHR1cmUsIGdlbmVyYXRlTWlwTWFwcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzaXplLCBcImZpcmVQcm9jZWR1cmFsVGV4dHVyZVwiLCBzY2VuZSwgZmFsbGJhY2tUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHMpO1xyXG4gICAgICAgIHRoaXMuX2ZpcmVDb2xvcnMgPSBGaXJlUHJvY2VkdXJhbFRleHR1cmUuUmVkRmlyZUNvbG9ycztcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJ0aW1lXCIsIHRoaXMuX3RpbWUpO1xyXG4gICAgICAgIHRoaXMuc2V0VmVjdG9yMihcInNwZWVkXCIsIHRoaXMuX3NwZWVkKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImMxXCIsIHRoaXMuX2ZpcmVDb2xvcnNbMF0pO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiYzJcIiwgdGhpcy5fZmlyZUNvbG9yc1sxXSk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJjM1wiLCB0aGlzLl9maXJlQ29sb3JzWzJdKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImM0XCIsIHRoaXMuX2ZpcmVDb2xvcnNbM10pO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiYzVcIiwgdGhpcy5fZmlyZUNvbG9yc1s0XSk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJjNlwiLCB0aGlzLl9maXJlQ29sb3JzWzVdKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiYWxwaGFUaHJlc2hvbGRcIiwgdGhpcy5fYWxwaGFUaHJlc2hvbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSByZW5kZXIodXNlQ2FtZXJhUG9zdFByb2Nlc3M/OiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3Qgc2NlbmUgPSB0aGlzLmdldFNjZW5lKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9HZW5lcmF0ZVRpbWUgJiYgc2NlbmUpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGltZSArPSBzY2VuZS5nZXRBbmltYXRpb25SYXRpbygpICogMC4wMztcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5yZW5kZXIodXNlQ2FtZXJhUG9zdFByb2Nlc3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IFB1cnBsZUZpcmVDb2xvcnMoKTogQ29sb3IzW10ge1xyXG4gICAgICAgIHJldHVybiBbbmV3IENvbG9yMygwLjUsIDAuMCwgMS4wKSwgbmV3IENvbG9yMygwLjksIDAuMCwgMS4wKSwgbmV3IENvbG9yMygwLjIsIDAuMCwgMS4wKSwgbmV3IENvbG9yMygxLjAsIDAuOSwgMS4wKSwgbmV3IENvbG9yMygwLjEsIDAuMSwgMS4wKSwgbmV3IENvbG9yMygwLjksIDAuOSwgMS4wKV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgR3JlZW5GaXJlQ29sb3JzKCk6IENvbG9yM1tdIHtcclxuICAgICAgICByZXR1cm4gW25ldyBDb2xvcjMoMC41LCAxLjAsIDAuMCksIG5ldyBDb2xvcjMoMC41LCAxLjAsIDAuMCksIG5ldyBDb2xvcjMoMC4zLCAwLjQsIDAuMCksIG5ldyBDb2xvcjMoMC41LCAxLjAsIDAuMCksIG5ldyBDb2xvcjMoMC4yLCAwLjAsIDAuMCksIG5ldyBDb2xvcjMoMC41LCAxLjAsIDAuMCldO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IFJlZEZpcmVDb2xvcnMoKTogQ29sb3IzW10ge1xyXG4gICAgICAgIHJldHVybiBbbmV3IENvbG9yMygwLjUsIDAuMCwgMC4xKSwgbmV3IENvbG9yMygwLjksIDAuMCwgMC4wKSwgbmV3IENvbG9yMygwLjIsIDAuMCwgMC4wKSwgbmV3IENvbG9yMygxLjAsIDAuOSwgMC4wKSwgbmV3IENvbG9yMygwLjEsIDAuMSwgMC4xKSwgbmV3IENvbG9yMygwLjksIDAuOSwgMC45KV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgQmx1ZUZpcmVDb2xvcnMoKTogQ29sb3IzW10ge1xyXG4gICAgICAgIHJldHVybiBbbmV3IENvbG9yMygwLjEsIDAuMCwgMC41KSwgbmV3IENvbG9yMygwLjAsIDAuMCwgMC41KSwgbmV3IENvbG9yMygwLjEsIDAuMCwgMC4yKSwgbmV3IENvbG9yMygwLjAsIDAuMCwgMS4wKSwgbmV3IENvbG9yMygwLjEsIDAuMiwgMC4zKSwgbmV3IENvbG9yMygwLjAsIDAuMiwgMC45KV07XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGF1dG9HZW5lcmF0ZVRpbWUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9HZW5lcmF0ZVRpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBhdXRvR2VuZXJhdGVUaW1lKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fYXV0b0dlbmVyYXRlVGltZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgZmlyZUNvbG9ycygpOiBDb2xvcjNbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpcmVDb2xvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBmaXJlQ29sb3JzKHZhbHVlOiBDb2xvcjNbXSkge1xyXG4gICAgICAgIHRoaXMuX2ZpcmVDb2xvcnMgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IHRpbWUoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdGltZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHRpbWUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX3RpbWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzVmVjdG9yMigpXHJcbiAgICBwdWJsaWMgZ2V0IHNwZWVkKCk6IFZlY3RvcjIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zcGVlZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNwZWVkKHZhbHVlOiBWZWN0b3IyKSB7XHJcbiAgICAgICAgdGhpcy5fc3BlZWQgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGFscGhhVGhyZXNob2xkKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FscGhhVGhyZXNob2xkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYWxwaGFUaHJlc2hvbGQodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2FscGhhVGhyZXNob2xkID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIGZpcmUgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgZmlyZSBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5GaXJlUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5maXJlQ29sb3JzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9maXJlQ29sb3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuZmlyZUNvbG9ycy5wdXNoKHRoaXMuX2ZpcmVDb2xvcnNbaV0uYXNBcnJheSgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZpcmUgUHJvY2VkdXJhbCBUZXh0dXJlIGZyb20gcGFyc2VkIGZpcmUgcHJvY2VkdXJhbCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBwYXJzZWRUZXh0dXJlIGRlZmluZXMgcGFyc2VkIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHNjZW5lIGRlZmluZXMgdGhlIGN1cnJlbnQgc2NlbmVcclxuICAgICAqIEBwYXJhbSByb290VXJsIGRlZmluZXMgdGhlIHJvb3QgVVJMIGNvbnRhaW5pbmcgZmlyZSBwcm9jZWR1cmFsIHRleHR1cmUgaW5mb3JtYXRpb25cclxuICAgICAqIEByZXR1cm5zIGEgcGFyc2VkIEZpcmUgUHJvY2VkdXJhbCBUZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2UocGFyc2VkVGV4dHVyZTogYW55LCBzY2VuZTogU2NlbmUsIHJvb3RVcmw6IHN0cmluZyk6IEZpcmVQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IFNlcmlhbGl6YXRpb25IZWxwZXIuUGFyc2UoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBGaXJlUHJvY2VkdXJhbFRleHR1cmUocGFyc2VkVGV4dHVyZS5uYW1lLCBwYXJzZWRUZXh0dXJlLl9zaXplLCBzY2VuZSwgdW5kZWZpbmVkLCBwYXJzZWRUZXh0dXJlLl9nZW5lcmF0ZU1pcE1hcHMpLFxyXG4gICAgICAgICAgICBwYXJzZWRUZXh0dXJlLFxyXG4gICAgICAgICAgICBzY2VuZSxcclxuICAgICAgICAgICAgcm9vdFVybFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbG9yczogQ29sb3IzW10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlZFRleHR1cmUuZmlyZUNvbG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb2xvcnMucHVzaChDb2xvcjMuRnJvbUFycmF5KHBhcnNlZFRleHR1cmUuZmlyZUNvbG9yc1tpXSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGV4dHVyZS5maXJlQ29sb3JzID0gY29sb3JzO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH1cclxufVxyXG5cclxuUmVnaXN0ZXJDbGFzcyhcIkJBQllMT04uRmlyZVByb2NlZHVyYWxUZXh0dXJlXCIsIEZpcmVQcm9jZWR1cmFsVGV4dHVyZSk7XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL2ZpcmVQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJncmFzc1Byb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dmFyeWluZyB2ZWMyIHZQb3NpdGlvbjt2YXJ5aW5nIHZlYzIgdlVWO3VuaWZvcm0gdmVjMyBoZXJiMUNvbG9yO3VuaWZvcm0gdmVjMyBoZXJiMkNvbG9yO3VuaWZvcm0gdmVjMyBoZXJiM0NvbG9yO3VuaWZvcm0gdmVjMyBncm91bmRDb2xvcjtmbG9hdCByYW5kKHZlYzIgbikge3JldHVybiBmcmFjdChjb3MoZG90KG4sdmVjMigxMi45ODk4LDQuMTQxNCkpKSo0Mzc1OC41NDUzKTt9XG5mbG9hdCBub2lzZSh2ZWMyIG4pIHtjb25zdCB2ZWMyIGQ9dmVjMigwLjAsMS4wKTt2ZWMyIGI9Zmxvb3IobiksZj1zbW9vdGhzdGVwKHZlYzIoMC4wKSx2ZWMyKDEuMCksZnJhY3QobikpO3JldHVybiBtaXgobWl4KHJhbmQoYikscmFuZChiK2QueXgpLGYueCksbWl4KHJhbmQoYitkLnh5KSxyYW5kKGIrZC55eSksZi54KSxmLnkpO31cbmZsb2F0IGZibSh2ZWMyIG4pIHtmbG9hdCB0b3RhbD0wLjAsYW1wbGl0dWRlPTEuMDtmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7dG90YWwrPW5vaXNlKG4pKmFtcGxpdHVkZTtuKz1uO2FtcGxpdHVkZSo9MC41O31cbnJldHVybiB0b3RhbDt9XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9ERUZJTklUSU9OU1xudm9pZCBtYWluKHZvaWQpIHtcbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fQkVHSU5cbnZlYzMgY29sb3I9bWl4KGdyb3VuZENvbG9yLGhlcmIxQ29sb3IscmFuZChnbF9GcmFnQ29vcmQueHkqNC4wKSk7Y29sb3I9bWl4KGNvbG9yLGhlcmIyQ29sb3IscmFuZChnbF9GcmFnQ29vcmQueHkqOC4wKSk7Y29sb3I9bWl4KGNvbG9yLGhlcmIzQ29sb3IscmFuZChnbF9GcmFnQ29vcmQueHkpKTtjb2xvcj1taXgoY29sb3IsaGVyYjFDb2xvcixmYm0oZ2xfRnJhZ0Nvb3JkLnh5KjE2LjApKTtnbF9GcmFnQ29sb3I9dmVjNChjb2xvciwxLjApO1xuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfTUFJTl9FTkRcbn1gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IGdyYXNzUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgeyBzZXJpYWxpemVBc0NvbG9yMyB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHsgQ29sb3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC5jb2xvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5cclxuaW1wb3J0IFwiLi9ncmFzc1Byb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgR3Jhc3NQcm9jZWR1cmFsVGV4dHVyZSBleHRlbmRzIFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgIHByaXZhdGUgX2dyYXNzQ29sb3JzOiBDb2xvcjNbXTtcclxuICAgIHByaXZhdGUgX2dyb3VuZENvbG9yID0gbmV3IENvbG9yMygxLCAxLCAxKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNpemU6IG51bWJlciwgc2NlbmU6IE51bGxhYmxlPFNjZW5lPiA9IG51bGwsIGZhbGxiYWNrVGV4dHVyZT86IFRleHR1cmUsIGdlbmVyYXRlTWlwTWFwcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzaXplLCBcImdyYXNzUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZ3Jhc3NDb2xvcnMgPSBbbmV3IENvbG9yMygwLjI5LCAwLjM4LCAwLjAyKSwgbmV3IENvbG9yMygwLjM2LCAwLjQ5LCAwLjA5KSwgbmV3IENvbG9yMygwLjUxLCAwLjYsIDAuMjgpXTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTaGFkZXJVbmlmb3JtcygpIHtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImhlcmIxQ29sb3JcIiwgdGhpcy5fZ3Jhc3NDb2xvcnNbMF0pO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiaGVyYjJDb2xvclwiLCB0aGlzLl9ncmFzc0NvbG9yc1sxXSk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJoZXJiM0NvbG9yXCIsIHRoaXMuX2dyYXNzQ29sb3JzWzJdKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImdyb3VuZENvbG9yXCIsIHRoaXMuX2dyb3VuZENvbG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGdyYXNzQ29sb3JzKCk6IENvbG9yM1tdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ3Jhc3NDb2xvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBncmFzc0NvbG9ycyh2YWx1ZTogQ29sb3IzW10pIHtcclxuICAgICAgICB0aGlzLl9ncmFzc0NvbG9ycyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplQXNDb2xvcjMoKVxyXG4gICAgcHVibGljIGdldCBncm91bmRDb2xvcigpOiBDb2xvcjMge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91bmRDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGdyb3VuZENvbG9yKHZhbHVlOiBDb2xvcjMpIHtcclxuICAgICAgICB0aGlzLl9ncm91bmRDb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGl6ZXMgdGhpcyBncmFzcyBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCBncmFzcyBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5HcmFzc1Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcblxyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuZ3Jhc3NDb2xvcnMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2dyYXNzQ29sb3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuZ3Jhc3NDb2xvcnMucHVzaCh0aGlzLl9ncmFzc0NvbG9yc1tpXS5hc0FycmF5KCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgR3Jhc3MgUHJvY2VkdXJhbCBUZXh0dXJlIGZyb20gcGFyc2VkIGdyYXNzIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gcGFyc2VkVGV4dHVyZSBkZWZpbmVzIHBhcnNlZCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBzY2VuZSBkZWZpbmVzIHRoZSBjdXJyZW50IHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcm9vdFVybCBkZWZpbmVzIHRoZSByb290IFVSTCBjb250YWluaW5nIGdyYXNzIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgR3Jhc3MgUHJvY2VkdXJhbCBUZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2UocGFyc2VkVGV4dHVyZTogYW55LCBzY2VuZTogU2NlbmUsIHJvb3RVcmw6IHN0cmluZyk6IEdyYXNzUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBTZXJpYWxpemF0aW9uSGVscGVyLlBhcnNlKFxyXG4gICAgICAgICAgICAoKSA9PiBuZXcgR3Jhc3NQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29sb3JzOiBDb2xvcjNbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyc2VkVGV4dHVyZS5ncmFzc0NvbG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb2xvcnMucHVzaChDb2xvcjMuRnJvbUFycmF5KHBhcnNlZFRleHR1cmUuZ3Jhc3NDb2xvcnNbaV0pKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRleHR1cmUuZ3Jhc3NDb2xvcnMgPSBjb2xvcnM7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWdpc3RlckNsYXNzKFwiQkFCWUxPTi5HcmFzc1Byb2NlZHVyYWxUZXh0dXJlXCIsIEdyYXNzUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9ncmFzc1Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzICovXHJcbmV4cG9ydCAqIGZyb20gXCIuL2JyaWNrL2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL2Nsb3VkL2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL2ZpcmUvaW5kZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vZ3Jhc3MvaW5kZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vbWFyYmxlL2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL25vcm1hbE1hcC9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9wZXJsaW5Ob2lzZS9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9yb2FkL2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3N0YXJmaWVsZC9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi93b29kL2luZGV4XCI7XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL21hcmJsZVByb2NlZHVyYWxUZXh0dXJlXCI7XHJcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcIm1hcmJsZVByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dmFyeWluZyB2ZWMyIHZQb3NpdGlvbjt2YXJ5aW5nIHZlYzIgdlVWO3VuaWZvcm0gZmxvYXQgbnVtYmVyT2ZUaWxlc0hlaWdodDt1bmlmb3JtIGZsb2F0IG51bWJlck9mVGlsZXNXaWR0aDt1bmlmb3JtIGZsb2F0IGFtcGxpdHVkZTt1bmlmb3JtIHZlYzMgbWFyYmxlQ29sb3I7dW5pZm9ybSB2ZWMzIGpvaW50Q29sb3I7Y29uc3QgdmVjMyB0aWxlU2l6ZT12ZWMzKDEuMSwxLjAsMS4xKTtjb25zdCB2ZWMzIHRpbGVQY3Q9dmVjMygwLjk4LDEuMCwwLjk4KTtmbG9hdCByYW5kKHZlYzIgbikge3JldHVybiBmcmFjdChjb3MoZG90KG4sdmVjMigxMi45ODk4LDQuMTQxNCkpKSo0Mzc1OC41NDUzKTt9XG5mbG9hdCBub2lzZSh2ZWMyIG4pIHtjb25zdCB2ZWMyIGQ9dmVjMigwLjAsMS4wKTt2ZWMyIGI9Zmxvb3IobiksZj1zbW9vdGhzdGVwKHZlYzIoMC4wKSx2ZWMyKDEuMCksZnJhY3QobikpO3JldHVybiBtaXgobWl4KHJhbmQoYikscmFuZChiK2QueXgpLGYueCksbWl4KHJhbmQoYitkLnh5KSxyYW5kKGIrZC55eSksZi54KSxmLnkpO31cbmZsb2F0IHR1cmJ1bGVuY2UodmVjMiBQKVxue2Zsb2F0IHZhbD0wLjA7ZmxvYXQgZnJlcT0xLjA7Zm9yIChpbnQgaT0wOyBpPDQ7IGkrKylcbnt2YWwrPWFicyhub2lzZShQKmZyZXEpL2ZyZXEpO2ZyZXEqPTIuMDc7fVxucmV0dXJuIHZhbDt9XG5mbG9hdCByb3VuZEYoZmxvYXQgbnVtYmVyKXtyZXR1cm4gc2lnbihudW1iZXIpKmZsb29yKGFicyhudW1iZXIpKzAuNSk7fVxudmVjMyBtYXJibGVfY29sb3IoZmxvYXQgeClcbnt2ZWMzIGNvbDt4PTAuNSooeCsxLik7eD1zcXJ0KHgpOyBcbng9c3FydCh4KTt4PXNxcnQoeCk7Y29sPXZlYzMoLjIrLjc1KngpOyBcbmNvbC5iKj0wLjk1OyBcbnJldHVybiBjb2w7fVxudm9pZCBtYWluKClcbntmbG9hdCBicmlja1c9MS4wL251bWJlck9mVGlsZXNXaWR0aDtmbG9hdCBicmlja0g9MS4wL251bWJlck9mVGlsZXNIZWlnaHQ7ZmxvYXQgam9pbnRXUGVyY2VudGFnZT0wLjAxO2Zsb2F0IGpvaW50SFBlcmNlbnRhZ2U9MC4wMTt2ZWMzIGNvbG9yPW1hcmJsZUNvbG9yO2Zsb2F0IHlpPXZVVi55L2JyaWNrSDtmbG9hdCBueWk9cm91bmRGKHlpKTtmbG9hdCB4aT12VVYueC9icmlja1c7aWYgKG1vZChmbG9vcih5aSksMi4wKT09MC4wKXt4aT14aS0wLjU7fVxuZmxvYXQgbnhpPXJvdW5kRih4aSk7dmVjMiBicmlja3ZVVj12ZWMyKCh4aS1mbG9vcih4aSkpL2JyaWNrSCwoeWktZmxvb3IoeWkpKS9icmlja1cpO2lmICh5aTxueWkram9pbnRIUGVyY2VudGFnZSAmJiB5aT5ueWktam9pbnRIUGVyY2VudGFnZSl7Y29sb3I9bWl4KGpvaW50Q29sb3IsdmVjMygwLjM3LDAuMjUsMC4yNSksKHlpLW55aSkvam9pbnRIUGVyY2VudGFnZSswLjIpO31cbmVsc2UgaWYgKHhpPG54aStqb2ludFdQZXJjZW50YWdlICYmIHhpPm54aS1qb2ludFdQZXJjZW50YWdlKXtjb2xvcj1taXgoam9pbnRDb2xvcix2ZWMzKDAuNDQsMC40NCwwLjQ0KSwoeGktbnhpKS9qb2ludFdQZXJjZW50YWdlKzAuMik7fVxuZWxzZSB7ZmxvYXQgdD02LjI4KmJyaWNrdlVWLngvKHRpbGVTaXplLngrbm9pc2UodmVjMih2VVYpKjYuMCkpO3QrPWFtcGxpdHVkZSp0dXJidWxlbmNlKGJyaWNrdlVWLnh5KTt0PXNpbih0KTtjb2xvcj1tYXJibGVfY29sb3IodCk7fVxuZ2xfRnJhZ0NvbG9yPXZlYzQoY29sb3IsMC4wKTt9YDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBtYXJibGVQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImltcG9ydCB7IHNlcmlhbGl6ZSB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHsgQ29sb3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC5jb2xvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5cclxuaW1wb3J0IFwiLi9tYXJibGVQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1hcmJsZVByb2NlZHVyYWxUZXh0dXJlIGV4dGVuZHMgUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgcHJpdmF0ZSBfbnVtYmVyT2ZUaWxlc0hlaWdodDogbnVtYmVyID0gMztcclxuICAgIHByaXZhdGUgX251bWJlck9mVGlsZXNXaWR0aDogbnVtYmVyID0gMztcclxuICAgIHByaXZhdGUgX2FtcGxpdHVkZTogbnVtYmVyID0gOS4wO1xyXG4gICAgcHJpdmF0ZSBfam9pbnRDb2xvciA9IG5ldyBDb2xvcjMoMC43MiwgMC43MiwgMC43Mik7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJtYXJibGVQcm9jZWR1cmFsVGV4dHVyZVwiLCBzY2VuZSwgZmFsbGJhY2tUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHMpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2hhZGVyVW5pZm9ybXMoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcIm51bWJlck9mVGlsZXNIZWlnaHRcIiwgdGhpcy5fbnVtYmVyT2ZUaWxlc0hlaWdodCk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcIm51bWJlck9mVGlsZXNXaWR0aFwiLCB0aGlzLl9udW1iZXJPZlRpbGVzV2lkdGgpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJhbXBsaXR1ZGVcIiwgdGhpcy5fYW1wbGl0dWRlKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImpvaW50Q29sb3JcIiwgdGhpcy5fam9pbnRDb2xvcik7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IG51bWJlck9mVGlsZXNIZWlnaHQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZUaWxlc0hlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IG51bWJlck9mVGlsZXNIZWlnaHQodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX251bWJlck9mVGlsZXNIZWlnaHQgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGFtcGxpdHVkZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hbXBsaXR1ZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBhbXBsaXR1ZGUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2FtcGxpdHVkZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgbnVtYmVyT2ZUaWxlc1dpZHRoKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck9mVGlsZXNXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IG51bWJlck9mVGlsZXNXaWR0aCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fbnVtYmVyT2ZUaWxlc1dpZHRoID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBqb2ludENvbG9yKCk6IENvbG9yMyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2pvaW50Q29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBqb2ludENvbG9yKHZhbHVlOiBDb2xvcjMpIHtcclxuICAgICAgICB0aGlzLl9qb2ludENvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIG1hcmJsZSBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCBtYXJibGUgcHJvY2VkdXJhbCB0ZXh0dXJlIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk9iamVjdCA9IFNlcmlhbGl6YXRpb25IZWxwZXIuU2VyaWFsaXplKHRoaXMsIHN1cGVyLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmN1c3RvbVR5cGUgPSBcIkJBQllMT04uTWFyYmxlUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgTWFyYmxlIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCBtYXJibGUgcHJvY2VkdXJhbCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBwYXJzZWRUZXh0dXJlIGRlZmluZXMgcGFyc2VkIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHNjZW5lIGRlZmluZXMgdGhlIGN1cnJlbnQgc2NlbmVcclxuICAgICAqIEBwYXJhbSByb290VXJsIGRlZmluZXMgdGhlIHJvb3QgVVJMIGNvbnRhaW5pbmcgbWFyYmxlIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgTWFyYmxlIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBNYXJibGVQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IFNlcmlhbGl6YXRpb25IZWxwZXIuUGFyc2UoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBNYXJibGVQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLk1hcmJsZVByb2NlZHVyYWxUZXh0dXJlXCIsIE1hcmJsZVByb2NlZHVyYWxUZXh0dXJlKTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vbm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwibm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHByZWNpc2lvbiBoaWdocCBmbG9hdDt1bmlmb3JtIHNhbXBsZXIyRCBiYXNlU2FtcGxlcjt1bmlmb3JtIGZsb2F0IHNpemU7dmFyeWluZyB2ZWMyIHZVVjtjb25zdCB2ZWMzIExVTUFfQ09FRkZJQ0lFTlQ9dmVjMygwLjIxMjYsMC43MTUyLDAuMDcyMik7ZmxvYXQgbHVtYUF0Q29vcmQodmVjMiBjb29yZClcbnt2ZWMzIHBpeGVsPXRleHR1cmUyRChiYXNlU2FtcGxlcixjb29yZCkucmdiO2Zsb2F0IGx1bWE9ZG90KHBpeGVsLExVTUFfQ09FRkZJQ0lFTlQpO3JldHVybiBsdW1hO31cbnZvaWQgbWFpbigpXG57ZmxvYXQgbHVtYVUwPWx1bWFBdENvb3JkKHZVVit2ZWMyKC0xLjAsIDAuMCkvc2l6ZSk7ZmxvYXQgbHVtYVUxPWx1bWFBdENvb3JkKHZVVit2ZWMyKCAxLjAsIDAuMCkvc2l6ZSk7ZmxvYXQgbHVtYVYwPWx1bWFBdENvb3JkKHZVVit2ZWMyKCAwLjAsLTEuMCkvc2l6ZSk7ZmxvYXQgbHVtYVYxPWx1bWFBdENvb3JkKHZVVit2ZWMyKCAwLjAsIDEuMCkvc2l6ZSk7dmVjMiBzbG9wZT0odmVjMihsdW1hVTAtbHVtYVUxLGx1bWFWMC1sdW1hVjEpKzEuMCkqMC41O2dsX0ZyYWdDb2xvcj12ZWM0KHNsb3BlLDEuMCwxLjApO31cbmA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3Qgbm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgeyBzZXJpYWxpemVBc1RleHR1cmUgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB0eXBlIHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyYWxUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL1Byb2NlZHVyYWxzL3Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBSZWdpc3RlckNsYXNzIH0gZnJvbSBcImNvcmUvTWlzYy90eXBlU3RvcmVcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcbmltcG9ydCBcIi4vbm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBOb3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZSBleHRlbmRzIFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgIHByaXZhdGUgX2Jhc2VUZXh0dXJlOiBUZXh0dXJlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBzY2VuZTogTnVsbGFibGU8U2NlbmU+ID0gbnVsbCwgZmFsbGJhY2tUZXh0dXJlPzogVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzPzogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHNpemUsIFwibm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0VGV4dHVyZShcImJhc2VTYW1wbGVyXCIsIHRoaXMuX2Jhc2VUZXh0dXJlKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwic2l6ZVwiLCB0aGlzLmdldFJlbmRlclNpemUoKSBhcyBudW1iZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSByZW5kZXIodXNlQ2FtZXJhUG9zdFByb2Nlc3M/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIucmVuZGVyKHVzZUNhbWVyYVBvc3RQcm9jZXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVzaXplKHNpemU6IGFueSwgZ2VuZXJhdGVNaXBNYXBzOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5yZXNpemUoc2l6ZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuXHJcbiAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIFwic2l6ZVwiIHVuaWZvcm1cclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGlzUmVhZHkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9iYXNlVGV4dHVyZSB8fCAhdGhpcy5fYmFzZVRleHR1cmUuaXNSZWFkeSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzdXBlci5pc1JlYWR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzVGV4dHVyZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGJhc2VUZXh0dXJlKCk6IFRleHR1cmUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9iYXNlVGV4dHVyZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGJhc2VUZXh0dXJlKHRleHR1cmU6IFRleHR1cmUpIHtcclxuICAgICAgICB0aGlzLl9iYXNlVGV4dHVyZSA9IHRleHR1cmU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIG5vcm1hbCBtYXAgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgbm9ybWFsIG1hcCBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5Ob3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5cclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbk9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBOb3JtYWwgTWFwIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCBub3JtYWwgbWFwIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gcGFyc2VkVGV4dHVyZSBkZWZpbmVzIHBhcnNlZCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBzY2VuZSBkZWZpbmVzIHRoZSBjdXJyZW50IHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcm9vdFVybCBkZWZpbmVzIHRoZSByb290IFVSTCBjb250YWluaW5nIG5vcm1hbCBtYXAgcHJvY2VkdXJhbCB0ZXh0dXJlIGluZm9ybWF0aW9uXHJcbiAgICAgKiBAcmV0dXJucyBhIHBhcnNlZCBOb3JtYWwgTWFwIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBOb3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IFNlcmlhbGl6YXRpb25IZWxwZXIuUGFyc2UoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBOb3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLk5vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlXCIsIE5vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlKTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vcGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJwZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dW5pZm9ybSBmbG9hdCBzaXplO3VuaWZvcm0gZmxvYXQgdGltZTt1bmlmb3JtIGZsb2F0IHRyYW5zbGF0aW9uU3BlZWQ7dmFyeWluZyB2ZWMyIHZVVjtmbG9hdCByKGZsb2F0IG4pXG57cmV0dXJuIGZyYWN0KGNvcyhuKjg5LjQyKSozNDMuNDIpO31cbnZlYzIgcih2ZWMyIG4pXG57cmV0dXJuIHZlYzIocihuLngqMjMuNjItMzAwLjArbi55KjM0LjM1KSxyKG4ueCo0NS4xMysyNTYuMCtuLnkqMzguODkpKTsgfVxuZmxvYXQgd29ybGV5KHZlYzIgbixmbG9hdCBzKVxue2Zsb2F0IGRpcz0xLjA7Zm9yKGludCB4PS0xOyB4PD0xOyB4KyspXG57Zm9yKGludCB5PS0xOyB5PD0xOyB5KyspXG57dmVjMiBwPWZsb29yKG4vcykrdmVjMih4LHkpO2Zsb2F0IGQ9bGVuZ3RoKHIocCkrdmVjMih4LHkpLWZyYWN0KG4vcykpO2lmIChkaXM+ZClcbmRpcz1kO319XG5yZXR1cm4gMS4wLWRpczt9XG52ZWMzIGhhc2gzMyh2ZWMzIHAzKVxue3AzPWZyYWN0KHAzKnZlYzMoMC4xMDMxLDAuMTEzNjksMC4xMzc4NykpO3AzKz1kb3QocDMscDMueXh6KzE5LjE5KTtyZXR1cm4gLTEuMCsyLjAqZnJhY3QodmVjMygocDMueCtwMy55KSpwMy56LChwMy54K3AzLnopKnAzLnksKHAzLnkrcDMueikqcDMueCkpO31cbmZsb2F0IHBlcmxpbk5vaXNlKHZlYzMgcClcbnt2ZWMzIHBpPWZsb29yKHApO3ZlYzMgcGY9cC1waTt2ZWMzIHc9cGYqcGYqKDMuMC0yLjAqcGYpO3JldHVybiBtaXgoXG5taXgoXG5taXgoXG5kb3QocGYtdmVjMygwLDAsMCksaGFzaDMzKHBpK3ZlYzMoMCwwLDApKSksXG5kb3QocGYtdmVjMygxLDAsMCksaGFzaDMzKHBpK3ZlYzMoMSwwLDApKSksXG53LnhcbiksXG5taXgoXG5kb3QocGYtdmVjMygwLDAsMSksaGFzaDMzKHBpK3ZlYzMoMCwwLDEpKSksXG5kb3QocGYtdmVjMygxLDAsMSksaGFzaDMzKHBpK3ZlYzMoMSwwLDEpKSksXG53LnhcbiksXG53LnpcbiksXG5taXgoXG5taXgoXG5kb3QocGYtdmVjMygwLDEsMCksaGFzaDMzKHBpK3ZlYzMoMCwxLDApKSksXG5kb3QocGYtdmVjMygxLDEsMCksaGFzaDMzKHBpK3ZlYzMoMSwxLDApKSksXG53LnhcbiksXG5taXgoXG5kb3QocGYtdmVjMygwLDEsMSksaGFzaDMzKHBpK3ZlYzMoMCwxLDEpKSksXG5kb3QocGYtdmVjMygxLDEsMSksaGFzaDMzKHBpK3ZlYzMoMSwxLDEpKSksXG53LnhcbiksXG53LnpcbiksXG53Lnlcbik7fVxuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfREVGSU5JVElPTlNcbnZvaWQgbWFpbih2b2lkKVxue3ZlYzIgdXY9Z2xfRnJhZ0Nvb3JkLnh5K3RyYW5zbGF0aW9uU3BlZWQ7ZmxvYXQgZGlzPShcbjEuMCtwZXJsaW5Ob2lzZSh2ZWMzKHV2L3ZlYzIoc2l6ZSxzaXplKSx0aW1lKjAuMDUpKjguMCkpXG4qICgxLjArKHdvcmxleSh1diwzMi4wKSsgMC41KndvcmxleSgyLjAqdXYsMzIuMCkrMC4yNSp3b3JsZXkoNC4wKnV2LDMyLjApKVxuKTtnbF9GcmFnQ29sb3I9dmVjNCh2ZWMzKGRpcy80LjApLDEuMCk7fVxuYDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBwZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiaW1wb3J0IHsgc2VyaWFsaXplIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzXCI7XHJcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25IZWxwZXIgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnMuc2VyaWFsaXphdGlvblwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5pbXBvcnQgXCIuL3Blcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlIGV4dGVuZHMgUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgdGltZTogbnVtYmVyID0gMC4wO1xyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIHRpbWVTY2FsZTogbnVtYmVyID0gMS4wO1xyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIHRyYW5zbGF0aW9uU3BlZWQ6IG51bWJlciA9IDEuMDtcclxuXHJcbiAgICBwcml2YXRlIF9jdXJyZW50VHJhbnNsYXRpb246IG51bWJlciA9IDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJwZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlXCIsIHNjZW5lLCBmYWxsYmFja1RleHR1cmUsIGdlbmVyYXRlTWlwTWFwcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTaGFkZXJVbmlmb3JtcygpIHtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwic2l6ZVwiLCB0aGlzLmdldFJlbmRlclNpemUoKSBhcyBudW1iZXIpO1xyXG5cclxuICAgICAgICBjb25zdCBzY2VuZSA9IHRoaXMuZ2V0U2NlbmUoKTtcclxuXHJcbiAgICAgICAgaWYgKCFzY2VuZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRlbHRhVGltZSA9IHNjZW5lLmdldEVuZ2luZSgpLmdldERlbHRhVGltZSgpO1xyXG5cclxuICAgICAgICB0aGlzLnRpbWUgKz0gZGVsdGFUaW1lO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJ0aW1lXCIsICh0aGlzLnRpbWUgKiB0aGlzLnRpbWVTY2FsZSkgLyAxMDAwKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY3VycmVudFRyYW5zbGF0aW9uICs9IChkZWx0YVRpbWUgKiB0aGlzLnRyYW5zbGF0aW9uU3BlZWQpIC8gMTAwMC4wO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJ0cmFuc2xhdGlvblNwZWVkXCIsIHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIHJlbmRlcih1c2VDYW1lcmFQb3N0UHJvY2Vzcz86IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICAgICAgc3VwZXIucmVuZGVyKHVzZUNhbWVyYVBvc3RQcm9jZXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVzaXplKHNpemU6IGFueSwgZ2VuZXJhdGVNaXBNYXBzOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5yZXNpemUoc2l6ZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGl6ZXMgdGhpcyBwZXJsaW4gbm9pc2UgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgcGVybGluIG5vaXNlIHByb2NlZHVyYWwgdGV4dHVyZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25PYmplY3QgPSBTZXJpYWxpemF0aW9uSGVscGVyLlNlcmlhbGl6ZSh0aGlzLCBzdXBlci5zZXJpYWxpemUoKSk7XHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5jdXN0b21UeXBlID0gXCJCQUJZTE9OLlBlcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgUGVybGluIE5vaXNlIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCBwZXJsaW4gbm9pc2UgcHJvY2VkdXJhbCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBwYXJzZWRUZXh0dXJlIGRlZmluZXMgcGFyc2VkIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHNjZW5lIGRlZmluZXMgdGhlIGN1cnJlbnQgc2NlbmVcclxuICAgICAqIEBwYXJhbSByb290VXJsIGRlZmluZXMgdGhlIHJvb3QgVVJMIGNvbnRhaW5pbmcgcGVybGluIG5vaXNlIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgUGVybGluIE5vaXNlIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBQZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IFBlcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmUocGFyc2VkVGV4dHVyZS5uYW1lLCBwYXJzZWRUZXh0dXJlLl9zaXplLCBzY2VuZSwgdW5kZWZpbmVkLCBwYXJzZWRUZXh0dXJlLl9nZW5lcmF0ZU1pcE1hcHMpLFxyXG4gICAgICAgICAgICBwYXJzZWRUZXh0dXJlLFxyXG4gICAgICAgICAgICBzY2VuZSxcclxuICAgICAgICAgICAgcm9vdFVybFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWdpc3RlckNsYXNzKFwiQkFCWUxPTi5QZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlXCIsIFBlcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9yb2FkUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwicm9hZFByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dmFyeWluZyB2ZWMyIHZVVjsgXG51bmlmb3JtIHZlYzMgcm9hZENvbG9yO2Zsb2F0IHJhbmQodmVjMiBuKSB7cmV0dXJuIGZyYWN0KGNvcyhkb3Qobix2ZWMyKDEyLjk4OTgsNC4xNDE0KSkpKjQzNzU4LjU0NTMpO31cbmZsb2F0IG5vaXNlKHZlYzIgbikge2NvbnN0IHZlYzIgZD12ZWMyKDAuMCwxLjApO3ZlYzIgYj1mbG9vcihuKSxmPXNtb290aHN0ZXAodmVjMigwLjApLHZlYzIoMS4wKSxmcmFjdChuKSk7cmV0dXJuIG1peChtaXgocmFuZChiKSxyYW5kKGIrZC55eCksZi54KSxtaXgocmFuZChiK2QueHkpLHJhbmQoYitkLnl5KSxmLngpLGYueSk7fVxuZmxvYXQgZmJtKHZlYzIgbikge2Zsb2F0IHRvdGFsPTAuMCxhbXBsaXR1ZGU9MS4wO2ZvciAoaW50IGk9MDsgaTw0OyBpKyspIHt0b3RhbCs9bm9pc2UobikqYW1wbGl0dWRlO24rPW47YW1wbGl0dWRlKj0wLjU7fVxucmV0dXJuIHRvdGFsO31cbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX0RFRklOSVRJT05TXG52b2lkIG1haW4odm9pZCkge1xuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfTUFJTl9CRUdJTlxuZmxvYXQgcmF0aW95PW1vZChnbF9GcmFnQ29vcmQueSoxMDAuMCAsZmJtKHZVVioyLjApKTt2ZWMzIGNvbG9yPXJvYWRDb2xvcipyYXRpb3k7Z2xfRnJhZ0NvbG9yPXZlYzQoY29sb3IsMS4wKTtcbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fRU5EXG59YDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCByb2FkUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgeyBzZXJpYWxpemVBc0NvbG9yMyB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHsgQ29sb3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC5jb2xvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5pbXBvcnQgXCIuL3JvYWRQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJvYWRQcm9jZWR1cmFsVGV4dHVyZSBleHRlbmRzIFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgIHByaXZhdGUgX3JvYWRDb2xvciA9IG5ldyBDb2xvcjMoMC41MywgMC41MywgMC41Myk7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJyb2FkUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwicm9hZENvbG9yXCIsIHRoaXMuX3JvYWRDb2xvcik7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzQ29sb3IzKClcclxuICAgIHB1YmxpYyBnZXQgcm9hZENvbG9yKCk6IENvbG9yMyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvYWRDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHJvYWRDb2xvcih2YWx1ZTogQ29sb3IzKSB7XHJcbiAgICAgICAgdGhpcy5fcm9hZENvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIHJvYWQgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgcm9hZCBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5Sb2FkUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgUm9hZCBQcm9jZWR1cmFsIFRleHR1cmUgZnJvbSBwYXJzZWQgcm9hZCBwcm9jZWR1cmFsIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHBhcnNlZFRleHR1cmUgZGVmaW5lcyBwYXJzZWQgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgY3VycmVudCBzY2VuZVxyXG4gICAgICogQHBhcmFtIHJvb3RVcmwgZGVmaW5lcyB0aGUgcm9vdCBVUkwgY29udGFpbmluZyByb2FkIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgUm9hZCBQcm9jZWR1cmFsIFRleHR1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBQYXJzZShwYXJzZWRUZXh0dXJlOiBhbnksIHNjZW5lOiBTY2VuZSwgcm9vdFVybDogc3RyaW5nKTogUm9hZFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IFJvYWRQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLlJvYWRQcm9jZWR1cmFsVGV4dHVyZVwiLCBSb2FkUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9zdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJzdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2RlZmluZSB2b2xzdGVwcyAyMFxuI2RlZmluZSBpdGVyYXRpb25zIDE1XG52YXJ5aW5nIHZlYzIgdlBvc2l0aW9uO3ZhcnlpbmcgdmVjMiB2VVY7dW5pZm9ybSBmbG9hdCB0aW1lO3VuaWZvcm0gZmxvYXQgYWxwaGE7dW5pZm9ybSBmbG9hdCBiZXRhO3VuaWZvcm0gZmxvYXQgem9vbTt1bmlmb3JtIGZsb2F0IGZvcm11cGFyYW07dW5pZm9ybSBmbG9hdCBzdGVwc2l6ZTt1bmlmb3JtIGZsb2F0IHRpbGU7dW5pZm9ybSBmbG9hdCBicmlnaHRuZXNzO3VuaWZvcm0gZmxvYXQgZGFya21hdHRlcjt1bmlmb3JtIGZsb2F0IGRpc3RmYWRpbmc7dW5pZm9ybSBmbG9hdCBzYXR1cmF0aW9uO3ZvaWQgbWFpbigpXG57dmVjMyBkaXI9dmVjMyh2VVYqem9vbSwxLik7ZmxvYXQgbG9jYWxUaW1lPXRpbWUqMC4wMDAxO21hdDIgcm90MT1tYXQyKGNvcyhhbHBoYSksc2luKGFscGhhKSwtc2luKGFscGhhKSxjb3MoYWxwaGEpKTttYXQyIHJvdDI9bWF0Mihjb3MoYmV0YSksc2luKGJldGEpLC1zaW4oYmV0YSksY29zKGJldGEpKTtkaXIueHoqPXJvdDE7ZGlyLnh5Kj1yb3QyO3ZlYzMgZnJvbV89dmVjMygxLiwuNSwwLjUpO2Zyb21fKz12ZWMzKC0yLixsb2NhbFRpbWUqMi4sbG9jYWxUaW1lKTtmcm9tXy54eio9cm90MTtmcm9tXy54eSo9cm90MjtmbG9hdCBzPTAuMSxmYWRlPTEuO3ZlYzMgdj12ZWMzKDAuKTtmb3IgKGludCByPTA7IHI8dm9sc3RlcHM7IHIrKykge3ZlYzMgcD1mcm9tXytzKmRpciouNTtwPWFicyh2ZWMzKHRpbGUpLW1vZChwLHZlYzModGlsZSoyLikpKTsgXG5mbG9hdCBwYSxhPXBhPTAuO2ZvciAoaW50IGk9MDsgaTxpdGVyYXRpb25zOyBpKyspIHtwPWFicyhwKS9kb3QocCxwKS1mb3JtdXBhcmFtOyBcbmErPWFicyhsZW5ndGgocCktcGEpOyBcbnBhPWxlbmd0aChwKTt9XG5mbG9hdCBkbT1tYXgoMC4sZGFya21hdHRlci1hKmEqLjAwMSk7IFxuYSo9YSphOyBcbmlmIChyPjYpIGZhZGUqPTEuLWRtOyBcbnYrPWZhZGU7dis9dmVjMyhzLHMqcyxzKnMqcypzKSphKmJyaWdodG5lc3MqZmFkZTsgXG5mYWRlKj1kaXN0ZmFkaW5nOyBcbnMrPXN0ZXBzaXplO31cbnY9bWl4KHZlYzMobGVuZ3RoKHYpKSx2LHNhdHVyYXRpb24pOyBcbmdsX0ZyYWdDb2xvcj12ZWM0KHYqLjAxLDEuKTt9YDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBzdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImltcG9ydCB7IHNlcmlhbGl6ZSB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJhbFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvUHJvY2VkdXJhbHMvcHJvY2VkdXJhbFRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuaW1wb3J0IFwiLi9zdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFN0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlIGV4dGVuZHMgUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgcHJpdmF0ZSBfdGltZSA9IDE7XHJcbiAgICBwcml2YXRlIF9hbHBoYSA9IDAuNTtcclxuICAgIHByaXZhdGUgX2JldGEgPSAwLjg7XHJcbiAgICBwcml2YXRlIF96b29tID0gMC44O1xyXG4gICAgcHJpdmF0ZSBfZm9ybXVwYXJhbSA9IDAuNTM7XHJcbiAgICBwcml2YXRlIF9zdGVwc2l6ZSA9IDAuMTtcclxuICAgIHByaXZhdGUgX3RpbGUgPSAwLjg1O1xyXG4gICAgcHJpdmF0ZSBfYnJpZ2h0bmVzcyA9IDAuMDAxNTtcclxuICAgIHByaXZhdGUgX2RhcmttYXR0ZXIgPSAwLjQ7XHJcbiAgICBwcml2YXRlIF9kaXN0ZmFkaW5nID0gMC43MztcclxuICAgIHByaXZhdGUgX3NhdHVyYXRpb24gPSAwLjg1O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBzY2VuZTogTnVsbGFibGU8U2NlbmU+ID0gbnVsbCwgZmFsbGJhY2tUZXh0dXJlPzogVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzPzogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHNpemUsIFwic3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJ0aW1lXCIsIHRoaXMuX3RpbWUpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJhbHBoYVwiLCB0aGlzLl9hbHBoYSk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcImJldGFcIiwgdGhpcy5fYmV0YSk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcInpvb21cIiwgdGhpcy5fem9vbSk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcImZvcm11cGFyYW1cIiwgdGhpcy5fZm9ybXVwYXJhbSk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcInN0ZXBzaXplXCIsIHRoaXMuX3N0ZXBzaXplKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwidGlsZVwiLCB0aGlzLl90aWxlKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiYnJpZ2h0bmVzc1wiLCB0aGlzLl9icmlnaHRuZXNzKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiZGFya21hdHRlclwiLCB0aGlzLl9kYXJrbWF0dGVyKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiZGlzdGZhZGluZ1wiLCB0aGlzLl9kaXN0ZmFkaW5nKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwic2F0dXJhdGlvblwiLCB0aGlzLl9zYXR1cmF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgdGltZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgdGltZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fdGltZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgYWxwaGEoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWxwaGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBhbHBoYSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fYWxwaGEgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGJldGEoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYmV0YTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGJldGEodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2JldGEgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGZvcm11cGFyYW0oKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybXVwYXJhbTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGZvcm11cGFyYW0odmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2Zvcm11cGFyYW0gPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IHN0ZXBzaXplKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0ZXBzaXplO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc3RlcHNpemUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX3N0ZXBzaXplID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCB6b29tKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3pvb207XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB6b29tKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl96b29tID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCB0aWxlKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB0aWxlKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl90aWxlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBicmlnaHRuZXNzKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JyaWdodG5lc3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBicmlnaHRuZXNzKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9icmlnaHRuZXNzID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBkYXJrbWF0dGVyKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhcmttYXR0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBkYXJrbWF0dGVyKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9kYXJrbWF0dGVyID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBkaXN0ZmFkaW5nKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3RmYWRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBkaXN0ZmFkaW5nKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9kaXN0ZmFkaW5nID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBzYXR1cmF0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NhdHVyYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzYXR1cmF0aW9uKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9zYXR1cmF0aW9uID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIHN0YXJmaWVsZCBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCBzdGFyZmllbGQgcHJvY2VkdXJhbCB0ZXh0dXJlIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk9iamVjdCA9IFNlcmlhbGl6YXRpb25IZWxwZXIuU2VyaWFsaXplKHRoaXMsIHN1cGVyLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmN1c3RvbVR5cGUgPSBcIkJBQllMT04uU3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgU3RhcmZpZWxkIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCBzdGFydGZpZWxkIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gcGFyc2VkVGV4dHVyZSBkZWZpbmVzIHBhcnNlZCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBzY2VuZSBkZWZpbmVzIHRoZSBjdXJyZW50IHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcm9vdFVybCBkZWZpbmVzIHRoZSByb290IFVSTCBjb250YWluaW5nIHN0YXJ0ZmllbGQgcHJvY2VkdXJhbCB0ZXh0dXJlIGluZm9ybWF0aW9uXHJcbiAgICAgKiBAcmV0dXJucyBhIHBhcnNlZCBTdGFyZmllbGQgUHJvY2VkdXJhbCBUZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2UocGFyc2VkVGV4dHVyZTogYW55LCBzY2VuZTogU2NlbmUsIHJvb3RVcmw6IHN0cmluZyk6IFN0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IFN0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlKHBhcnNlZFRleHR1cmUubmFtZSwgcGFyc2VkVGV4dHVyZS5fc2l6ZSwgc2NlbmUsIHVuZGVmaW5lZCwgcGFyc2VkVGV4dHVyZS5fZ2VuZXJhdGVNaXBNYXBzKSxcclxuICAgICAgICAgICAgcGFyc2VkVGV4dHVyZSxcclxuICAgICAgICAgICAgc2NlbmUsXHJcbiAgICAgICAgICAgIHJvb3RVcmxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH1cclxufVxyXG5cclxuUmVnaXN0ZXJDbGFzcyhcIkJBQllMT04uU3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmVcIiwgU3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi93b29kUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwid29vZFByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dmFyeWluZyB2ZWMyIHZQb3NpdGlvbjt2YXJ5aW5nIHZlYzIgdlVWO3VuaWZvcm0gZmxvYXQgYW1wU2NhbGU7dW5pZm9ybSB2ZWMzIHdvb2RDb2xvcjtmbG9hdCByYW5kKHZlYzIgbikge3JldHVybiBmcmFjdChjb3MoZG90KG4sdmVjMigxMi45ODk4LDQuMTQxNCkpKSo0Mzc1OC41NDUzKTt9XG5mbG9hdCBub2lzZSh2ZWMyIG4pIHtjb25zdCB2ZWMyIGQ9dmVjMigwLjAsMS4wKTt2ZWMyIGI9Zmxvb3IobiksZj1zbW9vdGhzdGVwKHZlYzIoMC4wKSx2ZWMyKDEuMCksZnJhY3QobikpO3JldHVybiBtaXgobWl4KHJhbmQoYikscmFuZChiK2QueXgpLGYueCksbWl4KHJhbmQoYitkLnh5KSxyYW5kKGIrZC55eSksZi54KSxmLnkpO31cbmZsb2F0IGZibSh2ZWMyIG4pIHtmbG9hdCB0b3RhbD0wLjAsYW1wbGl0dWRlPTEuMDtmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7dG90YWwrPW5vaXNlKG4pKmFtcGxpdHVkZTtuKz1uO2FtcGxpdHVkZSo9MC41O31cbnJldHVybiB0b3RhbDt9XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9ERUZJTklUSU9OU1xudm9pZCBtYWluKHZvaWQpIHtcbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fQkVHSU5cbmZsb2F0IHJhdGlveT1tb2QodlVWLngqYW1wU2NhbGUsMi4wK2ZibSh2VVYqMC44KSk7dmVjMyB3b29kPXdvb2RDb2xvcipyYXRpb3k7Z2xfRnJhZ0NvbG9yPXZlYzQod29vZCwxLjApO1xuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfTUFJTl9FTkRcbn1gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IHdvb2RQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImltcG9ydCB7IHNlcmlhbGl6ZSwgc2VyaWFsaXplQXNDb2xvcjMgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB7IENvbG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJhbFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvUHJvY2VkdXJhbHMvcHJvY2VkdXJhbFRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuaW1wb3J0IFwiLi93b29kUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBXb29kUHJvY2VkdXJhbFRleHR1cmUgZXh0ZW5kcyBQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICBwcml2YXRlIF9hbXBTY2FsZTogbnVtYmVyID0gMTAwLjA7XHJcbiAgICBwcml2YXRlIF93b29kQ29sb3I6IENvbG9yMyA9IG5ldyBDb2xvcjMoMC4zMiwgMC4xNywgMC4wOSk7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJ3b29kUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJhbXBTY2FsZVwiLCB0aGlzLl9hbXBTY2FsZSk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJ3b29kQ29sb3JcIiwgdGhpcy5fd29vZENvbG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgYW1wU2NhbGUoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYW1wU2NhbGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBhbXBTY2FsZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fYW1wU2NhbGUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzQ29sb3IzKClcclxuICAgIHB1YmxpYyBnZXQgd29vZENvbG9yKCk6IENvbG9yMyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvb2RDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHdvb2RDb2xvcih2YWx1ZTogQ29sb3IzKSB7XHJcbiAgICAgICAgdGhpcy5fd29vZENvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIHdvb2QgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgd29vZCBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5Xb29kUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgV29vZCBQcm9jZWR1cmFsIFRleHR1cmUgZnJvbSBwYXJzZWQgd29vZCBwcm9jZWR1cmFsIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHBhcnNlZFRleHR1cmUgZGVmaW5lcyBwYXJzZWQgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgY3VycmVudCBzY2VuZVxyXG4gICAgICogQHBhcmFtIHJvb3RVcmwgZGVmaW5lcyB0aGUgcm9vdCBVUkwgY29udGFpbmluZyB3b29kIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgV29vZCBQcm9jZWR1cmFsIFRleHR1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBQYXJzZShwYXJzZWRUZXh0dXJlOiBhbnksIHNjZW5lOiBTY2VuZSwgcm9vdFVybDogc3RyaW5nKTogV29vZFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IFdvb2RQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLldvb2RQcm9jZWR1cmFsVGV4dHVyZVwiLCBXb29kUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8taW50ZXJuYWwtbW9kdWxlcyAqL1xyXG5pbXBvcnQgKiBhcyBQcm9jZWR1cmFsVGV4dHVyZXNMaWIgZnJvbSBcInByb2NlZHVyYWwtdGV4dHVyZXMvaW5kZXhcIjtcclxuXHJcbi8qKlxyXG4gKiBMZWdhY3kgc3VwcG9ydCwgZGVmaW5pbmcgd2luZG93LkJBQllMT04uR3JpZE1hdGVyaWFsLi4uIChnbG9iYWwgdmFyaWFibGUpLlxyXG4gKlxyXG4gKiBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIFVNRCBtb2R1bGUuXHJcbiAqIFRoZSBlbnRyeSBwb2ludCBmb3IgYSBmdXR1cmUgRVNNIHBhY2thZ2Ugc2hvdWxkIGJlIGluZGV4LnRzXHJcbiAqL1xyXG5jb25zdCBnbG9iYWxPYmplY3QgPSB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcclxuaWYgKHR5cGVvZiBnbG9iYWxPYmplY3QgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICg8YW55Pmdsb2JhbE9iamVjdCkuQkFCWUxPTiA9ICg8YW55Pmdsb2JhbE9iamVjdCkuQkFCWUxPTiB8fCB7fTtcclxuICAgIGZvciAoY29uc3QgbWF0IGluIFByb2NlZHVyYWxUZXh0dXJlc0xpYikge1xyXG4gICAgICAgICg8YW55Pmdsb2JhbE9iamVjdCkuQkFCWUxPTlttYXRdID0gKDxhbnk+UHJvY2VkdXJhbFRleHR1cmVzTGliKVttYXRdO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgKiBmcm9tIFwicHJvY2VkdXJhbC10ZXh0dXJlcy9pbmRleFwiO1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYmFieWxvbmpzX01pc2NfZGVjb3JhdG9yc19fOyIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxuXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlLCBTdXBwcmVzc2VkRXJyb3IsIFN5bWJvbCwgSXRlcmF0b3IgKi9cblxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XG4gIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XG4gIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XG4gIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG59XG5cbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcbiAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcbiAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XG4gICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICB9XG4gIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXG4gICAgICB0W3BdID0gc1twXTtcbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICB9XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcbiAgZnVuY3Rpb24gYWNjZXB0KGYpIHsgaWYgKGYgIT09IHZvaWQgMCAmJiB0eXBlb2YgZiAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiRnVuY3Rpb24gZXhwZWN0ZWRcIik7IHJldHVybiBmOyB9XG4gIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XG4gIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xuICB2YXIgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JJbiB8fCAodGFyZ2V0ID8gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGNvbnRleHRJbi5uYW1lKSA6IHt9KTtcbiAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcbiAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBjb250ZXh0ID0ge307XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcbiAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xuICAgICAgY29udGV4dC5hZGRJbml0aWFsaXplciA9IGZ1bmN0aW9uIChmKSB7IGlmIChkb25lKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGFkZCBpbml0aWFsaXplcnMgYWZ0ZXIgZGVjb3JhdGlvbiBoYXMgY29tcGxldGVkXCIpOyBleHRyYUluaXRpYWxpemVycy5wdXNoKGFjY2VwdChmIHx8IG51bGwpKTsgfTtcbiAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xuICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IHZvaWQgMCkgY29udGludWU7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LnNldCkpIGRlc2NyaXB0b3Iuc2V0ID0gXztcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoXyA9IGFjY2VwdChyZXN1bHQpKSB7XG4gICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XG4gICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xuICAgICAgfVxuICB9XG4gIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcbiAgZG9uZSA9IHRydWU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19ydW5Jbml0aWFsaXplcnModGhpc0FyZywgaW5pdGlhbGl6ZXJzLCB2YWx1ZSkge1xuICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlID0gdXNlVmFsdWUgPyBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnLCB2YWx1ZSkgOiBpbml0aWFsaXplcnNbaV0uY2FsbCh0aGlzQXJnKTtcbiAgfVxuICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xuICByZXR1cm4gdHlwZW9mIHggPT09IFwic3ltYm9sXCIgPyB4IDogXCJcIi5jb25jYXQoeCk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19zZXRGdW5jdGlvbk5hbWUoZiwgbmFtZSwgcHJlZml4KSB7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xuICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcbiAgcmV0dXJuIGcubmV4dCA9IHZlcmIoMCksIGdbXCJ0aHJvd1wiXSA9IHZlcmIoMSksIGdbXCJyZXR1cm5cIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn1cblxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcbiAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gIGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICB9XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXG4gICAgICAgICAgcltrXSA9IGFbal07XG4gIHJldHVybiByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gYXdhaXRSZXR1cm4oZikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGYsIHJlamVjdCk7IH07IH1cbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XG4gIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cbiAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyB9XG4gIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cbiAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jRGVsZWdhdG9yKG8pIHtcbiAgdmFyIGksIHA7XG4gIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XG4gIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IGZhbHNlIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcbiAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XG4gIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XG4gIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XG4gIHJldHVybiBjb29rZWQ7XG59O1xuXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59O1xuXG52YXIgb3duS2V5cyA9IGZ1bmN0aW9uKG8pIHtcbiAgb3duS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHx8IGZ1bmN0aW9uIChvKSB7XG4gICAgdmFyIGFyID0gW107XG4gICAgZm9yICh2YXIgayBpbiBvKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspKSBhclthci5sZW5ndGhdID0gaztcbiAgICByZXR1cm4gYXI7XG4gIH07XG4gIHJldHVybiBvd25LZXlzKG8pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9faW1wb3J0U3Rhcihtb2QpIHtcbiAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgdmFyIHJlc3VsdCA9IHt9O1xuICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgPSBvd25LZXlzKG1vZCksIGkgPSAwOyBpIDwgay5sZW5ndGg7IGkrKykgaWYgKGtbaV0gIT09IFwiZGVmYXVsdFwiKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGtbaV0pO1xuICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XG4gIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xuICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICB2YXIgZGlzcG9zZSwgaW5uZXI7XG4gICAgaWYgKGFzeW5jKSB7XG4gICAgICBpZiAoIVN5bWJvbC5hc3luY0Rpc3Bvc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNEaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICB9XG4gICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgaWYgKCFTeW1ib2wuZGlzcG9zZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5kaXNwb3NlIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuZGlzcG9zZV07XG4gICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xuICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xuICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XG4gIH1cbiAgZWxzZSBpZiAoYXN5bmMpIHtcbiAgICBlbnYuc3RhY2sucHVzaCh7IGFzeW5jOiB0cnVlIH0pO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxudmFyIF9TdXBwcmVzc2VkRXJyb3IgPSB0eXBlb2YgU3VwcHJlc3NlZEVycm9yID09PSBcImZ1bmN0aW9uXCIgPyBTdXBwcmVzc2VkRXJyb3IgOiBmdW5jdGlvbiAoZXJyb3IsIHN1cHByZXNzZWQsIG1lc3NhZ2UpIHtcbiAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlLm5hbWUgPSBcIlN1cHByZXNzZWRFcnJvclwiLCBlLmVycm9yID0gZXJyb3IsIGUuc3VwcHJlc3NlZCA9IHN1cHByZXNzZWQsIGU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19kaXNwb3NlUmVzb3VyY2VzKGVudikge1xuICBmdW5jdGlvbiBmYWlsKGUpIHtcbiAgICBlbnYuZXJyb3IgPSBlbnYuaGFzRXJyb3IgPyBuZXcgX1N1cHByZXNzZWRFcnJvcihlLCBlbnYuZXJyb3IsIFwiQW4gZXJyb3Igd2FzIHN1cHByZXNzZWQgZHVyaW5nIGRpc3Bvc2FsLlwiKSA6IGU7XG4gICAgZW52Lmhhc0Vycm9yID0gdHJ1ZTtcbiAgfVxuICB2YXIgciwgcyA9IDA7XG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgd2hpbGUgKHIgPSBlbnYuc3RhY2sucG9wKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghci5hc3luYyAmJiBzID09PSAxKSByZXR1cm4gcyA9IDAsIGVudi5zdGFjay5wdXNoKHIpLCBQcm9taXNlLnJlc29sdmUoKS50aGVuKG5leHQpO1xuICAgICAgICBpZiAoci5kaXNwb3NlKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IHIuZGlzcG9zZS5jYWxsKHIudmFsdWUpO1xuICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBzIHw9IDE7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZSkge1xuICAgICAgICBmYWlsKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG5leHQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uKHBhdGgsIHByZXNlcnZlSnN4KSB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcLlxcLj9cXC8vLnRlc3QocGF0aCkpIHtcbiAgICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL1xcLih0c3gpJHwoKD86XFwuZCk/KSgoPzpcXC5bXi4vXSs/KT8pXFwuKFtjbV0/KXRzJC9pLCBmdW5jdGlvbiAobSwgdHN4LCBkLCBleHQsIGNtKSB7XG4gICAgICAgICAgcmV0dXJuIHRzeCA/IHByZXNlcnZlSnN4ID8gXCIuanN4XCIgOiBcIi5qc1wiIDogZCAmJiAoIWV4dCB8fCAhY20pID8gbSA6IChkICsgZXh0ICsgXCIuXCIgKyBjbS50b0xvd2VyQ2FzZSgpICsgXCJqc1wiKTtcbiAgICAgIH0pO1xuICB9XG4gIHJldHVybiBwYXRoO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZXh0ZW5kcyxcbiAgX19hc3NpZ24sXG4gIF9fcmVzdCxcbiAgX19kZWNvcmF0ZSxcbiAgX19wYXJhbSxcbiAgX19lc0RlY29yYXRlLFxuICBfX3J1bkluaXRpYWxpemVycyxcbiAgX19wcm9wS2V5LFxuICBfX3NldEZ1bmN0aW9uTmFtZSxcbiAgX19tZXRhZGF0YSxcbiAgX19hd2FpdGVyLFxuICBfX2dlbmVyYXRvcixcbiAgX19jcmVhdGVCaW5kaW5nLFxuICBfX2V4cG9ydFN0YXIsXG4gIF9fdmFsdWVzLFxuICBfX3JlYWQsXG4gIF9fc3ByZWFkLFxuICBfX3NwcmVhZEFycmF5cyxcbiAgX19zcHJlYWRBcnJheSxcbiAgX19hd2FpdCxcbiAgX19hc3luY0dlbmVyYXRvcixcbiAgX19hc3luY0RlbGVnYXRvcixcbiAgX19hc3luY1ZhbHVlcyxcbiAgX19tYWtlVGVtcGxhdGVPYmplY3QsXG4gIF9faW1wb3J0U3RhcixcbiAgX19pbXBvcnREZWZhdWx0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0LFxuICBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4sXG4gIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxuICBfX2Rpc3Bvc2VSZXNvdXJjZXMsXG4gIF9fcmV3cml0ZVJlbGF0aXZlSW1wb3J0RXh0ZW5zaW9uLFxufTtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCAqIGFzIHByb2NlZHVyYWxUZXh0dXJlcyBmcm9tIFwiQGx0cy9wcm9jZWR1cmFsLXRleHR1cmVzL2xlZ2FjeS9sZWdhY3lcIjtcclxuZXhwb3J0IHsgcHJvY2VkdXJhbFRleHR1cmVzIH07XHJcbmV4cG9ydCBkZWZhdWx0IHByb2NlZHVyYWxUZXh0dXJlcztcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|
|
2288
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbmpzLnByb2NlZHVyYWxUZXh0dXJlcy5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoWkE7QUFDQTtBQUVBO0FBQ0E7QUFjQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyQkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFBQTtBQU1BO0FBQUE7QUFDQTtBQU5BO0FBQ0E7QUFDQTtBQUNBO0FBSUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQU9BOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQWxFQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFRQTtBQURBO0FBR0E7QUFtQ0E7QUFBQTtBQXRGQTtBQXdGQTs7Ozs7Ozs7Ozs7Ozs7OztBQ25HQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBRUE7QUFDQTtBQVlBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25CQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFFQTtBQUFBO0FBTUE7QUFBQTtBQUNBO0FBTkE7QUFDQTtBQUNBO0FBQ0E7QUFJQTs7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBT0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBbEVBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQW1DQTtBQUFBO0FBdEZBO0FBd0ZBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbkdBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFFQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBR0E7QUFFQTtBQUFBO0FBT0E7QUFBQTtBQUNBO0FBUEE7QUFDQTtBQUNBO0FBRUE7QUFJQTtBQUNBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQUE7QUFFQTtBQUFBO0FBQ0E7QUFDQTs7O0FBQUE7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTs7O0FBSkE7QUFNQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQU9BOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFDQTtBQXRGQTtBQURBO0FBR0E7QUFnQkE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBK0NBO0FBQUE7QUExSUE7QUE0SUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4SkE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFVQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqQkE7QUFDQTtBQUNBO0FBRUE7QUFFQTtBQUdBO0FBRUE7QUFBQTtBQUlBO0FBQUE7QUFDQTtBQUhBO0FBS0E7QUFFQTs7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFFQTs7Ozs7O0FBTUE7QUFDQTtBQUNBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFoREE7QUFEQTtBQUdBO0FBK0NBO0FBQUE7QUE5RUE7QUFnRkE7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzRkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFrQkE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekJBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFHQTtBQUVBO0FBQUE7QUFNQTtBQUFBO0FBQ0E7QUFOQTtBQUNBO0FBQ0E7QUFDQTtBQUlBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFsRUE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBbUNBO0FBQUE7QUF0RkE7QUF3RkE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuR0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNaQTtBQUNBO0FBRUE7QUFFQTtBQUVBO0FBRUE7QUFBQTtBQUdBO0FBQUE7QUFDQTtBQUNBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFwQ0E7QUFEQTtBQUdBO0FBbUNBO0FBQUE7QUF0RUE7QUF3RUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqRkE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFpREE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDeERBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUFBO0FBWUE7QUFBQTtBQUNBO0FBWEE7QUFHQTtBQUdBO0FBRUE7QUFJQTs7QUFDQTtBQUVBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBRUE7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBcEVBO0FBREE7QUFDQTtBQUdBO0FBREE7QUFDQTtBQUdBO0FBREE7QUFDQTtBQStEQTtBQUFBO0FBdkVBO0FBeUVBOzs7Ozs7Ozs7Ozs7Ozs7O0FDbEZBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFFQTtBQUNBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEJBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQUE7QUFHQTtBQUFBO0FBQ0E7QUFIQTtBQUlBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUFwQ0E7QUFEQTtBQUdBO0FBbUNBO0FBQUE7QUFsREE7QUFvREE7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5REE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQUE7QUFDQTtBQUVBO0FBQ0E7QUFnQkE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdkJBO0FBQ0E7QUFFQTtBQUVBO0FBRUE7QUFFQTtBQUFBO0FBYUE7QUFBQTtBQUNBO0FBYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBOztBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFRQTtBQUFBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFMQTtBQVFBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBT0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUVBOzs7Ozs7QUFNQTtBQUNBO0FBQ0E7QUFPQTtBQUNBO0FBeElBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQVFBO0FBREE7QUFHQTtBQW1DQTtBQUFBO0FBMUtBO0FBNEtBOzs7Ozs7Ozs7Ozs7Ozs7O0FDckxBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FBO0FBQ0E7QUFFQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDakJBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7QUFFQTtBQUVBO0FBQUE7QUFJQTtBQUFBO0FBQ0E7QUFKQTtBQUNBO0FBSUE7O0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQUE7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7OztBQUxBO0FBUUE7QUFBQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBTEE7QUFPQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBRUE7Ozs7OztBQU1BO0FBQ0E7QUFDQTtBQU9BO0FBQ0E7QUE5Q0E7QUFEQTtBQUdBO0FBUUE7QUFEQTtBQUdBO0FBbUNBO0FBQUE7QUE5REE7QUFnRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxRUE7QUFDQTtBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTs7Ozs7Ozs7Ozs7QUNqQkE7Ozs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTs7Ozs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9icmljay9icmlja1Byb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9icmljay9icmlja1Byb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9icmljay9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvY2xvdWQvY2xvdWRQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvY2xvdWQvY2xvdWRQcm9jZWR1cmFsVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvY2xvdWQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2ZpcmUvZmlyZVByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9maXJlL2ZpcmVQcm9jZWR1cmFsVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvZmlyZS9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvZ3Jhc3MvZ3Jhc3NQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvZ3Jhc3MvZ3Jhc3NQcm9jZWR1cmFsVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvZ3Jhc3MvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2luZGV4LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9tYXJibGUvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL21hcmJsZS9tYXJibGVQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvbWFyYmxlL21hcmJsZVByb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9ub3JtYWxNYXAvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL25vcm1hbE1hcC9ub3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvbm9ybWFsTWFwL25vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9wZXJsaW5Ob2lzZS9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvcGVybGluTm9pc2UvcGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvcGVybGluTm9pc2UvcGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZS50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvcm9hZC9pbmRleC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvcm9hZC9yb2FkUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnQudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL3JvYWQvcm9hZFByb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy9zdGFyZmllbGQvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2Rldi9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL3N0YXJmaWVsZC9zdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvc3RhcmZpZWxkL3N0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlLnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy93b29kL2luZGV4LnRzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uLi8uLi8uLi9kZXYvcHJvY2VkdXJhbFRleHR1cmVzL3NyYy93b29kL3dvb2RQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudC50cyIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvLi4vLi4vLi4vZGV2L3Byb2NlZHVyYWxUZXh0dXJlcy9zcmMvd29vZC93b29kUHJvY2VkdXJhbFRleHR1cmUudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTLy4uLy4uLy4uL2x0cy9wcm9jZWR1cmFsVGV4dHVyZXMvc3JjL2xlZ2FjeS9sZWdhY3kudHMiLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTL2V4dGVybmFsIHVtZCB7XCJyb290XCI6XCJCQUJZTE9OXCIsXCJjb21tb25qc1wiOlwiYmFieWxvbmpzXCIsXCJjb21tb25qczJcIjpcImJhYnlsb25qc1wiLFwiYW1kXCI6XCJiYWJ5bG9uanNcIn0iLCJ3ZWJwYWNrOi8vUFJPQ0VEVVJBTFRFWFRVUkVTL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9QUk9DRURVUkFMVEVYVFVSRVMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL1BST0NFRFVSQUxURVhUVVJFUy8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJiYWJ5bG9uanNcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoXCJiYWJ5bG9uanMtcHJvY2VkdXJhbC10ZXh0dXJlc1wiLCBbXCJiYWJ5bG9uanNcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiYmFieWxvbmpzLXByb2NlZHVyYWwtdGV4dHVyZXNcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJiYWJ5bG9uanNcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIlBST0NFRFVSQUxURVhUVVJFU1wiXSA9IGZhY3Rvcnkocm9vdFtcIkJBQllMT05cIl0pO1xufSkoKHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiB0aGlzKSwgKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYmFieWxvbmpzX01pc2NfZGVjb3JhdG9yc19fKSA9PiB7XG5yZXR1cm4gIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xuXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcbiAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcbiAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/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/OlxcLlteLi9dKz8pPylcXC4oW2NtXT8pdHMkL2ksIGZ1bmN0aW9uIChtLCB0c3gsIGQsIGV4dCwgY20pIHtcbiAgICAgICAgICByZXR1cm4gdHN4ID8gcHJlc2VydmVKc3ggPyBcIi5qc3hcIiA6IFwiLmpzXCIgOiBkICYmICghZXh0IHx8ICFjbSkgPyBtIDogKGQgKyBleHQgKyBcIi5cIiArIGNtLnRvTG93ZXJDYXNlKCkgKyBcImpzXCIpO1xuICAgICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgX19leHRlbmRzLFxuICBfX2Fzc2lnbixcbiAgX19yZXN0LFxuICBfX2RlY29yYXRlLFxuICBfX3BhcmFtLFxuICBfX2VzRGVjb3JhdGUsXG4gIF9fcnVuSW5pdGlhbGl6ZXJzLFxuICBfX3Byb3BLZXksXG4gIF9fc2V0RnVuY3Rpb25OYW1lLFxuICBfX21ldGFkYXRhLFxuICBfX2F3YWl0ZXIsXG4gIF9fZ2VuZXJhdG9yLFxuICBfX2NyZWF0ZUJpbmRpbmcsXG4gIF9fZXhwb3J0U3RhcixcbiAgX192YWx1ZXMsXG4gIF9fcmVhZCxcbiAgX19zcHJlYWQsXG4gIF9fc3ByZWFkQXJyYXlzLFxuICBfX3NwcmVhZEFycmF5LFxuICBfX2F3YWl0LFxuICBfX2FzeW5jR2VuZXJhdG9yLFxuICBfX2FzeW5jRGVsZWdhdG9yLFxuICBfX2FzeW5jVmFsdWVzLFxuICBfX21ha2VUZW1wbGF0ZU9iamVjdCxcbiAgX19pbXBvcnRTdGFyLFxuICBfX2ltcG9ydERlZmF1bHQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRHZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRTZXQsXG4gIF9fY2xhc3NQcml2YXRlRmllbGRJbixcbiAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2UsXG4gIF9fZGlzcG9zZVJlc291cmNlcyxcbiAgX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24sXG59O1xuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwiYnJpY2tQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3ZhcnlpbmcgdmVjMiB2UG9zaXRpb247dmFyeWluZyB2ZWMyIHZVVjt1bmlmb3JtIGZsb2F0IG51bWJlck9mQnJpY2tzSGVpZ2h0O3VuaWZvcm0gZmxvYXQgbnVtYmVyT2ZCcmlja3NXaWR0aDt1bmlmb3JtIHZlYzMgYnJpY2tDb2xvcjt1bmlmb3JtIHZlYzMgam9pbnRDb2xvcjtmbG9hdCByYW5kKHZlYzIgbikge3JldHVybiBmcmFjdChjb3MoZG90KG4sdmVjMigxMi45ODk4LDQuMTQxNCkpKSo0Mzc1OC41NDUzKTt9XG5mbG9hdCBub2lzZSh2ZWMyIG4pIHtjb25zdCB2ZWMyIGQ9dmVjMigwLjAsMS4wKTt2ZWMyIGI9Zmxvb3IobiksZj1zbW9vdGhzdGVwKHZlYzIoMC4wKSx2ZWMyKDEuMCksZnJhY3QobikpO3JldHVybiBtaXgobWl4KHJhbmQoYikscmFuZChiK2QueXgpLGYueCksbWl4KHJhbmQoYitkLnh5KSxyYW5kKGIrZC55eSksZi54KSxmLnkpO31cbmZsb2F0IGZibSh2ZWMyIG4pIHtmbG9hdCB0b3RhbD0wLjAsYW1wbGl0dWRlPTEuMDtmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7dG90YWwrPW5vaXNlKG4pKmFtcGxpdHVkZTtuKz1uO2FtcGxpdHVkZSo9MC41O31cbnJldHVybiB0b3RhbDt9XG5mbG9hdCByb3VuZEYoZmxvYXQgbnVtYmVyKXtyZXR1cm4gc2lnbihudW1iZXIpKmZsb29yKGFicyhudW1iZXIpKzAuNSk7fVxuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfREVGSU5JVElPTlNcbnZvaWQgbWFpbih2b2lkKVxue2Zsb2F0IGJyaWNrVz0xLjAvbnVtYmVyT2ZCcmlja3NXaWR0aDtmbG9hdCBicmlja0g9MS4wL251bWJlck9mQnJpY2tzSGVpZ2h0O2Zsb2F0IGpvaW50V1BlcmNlbnRhZ2U9MC4wMTtmbG9hdCBqb2ludEhQZXJjZW50YWdlPTAuMDU7dmVjMyBjb2xvcj1icmlja0NvbG9yO2Zsb2F0IHlpPXZVVi55L2JyaWNrSDtmbG9hdCBueWk9cm91bmRGKHlpKTtmbG9hdCB4aT12VVYueC9icmlja1c7aWYgKG1vZChmbG9vcih5aSksMi4wKT09MC4wKXt4aT14aS0wLjU7fVxuZmxvYXQgbnhpPXJvdW5kRih4aSk7dmVjMiBicmlja3ZVVj12ZWMyKCh4aS1mbG9vcih4aSkpL2JyaWNrSCwoeWktZmxvb3IoeWkpKS8gYnJpY2tXKTtpZiAoeWk8bnlpK2pvaW50SFBlcmNlbnRhZ2UgJiYgeWk+bnlpLWpvaW50SFBlcmNlbnRhZ2Upe2NvbG9yPW1peChqb2ludENvbG9yLHZlYzMoMC4zNywwLjI1LDAuMjUpLCh5aS1ueWkpL2pvaW50SFBlcmNlbnRhZ2UrMC4yKTt9XG5lbHNlIGlmICh4aTxueGkram9pbnRXUGVyY2VudGFnZSAmJiB4aT5ueGktam9pbnRXUGVyY2VudGFnZSl7Y29sb3I9bWl4KGpvaW50Q29sb3IsdmVjMygwLjQ0LDAuNDQsMC40NCksKHhpLW54aSkvam9pbnRXUGVyY2VudGFnZSswLjIpO31cbmVsc2Uge2Zsb2F0IGJyaWNrQ29sb3JTd2l0Y2g9bW9kKGZsb29yKHlpKStmbG9vcih4aSksMy4wKTtpZiAoYnJpY2tDb2xvclN3aXRjaD09MC4wKVxuY29sb3I9bWl4KGNvbG9yLHZlYzMoMC4zMywwLjMzLDAuMzMpLDAuMyk7ZWxzZSBpZiAoYnJpY2tDb2xvclN3aXRjaD09Mi4wKVxuY29sb3I9bWl4KGNvbG9yLHZlYzMoMC4xMSwwLjExLDAuMTEpLDAuMyk7fVxuZ2xfRnJhZ0NvbG9yPXZlYzQoY29sb3IsMS4wKTt9YDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBicmlja1Byb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiaW1wb3J0IHsgc2VyaWFsaXplLCBzZXJpYWxpemVBc0NvbG9yMyB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHsgQ29sb3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC5jb2xvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5cclxuaW1wb3J0IFwiLi9icmlja1Byb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQnJpY2tQcm9jZWR1cmFsVGV4dHVyZSBleHRlbmRzIFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgIHByaXZhdGUgX251bWJlck9mQnJpY2tzSGVpZ2h0OiBudW1iZXIgPSAxNTtcclxuICAgIHByaXZhdGUgX251bWJlck9mQnJpY2tzV2lkdGg6IG51bWJlciA9IDU7XHJcbiAgICBwcml2YXRlIF9qb2ludENvbG9yID0gbmV3IENvbG9yMygwLjcyLCAwLjcyLCAwLjcyKTtcclxuICAgIHByaXZhdGUgX2JyaWNrQ29sb3IgPSBuZXcgQ29sb3IzKDAuNzcsIDAuNDcsIDAuNCk7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJicmlja1Byb2NlZHVyYWxUZXh0dXJlXCIsIHNjZW5lLCBmYWxsYmFja1RleHR1cmUsIGdlbmVyYXRlTWlwTWFwcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTaGFkZXJVbmlmb3JtcygpIHtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwibnVtYmVyT2ZCcmlja3NIZWlnaHRcIiwgdGhpcy5fbnVtYmVyT2ZCcmlja3NIZWlnaHQpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJudW1iZXJPZkJyaWNrc1dpZHRoXCIsIHRoaXMuX251bWJlck9mQnJpY2tzV2lkdGgpO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiYnJpY2tDb2xvclwiLCB0aGlzLl9icmlja0NvbG9yKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImpvaW50Q29sb3JcIiwgdGhpcy5fam9pbnRDb2xvcik7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IG51bWJlck9mQnJpY2tzSGVpZ2h0KCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck9mQnJpY2tzSGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgbnVtYmVyT2ZCcmlja3NIZWlnaHQodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX251bWJlck9mQnJpY2tzSGVpZ2h0ID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBudW1iZXJPZkJyaWNrc1dpZHRoKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck9mQnJpY2tzV2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBudW1iZXJPZkJyaWNrc1dpZHRoKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9udW1iZXJPZkJyaWNrc1dpZHRoID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemVBc0NvbG9yMygpXHJcbiAgICBwdWJsaWMgZ2V0IGpvaW50Q29sb3IoKTogQ29sb3IzIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fam9pbnRDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGpvaW50Q29sb3IodmFsdWU6IENvbG9yMykge1xyXG4gICAgICAgIHRoaXMuX2pvaW50Q29sb3IgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzQ29sb3IzKClcclxuICAgIHB1YmxpYyBnZXQgYnJpY2tDb2xvcigpOiBDb2xvcjMge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9icmlja0NvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYnJpY2tDb2xvcih2YWx1ZTogQ29sb3IzKSB7XHJcbiAgICAgICAgdGhpcy5fYnJpY2tDb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGl6ZXMgdGhpcyBicmljayBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCBicmljayBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5Ccmlja1Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEJyaWNrIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCBicmljayBwcm9jZWR1cmFsIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHBhcnNlZFRleHR1cmUgZGVmaW5lcyBwYXJzZWQgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgY3VycmVudCBzY2VuZVxyXG4gICAgICogQHBhcmFtIHJvb3RVcmwgZGVmaW5lcyB0aGUgcm9vdCBVUkwgY29udGFpbmluZyBicmljayBwcm9jZWR1cmFsIHRleHR1cmUgaW5mb3JtYXRpb25cclxuICAgICAqIEByZXR1cm5zIGEgcGFyc2VkIEJyaWNrIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBCcmlja1Byb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IEJyaWNrUHJvY2VkdXJhbFRleHR1cmUocGFyc2VkVGV4dHVyZS5uYW1lLCBwYXJzZWRUZXh0dXJlLl9zaXplLCBzY2VuZSwgdW5kZWZpbmVkLCBwYXJzZWRUZXh0dXJlLl9nZW5lcmF0ZU1pcE1hcHMpLFxyXG4gICAgICAgICAgICBwYXJzZWRUZXh0dXJlLFxyXG4gICAgICAgICAgICBzY2VuZSxcclxuICAgICAgICAgICAgcm9vdFVybFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWdpc3RlckNsYXNzKFwiQkFCWUxPTi5Ccmlja1Byb2NlZHVyYWxUZXh0dXJlXCIsIEJyaWNrUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9icmlja1Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcImNsb3VkUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHByZWNpc2lvbiBoaWdocCBmbG9hdDt2YXJ5aW5nIHZlYzIgdlVWO3VuaWZvcm0gdmVjNCBza3lDb2xvcjt1bmlmb3JtIHZlYzQgY2xvdWRDb2xvcjt1bmlmb3JtIGZsb2F0IGFtcGxpdHVkZTt1bmlmb3JtIGludCBudW1PY3RhdmVzO2Zsb2F0IHJhbmQodmVjMiBuKSB7cmV0dXJuIGZyYWN0KGNvcyhkb3Qobix2ZWMyKDEyLjk4OTgsNC4xNDE0KSkpKjQzNzU4LjU0NTMpO31cbmZsb2F0IG5vaXNlKHZlYzIgbikge2NvbnN0IHZlYzIgZD12ZWMyKDAuMCwxLjApO3ZlYzIgYj1mbG9vcihuKSxmPXNtb290aHN0ZXAodmVjMigwLjApLHZlYzIoMS4wKSxmcmFjdChuKSk7cmV0dXJuIG1peChtaXgocmFuZChiKSxyYW5kKGIrZC55eCksZi54KSxtaXgocmFuZChiK2QueHkpLHJhbmQoYitkLnl5KSxmLngpLGYueSk7fVxuZmxvYXQgZmJtKHZlYzIgbikge2Zsb2F0IHRvdGFsPTAuMCxhbXBsPWFtcGxpdHVkZTtcbiNpZmRlZiBXRUJHTDJcbmZvciAoaW50IGk9MDsgaTxudW1PY3RhdmVzOyBpKyspIHtcbiNlbHNlXG5mb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7XG4jZW5kaWZcbnRvdGFsKz1ub2lzZShuKSphbXBsO24rPW47YW1wbCo9MC41O31cbnJldHVybiB0b3RhbDt9XG52b2lkIG1haW4oKSB7dmVjMiBwPXZVVioxMi4wO3ZlYzQgYz1taXgoc2t5Q29sb3IsY2xvdWRDb2xvcixmYm0ocCkpO2dsX0ZyYWdDb2xvcj1jO31cbmA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3QgY2xvdWRQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImltcG9ydCB7IHNlcmlhbGl6ZSwgc2VyaWFsaXplQXNDb2xvcjQgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB7IENvbG9yNCB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJhbFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvUHJvY2VkdXJhbHMvcHJvY2VkdXJhbFRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuXHJcbmltcG9ydCBcIi4vY2xvdWRQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENsb3VkUHJvY2VkdXJhbFRleHR1cmUgZXh0ZW5kcyBQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICBwcml2YXRlIF9za3lDb2xvciA9IG5ldyBDb2xvcjQoMC4xNSwgMC42OCwgMS4wLCAxLjApO1xyXG4gICAgcHJpdmF0ZSBfY2xvdWRDb2xvciA9IG5ldyBDb2xvcjQoMSwgMSwgMSwgMS4wKTtcclxuICAgIHByaXZhdGUgX2FtcGxpdHVkZSA9IDE7XHJcbiAgICBwcml2YXRlIF9udW1PY3RhdmVzID0gNDtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNpemU6IG51bWJlciwgc2NlbmU6IE51bGxhYmxlPFNjZW5lPiA9IG51bGwsIGZhbGxiYWNrVGV4dHVyZT86IFRleHR1cmUsIGdlbmVyYXRlTWlwTWFwcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzaXplLCBcImNsb3VkUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3I0KFwic2t5Q29sb3JcIiwgdGhpcy5fc2t5Q29sb3IpO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3I0KFwiY2xvdWRDb2xvclwiLCB0aGlzLl9jbG91ZENvbG9yKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiYW1wbGl0dWRlXCIsIHRoaXMuX2FtcGxpdHVkZSk7XHJcbiAgICAgICAgdGhpcy5zZXRJbnQoXCJudW1PY3RhdmVzXCIsIHRoaXMuX251bU9jdGF2ZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemVBc0NvbG9yNCgpXHJcbiAgICBwdWJsaWMgZ2V0IHNreUNvbG9yKCk6IENvbG9yNCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NreUNvbG9yO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc2t5Q29sb3IodmFsdWU6IENvbG9yNCkge1xyXG4gICAgICAgIHRoaXMuX3NreUNvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemVBc0NvbG9yNCgpXHJcbiAgICBwdWJsaWMgZ2V0IGNsb3VkQ29sb3IoKTogQ29sb3I0IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2xvdWRDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGNsb3VkQ29sb3IodmFsdWU6IENvbG9yNCkge1xyXG4gICAgICAgIHRoaXMuX2Nsb3VkQ29sb3IgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGFtcGxpdHVkZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hbXBsaXR1ZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBhbXBsaXR1ZGUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2FtcGxpdHVkZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgbnVtT2N0YXZlcygpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9udW1PY3RhdmVzO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgbnVtT2N0YXZlcyh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fbnVtT2N0YXZlcyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGl6ZXMgdGhpcyBjbG91ZCBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCBjbG91ZCBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5DbG91ZFByb2NlZHVyYWxUZXh0dXJlXCI7XHJcblxyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIENsb3VkIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCBjbG91ZCBwcm9jZWR1cmFsIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHBhcnNlZFRleHR1cmUgZGVmaW5lcyBwYXJzZWQgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgY3VycmVudCBzY2VuZVxyXG4gICAgICogQHBhcmFtIHJvb3RVcmwgZGVmaW5lcyB0aGUgcm9vdCBVUkwgY29udGFpbmluZyBjbG91ZCBwcm9jZWR1cmFsIHRleHR1cmUgaW5mb3JtYXRpb25cclxuICAgICAqIEByZXR1cm5zIGEgcGFyc2VkIENsb3VkIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBDbG91ZFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IENsb3VkUHJvY2VkdXJhbFRleHR1cmUocGFyc2VkVGV4dHVyZS5uYW1lLCBwYXJzZWRUZXh0dXJlLl9zaXplLCBzY2VuZSwgdW5kZWZpbmVkLCBwYXJzZWRUZXh0dXJlLl9nZW5lcmF0ZU1pcE1hcHMpLFxyXG4gICAgICAgICAgICBwYXJzZWRUZXh0dXJlLFxyXG4gICAgICAgICAgICBzY2VuZSxcclxuICAgICAgICAgICAgcm9vdFVybFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWdpc3RlckNsYXNzKFwiQkFCWUxPTi5DbG91ZFByb2NlZHVyYWxUZXh0dXJlXCIsIENsb3VkUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9jbG91ZFByb2NlZHVyYWxUZXh0dXJlXCI7XHJcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcImZpcmVQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O3VuaWZvcm0gZmxvYXQgdGltZTt1bmlmb3JtIHZlYzMgYzE7dW5pZm9ybSB2ZWMzIGMyO3VuaWZvcm0gdmVjMyBjMzt1bmlmb3JtIHZlYzMgYzQ7dW5pZm9ybSB2ZWMzIGM1O3VuaWZvcm0gdmVjMyBjNjt1bmlmb3JtIHZlYzIgc3BlZWQ7dW5pZm9ybSBmbG9hdCBzaGlmdDt1bmlmb3JtIGZsb2F0IGFscGhhVGhyZXNob2xkO3ZhcnlpbmcgdmVjMiB2VVY7ZmxvYXQgcmFuZCh2ZWMyIG4pIHtyZXR1cm4gZnJhY3QoY29zKGRvdChuLHZlYzIoMTIuOTg5OCw0LjE0MTQpKSkqNDM3NTguNTQ1Myk7fVxuZmxvYXQgbm9pc2UodmVjMiBuKSB7Y29uc3QgdmVjMiBkPXZlYzIoMC4wLDEuMCk7dmVjMiBiPWZsb29yKG4pLGY9c21vb3Roc3RlcCh2ZWMyKDAuMCksdmVjMigxLjApLGZyYWN0KG4pKTtyZXR1cm4gbWl4KG1peChyYW5kKGIpLHJhbmQoYitkLnl4KSxmLngpLG1peChyYW5kKGIrZC54eSkscmFuZChiK2QueXkpLGYueCksZi55KTt9XG5mbG9hdCBmYm0odmVjMiBuKSB7ZmxvYXQgdG90YWw9MC4wLGFtcGxpdHVkZT0xLjA7Zm9yIChpbnQgaT0wOyBpPDQ7IGkrKykge3RvdGFsKz1ub2lzZShuKSphbXBsaXR1ZGU7bis9bjthbXBsaXR1ZGUqPTAuNTt9XG5yZXR1cm4gdG90YWw7fVxudm9pZCBtYWluKCkge3ZlYzIgcD12VVYqOC4wO2Zsb2F0IHE9ZmJtKHAtdGltZSowLjEpO3ZlYzIgcj12ZWMyKGZibShwK3ErdGltZSpzcGVlZC54LXAueC1wLnkpLGZibShwK3EtdGltZSpzcGVlZC55KSk7dmVjMyBjPW1peChjMSxjMixmYm0ocCtyKSkrbWl4KGMzLGM0LHIueCktbWl4KGM1LGM2LHIueSk7dmVjMyBjb2xvcj1jKmNvcyhzaGlmdCp2VVYueSk7ZmxvYXQgbHVtaW5hbmNlPWRvdChjb2xvci5yZ2IsdmVjMygwLjMsMC41OSwwLjExKSk7Z2xfRnJhZ0NvbG9yPXZlYzQoY29sb3IsbHVtaW5hbmNlKmFscGhhVGhyZXNob2xkKygxLjAtYWxwaGFUaHJlc2hvbGQpKTt9YDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBmaXJlUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgeyBzZXJpYWxpemUsIHNlcmlhbGl6ZUFzVmVjdG9yMiB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHsgVmVjdG9yMiB9IGZyb20gXCJjb3JlL01hdGhzL21hdGgudmVjdG9yXCI7XHJcbmltcG9ydCB7IENvbG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJhbFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvUHJvY2VkdXJhbHMvcHJvY2VkdXJhbFRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuXHJcbmltcG9ydCBcIi4vZmlyZVByb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgRmlyZVByb2NlZHVyYWxUZXh0dXJlIGV4dGVuZHMgUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgcHJpdmF0ZSBfdGltZTogbnVtYmVyID0gMC4wO1xyXG4gICAgcHJpdmF0ZSBfc3BlZWQgPSBuZXcgVmVjdG9yMigwLjUsIDAuMyk7XHJcbiAgICBwcml2YXRlIF9hdXRvR2VuZXJhdGVUaW1lOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgX2ZpcmVDb2xvcnM6IENvbG9yM1tdO1xyXG4gICAgcHJpdmF0ZSBfYWxwaGFUaHJlc2hvbGQ6IG51bWJlciA9IDAuNTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNpemU6IG51bWJlciwgc2NlbmU6IE51bGxhYmxlPFNjZW5lPiA9IG51bGwsIGZhbGxiYWNrVGV4dHVyZT86IFRleHR1cmUsIGdlbmVyYXRlTWlwTWFwcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzaXplLCBcImZpcmVQcm9jZWR1cmFsVGV4dHVyZVwiLCBzY2VuZSwgZmFsbGJhY2tUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHMpO1xyXG4gICAgICAgIHRoaXMuX2ZpcmVDb2xvcnMgPSBGaXJlUHJvY2VkdXJhbFRleHR1cmUuUmVkRmlyZUNvbG9ycztcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJ0aW1lXCIsIHRoaXMuX3RpbWUpO1xyXG4gICAgICAgIHRoaXMuc2V0VmVjdG9yMihcInNwZWVkXCIsIHRoaXMuX3NwZWVkKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImMxXCIsIHRoaXMuX2ZpcmVDb2xvcnNbMF0pO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiYzJcIiwgdGhpcy5fZmlyZUNvbG9yc1sxXSk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJjM1wiLCB0aGlzLl9maXJlQ29sb3JzWzJdKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImM0XCIsIHRoaXMuX2ZpcmVDb2xvcnNbM10pO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiYzVcIiwgdGhpcy5fZmlyZUNvbG9yc1s0XSk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJjNlwiLCB0aGlzLl9maXJlQ29sb3JzWzVdKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiYWxwaGFUaHJlc2hvbGRcIiwgdGhpcy5fYWxwaGFUaHJlc2hvbGQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSByZW5kZXIodXNlQ2FtZXJhUG9zdFByb2Nlc3M/OiBib29sZWFuKSB7XHJcbiAgICAgICAgY29uc3Qgc2NlbmUgPSB0aGlzLmdldFNjZW5lKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9HZW5lcmF0ZVRpbWUgJiYgc2NlbmUpIHtcclxuICAgICAgICAgICAgdGhpcy5fdGltZSArPSBzY2VuZS5nZXRBbmltYXRpb25SYXRpbygpICogMC4wMztcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5yZW5kZXIodXNlQ2FtZXJhUG9zdFByb2Nlc3MpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IFB1cnBsZUZpcmVDb2xvcnMoKTogQ29sb3IzW10ge1xyXG4gICAgICAgIHJldHVybiBbbmV3IENvbG9yMygwLjUsIDAuMCwgMS4wKSwgbmV3IENvbG9yMygwLjksIDAuMCwgMS4wKSwgbmV3IENvbG9yMygwLjIsIDAuMCwgMS4wKSwgbmV3IENvbG9yMygxLjAsIDAuOSwgMS4wKSwgbmV3IENvbG9yMygwLjEsIDAuMSwgMS4wKSwgbmV3IENvbG9yMygwLjksIDAuOSwgMS4wKV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgR3JlZW5GaXJlQ29sb3JzKCk6IENvbG9yM1tdIHtcclxuICAgICAgICByZXR1cm4gW25ldyBDb2xvcjMoMC41LCAxLjAsIDAuMCksIG5ldyBDb2xvcjMoMC41LCAxLjAsIDAuMCksIG5ldyBDb2xvcjMoMC4zLCAwLjQsIDAuMCksIG5ldyBDb2xvcjMoMC41LCAxLjAsIDAuMCksIG5ldyBDb2xvcjMoMC4yLCAwLjAsIDAuMCksIG5ldyBDb2xvcjMoMC41LCAxLjAsIDAuMCldO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IFJlZEZpcmVDb2xvcnMoKTogQ29sb3IzW10ge1xyXG4gICAgICAgIHJldHVybiBbbmV3IENvbG9yMygwLjUsIDAuMCwgMC4xKSwgbmV3IENvbG9yMygwLjksIDAuMCwgMC4wKSwgbmV3IENvbG9yMygwLjIsIDAuMCwgMC4wKSwgbmV3IENvbG9yMygxLjAsIDAuOSwgMC4wKSwgbmV3IENvbG9yMygwLjEsIDAuMSwgMC4xKSwgbmV3IENvbG9yMygwLjksIDAuOSwgMC45KV07XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgQmx1ZUZpcmVDb2xvcnMoKTogQ29sb3IzW10ge1xyXG4gICAgICAgIHJldHVybiBbbmV3IENvbG9yMygwLjEsIDAuMCwgMC41KSwgbmV3IENvbG9yMygwLjAsIDAuMCwgMC41KSwgbmV3IENvbG9yMygwLjEsIDAuMCwgMC4yKSwgbmV3IENvbG9yMygwLjAsIDAuMCwgMS4wKSwgbmV3IENvbG9yMygwLjEsIDAuMiwgMC4zKSwgbmV3IENvbG9yMygwLjAsIDAuMiwgMC45KV07XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGF1dG9HZW5lcmF0ZVRpbWUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dG9HZW5lcmF0ZVRpbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBhdXRvR2VuZXJhdGVUaW1lKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5fYXV0b0dlbmVyYXRlVGltZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgZmlyZUNvbG9ycygpOiBDb2xvcjNbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpcmVDb2xvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBmaXJlQ29sb3JzKHZhbHVlOiBDb2xvcjNbXSkge1xyXG4gICAgICAgIHRoaXMuX2ZpcmVDb2xvcnMgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IHRpbWUoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdGltZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHRpbWUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX3RpbWUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzVmVjdG9yMigpXHJcbiAgICBwdWJsaWMgZ2V0IHNwZWVkKCk6IFZlY3RvcjIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zcGVlZDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHNwZWVkKHZhbHVlOiBWZWN0b3IyKSB7XHJcbiAgICAgICAgdGhpcy5fc3BlZWQgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGFscGhhVGhyZXNob2xkKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FscGhhVGhyZXNob2xkO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgYWxwaGFUaHJlc2hvbGQodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2FscGhhVGhyZXNob2xkID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIGZpcmUgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgZmlyZSBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5GaXJlUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5maXJlQ29sb3JzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9maXJlQ29sb3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuZmlyZUNvbG9ycy5wdXNoKHRoaXMuX2ZpcmVDb2xvcnNbaV0uYXNBcnJheSgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uT2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBhIEZpcmUgUHJvY2VkdXJhbCBUZXh0dXJlIGZyb20gcGFyc2VkIGZpcmUgcHJvY2VkdXJhbCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBwYXJzZWRUZXh0dXJlIGRlZmluZXMgcGFyc2VkIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHNjZW5lIGRlZmluZXMgdGhlIGN1cnJlbnQgc2NlbmVcclxuICAgICAqIEBwYXJhbSByb290VXJsIGRlZmluZXMgdGhlIHJvb3QgVVJMIGNvbnRhaW5pbmcgZmlyZSBwcm9jZWR1cmFsIHRleHR1cmUgaW5mb3JtYXRpb25cclxuICAgICAqIEByZXR1cm5zIGEgcGFyc2VkIEZpcmUgUHJvY2VkdXJhbCBUZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2UocGFyc2VkVGV4dHVyZTogYW55LCBzY2VuZTogU2NlbmUsIHJvb3RVcmw6IHN0cmluZyk6IEZpcmVQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IFNlcmlhbGl6YXRpb25IZWxwZXIuUGFyc2UoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBGaXJlUHJvY2VkdXJhbFRleHR1cmUocGFyc2VkVGV4dHVyZS5uYW1lLCBwYXJzZWRUZXh0dXJlLl9zaXplLCBzY2VuZSwgdW5kZWZpbmVkLCBwYXJzZWRUZXh0dXJlLl9nZW5lcmF0ZU1pcE1hcHMpLFxyXG4gICAgICAgICAgICBwYXJzZWRUZXh0dXJlLFxyXG4gICAgICAgICAgICBzY2VuZSxcclxuICAgICAgICAgICAgcm9vdFVybFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbG9yczogQ29sb3IzW10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnNlZFRleHR1cmUuZmlyZUNvbG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb2xvcnMucHVzaChDb2xvcjMuRnJvbUFycmF5KHBhcnNlZFRleHR1cmUuZmlyZUNvbG9yc1tpXSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGV4dHVyZS5maXJlQ29sb3JzID0gY29sb3JzO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH1cclxufVxyXG5cclxuUmVnaXN0ZXJDbGFzcyhcIkJBQllMT04uRmlyZVByb2NlZHVyYWxUZXh0dXJlXCIsIEZpcmVQcm9jZWR1cmFsVGV4dHVyZSk7XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL2ZpcmVQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJncmFzc1Byb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dmFyeWluZyB2ZWMyIHZQb3NpdGlvbjt2YXJ5aW5nIHZlYzIgdlVWO3VuaWZvcm0gdmVjMyBoZXJiMUNvbG9yO3VuaWZvcm0gdmVjMyBoZXJiMkNvbG9yO3VuaWZvcm0gdmVjMyBoZXJiM0NvbG9yO3VuaWZvcm0gdmVjMyBncm91bmRDb2xvcjtmbG9hdCByYW5kKHZlYzIgbikge3JldHVybiBmcmFjdChjb3MoZG90KG4sdmVjMigxMi45ODk4LDQuMTQxNCkpKSo0Mzc1OC41NDUzKTt9XG5mbG9hdCBub2lzZSh2ZWMyIG4pIHtjb25zdCB2ZWMyIGQ9dmVjMigwLjAsMS4wKTt2ZWMyIGI9Zmxvb3IobiksZj1zbW9vdGhzdGVwKHZlYzIoMC4wKSx2ZWMyKDEuMCksZnJhY3QobikpO3JldHVybiBtaXgobWl4KHJhbmQoYikscmFuZChiK2QueXgpLGYueCksbWl4KHJhbmQoYitkLnh5KSxyYW5kKGIrZC55eSksZi54KSxmLnkpO31cbmZsb2F0IGZibSh2ZWMyIG4pIHtmbG9hdCB0b3RhbD0wLjAsYW1wbGl0dWRlPTEuMDtmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7dG90YWwrPW5vaXNlKG4pKmFtcGxpdHVkZTtuKz1uO2FtcGxpdHVkZSo9MC41O31cbnJldHVybiB0b3RhbDt9XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9ERUZJTklUSU9OU1xudm9pZCBtYWluKHZvaWQpIHtcbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fQkVHSU5cbnZlYzMgY29sb3I9bWl4KGdyb3VuZENvbG9yLGhlcmIxQ29sb3IscmFuZChnbF9GcmFnQ29vcmQueHkqNC4wKSk7Y29sb3I9bWl4KGNvbG9yLGhlcmIyQ29sb3IscmFuZChnbF9GcmFnQ29vcmQueHkqOC4wKSk7Y29sb3I9bWl4KGNvbG9yLGhlcmIzQ29sb3IscmFuZChnbF9GcmFnQ29vcmQueHkpKTtjb2xvcj1taXgoY29sb3IsaGVyYjFDb2xvcixmYm0oZ2xfRnJhZ0Nvb3JkLnh5KjE2LjApKTtnbF9GcmFnQ29sb3I9dmVjNChjb2xvciwxLjApO1xuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfTUFJTl9FTkRcbn1gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IGdyYXNzUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgeyBzZXJpYWxpemVBc0NvbG9yMyB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHsgQ29sb3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC5jb2xvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5cclxuaW1wb3J0IFwiLi9ncmFzc1Byb2NlZHVyYWxUZXh0dXJlLmZyYWdtZW50XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgR3Jhc3NQcm9jZWR1cmFsVGV4dHVyZSBleHRlbmRzIFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgIHByaXZhdGUgX2dyYXNzQ29sb3JzOiBDb2xvcjNbXTtcclxuICAgIHByaXZhdGUgX2dyb3VuZENvbG9yID0gbmV3IENvbG9yMygxLCAxLCAxKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHNpemU6IG51bWJlciwgc2NlbmU6IE51bGxhYmxlPFNjZW5lPiA9IG51bGwsIGZhbGxiYWNrVGV4dHVyZT86IFRleHR1cmUsIGdlbmVyYXRlTWlwTWFwcz86IGJvb2xlYW4pIHtcclxuICAgICAgICBzdXBlcihuYW1lLCBzaXplLCBcImdyYXNzUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fZ3Jhc3NDb2xvcnMgPSBbbmV3IENvbG9yMygwLjI5LCAwLjM4LCAwLjAyKSwgbmV3IENvbG9yMygwLjM2LCAwLjQ5LCAwLjA5KSwgbmV3IENvbG9yMygwLjUxLCAwLjYsIDAuMjgpXTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTaGFkZXJVbmlmb3JtcygpIHtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImhlcmIxQ29sb3JcIiwgdGhpcy5fZ3Jhc3NDb2xvcnNbMF0pO1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwiaGVyYjJDb2xvclwiLCB0aGlzLl9ncmFzc0NvbG9yc1sxXSk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJoZXJiM0NvbG9yXCIsIHRoaXMuX2dyYXNzQ29sb3JzWzJdKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImdyb3VuZENvbG9yXCIsIHRoaXMuX2dyb3VuZENvbG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGdyYXNzQ29sb3JzKCk6IENvbG9yM1tdIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZ3Jhc3NDb2xvcnM7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBncmFzc0NvbG9ycyh2YWx1ZTogQ29sb3IzW10pIHtcclxuICAgICAgICB0aGlzLl9ncmFzc0NvbG9ycyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplQXNDb2xvcjMoKVxyXG4gICAgcHVibGljIGdldCBncm91bmRDb2xvcigpOiBDb2xvcjMge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91bmRDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGdyb3VuZENvbG9yKHZhbHVlOiBDb2xvcjMpIHtcclxuICAgICAgICB0aGlzLl9ncm91bmRDb2xvciA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGl6ZXMgdGhpcyBncmFzcyBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCBncmFzcyBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5HcmFzc1Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcblxyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuZ3Jhc3NDb2xvcnMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2dyYXNzQ29sb3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuZ3Jhc3NDb2xvcnMucHVzaCh0aGlzLl9ncmFzc0NvbG9yc1tpXS5hc0FycmF5KCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgR3Jhc3MgUHJvY2VkdXJhbCBUZXh0dXJlIGZyb20gcGFyc2VkIGdyYXNzIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gcGFyc2VkVGV4dHVyZSBkZWZpbmVzIHBhcnNlZCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBzY2VuZSBkZWZpbmVzIHRoZSBjdXJyZW50IHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcm9vdFVybCBkZWZpbmVzIHRoZSByb290IFVSTCBjb250YWluaW5nIGdyYXNzIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgR3Jhc3MgUHJvY2VkdXJhbCBUZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2UocGFyc2VkVGV4dHVyZTogYW55LCBzY2VuZTogU2NlbmUsIHJvb3RVcmw6IHN0cmluZyk6IEdyYXNzUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgICAgIGNvbnN0IHRleHR1cmUgPSBTZXJpYWxpemF0aW9uSGVscGVyLlBhcnNlKFxyXG4gICAgICAgICAgICAoKSA9PiBuZXcgR3Jhc3NQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29sb3JzOiBDb2xvcjNbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyc2VkVGV4dHVyZS5ncmFzc0NvbG9ycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb2xvcnMucHVzaChDb2xvcjMuRnJvbUFycmF5KHBhcnNlZFRleHR1cmUuZ3Jhc3NDb2xvcnNbaV0pKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRleHR1cmUuZ3Jhc3NDb2xvcnMgPSBjb2xvcnM7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWdpc3RlckNsYXNzKFwiQkFCWUxPTi5HcmFzc1Byb2NlZHVyYWxUZXh0dXJlXCIsIEdyYXNzUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9ncmFzc1Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1pbnRlcm5hbC1tb2R1bGVzICovXHJcbmV4cG9ydCAqIGZyb20gXCIuL2JyaWNrL2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL2Nsb3VkL2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL2ZpcmUvaW5kZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vZ3Jhc3MvaW5kZXhcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vbWFyYmxlL2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL25vcm1hbE1hcC9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9wZXJsaW5Ob2lzZS9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9yb2FkL2luZGV4XCI7XHJcbmV4cG9ydCAqIGZyb20gXCIuL3N0YXJmaWVsZC9pbmRleFwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi93b29kL2luZGV4XCI7XHJcbiIsImV4cG9ydCAqIGZyb20gXCIuL21hcmJsZVByb2NlZHVyYWxUZXh0dXJlXCI7XHJcbiIsIi8vIERvIG5vdCBlZGl0LlxuaW1wb3J0IHsgU2hhZGVyU3RvcmUgfSBmcm9tIFwiY29yZS9FbmdpbmVzL3NoYWRlclN0b3JlXCI7XG5cbmNvbnN0IG5hbWUgPSBcIm1hcmJsZVByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dmFyeWluZyB2ZWMyIHZQb3NpdGlvbjt2YXJ5aW5nIHZlYzIgdlVWO3VuaWZvcm0gZmxvYXQgbnVtYmVyT2ZUaWxlc0hlaWdodDt1bmlmb3JtIGZsb2F0IG51bWJlck9mVGlsZXNXaWR0aDt1bmlmb3JtIGZsb2F0IGFtcGxpdHVkZTt1bmlmb3JtIHZlYzMgbWFyYmxlQ29sb3I7dW5pZm9ybSB2ZWMzIGpvaW50Q29sb3I7Y29uc3QgdmVjMyB0aWxlU2l6ZT12ZWMzKDEuMSwxLjAsMS4xKTtjb25zdCB2ZWMzIHRpbGVQY3Q9dmVjMygwLjk4LDEuMCwwLjk4KTtmbG9hdCByYW5kKHZlYzIgbikge3JldHVybiBmcmFjdChjb3MoZG90KG4sdmVjMigxMi45ODk4LDQuMTQxNCkpKSo0Mzc1OC41NDUzKTt9XG5mbG9hdCBub2lzZSh2ZWMyIG4pIHtjb25zdCB2ZWMyIGQ9dmVjMigwLjAsMS4wKTt2ZWMyIGI9Zmxvb3IobiksZj1zbW9vdGhzdGVwKHZlYzIoMC4wKSx2ZWMyKDEuMCksZnJhY3QobikpO3JldHVybiBtaXgobWl4KHJhbmQoYikscmFuZChiK2QueXgpLGYueCksbWl4KHJhbmQoYitkLnh5KSxyYW5kKGIrZC55eSksZi54KSxmLnkpO31cbmZsb2F0IHR1cmJ1bGVuY2UodmVjMiBQKVxue2Zsb2F0IHZhbD0wLjA7ZmxvYXQgZnJlcT0xLjA7Zm9yIChpbnQgaT0wOyBpPDQ7IGkrKylcbnt2YWwrPWFicyhub2lzZShQKmZyZXEpL2ZyZXEpO2ZyZXEqPTIuMDc7fVxucmV0dXJuIHZhbDt9XG5mbG9hdCByb3VuZEYoZmxvYXQgbnVtYmVyKXtyZXR1cm4gc2lnbihudW1iZXIpKmZsb29yKGFicyhudW1iZXIpKzAuNSk7fVxudmVjMyBtYXJibGVfY29sb3IoZmxvYXQgeClcbnt2ZWMzIGNvbDt4PTAuNSooeCsxLik7eD1zcXJ0KHgpOyBcbng9c3FydCh4KTt4PXNxcnQoeCk7Y29sPXZlYzMoLjIrLjc1KngpOyBcbmNvbC5iKj0wLjk1OyBcbnJldHVybiBjb2w7fVxudm9pZCBtYWluKClcbntmbG9hdCBicmlja1c9MS4wL251bWJlck9mVGlsZXNXaWR0aDtmbG9hdCBicmlja0g9MS4wL251bWJlck9mVGlsZXNIZWlnaHQ7ZmxvYXQgam9pbnRXUGVyY2VudGFnZT0wLjAxO2Zsb2F0IGpvaW50SFBlcmNlbnRhZ2U9MC4wMTt2ZWMzIGNvbG9yPW1hcmJsZUNvbG9yO2Zsb2F0IHlpPXZVVi55L2JyaWNrSDtmbG9hdCBueWk9cm91bmRGKHlpKTtmbG9hdCB4aT12VVYueC9icmlja1c7aWYgKG1vZChmbG9vcih5aSksMi4wKT09MC4wKXt4aT14aS0wLjU7fVxuZmxvYXQgbnhpPXJvdW5kRih4aSk7dmVjMiBicmlja3ZVVj12ZWMyKCh4aS1mbG9vcih4aSkpL2JyaWNrSCwoeWktZmxvb3IoeWkpKS9icmlja1cpO2lmICh5aTxueWkram9pbnRIUGVyY2VudGFnZSAmJiB5aT5ueWktam9pbnRIUGVyY2VudGFnZSl7Y29sb3I9bWl4KGpvaW50Q29sb3IsdmVjMygwLjM3LDAuMjUsMC4yNSksKHlpLW55aSkvam9pbnRIUGVyY2VudGFnZSswLjIpO31cbmVsc2UgaWYgKHhpPG54aStqb2ludFdQZXJjZW50YWdlICYmIHhpPm54aS1qb2ludFdQZXJjZW50YWdlKXtjb2xvcj1taXgoam9pbnRDb2xvcix2ZWMzKDAuNDQsMC40NCwwLjQ0KSwoeGktbnhpKS9qb2ludFdQZXJjZW50YWdlKzAuMik7fVxuZWxzZSB7ZmxvYXQgdD02LjI4KmJyaWNrdlVWLngvKHRpbGVTaXplLngrbm9pc2UodmVjMih2VVYpKjYuMCkpO3QrPWFtcGxpdHVkZSp0dXJidWxlbmNlKGJyaWNrdlVWLnh5KTt0PXNpbih0KTtjb2xvcj1tYXJibGVfY29sb3IodCk7fVxuZ2xfRnJhZ0NvbG9yPXZlYzQoY29sb3IsMC4wKTt9YDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBtYXJibGVQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImltcG9ydCB7IHNlcmlhbGl6ZSB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHsgQ29sb3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC5jb2xvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5cclxuaW1wb3J0IFwiLi9tYXJibGVQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1hcmJsZVByb2NlZHVyYWxUZXh0dXJlIGV4dGVuZHMgUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgcHJpdmF0ZSBfbnVtYmVyT2ZUaWxlc0hlaWdodDogbnVtYmVyID0gMztcclxuICAgIHByaXZhdGUgX251bWJlck9mVGlsZXNXaWR0aDogbnVtYmVyID0gMztcclxuICAgIHByaXZhdGUgX2FtcGxpdHVkZTogbnVtYmVyID0gOS4wO1xyXG4gICAgcHJpdmF0ZSBfam9pbnRDb2xvciA9IG5ldyBDb2xvcjMoMC43MiwgMC43MiwgMC43Mik7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJtYXJibGVQcm9jZWR1cmFsVGV4dHVyZVwiLCBzY2VuZSwgZmFsbGJhY2tUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHMpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2hhZGVyVW5pZm9ybXMoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcIm51bWJlck9mVGlsZXNIZWlnaHRcIiwgdGhpcy5fbnVtYmVyT2ZUaWxlc0hlaWdodCk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcIm51bWJlck9mVGlsZXNXaWR0aFwiLCB0aGlzLl9udW1iZXJPZlRpbGVzV2lkdGgpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJhbXBsaXR1ZGVcIiwgdGhpcy5fYW1wbGl0dWRlKTtcclxuICAgICAgICB0aGlzLnNldENvbG9yMyhcImpvaW50Q29sb3JcIiwgdGhpcy5fam9pbnRDb2xvcik7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IG51bWJlck9mVGlsZXNIZWlnaHQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbnVtYmVyT2ZUaWxlc0hlaWdodDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IG51bWJlck9mVGlsZXNIZWlnaHQodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX251bWJlck9mVGlsZXNIZWlnaHQgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGFtcGxpdHVkZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hbXBsaXR1ZGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBhbXBsaXR1ZGUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2FtcGxpdHVkZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgbnVtYmVyT2ZUaWxlc1dpZHRoKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX251bWJlck9mVGlsZXNXaWR0aDtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IG51bWJlck9mVGlsZXNXaWR0aCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fbnVtYmVyT2ZUaWxlc1dpZHRoID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBqb2ludENvbG9yKCk6IENvbG9yMyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2pvaW50Q29sb3I7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBqb2ludENvbG9yKHZhbHVlOiBDb2xvcjMpIHtcclxuICAgICAgICB0aGlzLl9qb2ludENvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIG1hcmJsZSBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCBtYXJibGUgcHJvY2VkdXJhbCB0ZXh0dXJlIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk9iamVjdCA9IFNlcmlhbGl6YXRpb25IZWxwZXIuU2VyaWFsaXplKHRoaXMsIHN1cGVyLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmN1c3RvbVR5cGUgPSBcIkJBQllMT04uTWFyYmxlUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgTWFyYmxlIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCBtYXJibGUgcHJvY2VkdXJhbCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBwYXJzZWRUZXh0dXJlIGRlZmluZXMgcGFyc2VkIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHNjZW5lIGRlZmluZXMgdGhlIGN1cnJlbnQgc2NlbmVcclxuICAgICAqIEBwYXJhbSByb290VXJsIGRlZmluZXMgdGhlIHJvb3QgVVJMIGNvbnRhaW5pbmcgbWFyYmxlIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgTWFyYmxlIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBNYXJibGVQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IFNlcmlhbGl6YXRpb25IZWxwZXIuUGFyc2UoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBNYXJibGVQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLk1hcmJsZVByb2NlZHVyYWxUZXh0dXJlXCIsIE1hcmJsZVByb2NlZHVyYWxUZXh0dXJlKTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vbm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwibm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlclwiO1xuY29uc3Qgc2hhZGVyID0gYHByZWNpc2lvbiBoaWdocCBmbG9hdDt1bmlmb3JtIHNhbXBsZXIyRCBiYXNlU2FtcGxlcjt1bmlmb3JtIGZsb2F0IHNpemU7dmFyeWluZyB2ZWMyIHZVVjtjb25zdCB2ZWMzIExVTUFfQ09FRkZJQ0lFTlQ9dmVjMygwLjIxMjYsMC43MTUyLDAuMDcyMik7ZmxvYXQgbHVtYUF0Q29vcmQodmVjMiBjb29yZClcbnt2ZWMzIHBpeGVsPXRleHR1cmUyRChiYXNlU2FtcGxlcixjb29yZCkucmdiO2Zsb2F0IGx1bWE9ZG90KHBpeGVsLExVTUFfQ09FRkZJQ0lFTlQpO3JldHVybiBsdW1hO31cbnZvaWQgbWFpbigpXG57ZmxvYXQgbHVtYVUwPWx1bWFBdENvb3JkKHZVVit2ZWMyKC0xLjAsIDAuMCkvc2l6ZSk7ZmxvYXQgbHVtYVUxPWx1bWFBdENvb3JkKHZVVit2ZWMyKCAxLjAsIDAuMCkvc2l6ZSk7ZmxvYXQgbHVtYVYwPWx1bWFBdENvb3JkKHZVVit2ZWMyKCAwLjAsLTEuMCkvc2l6ZSk7ZmxvYXQgbHVtYVYxPWx1bWFBdENvb3JkKHZVVit2ZWMyKCAwLjAsIDEuMCkvc2l6ZSk7dmVjMiBzbG9wZT0odmVjMihsdW1hVTAtbHVtYVUxLGx1bWFWMC1sdW1hVjEpKzEuMCkqMC41O2dsX0ZyYWdDb2xvcj12ZWM0KHNsb3BlLDEuMCwxLjApO31cbmA7XG4vLyBTaWRlZWZmZWN0XG5TaGFkZXJTdG9yZS5TaGFkZXJzU3RvcmVbbmFtZV0gPSBzaGFkZXI7XG4vKiogQGludGVybmFsICovXG5leHBvcnQgY29uc3Qgbm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgeyBzZXJpYWxpemVBc1RleHR1cmUgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB0eXBlIHsgVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy90ZXh0dXJlXCI7XHJcbmltcG9ydCB7IFByb2NlZHVyYWxUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL1Byb2NlZHVyYWxzL3Byb2NlZHVyYWxUZXh0dXJlXCI7XHJcbmltcG9ydCB0eXBlIHsgU2NlbmUgfSBmcm9tIFwiY29yZS9zY2VuZVwiO1xyXG5pbXBvcnQgeyBSZWdpc3RlckNsYXNzIH0gZnJvbSBcImNvcmUvTWlzYy90eXBlU3RvcmVcIjtcclxuaW1wb3J0IHR5cGUgeyBOdWxsYWJsZSB9IGZyb20gXCJjb3JlL3R5cGVzXCI7XHJcbmltcG9ydCBcIi4vbm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBOb3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZSBleHRlbmRzIFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgIHByaXZhdGUgX2Jhc2VUZXh0dXJlOiBUZXh0dXJlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBzY2VuZTogTnVsbGFibGU8U2NlbmU+ID0gbnVsbCwgZmFsbGJhY2tUZXh0dXJlPzogVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzPzogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHNpemUsIFwibm9ybWFsTWFwUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0VGV4dHVyZShcImJhc2VTYW1wbGVyXCIsIHRoaXMuX2Jhc2VUZXh0dXJlKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwic2l6ZVwiLCB0aGlzLmdldFJlbmRlclNpemUoKSBhcyBudW1iZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBvdmVycmlkZSByZW5kZXIodXNlQ2FtZXJhUG9zdFByb2Nlc3M/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIucmVuZGVyKHVzZUNhbWVyYVBvc3RQcm9jZXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVzaXplKHNpemU6IGFueSwgZ2VuZXJhdGVNaXBNYXBzOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5yZXNpemUoc2l6ZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuXHJcbiAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIFwic2l6ZVwiIHVuaWZvcm1cclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIGlzUmVhZHkoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9iYXNlVGV4dHVyZSB8fCAhdGhpcy5fYmFzZVRleHR1cmUuaXNSZWFkeSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBzdXBlci5pc1JlYWR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzVGV4dHVyZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGJhc2VUZXh0dXJlKCk6IFRleHR1cmUge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9iYXNlVGV4dHVyZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGJhc2VUZXh0dXJlKHRleHR1cmU6IFRleHR1cmUpIHtcclxuICAgICAgICB0aGlzLl9iYXNlVGV4dHVyZSA9IHRleHR1cmU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIG5vcm1hbCBtYXAgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgbm9ybWFsIG1hcCBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5Ob3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5cclxuICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbk9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBOb3JtYWwgTWFwIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCBub3JtYWwgbWFwIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gcGFyc2VkVGV4dHVyZSBkZWZpbmVzIHBhcnNlZCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBzY2VuZSBkZWZpbmVzIHRoZSBjdXJyZW50IHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcm9vdFVybCBkZWZpbmVzIHRoZSByb290IFVSTCBjb250YWluaW5nIG5vcm1hbCBtYXAgcHJvY2VkdXJhbCB0ZXh0dXJlIGluZm9ybWF0aW9uXHJcbiAgICAgKiBAcmV0dXJucyBhIHBhcnNlZCBOb3JtYWwgTWFwIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBOb3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IFNlcmlhbGl6YXRpb25IZWxwZXIuUGFyc2UoXHJcbiAgICAgICAgICAgICgpID0+IG5ldyBOb3JtYWxNYXBQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLk5vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlXCIsIE5vcm1hbE1hcFByb2NlZHVyYWxUZXh0dXJlKTtcclxuIiwiZXhwb3J0ICogZnJvbSBcIi4vcGVybGluTm9pc2VQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJwZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dW5pZm9ybSBmbG9hdCBzaXplO3VuaWZvcm0gZmxvYXQgdGltZTt1bmlmb3JtIGZsb2F0IHRyYW5zbGF0aW9uU3BlZWQ7dmFyeWluZyB2ZWMyIHZVVjtmbG9hdCByKGZsb2F0IG4pXG57cmV0dXJuIGZyYWN0KGNvcyhuKjg5LjQyKSozNDMuNDIpO31cbnZlYzIgcih2ZWMyIG4pXG57cmV0dXJuIHZlYzIocihuLngqMjMuNjItMzAwLjArbi55KjM0LjM1KSxyKG4ueCo0NS4xMysyNTYuMCtuLnkqMzguODkpKTsgfVxuZmxvYXQgd29ybGV5KHZlYzIgbixmbG9hdCBzKVxue2Zsb2F0IGRpcz0xLjA7Zm9yKGludCB4PS0xOyB4PD0xOyB4KyspXG57Zm9yKGludCB5PS0xOyB5PD0xOyB5KyspXG57dmVjMiBwPWZsb29yKG4vcykrdmVjMih4LHkpO2Zsb2F0IGQ9bGVuZ3RoKHIocCkrdmVjMih4LHkpLWZyYWN0KG4vcykpO2lmIChkaXM+ZClcbmRpcz1kO319XG5yZXR1cm4gMS4wLWRpczt9XG52ZWMzIGhhc2gzMyh2ZWMzIHAzKVxue3AzPWZyYWN0KHAzKnZlYzMoMC4xMDMxLDAuMTEzNjksMC4xMzc4NykpO3AzKz1kb3QocDMscDMueXh6KzE5LjE5KTtyZXR1cm4gLTEuMCsyLjAqZnJhY3QodmVjMygocDMueCtwMy55KSpwMy56LChwMy54K3AzLnopKnAzLnksKHAzLnkrcDMueikqcDMueCkpO31cbmZsb2F0IHBlcmxpbk5vaXNlKHZlYzMgcClcbnt2ZWMzIHBpPWZsb29yKHApO3ZlYzMgcGY9cC1waTt2ZWMzIHc9cGYqcGYqKDMuMC0yLjAqcGYpO3JldHVybiBtaXgoXG5taXgoXG5taXgoXG5kb3QocGYtdmVjMygwLDAsMCksaGFzaDMzKHBpK3ZlYzMoMCwwLDApKSksXG5kb3QocGYtdmVjMygxLDAsMCksaGFzaDMzKHBpK3ZlYzMoMSwwLDApKSksXG53LnhcbiksXG5taXgoXG5kb3QocGYtdmVjMygwLDAsMSksaGFzaDMzKHBpK3ZlYzMoMCwwLDEpKSksXG5kb3QocGYtdmVjMygxLDAsMSksaGFzaDMzKHBpK3ZlYzMoMSwwLDEpKSksXG53LnhcbiksXG53LnpcbiksXG5taXgoXG5taXgoXG5kb3QocGYtdmVjMygwLDEsMCksaGFzaDMzKHBpK3ZlYzMoMCwxLDApKSksXG5kb3QocGYtdmVjMygxLDEsMCksaGFzaDMzKHBpK3ZlYzMoMSwxLDApKSksXG53LnhcbiksXG5taXgoXG5kb3QocGYtdmVjMygwLDEsMSksaGFzaDMzKHBpK3ZlYzMoMCwxLDEpKSksXG5kb3QocGYtdmVjMygxLDEsMSksaGFzaDMzKHBpK3ZlYzMoMSwxLDEpKSksXG53LnhcbiksXG53LnpcbiksXG53Lnlcbik7fVxuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfREVGSU5JVElPTlNcbnZvaWQgbWFpbih2b2lkKVxue3ZlYzIgdXY9Z2xfRnJhZ0Nvb3JkLnh5K3RyYW5zbGF0aW9uU3BlZWQ7ZmxvYXQgZGlzPShcbjEuMCtwZXJsaW5Ob2lzZSh2ZWMzKHV2L3ZlYzIoc2l6ZSxzaXplKSx0aW1lKjAuMDUpKjguMCkpXG4qICgxLjArKHdvcmxleSh1diwzMi4wKSsgMC41KndvcmxleSgyLjAqdXYsMzIuMCkrMC4yNSp3b3JsZXkoNC4wKnV2LDMyLjApKVxuKTtnbF9GcmFnQ29sb3I9dmVjNCh2ZWMzKGRpcy80LjApLDEuMCk7fVxuYDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBwZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXIgPSB7IG5hbWUsIHNoYWRlciB9O1xuIiwiaW1wb3J0IHsgc2VyaWFsaXplIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzXCI7XHJcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25IZWxwZXIgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnMuc2VyaWFsaXphdGlvblwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5pbXBvcnQgXCIuL3Blcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBQZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlIGV4dGVuZHMgUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgdGltZTogbnVtYmVyID0gMC4wO1xyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIHRpbWVTY2FsZTogbnVtYmVyID0gMS4wO1xyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIHRyYW5zbGF0aW9uU3BlZWQ6IG51bWJlciA9IDEuMDtcclxuXHJcbiAgICBwcml2YXRlIF9jdXJyZW50VHJhbnNsYXRpb246IG51bWJlciA9IDA7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJwZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlXCIsIHNjZW5lLCBmYWxsYmFja1RleHR1cmUsIGdlbmVyYXRlTWlwTWFwcyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTaGFkZXJVbmlmb3JtcygpIHtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwic2l6ZVwiLCB0aGlzLmdldFJlbmRlclNpemUoKSBhcyBudW1iZXIpO1xyXG5cclxuICAgICAgICBjb25zdCBzY2VuZSA9IHRoaXMuZ2V0U2NlbmUoKTtcclxuXHJcbiAgICAgICAgaWYgKCFzY2VuZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRlbHRhVGltZSA9IHNjZW5lLmdldEVuZ2luZSgpLmdldERlbHRhVGltZSgpO1xyXG5cclxuICAgICAgICB0aGlzLnRpbWUgKz0gZGVsdGFUaW1lO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJ0aW1lXCIsICh0aGlzLnRpbWUgKiB0aGlzLnRpbWVTY2FsZSkgLyAxMDAwKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY3VycmVudFRyYW5zbGF0aW9uICs9IChkZWx0YVRpbWUgKiB0aGlzLnRyYW5zbGF0aW9uU3BlZWQpIC8gMTAwMC4wO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJ0cmFuc2xhdGlvblNwZWVkXCIsIHRoaXMuX2N1cnJlbnRUcmFuc2xhdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG92ZXJyaWRlIHJlbmRlcih1c2VDYW1lcmFQb3N0UHJvY2Vzcz86IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICAgICAgc3VwZXIucmVuZGVyKHVzZUNhbWVyYVBvc3RQcm9jZXNzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVzaXplKHNpemU6IGFueSwgZ2VuZXJhdGVNaXBNYXBzOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5yZXNpemUoc2l6ZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNlcmlhbGl6ZXMgdGhpcyBwZXJsaW4gbm9pc2UgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgcGVybGluIG5vaXNlIHByb2NlZHVyYWwgdGV4dHVyZSBvYmplY3RcclxuICAgICAqL1xyXG4gICAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YXRpb25PYmplY3QgPSBTZXJpYWxpemF0aW9uSGVscGVyLlNlcmlhbGl6ZSh0aGlzLCBzdXBlci5zZXJpYWxpemUoKSk7XHJcbiAgICAgICAgc2VyaWFsaXphdGlvbk9iamVjdC5jdXN0b21UeXBlID0gXCJCQUJZTE9OLlBlcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgUGVybGluIE5vaXNlIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCBwZXJsaW4gbm9pc2UgcHJvY2VkdXJhbCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBwYXJzZWRUZXh0dXJlIGRlZmluZXMgcGFyc2VkIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHNjZW5lIGRlZmluZXMgdGhlIGN1cnJlbnQgc2NlbmVcclxuICAgICAqIEBwYXJhbSByb290VXJsIGRlZmluZXMgdGhlIHJvb3QgVVJMIGNvbnRhaW5pbmcgcGVybGluIG5vaXNlIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgUGVybGluIE5vaXNlIFByb2NlZHVyYWwgVGV4dHVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG92ZXJyaWRlIFBhcnNlKHBhcnNlZFRleHR1cmU6IGFueSwgc2NlbmU6IFNjZW5lLCByb290VXJsOiBzdHJpbmcpOiBQZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IFBlcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmUocGFyc2VkVGV4dHVyZS5uYW1lLCBwYXJzZWRUZXh0dXJlLl9zaXplLCBzY2VuZSwgdW5kZWZpbmVkLCBwYXJzZWRUZXh0dXJlLl9nZW5lcmF0ZU1pcE1hcHMpLFxyXG4gICAgICAgICAgICBwYXJzZWRUZXh0dXJlLFxyXG4gICAgICAgICAgICBzY2VuZSxcclxuICAgICAgICAgICAgcm9vdFVybFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB0ZXh0dXJlO1xyXG4gICAgfVxyXG59XHJcblxyXG5SZWdpc3RlckNsYXNzKFwiQkFCWUxPTi5QZXJsaW5Ob2lzZVByb2NlZHVyYWxUZXh0dXJlXCIsIFBlcmxpbk5vaXNlUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9yb2FkUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwicm9hZFByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dmFyeWluZyB2ZWMyIHZVVjsgXG51bmlmb3JtIHZlYzMgcm9hZENvbG9yO2Zsb2F0IHJhbmQodmVjMiBuKSB7cmV0dXJuIGZyYWN0KGNvcyhkb3Qobix2ZWMyKDEyLjk4OTgsNC4xNDE0KSkpKjQzNzU4LjU0NTMpO31cbmZsb2F0IG5vaXNlKHZlYzIgbikge2NvbnN0IHZlYzIgZD12ZWMyKDAuMCwxLjApO3ZlYzIgYj1mbG9vcihuKSxmPXNtb290aHN0ZXAodmVjMigwLjApLHZlYzIoMS4wKSxmcmFjdChuKSk7cmV0dXJuIG1peChtaXgocmFuZChiKSxyYW5kKGIrZC55eCksZi54KSxtaXgocmFuZChiK2QueHkpLHJhbmQoYitkLnl5KSxmLngpLGYueSk7fVxuZmxvYXQgZmJtKHZlYzIgbikge2Zsb2F0IHRvdGFsPTAuMCxhbXBsaXR1ZGU9MS4wO2ZvciAoaW50IGk9MDsgaTw0OyBpKyspIHt0b3RhbCs9bm9pc2UobikqYW1wbGl0dWRlO24rPW47YW1wbGl0dWRlKj0wLjU7fVxucmV0dXJuIHRvdGFsO31cbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX0RFRklOSVRJT05TXG52b2lkIG1haW4odm9pZCkge1xuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfTUFJTl9CRUdJTlxuZmxvYXQgcmF0aW95PW1vZChnbF9GcmFnQ29vcmQueSoxMDAuMCAsZmJtKHZVVioyLjApKTt2ZWMzIGNvbG9yPXJvYWRDb2xvcipyYXRpb3k7Z2xfRnJhZ0NvbG9yPXZlYzQoY29sb3IsMS4wKTtcbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fRU5EXG59YDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCByb2FkUHJvY2VkdXJhbFRleHR1cmVQaXhlbFNoYWRlciA9IHsgbmFtZSwgc2hhZGVyIH07XG4iLCJpbXBvcnQgeyBzZXJpYWxpemVBc0NvbG9yMyB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHsgQ29sb3IzIH0gZnJvbSBcImNvcmUvTWF0aHMvbWF0aC5jb2xvclwiO1xyXG5pbXBvcnQgdHlwZSB7IFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvdGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBQcm9jZWR1cmFsVGV4dHVyZSB9IGZyb20gXCJjb3JlL01hdGVyaWFscy9UZXh0dXJlcy9Qcm9jZWR1cmFscy9wcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG5pbXBvcnQgdHlwZSB7IFNjZW5lIH0gZnJvbSBcImNvcmUvc2NlbmVcIjtcclxuaW1wb3J0IHsgUmVnaXN0ZXJDbGFzcyB9IGZyb20gXCJjb3JlL01pc2MvdHlwZVN0b3JlXCI7XHJcbmltcG9ydCB0eXBlIHsgTnVsbGFibGUgfSBmcm9tIFwiY29yZS90eXBlc1wiO1xyXG5pbXBvcnQgXCIuL3JvYWRQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJvYWRQcm9jZWR1cmFsVGV4dHVyZSBleHRlbmRzIFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgIHByaXZhdGUgX3JvYWRDb2xvciA9IG5ldyBDb2xvcjMoMC41MywgMC41MywgMC41Myk7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJyb2FkUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0Q29sb3IzKFwicm9hZENvbG9yXCIsIHRoaXMuX3JvYWRDb2xvcik7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzQ29sb3IzKClcclxuICAgIHB1YmxpYyBnZXQgcm9hZENvbG9yKCk6IENvbG9yMyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JvYWRDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHJvYWRDb2xvcih2YWx1ZTogQ29sb3IzKSB7XHJcbiAgICAgICAgdGhpcy5fcm9hZENvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIHJvYWQgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgcm9hZCBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5Sb2FkUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgUm9hZCBQcm9jZWR1cmFsIFRleHR1cmUgZnJvbSBwYXJzZWQgcm9hZCBwcm9jZWR1cmFsIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHBhcnNlZFRleHR1cmUgZGVmaW5lcyBwYXJzZWQgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgY3VycmVudCBzY2VuZVxyXG4gICAgICogQHBhcmFtIHJvb3RVcmwgZGVmaW5lcyB0aGUgcm9vdCBVUkwgY29udGFpbmluZyByb2FkIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgUm9hZCBQcm9jZWR1cmFsIFRleHR1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBQYXJzZShwYXJzZWRUZXh0dXJlOiBhbnksIHNjZW5lOiBTY2VuZSwgcm9vdFVybDogc3RyaW5nKTogUm9hZFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IFJvYWRQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLlJvYWRQcm9jZWR1cmFsVGV4dHVyZVwiLCBSb2FkUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi9zdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZVwiO1xyXG4iLCIvLyBEbyBub3QgZWRpdC5cbmltcG9ydCB7IFNoYWRlclN0b3JlIH0gZnJvbSBcImNvcmUvRW5naW5lcy9zaGFkZXJTdG9yZVwiO1xuXG5jb25zdCBuYW1lID0gXCJzdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyXCI7XG5jb25zdCBzaGFkZXIgPSBgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2RlZmluZSB2b2xzdGVwcyAyMFxuI2RlZmluZSBpdGVyYXRpb25zIDE1XG52YXJ5aW5nIHZlYzIgdlBvc2l0aW9uO3ZhcnlpbmcgdmVjMiB2VVY7dW5pZm9ybSBmbG9hdCB0aW1lO3VuaWZvcm0gZmxvYXQgYWxwaGE7dW5pZm9ybSBmbG9hdCBiZXRhO3VuaWZvcm0gZmxvYXQgem9vbTt1bmlmb3JtIGZsb2F0IGZvcm11cGFyYW07dW5pZm9ybSBmbG9hdCBzdGVwc2l6ZTt1bmlmb3JtIGZsb2F0IHRpbGU7dW5pZm9ybSBmbG9hdCBicmlnaHRuZXNzO3VuaWZvcm0gZmxvYXQgZGFya21hdHRlcjt1bmlmb3JtIGZsb2F0IGRpc3RmYWRpbmc7dW5pZm9ybSBmbG9hdCBzYXR1cmF0aW9uO3ZvaWQgbWFpbigpXG57dmVjMyBkaXI9dmVjMyh2VVYqem9vbSwxLik7ZmxvYXQgbG9jYWxUaW1lPXRpbWUqMC4wMDAxO21hdDIgcm90MT1tYXQyKGNvcyhhbHBoYSksc2luKGFscGhhKSwtc2luKGFscGhhKSxjb3MoYWxwaGEpKTttYXQyIHJvdDI9bWF0Mihjb3MoYmV0YSksc2luKGJldGEpLC1zaW4oYmV0YSksY29zKGJldGEpKTtkaXIueHoqPXJvdDE7ZGlyLnh5Kj1yb3QyO3ZlYzMgZnJvbV89dmVjMygxLiwuNSwwLjUpO2Zyb21fKz12ZWMzKC0yLixsb2NhbFRpbWUqMi4sbG9jYWxUaW1lKTtmcm9tXy54eio9cm90MTtmcm9tXy54eSo9cm90MjtmbG9hdCBzPTAuMSxmYWRlPTEuO3ZlYzMgdj12ZWMzKDAuKTtmb3IgKGludCByPTA7IHI8dm9sc3RlcHM7IHIrKykge3ZlYzMgcD1mcm9tXytzKmRpciouNTtwPWFicyh2ZWMzKHRpbGUpLW1vZChwLHZlYzModGlsZSoyLikpKTsgXG5mbG9hdCBwYSxhPXBhPTAuO2ZvciAoaW50IGk9MDsgaTxpdGVyYXRpb25zOyBpKyspIHtwPWFicyhwKS9kb3QocCxwKS1mb3JtdXBhcmFtOyBcbmErPWFicyhsZW5ndGgocCktcGEpOyBcbnBhPWxlbmd0aChwKTt9XG5mbG9hdCBkbT1tYXgoMC4sZGFya21hdHRlci1hKmEqLjAwMSk7IFxuYSo9YSphOyBcbmlmIChyPjYpIGZhZGUqPTEuLWRtOyBcbnYrPWZhZGU7dis9dmVjMyhzLHMqcyxzKnMqcypzKSphKmJyaWdodG5lc3MqZmFkZTsgXG5mYWRlKj1kaXN0ZmFkaW5nOyBcbnMrPXN0ZXBzaXplO31cbnY9bWl4KHZlYzMobGVuZ3RoKHYpKSx2LHNhdHVyYXRpb24pOyBcbmdsX0ZyYWdDb2xvcj12ZWM0KHYqLjAxLDEuKTt9YDtcbi8vIFNpZGVlZmZlY3RcblNoYWRlclN0b3JlLlNoYWRlcnNTdG9yZVtuYW1lXSA9IHNoYWRlcjtcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBzdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImltcG9ydCB7IHNlcmlhbGl6ZSB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9yc1wiO1xyXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uSGVscGVyIH0gZnJvbSBcImNvcmUvTWlzYy9kZWNvcmF0b3JzLnNlcmlhbGl6YXRpb25cIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJhbFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvUHJvY2VkdXJhbHMvcHJvY2VkdXJhbFRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuaW1wb3J0IFwiLi9zdGFyZmllbGRQcm9jZWR1cmFsVGV4dHVyZS5mcmFnbWVudFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFN0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlIGV4dGVuZHMgUHJvY2VkdXJhbFRleHR1cmUge1xyXG4gICAgcHJpdmF0ZSBfdGltZSA9IDE7XHJcbiAgICBwcml2YXRlIF9hbHBoYSA9IDAuNTtcclxuICAgIHByaXZhdGUgX2JldGEgPSAwLjg7XHJcbiAgICBwcml2YXRlIF96b29tID0gMC44O1xyXG4gICAgcHJpdmF0ZSBfZm9ybXVwYXJhbSA9IDAuNTM7XHJcbiAgICBwcml2YXRlIF9zdGVwc2l6ZSA9IDAuMTtcclxuICAgIHByaXZhdGUgX3RpbGUgPSAwLjg1O1xyXG4gICAgcHJpdmF0ZSBfYnJpZ2h0bmVzcyA9IDAuMDAxNTtcclxuICAgIHByaXZhdGUgX2RhcmttYXR0ZXIgPSAwLjQ7XHJcbiAgICBwcml2YXRlIF9kaXN0ZmFkaW5nID0gMC43MztcclxuICAgIHByaXZhdGUgX3NhdHVyYXRpb24gPSAwLjg1O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgc2l6ZTogbnVtYmVyLCBzY2VuZTogTnVsbGFibGU8U2NlbmU+ID0gbnVsbCwgZmFsbGJhY2tUZXh0dXJlPzogVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzPzogYm9vbGVhbikge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHNpemUsIFwic3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJ0aW1lXCIsIHRoaXMuX3RpbWUpO1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJhbHBoYVwiLCB0aGlzLl9hbHBoYSk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcImJldGFcIiwgdGhpcy5fYmV0YSk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcInpvb21cIiwgdGhpcy5fem9vbSk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcImZvcm11cGFyYW1cIiwgdGhpcy5fZm9ybXVwYXJhbSk7XHJcbiAgICAgICAgdGhpcy5zZXRGbG9hdChcInN0ZXBzaXplXCIsIHRoaXMuX3N0ZXBzaXplKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwidGlsZVwiLCB0aGlzLl90aWxlKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiYnJpZ2h0bmVzc1wiLCB0aGlzLl9icmlnaHRuZXNzKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiZGFya21hdHRlclwiLCB0aGlzLl9kYXJrbWF0dGVyKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwiZGlzdGZhZGluZ1wiLCB0aGlzLl9kaXN0ZmFkaW5nKTtcclxuICAgICAgICB0aGlzLnNldEZsb2F0KFwic2F0dXJhdGlvblwiLCB0aGlzLl9zYXR1cmF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgdGltZSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgdGltZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fdGltZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2hhZGVyVW5pZm9ybXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgYWxwaGEoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYWxwaGE7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBhbHBoYSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fYWxwaGEgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGJldGEoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYmV0YTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGJldGEodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2JldGEgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IGZvcm11cGFyYW0oKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybXVwYXJhbTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IGZvcm11cGFyYW0odmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX2Zvcm11cGFyYW0gPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZSgpXHJcbiAgICBwdWJsaWMgZ2V0IHN0ZXBzaXplKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0ZXBzaXplO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZXQgc3RlcHNpemUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX3N0ZXBzaXplID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCB6b29tKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3pvb207XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB6b29tKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl96b29tID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCB0aWxlKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCB0aWxlKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl90aWxlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBicmlnaHRuZXNzKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JyaWdodG5lc3M7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBicmlnaHRuZXNzKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9icmlnaHRuZXNzID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBkYXJrbWF0dGVyKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhcmttYXR0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBkYXJrbWF0dGVyKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9kYXJrbWF0dGVyID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBkaXN0ZmFkaW5nKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3RmYWRpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBkaXN0ZmFkaW5nKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9kaXN0ZmFkaW5nID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIEBzZXJpYWxpemUoKVxyXG4gICAgcHVibGljIGdldCBzYXR1cmF0aW9uKCk6IG51bWJlciB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NhdHVyYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBzYXR1cmF0aW9uKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLl9zYXR1cmF0aW9uID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIHN0YXJmaWVsZCBwcm9jZWR1cmFsIHRleHR1cmVcclxuICAgICAqIEByZXR1cm5zIGEgc2VyaWFsaXplZCBzdGFyZmllbGQgcHJvY2VkdXJhbCB0ZXh0dXJlIG9iamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgc2VyaWFsaXphdGlvbk9iamVjdCA9IFNlcmlhbGl6YXRpb25IZWxwZXIuU2VyaWFsaXplKHRoaXMsIHN1cGVyLnNlcmlhbGl6ZSgpKTtcclxuICAgICAgICBzZXJpYWxpemF0aW9uT2JqZWN0LmN1c3RvbVR5cGUgPSBcIkJBQllMT04uU3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgU3RhcmZpZWxkIFByb2NlZHVyYWwgVGV4dHVyZSBmcm9tIHBhcnNlZCBzdGFydGZpZWxkIHByb2NlZHVyYWwgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gcGFyc2VkVGV4dHVyZSBkZWZpbmVzIHBhcnNlZCB0ZXh0dXJlIGRhdGFcclxuICAgICAqIEBwYXJhbSBzY2VuZSBkZWZpbmVzIHRoZSBjdXJyZW50IHNjZW5lXHJcbiAgICAgKiBAcGFyYW0gcm9vdFVybCBkZWZpbmVzIHRoZSByb290IFVSTCBjb250YWluaW5nIHN0YXJ0ZmllbGQgcHJvY2VkdXJhbCB0ZXh0dXJlIGluZm9ybWF0aW9uXHJcbiAgICAgKiBAcmV0dXJucyBhIHBhcnNlZCBTdGFyZmllbGQgUHJvY2VkdXJhbCBUZXh0dXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgb3ZlcnJpZGUgUGFyc2UocGFyc2VkVGV4dHVyZTogYW55LCBzY2VuZTogU2NlbmUsIHJvb3RVcmw6IHN0cmluZyk6IFN0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IFN0YXJmaWVsZFByb2NlZHVyYWxUZXh0dXJlKHBhcnNlZFRleHR1cmUubmFtZSwgcGFyc2VkVGV4dHVyZS5fc2l6ZSwgc2NlbmUsIHVuZGVmaW5lZCwgcGFyc2VkVGV4dHVyZS5fZ2VuZXJhdGVNaXBNYXBzKSxcclxuICAgICAgICAgICAgcGFyc2VkVGV4dHVyZSxcclxuICAgICAgICAgICAgc2NlbmUsXHJcbiAgICAgICAgICAgIHJvb3RVcmxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gdGV4dHVyZTtcclxuICAgIH1cclxufVxyXG5cclxuUmVnaXN0ZXJDbGFzcyhcIkJBQllMT04uU3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmVcIiwgU3RhcmZpZWxkUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCJleHBvcnQgKiBmcm9tIFwiLi93b29kUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuIiwiLy8gRG8gbm90IGVkaXQuXG5pbXBvcnQgeyBTaGFkZXJTdG9yZSB9IGZyb20gXCJjb3JlL0VuZ2luZXMvc2hhZGVyU3RvcmVcIjtcblxuY29uc3QgbmFtZSA9IFwid29vZFByb2NlZHVyYWxUZXh0dXJlUGl4ZWxTaGFkZXJcIjtcbmNvbnN0IHNoYWRlciA9IGBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7dmFyeWluZyB2ZWMyIHZQb3NpdGlvbjt2YXJ5aW5nIHZlYzIgdlVWO3VuaWZvcm0gZmxvYXQgYW1wU2NhbGU7dW5pZm9ybSB2ZWMzIHdvb2RDb2xvcjtmbG9hdCByYW5kKHZlYzIgbikge3JldHVybiBmcmFjdChjb3MoZG90KG4sdmVjMigxMi45ODk4LDQuMTQxNCkpKSo0Mzc1OC41NDUzKTt9XG5mbG9hdCBub2lzZSh2ZWMyIG4pIHtjb25zdCB2ZWMyIGQ9dmVjMigwLjAsMS4wKTt2ZWMyIGI9Zmxvb3IobiksZj1zbW9vdGhzdGVwKHZlYzIoMC4wKSx2ZWMyKDEuMCksZnJhY3QobikpO3JldHVybiBtaXgobWl4KHJhbmQoYikscmFuZChiK2QueXgpLGYueCksbWl4KHJhbmQoYitkLnh5KSxyYW5kKGIrZC55eSksZi54KSxmLnkpO31cbmZsb2F0IGZibSh2ZWMyIG4pIHtmbG9hdCB0b3RhbD0wLjAsYW1wbGl0dWRlPTEuMDtmb3IgKGludCBpPTA7IGk8NDsgaSsrKSB7dG90YWwrPW5vaXNlKG4pKmFtcGxpdHVkZTtuKz1uO2FtcGxpdHVkZSo9MC41O31cbnJldHVybiB0b3RhbDt9XG4jZGVmaW5lIENVU1RPTV9GUkFHTUVOVF9ERUZJTklUSU9OU1xudm9pZCBtYWluKHZvaWQpIHtcbiNkZWZpbmUgQ1VTVE9NX0ZSQUdNRU5UX01BSU5fQkVHSU5cbmZsb2F0IHJhdGlveT1tb2QodlVWLngqYW1wU2NhbGUsMi4wK2ZibSh2VVYqMC44KSk7dmVjMyB3b29kPXdvb2RDb2xvcipyYXRpb3k7Z2xfRnJhZ0NvbG9yPXZlYzQod29vZCwxLjApO1xuI2RlZmluZSBDVVNUT01fRlJBR01FTlRfTUFJTl9FTkRcbn1gO1xuLy8gU2lkZWVmZmVjdFxuU2hhZGVyU3RvcmUuU2hhZGVyc1N0b3JlW25hbWVdID0gc2hhZGVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGNvbnN0IHdvb2RQcm9jZWR1cmFsVGV4dHVyZVBpeGVsU2hhZGVyID0geyBuYW1lLCBzaGFkZXIgfTtcbiIsImltcG9ydCB7IHNlcmlhbGl6ZSwgc2VyaWFsaXplQXNDb2xvcjMgfSBmcm9tIFwiY29yZS9NaXNjL2RlY29yYXRvcnNcIjtcclxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkhlbHBlciB9IGZyb20gXCJjb3JlL01pc2MvZGVjb3JhdG9ycy5zZXJpYWxpemF0aW9uXCI7XHJcbmltcG9ydCB7IENvbG9yMyB9IGZyb20gXCJjb3JlL01hdGhzL21hdGguY29sb3JcIjtcclxuaW1wb3J0IHR5cGUgeyBUZXh0dXJlIH0gZnJvbSBcImNvcmUvTWF0ZXJpYWxzL1RleHR1cmVzL3RleHR1cmVcIjtcclxuaW1wb3J0IHsgUHJvY2VkdXJhbFRleHR1cmUgfSBmcm9tIFwiY29yZS9NYXRlcmlhbHMvVGV4dHVyZXMvUHJvY2VkdXJhbHMvcHJvY2VkdXJhbFRleHR1cmVcIjtcclxuaW1wb3J0IHR5cGUgeyBTY2VuZSB9IGZyb20gXCJjb3JlL3NjZW5lXCI7XHJcbmltcG9ydCB7IFJlZ2lzdGVyQ2xhc3MgfSBmcm9tIFwiY29yZS9NaXNjL3R5cGVTdG9yZVwiO1xyXG5pbXBvcnQgdHlwZSB7IE51bGxhYmxlIH0gZnJvbSBcImNvcmUvdHlwZXNcIjtcclxuaW1wb3J0IFwiLi93b29kUHJvY2VkdXJhbFRleHR1cmUuZnJhZ21lbnRcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBXb29kUHJvY2VkdXJhbFRleHR1cmUgZXh0ZW5kcyBQcm9jZWR1cmFsVGV4dHVyZSB7XHJcbiAgICBwcml2YXRlIF9hbXBTY2FsZTogbnVtYmVyID0gMTAwLjA7XHJcbiAgICBwcml2YXRlIF93b29kQ29sb3I6IENvbG9yMyA9IG5ldyBDb2xvcjMoMC4zMiwgMC4xNywgMC4wOSk7XHJcblxyXG4gICAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBzaXplOiBudW1iZXIsIHNjZW5lOiBOdWxsYWJsZTxTY2VuZT4gPSBudWxsLCBmYWxsYmFja1RleHR1cmU/OiBUZXh0dXJlLCBnZW5lcmF0ZU1pcE1hcHM/OiBib29sZWFuKSB7XHJcbiAgICAgICAgc3VwZXIobmFtZSwgc2l6ZSwgXCJ3b29kUHJvY2VkdXJhbFRleHR1cmVcIiwgc2NlbmUsIGZhbGxiYWNrVGV4dHVyZSwgZ2VuZXJhdGVNaXBNYXBzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNoYWRlclVuaWZvcm1zKCkge1xyXG4gICAgICAgIHRoaXMuc2V0RmxvYXQoXCJhbXBTY2FsZVwiLCB0aGlzLl9hbXBTY2FsZSk7XHJcbiAgICAgICAgdGhpcy5zZXRDb2xvcjMoXCJ3b29kQ29sb3JcIiwgdGhpcy5fd29vZENvbG9yKTtcclxuICAgIH1cclxuXHJcbiAgICBAc2VyaWFsaXplKClcclxuICAgIHB1YmxpYyBnZXQgYW1wU2NhbGUoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYW1wU2NhbGU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNldCBhbXBTY2FsZSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fYW1wU2NhbGUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNoYWRlclVuaWZvcm1zKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQHNlcmlhbGl6ZUFzQ29sb3IzKClcclxuICAgIHB1YmxpYyBnZXQgd29vZENvbG9yKCk6IENvbG9yMyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvb2RDb2xvcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc2V0IHdvb2RDb2xvcih2YWx1ZTogQ29sb3IzKSB7XHJcbiAgICAgICAgdGhpcy5fd29vZENvbG9yID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTaGFkZXJVbmlmb3JtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2VyaWFsaXplcyB0aGlzIHdvb2QgcHJvY2VkdXJhbCB0ZXh0dXJlXHJcbiAgICAgKiBAcmV0dXJucyBhIHNlcmlhbGl6ZWQgd29vZCBwcm9jZWR1cmFsIHRleHR1cmUgb2JqZWN0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJpYWxpemUoKTogYW55IHtcclxuICAgICAgICBjb25zdCBzZXJpYWxpemF0aW9uT2JqZWN0ID0gU2VyaWFsaXphdGlvbkhlbHBlci5TZXJpYWxpemUodGhpcywgc3VwZXIuc2VyaWFsaXplKCkpO1xyXG4gICAgICAgIHNlcmlhbGl6YXRpb25PYmplY3QuY3VzdG9tVHlwZSA9IFwiQkFCWUxPTi5Xb29kUHJvY2VkdXJhbFRleHR1cmVcIjtcclxuXHJcbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgV29vZCBQcm9jZWR1cmFsIFRleHR1cmUgZnJvbSBwYXJzZWQgd29vZCBwcm9jZWR1cmFsIHRleHR1cmUgZGF0YVxyXG4gICAgICogQHBhcmFtIHBhcnNlZFRleHR1cmUgZGVmaW5lcyBwYXJzZWQgdGV4dHVyZSBkYXRhXHJcbiAgICAgKiBAcGFyYW0gc2NlbmUgZGVmaW5lcyB0aGUgY3VycmVudCBzY2VuZVxyXG4gICAgICogQHBhcmFtIHJvb3RVcmwgZGVmaW5lcyB0aGUgcm9vdCBVUkwgY29udGFpbmluZyB3b29kIHByb2NlZHVyYWwgdGV4dHVyZSBpbmZvcm1hdGlvblxyXG4gICAgICogQHJldHVybnMgYSBwYXJzZWQgV29vZCBQcm9jZWR1cmFsIFRleHR1cmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBvdmVycmlkZSBQYXJzZShwYXJzZWRUZXh0dXJlOiBhbnksIHNjZW5lOiBTY2VuZSwgcm9vdFVybDogc3RyaW5nKTogV29vZFByb2NlZHVyYWxUZXh0dXJlIHtcclxuICAgICAgICBjb25zdCB0ZXh0dXJlID0gU2VyaWFsaXphdGlvbkhlbHBlci5QYXJzZShcclxuICAgICAgICAgICAgKCkgPT4gbmV3IFdvb2RQcm9jZWR1cmFsVGV4dHVyZShwYXJzZWRUZXh0dXJlLm5hbWUsIHBhcnNlZFRleHR1cmUuX3NpemUsIHNjZW5lLCB1bmRlZmluZWQsIHBhcnNlZFRleHR1cmUuX2dlbmVyYXRlTWlwTWFwcyksXHJcbiAgICAgICAgICAgIHBhcnNlZFRleHR1cmUsXHJcbiAgICAgICAgICAgIHNjZW5lLFxyXG4gICAgICAgICAgICByb290VXJsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRleHR1cmU7XHJcbiAgICB9XHJcbn1cclxuXHJcblJlZ2lzdGVyQ2xhc3MoXCJCQUJZTE9OLldvb2RQcm9jZWR1cmFsVGV4dHVyZVwiLCBXb29kUHJvY2VkdXJhbFRleHR1cmUpO1xyXG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8taW50ZXJuYWwtbW9kdWxlcyAqL1xyXG5pbXBvcnQgKiBhcyBQcm9jZWR1cmFsVGV4dHVyZXNMaWIgZnJvbSBcInByb2NlZHVyYWwtdGV4dHVyZXMvaW5kZXhcIjtcclxuXHJcbi8qKlxyXG4gKiBMZWdhY3kgc3VwcG9ydCwgZGVmaW5pbmcgd2luZG93LkJBQllMT04uR3JpZE1hdGVyaWFsLi4uIChnbG9iYWwgdmFyaWFibGUpLlxyXG4gKlxyXG4gKiBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIFVNRCBtb2R1bGUuXHJcbiAqIFRoZSBlbnRyeSBwb2ludCBmb3IgYSBmdXR1cmUgRVNNIHBhY2thZ2Ugc2hvdWxkIGJlIGluZGV4LnRzXHJcbiAqL1xyXG5jb25zdCBnbG9iYWxPYmplY3QgPSB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHVuZGVmaW5lZDtcclxuaWYgKHR5cGVvZiBnbG9iYWxPYmplY3QgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICg8YW55Pmdsb2JhbE9iamVjdCkuQkFCWUxPTiA9ICg8YW55Pmdsb2JhbE9iamVjdCkuQkFCWUxPTiB8fCB7fTtcclxuICAgIGZvciAoY29uc3QgbWF0IGluIFByb2NlZHVyYWxUZXh0dXJlc0xpYikge1xyXG4gICAgICAgICg8YW55Pmdsb2JhbE9iamVjdCkuQkFCWUxPTlttYXRdID0gKDxhbnk+UHJvY2VkdXJhbFRleHR1cmVzTGliKVttYXRdO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgKiBmcm9tIFwicHJvY2VkdXJhbC10ZXh0dXJlcy9pbmRleFwiO1xyXG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfYmFieWxvbmpzX01pc2NfZGVjb3JhdG9yc19fOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCAqIGFzIHByb2NlZHVyYWxUZXh0dXJlcyBmcm9tIFwiQGx0cy9wcm9jZWR1cmFsLXRleHR1cmVzL2xlZ2FjeS9sZWdhY3lcIjtcclxuZXhwb3J0IHsgcHJvY2VkdXJhbFRleHR1cmVzIH07XHJcbmV4cG9ydCBkZWZhdWx0IHByb2NlZHVyYWxUZXh0dXJlcztcclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|