ngx-spine
Version:
[](https://travis-ci.org/PoiScript/ngx-spine)
396 lines • 55.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { SkeletonClipping } from "../core/SkeletonClipping";
import { Color, Vector2, Utils } from "../core/Utils";
import { WebGLBlendModeConverter } from "./WebGL";
import { RegionAttachment } from "../core/attachments/RegionAttachment";
import { MeshAttachment } from "../core/attachments/MeshAttachment";
import { ClippingAttachment } from "../core/attachments/ClippingAttachment";
var Renderable = /** @class */ (function () {
function Renderable(vertices, numVertices, numFloats) {
this.vertices = vertices;
this.numVertices = numVertices;
this.numFloats = numFloats;
}
return Renderable;
}());
if (false) {
/** @type {?} */
Renderable.prototype.vertices;
/** @type {?} */
Renderable.prototype.numVertices;
/** @type {?} */
Renderable.prototype.numFloats;
}
var SkeletonRenderer = /** @class */ (function () {
function SkeletonRenderer(context, twoColorTint) {
if (twoColorTint === void 0) { twoColorTint = true; }
this.premultipliedAlpha = false;
this.vertexEffect = null;
this.tempColor = new Color();
this.tempColor2 = new Color();
this.vertexSize = 2 + 2 + 4;
this.twoColorTint = false;
this.renderable = new Renderable(null, 0, 0);
this.clipper = new SkeletonClipping();
this.temp = new Vector2();
this.temp2 = new Vector2();
this.temp3 = new Color();
this.temp4 = new Color();
this.twoColorTint = twoColorTint;
if (twoColorTint)
this.vertexSize += 4;
this.vertices = Utils.newFloatArray(this.vertexSize * 1024);
}
/**
* @param {?} batcher
* @param {?} skeleton
* @param {?=} slotRangeStart
* @param {?=} slotRangeEnd
* @return {?}
*/
SkeletonRenderer.prototype.draw = /**
* @param {?} batcher
* @param {?} skeleton
* @param {?=} slotRangeStart
* @param {?=} slotRangeEnd
* @return {?}
*/
function (batcher, skeleton, slotRangeStart, slotRangeEnd) {
if (slotRangeStart === void 0) { slotRangeStart = -1; }
if (slotRangeEnd === void 0) { slotRangeEnd = -1; }
/** @type {?} */
var clipper = this.clipper;
/** @type {?} */
var premultipliedAlpha = this.premultipliedAlpha;
/** @type {?} */
var twoColorTint = this.twoColorTint;
/** @type {?} */
var blendMode = null;
/** @type {?} */
var tempPos = this.temp;
/** @type {?} */
var tempUv = this.temp2;
/** @type {?} */
var tempLight = this.temp3;
/** @type {?} */
var tempDark = this.temp4;
/** @type {?} */
var renderable = this.renderable;
/** @type {?} */
var uvs = null;
/** @type {?} */
var triangles = null;
/** @type {?} */
var drawOrder = skeleton.drawOrder;
/** @type {?} */
var attachmentColor = null;
/** @type {?} */
var skeletonColor = skeleton.color;
/** @type {?} */
var vertexSize = twoColorTint ? 12 : 8;
/** @type {?} */
var inRange = false;
if (slotRangeStart == -1)
inRange = true;
for (var i = 0, n = drawOrder.length; i < n; i++) {
/** @type {?} */
var clippedVertexSize = clipper.isClipping() ? 2 : vertexSize;
/** @type {?} */
var slot = drawOrder[i];
if (slotRangeStart >= 0 && slotRangeStart == slot.data.index) {
inRange = true;
}
if (!inRange) {
clipper.clipEndWithSlot(slot);
continue;
}
if (slotRangeEnd >= 0 && slotRangeEnd == slot.data.index) {
inRange = false;
}
/** @type {?} */
var attachment = slot.getAttachment();
/** @type {?} */
var texture = null;
if (attachment instanceof RegionAttachment) {
/** @type {?} */
var region = (/** @type {?} */ (attachment));
renderable.vertices = this.vertices;
renderable.numVertices = 4;
renderable.numFloats = clippedVertexSize << 2;
region.computeWorldVertices(slot.bone, renderable.vertices, 0, clippedVertexSize);
triangles = SkeletonRenderer.QUAD_TRIANGLES;
uvs = region.uvs;
texture = (/** @type {?} */ ((((/** @type {?} */ (region.region.renderObject))).texture)));
attachmentColor = region.color;
}
else if (attachment instanceof MeshAttachment) {
/** @type {?} */
var mesh = (/** @type {?} */ (attachment));
renderable.vertices = this.vertices;
renderable.numVertices = mesh.worldVerticesLength >> 1;
renderable.numFloats = renderable.numVertices * clippedVertexSize;
if (renderable.numFloats > renderable.vertices.length) {
renderable.vertices = this.vertices = Utils.newFloatArray(renderable.numFloats);
}
mesh.computeWorldVertices(slot, 0, mesh.worldVerticesLength, renderable.vertices, 0, clippedVertexSize);
triangles = mesh.triangles;
texture = (/** @type {?} */ ((((/** @type {?} */ (mesh.region.renderObject))).texture)));
uvs = mesh.uvs;
attachmentColor = mesh.color;
}
else if (attachment instanceof ClippingAttachment) {
/** @type {?} */
var clip = (/** @type {?} */ (attachment));
clipper.clipStart(slot, clip);
continue;
}
else {
clipper.clipEndWithSlot(slot);
continue;
}
if (texture != null) {
/** @type {?} */
var slotColor = slot.color;
/** @type {?} */
var finalColor = this.tempColor;
finalColor.r = skeletonColor.r * slotColor.r * attachmentColor.r;
finalColor.g = skeletonColor.g * slotColor.g * attachmentColor.g;
finalColor.b = skeletonColor.b * slotColor.b * attachmentColor.b;
finalColor.a = skeletonColor.a * slotColor.a * attachmentColor.a;
if (premultipliedAlpha) {
finalColor.r *= finalColor.a;
finalColor.g *= finalColor.a;
finalColor.b *= finalColor.a;
}
/** @type {?} */
var darkColor = this.tempColor2;
if (slot.darkColor == null)
darkColor.set(0, 0, 0, 1.0);
else {
if (premultipliedAlpha) {
darkColor.r = slot.darkColor.r * finalColor.a;
darkColor.g = slot.darkColor.g * finalColor.a;
darkColor.b = slot.darkColor.b * finalColor.a;
}
else {
darkColor.setFromColor(slot.darkColor);
}
darkColor.a = premultipliedAlpha ? 1.0 : 0.0;
}
/** @type {?} */
var slotBlendMode = slot.data.blendMode;
if (slotBlendMode != blendMode) {
blendMode = slotBlendMode;
batcher.setBlendMode(WebGLBlendModeConverter.getSourceGLBlendMode(blendMode, premultipliedAlpha), WebGLBlendModeConverter.getDestGLBlendMode(blendMode));
}
if (clipper.isClipping()) {
clipper.clipTriangles(renderable.vertices, renderable.numFloats, triangles, triangles.length, uvs, finalColor, darkColor, twoColorTint);
/** @type {?} */
var clippedVertices = new Float32Array(clipper.clippedVertices);
/** @type {?} */
var clippedTriangles = clipper.clippedTriangles;
if (this.vertexEffect != null) {
/** @type {?} */
var vertexEffect = this.vertexEffect;
/** @type {?} */
var verts = clippedVertices;
if (!twoColorTint) {
for (var v = 0, n_1 = clippedVertices.length; v < n_1; v += vertexSize) {
tempPos.x = verts[v];
tempPos.y = verts[v + 1];
tempLight.set(verts[v + 2], verts[v + 3], verts[v + 4], verts[v + 5]);
tempUv.x = verts[v + 6];
tempUv.y = verts[v + 7];
tempDark.set(0, 0, 0, 0);
vertexEffect.transform(tempPos, tempUv, tempLight, tempDark);
verts[v] = tempPos.x;
verts[v + 1] = tempPos.y;
verts[v + 2] = tempLight.r;
verts[v + 3] = tempLight.g;
verts[v + 4] = tempLight.b;
verts[v + 5] = tempLight.a;
verts[v + 6] = tempUv.x;
verts[v + 7] = tempUv.y;
}
}
else {
for (var v = 0, n_2 = clippedVertices.length; v < n_2; v += vertexSize) {
tempPos.x = verts[v];
tempPos.y = verts[v + 1];
tempLight.set(verts[v + 2], verts[v + 3], verts[v + 4], verts[v + 5]);
tempUv.x = verts[v + 6];
tempUv.y = verts[v + 7];
tempDark.set(verts[v + 8], verts[v + 9], verts[v + 10], verts[v + 11]);
vertexEffect.transform(tempPos, tempUv, tempLight, tempDark);
verts[v] = tempPos.x;
verts[v + 1] = tempPos.y;
verts[v + 2] = tempLight.r;
verts[v + 3] = tempLight.g;
verts[v + 4] = tempLight.b;
verts[v + 5] = tempLight.a;
verts[v + 6] = tempUv.x;
verts[v + 7] = tempUv.y;
verts[v + 8] = tempDark.r;
verts[v + 9] = tempDark.g;
verts[v + 10] = tempDark.b;
verts[v + 11] = tempDark.a;
}
}
}
batcher.draw(texture, clippedVertices, clippedTriangles);
}
else {
/** @type {?} */
var verts = renderable.vertices;
if (this.vertexEffect != null) {
/** @type {?} */
var vertexEffect = this.vertexEffect;
if (!twoColorTint) {
for (var v = 0, u = 0, n_3 = renderable.numFloats; v < n_3; v += vertexSize, u += 2) {
tempPos.x = verts[v];
tempPos.y = verts[v + 1];
tempUv.x = uvs[u];
tempUv.y = uvs[u + 1];
tempLight.setFromColor(finalColor);
tempDark.set(0, 0, 0, 0);
vertexEffect.transform(tempPos, tempUv, tempLight, tempDark);
verts[v] = tempPos.x;
verts[v + 1] = tempPos.y;
verts[v + 2] = tempLight.r;
verts[v + 3] = tempLight.g;
verts[v + 4] = tempLight.b;
verts[v + 5] = tempLight.a;
verts[v + 6] = tempUv.x;
verts[v + 7] = tempUv.y;
}
}
else {
for (var v = 0, u = 0, n_4 = renderable.numFloats; v < n_4; v += vertexSize, u += 2) {
tempPos.x = verts[v];
tempPos.y = verts[v + 1];
tempUv.x = uvs[u];
tempUv.y = uvs[u + 1];
tempLight.setFromColor(finalColor);
tempDark.setFromColor(darkColor);
vertexEffect.transform(tempPos, tempUv, tempLight, tempDark);
verts[v] = tempPos.x;
verts[v + 1] = tempPos.y;
verts[v + 2] = tempLight.r;
verts[v + 3] = tempLight.g;
verts[v + 4] = tempLight.b;
verts[v + 5] = tempLight.a;
verts[v + 6] = tempUv.x;
verts[v + 7] = tempUv.y;
verts[v + 8] = tempDark.r;
verts[v + 9] = tempDark.g;
verts[v + 10] = tempDark.b;
verts[v + 11] = tempDark.a;
}
}
}
else {
if (!twoColorTint) {
for (var v = 2, u = 0, n_5 = renderable.numFloats; v < n_5; v += vertexSize, u += 2) {
verts[v] = finalColor.r;
verts[v + 1] = finalColor.g;
verts[v + 2] = finalColor.b;
verts[v + 3] = finalColor.a;
verts[v + 4] = uvs[u];
verts[v + 5] = uvs[u + 1];
}
}
else {
for (var v = 2, u = 0, n_6 = renderable.numFloats; v < n_6; v += vertexSize, u += 2) {
verts[v] = finalColor.r;
verts[v + 1] = finalColor.g;
verts[v + 2] = finalColor.b;
verts[v + 3] = finalColor.a;
verts[v + 4] = uvs[u];
verts[v + 5] = uvs[u + 1];
verts[v + 6] = darkColor.r;
verts[v + 7] = darkColor.g;
verts[v + 8] = darkColor.b;
verts[v + 9] = darkColor.a;
}
}
}
/** @type {?} */
var view = ((/** @type {?} */ (renderable.vertices))).subarray(0, renderable.numFloats);
batcher.draw(texture, view, triangles);
}
}
clipper.clipEndWithSlot(slot);
}
clipper.clipEnd();
};
SkeletonRenderer.QUAD_TRIANGLES = [0, 1, 2, 2, 3, 0];
return SkeletonRenderer;
}());
export { SkeletonRenderer };
if (false) {
/** @type {?} */
SkeletonRenderer.QUAD_TRIANGLES;
/** @type {?} */
SkeletonRenderer.prototype.premultipliedAlpha;
/** @type {?} */
SkeletonRenderer.prototype.vertexEffect;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.tempColor;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.tempColor2;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.vertices;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.vertexSize;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.twoColorTint;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.renderable;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.clipper;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.temp;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.temp2;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.temp3;
/**
* @type {?}
* @private
*/
SkeletonRenderer.prototype.temp4;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2tlbGV0b25SZW5kZXJlci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zcGluZS8iLCJzb3VyY2VzIjpbImxpYi9zcGluZS10cy93ZWJnbC9Ta2VsZXRvblJlbmRlcmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUE2QkEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBZ0MsdUJBQXVCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFLaEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRzVFO0lBQ0Usb0JBQ1MsUUFBMkIsRUFDM0IsV0FBbUIsRUFDbkIsU0FBaUI7UUFGakIsYUFBUSxHQUFSLFFBQVEsQ0FBbUI7UUFDM0IsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDbkIsY0FBUyxHQUFULFNBQVMsQ0FBUTtJQUN2QixDQUFDO0lBQ04saUJBQUM7QUFBRCxDQUFDLEFBTkQsSUFNQzs7O0lBSkcsOEJBQWtDOztJQUNsQyxpQ0FBMEI7O0lBQzFCLCtCQUF3Qjs7QUFHNUI7SUFlRSwwQkFDRSxPQUFxQyxFQUNyQyxZQUE0QjtRQUE1Qiw2QkFBQSxFQUFBLG1CQUE0QjtRQWY5Qix1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0IsaUJBQVksR0FBaUIsSUFBSSxDQUFDO1FBQzFCLGNBQVMsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3hCLGVBQVUsR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBRXpCLGVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixpQkFBWSxHQUFHLEtB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RUFBRSxTQUFTLENBQUMsQ0FBQztpQkFDeEM7YUFDRjtZQUNELE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0I7UUFDRCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQWxVTSwrQkFBYyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQW1VN0MsdUJBQUM7Q0FBQSxBQXBVRCxJQW9VQztTQXBVWSxnQkFBZ0I7OztJQUMzQixnQ0FBMkM7O0lBQzNDLDhDQUEyQjs7SUFDM0Isd0NBQWtDOzs7OztJQUNsQyxxQ0FBZ0M7Ozs7O0lBQ2hDLHNDQUFpQzs7Ozs7SUFDakMsb0NBQW9DOzs7OztJQUNwQyxzQ0FBK0I7Ozs7O0lBQy9CLHdDQUE2Qjs7Ozs7SUFDN0Isc0NBQTREOzs7OztJQUM1RCxtQ0FBMkQ7Ozs7O0lBQzNELGdDQUE2Qjs7Ozs7SUFDN0IsaUNBQThCOzs7OztJQUM5QixpQ0FBNEI7Ozs7O0lBQzVCLGlDQUE0QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICogU3BpbmUgUnVudGltZXMgTGljZW5zZSBBZ3JlZW1lbnRcclxuICogTGFzdCB1cGRhdGVkIE1heSAxLCAyMDE5LiBSZXBsYWNlcyBhbGwgcHJpb3IgdmVyc2lvbnMuXHJcbiAqXHJcbiAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE5LCBFc290ZXJpYyBTb2Z0d2FyZSBMTENcclxuICpcclxuICogSW50ZWdyYXRpb24gb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmUgb3Igb3RoZXJ3aXNlIGNyZWF0aW5nXHJcbiAqIGRlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFNwaW5lIFJ1bnRpbWVzIGlzIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgYW5kXHJcbiAqIGNvbmRpdGlvbnMgb2YgU2VjdGlvbiAyIG9mIHRoZSBTcGluZSBFZGl0b3IgTGljZW5zZSBBZ3JlZW1lbnQ6XHJcbiAqIGh0dHA6Ly9lc290ZXJpY3NvZnR3YXJlLmNvbS9zcGluZS1lZGl0b3ItbGljZW5zZVxyXG4gKlxyXG4gKiBPdGhlcndpc2UsIGl0IGlzIHBlcm1pdHRlZCB0byBpbnRlZ3JhdGUgdGhlIFNwaW5lIFJ1bnRpbWVzIGludG8gc29mdHdhcmVcclxuICogb3Igb3RoZXJ3aXNlIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBTcGluZSBSdW50aW1lcyAoY29sbGVjdGl2ZWx5LFxyXG4gKiBcIlByb2R1Y3RzXCIpLCBwcm92aWRlZCB0aGF0IGVhY2ggdXNlciBvZiB0aGUgUHJvZHVjdHMgbXVzdCBvYnRhaW4gdGhlaXIgb3duXHJcbiAqIFNwaW5lIEVkaXRvciBsaWNlbnNlIGFuZCByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZHVjdHMgaW4gYW55IGZvcm0gbXVzdFxyXG4gKiBpbmNsdWRlIHRoaXMgbGljZW5zZSBhbmQgY29weXJpZ2h0IG5vdGljZS5cclxuICpcclxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFU09URVJJQyBTT0ZUV0FSRSBMTEMgXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTU1xyXG4gKiBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTXHJcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOXHJcbiAqIE5PIEVWRU5UIFNIQUxMIEVTT1RFUklDIFNPRlRXQVJFIExMQyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULFxyXG4gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLFxyXG4gKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVMsIEJVU0lORVNTXHJcbiAqIElOVEVSUlVQVElPTiwgT1IgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFMpIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcclxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HXHJcbiAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSxcclxuICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5pbXBvcnQgeyBWZXJ0ZXhFZmZlY3QgfSBmcm9tIFwiLi4vY29yZS9WZXJ0ZXhFZmZlY3RcIjtcclxuaW1wb3J0IHsgU2tlbGV0b25DbGlwcGluZyB9IGZyb20gXCIuLi9jb3JlL1NrZWxldG9uQ2xpcHBpbmdcIjtcclxuaW1wb3J0IHsgQ29sb3IsIFZlY3RvcjIsIFV0aWxzIH0gZnJvbSBcIi4uL2NvcmUvVXRpbHNcIjtcclxuaW1wb3J0IHsgTWFuYWdlZFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgV2ViR0xCbGVuZE1vZGVDb252ZXJ0ZXIgfSBmcm9tIFwiLi9XZWJHTFwiO1xyXG5pbXBvcnQgeyBTa2VsZXRvbiB9IGZyb20gXCIuLi9jb3JlL1NrZWxldG9uXCI7XHJcbmltcG9ydCB7IFBvbHlnb25CYXRjaGVyIH0gZnJvbSBcIi4vUG9seWdvbkJhdGNoZXJcIjtcclxuaW1wb3J0IHsgQmxlbmRNb2RlIH0gZnJvbSBcIi4uL2NvcmUvQmxlbmRNb2RlXCI7XHJcbmltcG9ydCB7IEdMVGV4dHVyZSB9IGZyb20gXCIuL0dMVGV4dHVyZVwiO1xyXG5pbXBvcnQgeyBSZWdpb25BdHRhY2htZW50IH0gZnJvbSBcIi4uL2NvcmUvYXR0YWNobWVudHMvUmVnaW9uQXR0YWNobWVudFwiO1xyXG5pbXBvcnQgeyBNZXNoQXR0YWNobWVudCB9IGZyb20gXCIuLi9jb3JlL2F0dGFjaG1lbnRzL01lc2hBdHRhY2htZW50XCI7XHJcbmltcG9ydCB7IFRleHR1cmVBdGxhc1JlZ2lvbiB9IGZyb20gXCIuLi9jb3JlL1RleHR1cmVBdGxhc1wiO1xyXG5pbXBvcnQgeyBDbGlwcGluZ0F0dGFjaG1lbnQgfSBmcm9tIFwiLi4vY29yZS9hdHRhY2htZW50cy9DbGlwcGluZ0F0dGFjaG1lbnRcIjtcclxuaW1wb3J0IHsgQXJyYXlMaWtlIH0gZnJvbSBcIi4uL2NvcmUvVXRpbHNcIjtcclxuXHJcbmNsYXNzIFJlbmRlcmFibGUge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHZlcnRpY2VzOiBBcnJheUxpa2U8bnVtYmVyPixcclxuICAgIHB1YmxpYyBudW1WZXJ0aWNlczogbnVtYmVyLFxyXG4gICAgcHVibGljIG51bUZsb2F0czogbnVtYmVyXHJcbiAgKSB7fVxyXG59XHJcbmV4cG9ydCBjbGFzcyBTa2VsZXRvblJlbmRlcmVyIHtcclxuICBzdGF0aWMgUVVBRF9UUklBTkdMRVMgPSBbMCwgMSwgMiwgMiwgMywgMF07XHJcbiAgcHJlbXVsdGlwbGllZEFscGhhID0gZmFsc2U7XHJcbiAgdmVydGV4RWZmZWN0OiBWZXJ0ZXhFZmZlY3QgPSBudWxsO1xyXG4gIHByaXZhdGUgdGVtcENvbG9yID0gbmV3IENvbG9yKCk7XHJcbiAgcHJpdmF0ZSB0ZW1wQ29sb3IyID0gbmV3IENvbG9yKCk7XHJcbiAgcHJpdmF0ZSB2ZXJ0aWNlczogQXJyYXlMaWtlPG51bWJlcj47XHJcbiAgcHJpdmF0ZSB2ZXJ0ZXhTaXplID0gMiArIDIgKyA0O1xyXG4gIHByaXZhdGUgdHdvQ29sb3JUaW50ID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSByZW5kZXJhYmxlOiBSZW5kZXJhYmxlID0gbmV3IFJlbmRlcmFibGUobnVsbCwgMCwgMCk7XHJcbiAgcHJpdmF0ZSBjbGlwcGVyOiBTa2VsZXRvbkNsaXBwaW5nID0gbmV3IFNrZWxldG9uQ2xpcHBpbmcoKTtcclxuICBwcml2YXRlIHRlbXAgPSBuZXcgVmVjdG9yMigpO1xyXG4gIHByaXZhdGUgdGVtcDIgPSBuZXcgVmVjdG9yMigpO1xyXG4gIHByaXZhdGUgdGVtcDMgPSBuZXcgQ29sb3IoKTtcclxuICBwcml2YXRlIHRlbXA0ID0gbmV3IENvbG9yKCk7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBjb250ZXh0OiBNYW5hZ2VkV2ViR0xSZW5kZXJpbmdDb250ZXh0LFxyXG4gICAgdHdvQ29sb3JUaW50OiBib29sZWFuID0gdHJ1ZVxyXG4gICkge1xyXG4gICAgdGhpcy50d29Db2xvclRpbnQgPSB0d29Db2xvclRpbnQ7XHJcbiAgICBpZiAodHdvQ29sb3JUaW50KSB0aGlzLnZlcnRleFNpemUgKz0gNDtcclxuICAgIHRoaXMudmVydGljZXMgPSBVdGlscy5uZXdGbG9hdEFycmF5KHRoaXMudmVydGV4U2l6ZSAqIDEwMjQpO1xyXG4gIH1cclxuICBkcmF3KFxyXG4gICAgYmF0Y2hlcjogUG9seWdvbkJhdGNoZXIsXHJcbiAgICBza2VsZXRvbjogU2tlbGV0b24sXHJcbiAgICBzbG90UmFuZ2VTdGFydDogbnVtYmVyID0gLTEsXHJcbiAgICBzbG90UmFuZ2VFbmQ6IG51bWJlciA9IC0xXHJcbiAgKSB7XHJcbiAgICBsZXQgY2xpcHBlciA9IHRoaXMuY2xpcHBlcjtcclxuICAgIGxldCBwcmVtdWx0aXBsaWVkQWxwaGEgPSB0aGlzLnByZW11bHRpcGxpZWRBbHBoYTtcclxuICAgIGxldCB0d29Db2xvclRpbnQgPSB0aGlzLnR3b0NvbG9yVGludDtcclxuICAgIGxldCBibGVuZE1vZGU6IEJsZW5kTW9kZSA9IG51bGw7XHJcbiAgICBsZXQgdGVtcFBvcyA9IHRoaXMudGVtcDtcclxuICAgIGxldCB0ZW1wVXYgPSB0aGlzLnRlbXAyO1xyXG4gICAgbGV0IHRlbXBMaWdodCA9IHRoaXMudGVtcDM7XHJcbiAgICBsZXQgdGVtcERhcmsgPSB0aGlzLnRlbXA0O1xyXG4gICAgbGV0IHJlbmRlcmFibGU6IFJlbmRlcmFibGUgPSB0aGlzLnJlbmRlcmFibGU7XHJcbiAgICBsZXQgdXZzOiBBcnJheUxpa2U8bnVtYmVyPiA9IG51bGw7XHJcbiAgICBsZXQgdHJpYW5nbGVzOiBBcnJheTxudW1iZXI+ID0gbnVsbDtcclxuICAgIGxldCBkcmF3T3JkZXIgPSBza2VsZXRvbi5kcmF3T3JkZXI7XHJcbiAgICBsZXQgYXR0YWNobWVudENvbG9yOiBDb2xvciA9IG51bGw7XHJcbiAgICBsZXQgc2tlbGV0b25Db2xvciA9IHNrZWxldG9uLmNvbG9yO1xyXG4gICAgbGV0IHZlcnRleFNpemUgPSB0d29Db2xvclRpbnQgPyAxMiA6IDg7XHJcbiAgICBsZXQgaW5SYW5nZSA9IGZhbHNlO1xyXG4gICAgaWYgKHNsb3RSYW5nZVN0YXJ0ID09IC0xKSBpblJhbmdlID0gdHJ1ZTtcclxuICAgIGZvciAobGV0IGkgPSAwLCBuID0gZHJhd09yZGVyLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICBsZXQgY2xpcHBlZFZlcnRleFNpemUgPSBjbGlwcGVyLmlzQ2xpcHBpbmcoKSA/IDIgOiB2ZXJ0ZXhTaXplO1xyXG4gICAgICBsZXQgc2xvdCA9IGRyYXdPcmRlcltpXTtcclxuICAgICAgaWYgKHNsb3RSYW5nZVN0YXJ0ID49IDAgJiYgc2xvdFJhbmdlU3RhcnQgPT0gc2xvdC5kYXRhLmluZGV4KSB7XHJcbiAgICAgICAgaW5SYW5nZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpblJhbmdlKSB7XHJcbiAgICAgICAgY2xpcHBlci5jbGlwRW5kV2l0aFNsb3Qoc2xvdCk7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNsb3RSYW5nZUVuZCA+PSAwICYmIHNsb3RSYW5nZUVuZCA9PSBzbG90LmRhdGEuaW5kZXgpIHtcclxuICAgICAgICBpblJhbmdlID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGF0dGFjaG1lbnQgPSBzbG90LmdldEF0dGFjaG1lbnQoKTtcclxuICAgICAgbGV0IHRleHR1cmU6IEdMVGV4dHVyZSA9IG51bGw7XHJcbiAgICAgIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgUmVnaW9uQXR0YWNobWVudCkge1xyXG4gICAgICAgIGxldCByZWdpb24gPSA8UmVnaW9uQXR0YWNobWVudD5hdHRhY2htZW50O1xyXG4gICAgICAgIHJlbmRlcmFibGUudmVydGljZXMgPSB0aGlzLnZlcnRpY2VzO1xyXG4gICAgICAgIHJlbmRlcmFibGUubnVtVmVydGljZXMgPSA0O1xyXG4gICAgICAgIHJlbmRlcmFibGUubnVtRmxvYXRzID0gY2xpcHBlZFZlcnRleFNpemUgPDwgMjtcclxuICAgICAgICByZWdpb24uY29tcHV0ZVdvcmxkVmVydGljZXMoXHJcbiAgICAgICAgICBzbG90LmJvbmUsXHJcbiAgICAgICAgICByZW5kZXJhYmxlLnZlcnRpY2VzLFxyXG4gICAgICAgICAgMCxcclxuICAgICAgICAgIGNsaXBwZWRWZXJ0ZXhTaXplXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0cmlhbmdsZXMgPSBTa2VsZXRvblJlbmRlcmVyLlFVQURfVFJJQU5HTEVTO1xyXG4gICAgICAgIHV2cyA9IHJlZ2lvbi51dnM7XHJcbiAgICAgICAgdGV4dHVyZSA9IDxHTFRleHR1cmU+KFxyXG4gICAgICAgICAgKDxUZXh0dXJlQXRsYXNSZWdpb24+cmVnaW9uLnJlZ2lvbi5yZW5kZXJPYmplY3QpLnRleHR1cmVcclxuICAgICAgICApO1xyXG4gICAgICAgIGF0dGFjaG1lbnRDb2xvciA9IHJlZ2lvbi5jb2xvcjtcclxuICAgICAgfSBlbHNlIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgTWVzaEF0dGFjaG1lbnQpIHtcclxuICAgICAgICBsZXQgbWVzaCA9IDxNZXNoQXR0YWNobWVudD5hdHRhY2htZW50O1xyXG4gICAgICAgIHJlbmRlcmFibGUudmVydGljZXMgPSB0aGlzLnZlcnRpY2VzO1xyXG4gICAgICAgIHJlbmRlcmFibGUubnVtVmVydGljZXMgPSBtZXNoLndvcmxkVmVydGljZXNMZW5ndGggPj4gMTtcclxuICAgICAgICByZW5kZXJhYmxlLm51bUZsb2F0cyA9IHJlbmRlcmFibGUubnVtVmVydGljZXMgKiBjbGlwcGVkVmVydGV4U2l6ZTtcclxuICAgICAgICBpZiAocmVuZGVyYWJsZS5udW1GbG9hdHMgPiByZW5kZXJhYmxlLnZlcnRpY2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgcmVuZGVyYWJsZS52ZXJ0aWNlcyA9IHRoaXMudmVydGljZXMgPSBVdGlscy5uZXdGbG9hdEFycmF5KFxyXG4gICAgICAgICAgICByZW5kZXJhYmxlLm51bUZsb2F0c1xyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbWVzaC5jb21wdXRlV29ybGRWZXJ0aWNlcyhcclxuICAgICAgICAgIHNsb3QsXHJcbiAgICAgICAgICAwLFxyXG4gICAgICAgICAgbWVzaC53b3JsZFZlcnRpY2VzTGVuZ3RoLFxyXG4gICAgICAgICAgcmVuZGVyYWJsZS52ZXJ0aWNlcyxcclxuICAgICAgICAgIDAsXHJcbiAgICAgICAgICBjbGlwcGVkVmVydGV4U2l6ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdHJpYW5nbGVzID0gbWVzaC50cmlhbmdsZXM7XHJcbiAgICAgICAgdGV4dHVyZSA9IDxHTFRleHR1cmU+KFxyXG4gICAgICAgICAgKDxUZXh0dXJlQXRsYXNSZWdpb24+bWVzaC5yZWdpb24ucmVuZGVyT2JqZWN0KS50ZXh0dXJlXHJcbiAgICAgICAgKTtcclxuICAgICAgICB1dnMgPSBtZXNoLnV2cztcclxuICAgICAgICBhdHRhY2htZW50Q29sb3IgPSBtZXNoLmNvbG9yO1xyXG4gICAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnQgaW5zdGFuY2VvZiBDbGlwcGluZ0F0dGFjaG1lbnQpIHtcclxuICAgICAgICBsZXQgY2xpcCA9IDxDbGlwcGluZ0F0dGFjaG1lbnQ+YXR0YWNobWVudDtcclxuICAgICAgICBjbGlwcGVyLmNsaXBTdGFydChzbG90LCBjbGlwKTtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjbGlwcGVyLmNsaXBFbmRXaXRoU2xvdChzbG90KTtcclxuICAgICAgICBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGV4dHVyZSAhPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHNsb3RDb2xvciA9IHNsb3QuY29sb3I7XHJcbiAgICAgICAgbGV0IGZpbmFsQ29sb3IgPSB0aGlzLnRlbXBDb2xvcjtcclxuICAgICAgICBmaW5hbENvbG9yLnIgPSBza2VsZXRvbkNvbG9yLnIgKiBzbG90Q29sb3IuciAqIGF0dGFjaG1lbnRDb2xvci5yO1xyXG4gICAgICAgIGZpbmFsQ29sb3IuZyA9IHNrZWxldG9uQ29sb3IuZyAqIHNsb3RDb2xvci5nICogYXR0YWNobWVudENvbG9yLmc7XHJcbiAgICAgICAgZmluYWxDb2xvci5iID0gc2tlbGV0b25Db2xvci5iICogc2xvdENvbG9yLmIgKiBhdHRhY2htZW50Q29sb3IuYjtcclxuICAgICAgICBmaW5hbENvbG9yLmEgPSBza2VsZXRvbkNvbG9yLmEgKiBzbG90Q29sb3IuYSAqIGF0dGFjaG1lbnRDb2xvci5hO1xyXG4gICAgICAgIGlmIChwcmVtdWx0aXBsaWVkQWxwaGEpIHtcclxuICAgICAgICAgIGZpbmFsQ29sb3IuciAqPSBmaW5hbENvbG9yLmE7XHJcbiAgICAgICAgICBmaW5hbENvbG9yLmcgKj0gZmluYWxDb2xvci5hO1xyXG4gICAgICAgICAgZmluYWxDb2xvci5iICo9IGZpbmFsQ29sb3IuYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IGRhcmtDb2xvciA9IHRoaXMudGVtcENvbG9yMjtcclxuICAgICAgICBpZiAoc2xvdC5kYXJrQ29sb3IgPT0gbnVsbCkgZGFya0NvbG9yLnNldCgwLCAwLCAwLCAxLjApO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHByZW11bHRpcGxpZWRBbHBoYSkge1xyXG4gICAgICAgICAgICBkYXJrQ29sb3IuciA9IHNsb3QuZGFya0NvbG9yLnIgKiBmaW5hbENvbG9yLmE7XHJcbiAgICAgICAgICAgIGRhcmtDb2xvci5nID0gc2xvdC5kYXJrQ29sb3IuZyAqIGZpbmFsQ29sb3IuYTtcclxuICAgICAgICAgICAgZGFya0NvbG9yLmIgPSBzbG90LmRhcmtDb2xvci5iICogZmluYWxDb2xvci5hO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGFya0NvbG9yLnNldEZyb21Db2xvcihzbG90LmRhcmtDb2xvcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXJrQ29sb3IuYSA9IHByZW11bHRpcGxpZWRBbHBoYSA/IDEuMCA6IDAuMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHNsb3RCbGVuZE1vZGUgPSBzbG90LmRhdGEuYmxlbmRNb2RlO1xyXG4gICAgICAgIGlmIChzbG90QmxlbmRNb2RlICE9IGJsZW5kTW9kZSkge1xyXG4gICAgICAgICAgYmxlbmRNb2RlID0gc2xvdEJsZW5kTW9kZTtcclxuICAgICAgICAgIGJhdGNoZXIuc2V0QmxlbmRNb2RlKFxyXG4gICAgICAgICAgICBXZWJHTEJsZW5kTW9kZUNvbnZlcnRlci5nZXRTb3VyY2VHTEJsZW5kTW9kZShcclxuICAgICAgICAgICAgICBibGVuZE1vZGUsXHJcbiAgICAgICAgICAgICAgcHJlbXVsdGlwbGllZEFscGhhXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIFdlYkdMQmxlbmRNb2RlQ29udmVydGVyLmdldERlc3RHTEJsZW5kTW9kZShibGVuZE1vZGUpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2xpcHBlci5pc0NsaXBwaW5nKCkpIHtcclxuICAgICAgICAgIGNsaXBwZXIuY2xpcFRyaWFuZ2xlcyhcclxuICAgICAgICAgICAgcmVuZGVyYWJsZS52ZXJ0aWNlcyxcclxuICAgICAgICAgICAgcmVuZGVyYWJsZS5udW1GbG9hdHMsXHJcbiAgICAgICAgICAgIHRyaWFuZ2xlcyxcclxuICAgICAgICAgICAgdHJpYW5nbGVzLmxlbmd0aCxcclxuICAgICAgICAgICAgdXZzLFxyXG4gICAgICAgICAgICBmaW5hbENvbG9yLFxyXG4gICAgICAgICAgICBkYXJrQ29sb3IsXHJcbiAgICAgICAgICAgIHR3b0NvbG9yVGludFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIGxldCBjbGlwcGVkVmVydGljZXMgPSBuZXcgRmxvYXQzMkFycmF5KGNsaXBwZXIuY2xpcHBlZFZlcnRpY2VzKTtcclxuICAgICAgICAgIGxldCBjbGlwcGVkVHJpYW5nbGVzID0gY2xpcHBlci5jbGlwcGVkVHJpYW5nbGVzO1xyXG4gICAgICAgICAgaWYgKHRoaXMudmVydGV4RWZmZWN0ICE9IG51bGwpIHtcclxuICAgICAgICAgICAgbGV0IHZlcnRleEVmZmVjdCA9IHRoaXMudmVydGV4RWZmZWN0O1xyXG4gICAgICAgICAgICBsZXQgdmVydHMgPSBjbGlwcGVkVmVydGljZXM7XHJcbiAgICAgICAgICAgIGlmICghdHdvQ29sb3JUaW50KSB7XHJcbiAgICAgICAgICAgICAgZm9yIChcclxuICAgICAgICAgICAgICAgIGxldCB2ID0gMCwgbiA9IGNsaXBwZWRWZXJ0aWNlcy5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICB2IDwgbjtcclxuICAgICAgICAgICAgICAgIHYgKz0gdmVydGV4U2l6ZVxyXG4gICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgdGVtcFBvcy54ID0gdmVydHNbdl07XHJcbiAgICAgICAgICAgICAgICB0ZW1wUG9zLnkgPSB2ZXJ0c1t2ICsgMV07XHJcbiAgICAgICAgICAgICAgICB0ZW1wTGlnaHQuc2V0KFxyXG4gICAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgMl0sXHJcbiAgICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAzXSxcclxuICAgICAgICAgICAgICAgICAgdmVydHNbdiArIDRdLFxyXG4gICAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgNV1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0ZW1wVXYueCA9IHZlcnRzW3YgKyA2XTtcclxuICAgICAgICAgICAgICAgIHRlbXBVdi55ID0gdmVydHNbdiArIDddO1xyXG4gICAgICAgICAgICAgICAgdGVtcERhcmsuc2V0KDAsIDAsIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgdmVydGV4RWZmZWN0LnRyYW5zZm9ybSh0ZW1wUG9zLCB0ZW1wVXYsIHRlbXBMaWdodCwgdGVtcERhcmspO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdl0gPSB0ZW1wUG9zLng7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgMV0gPSB0ZW1wUG9zLnk7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgMl0gPSB0ZW1wTGlnaHQucjtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAzXSA9IHRlbXBMaWdodC5nO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDRdID0gdGVtcExpZ2h0LmI7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgNV0gPSB0ZW1wTGlnaHQuYTtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyA2XSA9IHRlbXBVdi54O1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDddID0gdGVtcFV2Lnk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGZvciAoXHJcbiAgICAgICAgICAgICAgICBsZXQgdiA9IDAsIG4gPSBjbGlwcGVkVmVydGljZXMubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgdiA8IG47XHJcbiAgICAgICAgICAgICAgICB2ICs9IHZlcnRleFNpemVcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRlbXBQb3MueCA9IHZlcnRzW3ZdO1xyXG4gICAgICAgICAgICAgICAgdGVtcFBvcy55ID0gdmVydHNbdiArIDFdO1xyXG4gICAgICAgICAgICAgICAgdGVtcExpZ2h0LnNldChcclxuICAgICAgICAgICAgICAgICAgdmVydHNbdiArIDJdLFxyXG4gICAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgM10sXHJcbiAgICAgICAgICAgICAgICAgIHZlcnRzW3YgKyA0XSxcclxuICAgICAgICAgICAgICAgICAgdmVydHNbdiArIDVdXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdGVtcFV2LnggPSB2ZXJ0c1t2ICsgNl07XHJcbiAgICAgICAgICAgICAgICB0ZW1wVXYueSA9IHZlcnRzW3YgKyA3XTtcclxuICAgICAgICAgICAgICAgIHRlbXBEYXJrLnNldChcclxuICAgICAgICAgICAgICAgICAgdmVydHNbdiArIDhdLFxyXG4gICAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgOV0sXHJcbiAgICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAxMF0sXHJcbiAgICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAxMV1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhFZmZlY3QudHJhbnNmb3JtKHRlbXBQb3MsIHRlbXBVdiwgdGVtcExpZ2h0LCB0ZW1wRGFyayk7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2XSA9IHRlbXBQb3MueDtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAxXSA9IHRlbXBQb3MueTtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyAyXSA9IHRlbXBMaWdodC5yO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDNdID0gdGVtcExpZ2h0Lmc7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgNF0gPSB0ZW1wTGlnaHQuYjtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyA1XSA9IHRlbXBMaWdodC5hO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDZdID0gdGVtcFV2Lng7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgN10gPSB0ZW1wVXYueTtcclxuICAgICAgICAgICAgICAgIHZlcnRzW3YgKyA4XSA9IHRlbXBEYXJrLnI7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgOV0gPSB0ZW1wRGFyay5nO1xyXG4gICAgICAgICAgICAgICAgdmVydHNbdiArIDEwXSA9IHRlbXBEYXJrLmI7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0c1t2ICsgMTFdID0gdGVtcERhcmsuYTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgIC