react-image-markup
Version:
Markup Image with ReactJS (customizable)
257 lines (213 loc) • 27.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _fabric = require("fabric");
var _canvasHistory = _interopRequireDefault(require("./canvasHistory"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
var _default = function () {
var drag;
var shape;
var color;
var lineWidth, fillCircle, angle;
var properties;
function Shape(canvas) {
var draggable = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
var type = arguments.length > 2 ? arguments[2] : undefined;
var params = arguments.length > 3 ? arguments[3] : undefined;
if (!draggable) {
drag = false;
return Shape;
}
if (color && color !== params.stroke) {
color = params.stroke;
shape = type;
new Shape(canvas, true, shape, params);
return Shape;
}
if (shape && shape !== type) {
shape = type;
drag = true;
new Shape(canvas, true, shape, params);
return Shape;
}
properties = params;
if (properties) {
fillCircle = properties.fill;
color = properties.stroke;
lineWidth = properties.strokeWidth;
angle = properties.angle;
}
this.canvas = canvas;
this.className = 'Shape';
this.isDrawing = false;
this.origX = 0;
this.origY = 0;
drag = draggable;
shape = type;
this.bindEvents();
}
Shape.prototype.bindEvents = function () {
var inst = this;
document.onkeydown = function (e) {
if (e.which === 46 || e.keycode === 46) {
inst.canvas.getActiveObjects().forEach(function (obj) {
inst.canvas.remove(obj);
});
}
inst.canvas.renderAll();
};
inst.selectable = true;
inst.canvas.off('mouse:down');
inst.canvas.on('mouse:down', function (o) {
inst.onMouseDown(o);
});
inst.canvas.on('mouse:move', function (o) {
inst.onMouseMove(o);
});
inst.canvas.on('mouse:up', function (o) {
inst.onMouseUp(o);
});
inst.canvas.on('object:moving', function () {
inst.disable();
});
};
Shape.prototype.onMouseUp = function () {
var inst = this;
if (!inst.isEnable()) {
return;
}
if (drag) {
inst.canvas.getObjects().forEach(function (object, index, array) {
if (index === array.length - 1) {
if (inst.canvas.getActiveObject() && inst.canvas.getActiveObject()._objects && inst.canvas.getActiveObject()._objects.length > 1) {
inst.canvas.setActiveObject(object);
}
}
});
if (inst.canvas.getActiveObject()) {
inst.canvas.getActiveObject().hasControls = false;
inst.canvas.getActiveObject().hasBorders = false;
inst.canvas.getActiveObject().lockMovementX = true;
inst.canvas.getActiveObject().lockMovementY = true;
inst.canvas.getActiveObject().lockUniScaling = true;
}
inst.canvas.renderAll();
}
new _canvasHistory["default"](inst.canvas);
inst.disable();
};
Shape.prototype.onMouseMove = function (o) {
var inst = this;
if (!inst.isEnable()) {
return;
}
inst.canvas.selection = false;
var pointer = inst.canvas.getPointer(o.e);
var activeObj;
if (inst.canvas.getActiveObject()) {
activeObj = inst.canvas.getActiveObject();
activeObj.stroke = color;
activeObj.strokeWidth = lineWidth;
activeObj.fill = fillCircle;
activeObj.noScaleCache = false;
activeObj.strokeUniform = true;
}
if (this.origX > pointer.x) {
activeObj.set({
left: Math.abs(pointer.x)
});
}
if (this.origY > pointer.y) {
activeObj.set({
top: Math.abs(pointer.y)
});
}
if (shape === "rect") {
activeObj.set({
width: Math.abs(this.origX - pointer.x)
});
activeObj.set({
height: Math.abs(this.origY - pointer.y)
});
}
if (shape === "circle") {
activeObj.set({
rx: Math.abs(this.origX - pointer.x) / 2
});
activeObj.set({
ry: Math.abs(this.origY - pointer.y) / 2
});
}
activeObj.setCoords();
inst.canvas.renderAll();
};
Shape.prototype.onMouseDown = function (o) {
var inst = this;
if (!drag) {
if (inst.canvas.getActiveObject()) {
inst.canvas.getActiveObject().hasControls = true;
inst.canvas.getActiveObject().hasBorders = true;
inst.canvas.getActiveObject().lockMovementX = false;
inst.canvas.getActiveObject().lockMovementY = false;
inst.canvas.getActiveObject().lockUniScaling = false;
inst.canvas.renderAll();
}
inst.disable();
return;
}
inst.enable();
if (inst.canvas.getActiveObject()) {
inst.canvas.getActiveObject().hasControls = false;
inst.canvas.getActiveObject().hasBorders = false;
inst.canvas.getActiveObject().lockMovementX = true;
inst.canvas.getActiveObject().lockMovementY = true;
inst.canvas.getActiveObject().lockUniScaling = true;
inst.canvas.renderAll();
}
var pointer = inst.canvas.getPointer(o.e);
this.origX = pointer.x;
this.origY = pointer.y;
if (shape === "rect") {
var rect = new _fabric.fabric.Rect({
left: this.origX,
top: this.origY,
originX: 'left',
originY: 'top',
width: pointer.x - this.origX,
height: pointer.y - this.origY,
angle: angle,
fill: fillCircle,
transparentCorners: false,
stroke: color,
strokeWidth: lineWidth
});
inst.canvas.add(rect).setActiveObject(rect);
}
if (shape === "circle") {
var circle = new _fabric.fabric.Ellipse({
top: this.origY,
left: this.origX,
rx: 0,
ry: 0,
transparentCorners: false,
hasBorders: true,
hasControls: true
});
inst.canvas.add(circle).setActiveObject(circle);
}
};
Shape.prototype.isEnable = function () {
return this.isDrawing;
};
Shape.prototype.enable = function () {
this.isDrawing = true;
};
Shape.prototype.disable = function () {
this.isDrawing = false;
};
return Shape;
}();
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hc3NldHMvanMvc2hhcGUuanMiXSwibmFtZXMiOlsiZHJhZyIsInNoYXBlIiwiY29sb3IiLCJsaW5lV2lkdGgiLCJmaWxsQ2lyY2xlIiwiYW5nbGUiLCJwcm9wZXJ0aWVzIiwiU2hhcGUiLCJjYW52YXMiLCJkcmFnZ2FibGUiLCJ0eXBlIiwicGFyYW1zIiwic3Ryb2tlIiwiZmlsbCIsInN0cm9rZVdpZHRoIiwiY2xhc3NOYW1lIiwiaXNEcmF3aW5nIiwib3JpZ1giLCJvcmlnWSIsImJpbmRFdmVudHMiLCJwcm90b3R5cGUiLCJpbnN0IiwiZG9jdW1lbnQiLCJvbmtleWRvd24iLCJlIiwid2hpY2giLCJrZXljb2RlIiwiZ2V0QWN0aXZlT2JqZWN0cyIsImZvckVhY2giLCJvYmoiLCJyZW1vdmUiLCJyZW5kZXJBbGwiLCJzZWxlY3RhYmxlIiwib2ZmIiwib24iLCJvIiwib25Nb3VzZURvd24iLCJvbk1vdXNlTW92ZSIsIm9uTW91c2VVcCIsImRpc2FibGUiLCJpc0VuYWJsZSIsImdldE9iamVjdHMiLCJvYmplY3QiLCJpbmRleCIsImFycmF5IiwibGVuZ3RoIiwiZ2V0QWN0aXZlT2JqZWN0IiwiX29iamVjdHMiLCJzZXRBY3RpdmVPYmplY3QiLCJoYXNDb250cm9scyIsImhhc0JvcmRlcnMiLCJsb2NrTW92ZW1lbnRYIiwibG9ja01vdmVtZW50WSIsImxvY2tVbmlTY2FsaW5nIiwiQ2FudmFzSGlzdG9yeSIsInNlbGVjdGlvbiIsInBvaW50ZXIiLCJnZXRQb2ludGVyIiwiYWN0aXZlT2JqIiwibm9TY2FsZUNhY2hlIiwic3Ryb2tlVW5pZm9ybSIsIngiLCJzZXQiLCJsZWZ0IiwiTWF0aCIsImFicyIsInkiLCJ0b3AiLCJ3aWR0aCIsImhlaWdodCIsInJ4IiwicnkiLCJzZXRDb29yZHMiLCJlbmFibGUiLCJyZWN0IiwiZmFicmljIiwiUmVjdCIsIm9yaWdpblgiLCJvcmlnaW5ZIiwidHJhbnNwYXJlbnRDb3JuZXJzIiwiYWRkIiwiY2ly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QyxTQUFLekQsU0FBTCxHQUFpQixJQUFqQjtBQUNILEdBRkQ7O0FBSUFULEVBQUFBLEtBQUssQ0FBQ2EsU0FBTixDQUFnQm1CLE9BQWhCLEdBQTBCLFlBQVk7QUFDbEMsU0FBS3ZCLFNBQUwsR0FBaUIsS0FBakI7QUFDSCxHQUZEOztBQUdBLFNBQU9ULEtBQVA7QUFDSCxDQXZOZSxFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtmYWJyaWN9IGZyb20gJ2ZhYnJpYyc7XHJcbmltcG9ydCBDYW52YXNIaXN0b3J5IGZyb20gXCIuL2NhbnZhc0hpc3RvcnlcIjtcclxuZXhwb3J0IGRlZmF1bHQgKGZ1bmN0aW9uICgpIHtcclxuICAgIGxldCBkcmFnO1xyXG4gICAgbGV0IHNoYXBlO1xyXG4gICAgbGV0IGNvbG9yO1xyXG4gICAgbGV0IGxpbmVXaWR0aCxmaWxsQ2lyY2xlLGFuZ2xlO1xyXG4gICAgbGV0IHByb3BlcnRpZXM7XHJcbiAgICBmdW5jdGlvbiBTaGFwZShjYW52YXMsZHJhZ2dhYmxlID0gZmFsc2UsdHlwZSxwYXJhbXMpIHsgICAgIFxyXG4gICAgICAgIGlmKCFkcmFnZ2FibGUpe1xyXG4gICAgICAgICAgICBkcmFnID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiBTaGFwZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoY29sb3IgJiYgY29sb3IgIT09IHBhcmFtcy5zdHJva2Upe1xyXG4gICAgICAgICAgICBjb2xvciA9IHBhcmFtcy5zdHJva2U7XHJcbiAgICAgICAgICAgIHNoYXBlID0gdHlwZTtcclxuICAgICAgICAgICAgbmV3IFNoYXBlKGNhbnZhcyx0cnVlLHNoYXBlLHBhcmFtcylcclxuICAgICAgICAgICAgcmV0dXJuIFNoYXBlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZigoc2hhcGUgJiYgc2hhcGUgIT09IHR5cGUpKXtcclxuICAgICAgICAgICAgc2hhcGUgPSB0eXBlO1xyXG4gICAgICAgICAgICBkcmFnID0gdHJ1ZTtcclxuICAgICAgICAgICAgbmV3IFNoYXBlKGNhbnZhcyx0cnVlLHNoYXBlLHBhcmFtcylcclxuICAgICAgICAgICAgcmV0dXJuIFNoYXBlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwcm9wZXJ0aWVzID0gcGFyYW1zO1xyXG4gICAgICAgIGlmKHByb3BlcnRpZXMpe1xyXG4gICAgICAgICAgICBmaWxsQ2lyY2xlID0gcHJvcGVydGllcy5maWxsO1xyXG4gICAgICAgICAgICBjb2xvciA9IHByb3BlcnRpZXMuc3Ryb2tlO1xyXG4gICAgICAgICAgICBsaW5lV2lkdGggPSBwcm9wZXJ0aWVzLnN0cm9rZVdpZHRoO1xyXG4gICAgICAgICAgICBhbmdsZSA9IHByb3BlcnRpZXMuYW5nbGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FudmFzID0gY2FudmFzOyAgICAgIFxyXG4gICAgICAgIHRoaXMuY2xhc3NOYW1lID0gJ1NoYXBlJztcclxuICAgICAgICB0aGlzLmlzRHJhd2luZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMub3JpZ1ggPSAwO1xyXG4gICAgICAgIHRoaXMub3JpZ1kgPSAwO1xyXG5cclxuICAgICAgICBkcmFnID0gZHJhZ2dhYmxlO1xyXG4gICAgICAgIHNoYXBlID0gdHlwZTtcclxuXHJcbiAgICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgU2hhcGUucHJvdG90eXBlLmJpbmRFdmVudHMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgbGV0IGluc3QgPSB0aGlzO1xyXG4gICAgICAgIGRvY3VtZW50Lm9ua2V5ZG93bj0oZSk9PntcclxuICAgICAgICAgICAgaWYoZS53aGljaCA9PT0gNDYgfHwgZS5rZXljb2RlID09PSA0Nil7XHJcbiAgICAgICAgICAgICAgICBpbnN0LmNhbnZhcy5nZXRBY3RpdmVPYmplY3RzKCkuZm9yRWFjaCgob2JqKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdC5jYW52YXMucmVtb3ZlKG9iailcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluc3QuY2FudmFzLnJlbmRlckFsbCgpXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpbnN0LnNlbGVjdGFibGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaW5zdC5jYW52YXMub2ZmKCdtb3VzZTpkb3duJyk7XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGluc3QuY2FudmFzLm9uKCdtb3VzZTpkb3duJywgZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBpbnN0Lm9uTW91c2VEb3duKG8pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpbnN0LmNhbnZhcy5vbignbW91c2U6bW92ZScsIGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdC5vbk1vdXNlTW92ZShvKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaW5zdC5jYW52YXMub24oJ21vdXNlOnVwJywgZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICAgICAgICAgICAgICBpbnN0Lm9uTW91c2VVcChvKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgaW5zdC5jYW52YXMub24oJ29iamVjdDptb3ZpbmcnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5zdC5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIFxyXG5cclxuICAgIH07XHJcbiAgICBTaGFwZS5wcm90b3R5cGUub25Nb3VzZVVwID0gZnVuY3Rpb24gKCkge1xyXG5cclxuICAgICAgICBsZXQgaW5zdCA9IHRoaXM7XHJcbiAgICAgICAgaWYgKCFpbnN0LmlzRW5hYmxlKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihkcmFnKXtcclxuICAgICAgICAgICAgaW5zdC5jYW52YXMuZ2V0T2JqZWN0cygpLmZvckVhY2goZnVuY3Rpb24ob2JqZWN0LGluZGV4LGFycmF5KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IChhcnJheS5sZW5ndGggLTEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaW5zdC5jYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCkgJiYgaW5zdC5jYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCkuX29iamVjdHMgJiYgaW5zdC5jYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCkuX29iamVjdHMubGVuZ3RoID4gMSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3QuY2FudmFzLnNldEFjdGl2ZU9iamVjdChvYmplY3QpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZihpbnN0LmNhbnZhcy5nZXRBY3RpdmVPYmplY3QoKSl7XHJcbiAgICAgICAgICAgICAgICBpbnN0LmNhbnZhcy5nZXRBY3RpdmVPYmplY3QoKS5oYXNDb250cm9scyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaW5zdC5jYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCkuaGFzQm9yZGVycyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaW5zdC5jYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCkubG9ja01vdmVtZW50WCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpbnN0LmNhbnZhcy5nZXRBY3RpdmVPYmplY3QoKS5sb2NrTW92ZW1lbnRZID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGluc3QuY2FudmFzLmdldEFjdGl2ZU9iamVjdCgpLmxvY2tVbmlTY2FsaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpbnN0LmNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbmV3IENhbnZhc0hpc3RvcnkoaW5zdC5jYW52YXMpXHJcbiAgICAgICAgaW5zdC5kaXNhYmxlKCk7XHJcblxyXG4gICAgfTtcclxuICAgIFNoYXBlLnByb3RvdHlwZS5vbk1vdXNlTW92ZSA9IGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgbGV0IGluc3QgPSB0aGlzO1xyXG4gICAgICAgIGlmICghaW5zdC5pc0VuYWJsZSgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW5zdC5jYW52YXMuc2VsZWN0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHBvaW50ZXIgPSBpbnN0LmNhbnZhcy5nZXRQb2ludGVyKG8uZSk7XHJcbiAgICAgICAgbGV0IGFjdGl2ZU9iajtcclxuICAgICAgICBpZihpbnN0LmNhbnZhcy5nZXRBY3RpdmVPYmplY3QoKSl7XHJcbiAgICAgICAgICAgIGFjdGl2ZU9iaiA9IGluc3QuY2FudmFzLmdldEFjdGl2ZU9iamVjdCgpO1xyXG4gICAgICAgICAgICBhY3RpdmVPYmouc3Ryb2tlID0gY29sb3I7XHJcbiAgICAgICAgICAgIGFjdGl2ZU9iai5zdHJva2VXaWR0aCA9IGxpbmVXaWR0aDtcclxuICAgICAgICAgICAgYWN0aXZlT2JqLmZpbGwgPSBmaWxsQ2lyY2xlO1xyXG4gICAgICAgICAgICBhY3RpdmVPYmoubm9TY2FsZUNhY2hlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGFjdGl2ZU9iai5zdHJva2VVbmlmb3JtID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm9yaWdYID4gcG9pbnRlci54KSB7XHJcbiAgICAgICAgICAgIGFjdGl2ZU9iai5zZXQoe1xyXG4gICAgICAgICAgICAgICAgbGVmdDogTWF0aC5hYnMocG9pbnRlci54KVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMub3JpZ1kgPiBwb2ludGVyLnkpIHtcclxuICAgICAgICAgICAgYWN0aXZlT2JqLnNldCh7XHJcbiAgICAgICAgICAgICAgICB0b3A6IE1hdGguYWJzKHBvaW50ZXIueSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHNoYXBlID09PSBcInJlY3RcIil7XHJcbiAgICAgICAgICAgIGFjdGl2ZU9iai5zZXQoe1xyXG4gICAgICAgICAgICAgICAgd2lkdGg6IE1hdGguYWJzKHRoaXMub3JpZ1ggLSBwb2ludGVyLngpXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBhY3RpdmVPYmouc2V0KHtcclxuICAgICAgICAgICAgICAgIGhlaWdodDogTWF0aC5hYnModGhpcy5vcmlnWSAtIHBvaW50ZXIueSlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHNoYXBlID09PSBcImNpcmNsZVwiKXtcclxuICAgICAgICAgICAgYWN0aXZlT2JqLnNldCh7XHJcbiAgICAgICAgICAgICAgICByeDogTWF0aC5hYnModGhpcy5vcmlnWCAtIHBvaW50ZXIueCkgLyAyXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBhY3RpdmVPYmouc2V0KHtcclxuICAgICAgICAgICAgICAgIHJ5OiBNYXRoLmFicyh0aGlzLm9yaWdZIC0gcG9pbnRlci55KSAvIDJcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFjdGl2ZU9iai5zZXRDb29yZHMoKTtcclxuICAgICAgICBpbnN0LmNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICAgIH07XHJcblxyXG4gICAgU2hhcGUucHJvdG90eXBlLm9uTW91c2VEb3duID0gZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICBcclxuICAgICAgICBsZXQgaW5zdCA9IHRoaXM7ICAgXHJcbiAgICAgICAgaWYoIWRyYWcpe1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYoIGluc3QuY2FudmFzLmdldEFjdGl2ZU9iamVjdCgpKXtcclxuICAgICAgICAgICAgICAgIGluc3QuY2FudmFzLmdldEFjdGl2ZU9iamVjdCgpLmhhc0NvbnRyb2xzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGluc3QuY2FudmFzLmdldEFjdGl2ZU9iamVjdCgpLmhhc0JvcmRlcnMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaW5zdC5jYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCkubG9ja01vdmVtZW50WCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaW5zdC5jYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCkubG9ja01vdmVtZW50WSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgaW5zdC5jYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCkubG9ja1VuaVNjYWxpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGluc3QuY2FudmFzLnJlbmRlckFsbCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGluc3QuZGlzYWJsZSgpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgICAgICBpbnN0LmVuYWJsZSgpO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgaWYoaW5zdC5jYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCkpe1xyXG4gICAgICAgICAgICAgICAgaW5zdC5jYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCkuaGFzQ29udHJvbHMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGluc3QuY2FudmFzLmdldEFjdGl2ZU9iamVjdCgpLmhhc0JvcmRlcnMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGluc3QuY2FudmFzLmdldEFjdGl2ZU9iamVjdCgpLmxvY2tNb3ZlbWVudFggPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaW5zdC5jYW52YXMuZ2V0QWN0aXZlT2JqZWN0KCkubG9ja01vdmVtZW50WSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpbnN0LmNhbnZhcy5nZXRBY3RpdmVPYmplY3QoKS5sb2NrVW5pU2NhbGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBpbnN0LmNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcG9pbnRlciA9IGluc3QuY2FudmFzLmdldFBvaW50ZXIoby5lKTtcclxuICAgICAgICAgICAgdGhpcy5vcmlnWCA9IHBvaW50ZXIueDtcclxuICAgICAgICAgICAgdGhpcy5vcmlnWSA9IHBvaW50ZXIueTtcclxuICAgICAgICAgICAgaWYoc2hhcGUgPT09IFwicmVjdFwiKXtcclxuICAgICAgICAgICAgICAgIGxldCByZWN0ID0gbmV3IGZhYnJpYy5SZWN0KHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiB0aGlzLm9yaWdYLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogdGhpcy5vcmlnWSxcclxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5YOiAnbGVmdCcsXHJcbiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogJ3RvcCcsXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHBvaW50ZXIueCAtIHRoaXMub3JpZ1gsXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBwb2ludGVyLnkgLSB0aGlzLm9yaWdZLFxyXG4gICAgICAgICAgICAgICAgICAgIGFuZ2xlOiBhbmdsZSxcclxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBmaWxsQ2lyY2xlLFxyXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50Q29ybmVyczogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBjb2xvcixcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogbGluZVdpZHRoXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGluc3QuY2FudmFzLmFkZChyZWN0KS5zZXRBY3RpdmVPYmplY3QocmVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoc2hhcGUgPT09IFwiY2lyY2xlXCIpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGNpcmNsZSA9IG5ldyBmYWJyaWMuRWxsaXBzZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiB0aGlzLm9yaWdZLFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IHRoaXMub3JpZ1gsXHJcbiAgICAgICAgICAgICAgICAgICAgcng6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgcnk6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRDb3JuZXJzOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBoYXNCb3JkZXJzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhc0NvbnRyb2xzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBpbnN0LmNhbnZhcy5hZGQoY2lyY2xlKS5zZXRBY3RpdmVPYmplY3QoY2lyY2xlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFNoYXBlLnByb3RvdHlwZS5pc0VuYWJsZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pc0RyYXdpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgU2hhcGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLmlzRHJhd2luZyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgU2hhcGUucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhpcy5pc0RyYXdpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBTaGFwZTtcclxufSgpKTtcclxuIl19