UNPKG

react-image-markup

Version:
370 lines (310 loc) 46.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.uploadImage = exports.saveImage = exports.clear = exports.setBackgroundImage = exports.toDataUrl = exports.undo = exports.redo = exports.applyCropping = exports.set = exports.drag = exports.changeColor = exports.canvasInit = exports.getCurrentColor = void 0; var _fabric = require("fabric"); var _canvasHistory = _interopRequireDefault(require("../../assets/js/canvasHistory")); var _shape = _interopRequireDefault(require("../../assets/js/shape")); var _text = _interopRequireDefault(require("../../assets/js/text")); var _arrow = _interopRequireDefault(require("../../assets/js/arrow")); var _crop = _interopRequireDefault(require("../../assets/js/crop")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } var history = []; var objects = []; var customParams = {}; var state = { color: "#000", fontSize: 32, strokeWidth: 7, currentTool: null }; var canvas; var getCurrentColor = function getCurrentColor() { return state.color; }; exports.getCurrentColor = getCurrentColor; var canvasInit = function canvasInit(c) { canvas = new _fabric.fabric.Canvas(c); canvas.backgroundColor = '#fff'; new _canvasHistory["default"](canvas); return canvas; }; exports.canvasInit = canvasInit; var changeColor = function changeColor(colorProperty) { state.color = colorProperty; set(state.currentTool); }; exports.changeColor = changeColor; var drag = function drag() { canvas.isDrawingMode = false; canvas.forEachObject(function (object) { object.selectable = true; object.evented = true; }); new _arrow["default"](canvas, false); new _shape["default"](canvas, false); new _text["default"](canvas, false); new _crop["default"](canvas, false, false, true); }; exports.drag = drag; var set = function set(type, params) { drag(); state.currentTool = type; switch (type) { case "text": customParams = { fill: params && params.fill ? params.fill : state.color, fontFamily: params && params.fontFamily ? params.fontFamily : 'Arial', fontSize: params && params.fontSize ? params.fontSize : state.fontSize, placeholder: params && params.placeholder ? params.placeholder : 'Add Text' }; new _text["default"](canvas, true, customParams); break; case "circle": customParams = { fill: params && params.fill ? params.fill : 'transparent', stroke: params && params.stroke ? params.stroke : state.color, strokeWidth: params && params.strokeWidth ? params.strokeWidth : state.strokeWidth, disableCircleEditing: params && params.disableCircleEditing ? params.disableCircleEditing : false, top: params && params.top ? params.top : 0, left: params && params.left ? params.left : 0, radius: params && params.radius ? params.radius : 20, strokeUniform: params && params.strokeUniform ? params.strokeUniform : true, noScaleCache: params && params.noScaleCache ? params.noScaleCache : false }; new _shape["default"](canvas, true, type, customParams); break; case "rect": customParams = { fill: params && params.fill ? params.fill : 'transparent', stroke: params && params.stroke ? params.stroke : state.color, strokeWidth: params && params.strokeWidth ? params.strokeWidth : state.strokeWidth, angle: params && params.angle ? params.angle : 0, width: params && params.width ? params.width : null, height: params && params.height ? params.height : null, top: params && params.top ? params.top : 0, left: params && params.left ? params.left : 0, opacity: params && params.opacity ? params.opacity : 1, strokeUniform: params && params.strokeUniform ? params.strokeUniform : true, noScaleCache: params && params.noScaleCache ? params.noScaleCache : false }; new _shape["default"](canvas, true, type, customParams); break; case 'selectMode': drag(); break; case 'arrow': customParams = { fill: params && params.fill ? params.fill : 'transparent', stroke: params && params.stroke ? params.stroke : state.color, strokeWidth: params && params.strokeWidth ? params.strokeWidth : state.strokeWidth, strokeUniform: params && params.strokeUniform ? params.strokeUniform : true, noScaleCache: params && params.noScaleCache ? params.noScaleCache : false }; new _arrow["default"](canvas, true, customParams); break; case 'freeDrawing': customParams = { stroke: params && params.stroke ? params.stroke : state.color, strokeWidth: params && params.strokeWidth ? params.strokeWidth : state.strokeWidth, drawingMode: params && params.drawingMode ? params.drawingMode : true }; canvas.isDrawingMode = customParams.drawingMode; canvas.freeDrawingBrush.color = customParams.stroke; canvas.freeDrawingBrush.width = customParams.strokeWidth; canvas.freeDrawingBrush.shadow = new _fabric.fabric.Shadow({ blur: 0, affectStroke: true, color: customParams.stroke }); canvas.on("object:added", function () { if (canvas.isDrawingMode) { new _canvasHistory["default"](canvas); } }); canvas.renderAll(); break; case 'crop': customParams = { width: params && params.width ? params.width : 200, height: params && params.height ? params.height : 200, overlayColor: params && params.overlayColor ? params.overlayColor : "#000", overlayOpacity: params && params.overlayOpacity ? params.overlayOpacity : 0.7, transparentCorner: params && params.transparentCorner ? params.transparentCorner : false, hasRotatingPoint: params && params.hasRotatingPoint ? params.hasRotatingPoint : false, hasControls: params && params.hasControls ? params.hasControls : true, cornerSize: params && params.cornerSize ? params.cornerSize : 10, borderColor: params && params.borderColor ? params.borderColor : "#000", cornerColor: params && params.cornerColor ? params.cornerColor : "#000", cornerStyle: params && params.cornerStyle ? params.cornerStyle : "circle" }; state.currentTool = 'selectMode'; new _crop["default"](canvas, true, false, false, customParams); break; default: } }; exports.set = set; var applyCropping = function applyCropping() { new _crop["default"](canvas, true, true); drag(); }; exports.applyCropping = applyCropping; var redo = function redo() { drag(); if (objects.length > 0) { if (objects[objects.length - 1] && objects[objects.length - 1].croppedImage) { JSON.parse(JSON.stringify(objects[objects.length - 1])); canvas.loadFromJSON(objects[objects.length - 1].json); setBackgroundImage(objects[objects.length - 1].croppedImage); new _canvasHistory["default"](false, false, objects.pop()); } else { canvas.loadFromJSON(objects[objects.length - 1]); new _canvasHistory["default"](false, false, objects.pop()); } } }; exports.redo = redo; var undo = function undo() { if (canvas.getActiveObject()) { canvas.discardActiveObject().renderAll(); } drag(); history = new _canvasHistory["default"](); if (history.length) { objects.push(history.pop()); if (history[history.length - 1] && history[history.length - 1].croppedImage) { JSON.parse(JSON.stringify(history[history.length - 1])); canvas.loadFromJSON(history[history.length - 1].json); setBackgroundImage(history[history.length - 1].croppedImage); } else { canvas.loadFromJSON(history[history.length - 1]); canvas.renderAll(); } } }; exports.undo = undo; var toDataUrl = function toDataUrl(url, callback) { var xhr = new XMLHttpRequest(); xhr.onload = function () { var reader = new FileReader(); reader.onloadend = function () { callback(reader.result); }; reader.readAsDataURL(xhr.response); }; xhr.open('GET', url); xhr.responseType = 'blob'; xhr.send(); }; exports.toDataUrl = toDataUrl; var setBackgroundImage = function setBackgroundImage(imageUrl) { var img = new Image(); toDataUrl(imageUrl, function (dataUri) { img.src = dataUri; if (canvas.width <= img.width || canvas.height <= img.height) { var canvasAspect = canvas.width / canvas.height; var imgAspect = img.width / img.height; var updatedLeft, updatedTop, scaleFactor; if (canvasAspect >= imgAspect) { scaleFactor = canvas.width / img.width; updatedLeft = 0; updatedTop = -(img.height * scaleFactor - canvas.height) / 2; } else { scaleFactor = canvas.height / img.height; updatedTop = 0; updatedLeft = -(img.width * scaleFactor - canvas.width) / 2; } img.width = canvas.width; img.height = canvas.height; canvas.setBackgroundImage(dataUri, canvas.renderAll.bind(canvas), { top: updatedTop, left: updatedLeft, originX: 'left', originY: 'top', scaleX: scaleFactor, scaleY: scaleFactor }); canvas.renderAll(); } else { var center = canvas.getCenter(); canvas.setBackgroundImage(dataUri, canvas.renderAll.bind(canvas), { top: center.top, left: center.left, originX: 'center', originY: 'center' }); canvas.renderAll(); } }); }; exports.setBackgroundImage = setBackgroundImage; var clear = function clear() { drag(); canvas.clear(); }; exports.clear = clear; var saveImage = function saveImage() { drag(); return canvas.toDataURL('image/jpeg', 1); }; exports.saveImage = saveImage; var uploadImage = function uploadImage(e) { drag(); var reader = new FileReader(); reader.onload = function (event) { var imgObj = new Image(); imgObj.src = event.target.result; imgObj.onload = function () { var image = new _fabric.fabric.Image(imgObj); if (canvas.width <= image.width || canvas.height <= image.height) { var canvasAspect = canvas.width / canvas.height; var imgAspect = image.width / image.height; var top, left, scaleFactor; if (canvasAspect >= imgAspect) { scaleFactor = canvas.height / image.height; top = 0; left = -(image.width * scaleFactor - canvas.width) / 2; } else { scaleFactor = canvas.width / image.width; left = 0; top = -(image.height * scaleFactor - canvas.height) / 2; } canvas.clear(); canvas.setBackgroundImage(image, canvas.renderAll.bind(canvas), { top: top, left: left, scaleX: scaleFactor, scaleY: scaleFactor }); var croppedImage = { json: canvas.toJSON(), croppedImage: canvas.toDataURL() }; new _canvasHistory["default"](canvas, croppedImage); canvas.renderAll(); } else { var center = canvas.getCenter(); canvas.clear(); canvas.setBackgroundImage(image, canvas.renderAll.bind(canvas), { top: center.top, left: center.left, originX: 'center', originY: 'center' }); var _croppedImage = { json: canvas.toJSON(), croppedImage: canvas.toDataURL() }; new _canvasHistory["default"](canvas, _croppedImage); canvas.renderAll(); } }; }; if (e.target && e.target.files && e.target.files[0]) { reader.readAsDataURL(e.target.files[0]); } }; exports.uploadImage = uploadImage; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hc3NldHMvanMvbWV0aG9kcy5qcyJdLCJuYW1lcyI6WyJoaXN0b3J5Iiwib2JqZWN0cyIsImN1c3RvbVBhcmFtcyIsInN0YXRlIiwiY29sb3IiLCJmb250U2l6ZSIsInN0cm9rZVdpZHRoIiwiY3VycmVudFRvb2wiLCJjYW52YXMiLCJnZXRDdXJyZW50Q29sb3IiLCJjYW52YXNJbml0IiwiYyIsImZhYnJpYyIsIkNhbnZhcyIsImJhY2tncm91bmRDb2xvciIsIkNhbnZhc0hpc3RvcnkiLCJjaGFuZ2VDb2xvciIsImNvbG9yUHJvcGVydHkiLCJzZXQiLCJkcmFnIiwiaXNEcmF3aW5nTW9kZSIsImZvckVhY2hPYmplY3QiLCJvYmplY3QiLCJzZWxlY3RhYmxlIiwiZXZlbnRlZCIsIkFycm93IiwiU2hhcGUiLCJUZXh0IiwiQ3JvcEltYWdlIiwidHlwZSIsInBhcmFtcyIsImZpbGwiLCJmb250RmFtaWx5IiwicGxhY2Vob2xkZXIiLCJzdHJva2UiLCJkaXNhYmxlQ2lyY2xlRWRpdGluZyIsInRvcCIsImxlZnQiLCJyYWRpdXMiLCJzdHJva2VVbmlmb3JtIiwibm9TY2FsZUNhY2hlIiwiYW5nbGUiLCJ3aWR0aCIsImhlaWdodCIsIm9wYWNpdHkiLCJkcmF3aW5nTW9kZSIsImZyZWVEcmF3aW5nQnJ1c2giLCJzaGFkb3ciLCJTaGFkb3ciLCJibHVyIiwiYWZmZWN0U3Ryb2tlIiwib24iLCJyZW5kZXJBbGwiLCJvdmVybGF5Q29sb3IiLCJvdmVybGF5T3BhY2l0eSIsInRyYW5zcGFyZW50Q29ybmVyIiwiaGFzUm90YXRpbmdQb2ludCIsImhhc0NvbnRyb2xzIiwiY29ybmVyU2l6ZSIsImJvcmRlckNvbG9yIiwiY29ybmVyQ29sb3IiLCJjb3JuZXJTdHlsZSIsImFwcGx5Q3JvcHBpbmciLCJyZWRvIiwibGVuZ3RoIiwiY3JvcHBlZEltYWdlIiwiSlNPTiIsInBhcnNlIiwic3RyaW5naWZ5IiwibG9hZEZyb21KU09OIiwianNvbiIsInNldEJhY2tncm91bmRJbWFnZSIsInBvcCIsInVuZG8iLCJnZXRBY3RpdmVPYmplY3QiLCJkaXNjYXJkQWN0aXZlT2JqZWN0IiwicHVzaCIsInRvRGF0YVVybCIsInVybCIsImNhbGxiYWNrIiwieGhyIiwiWE1MSHR0cFJlcXVlc3QiLCJvbmxvYWQiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwib25sb2FkZW5kIiwicmVzdWx0IiwicmVhZEFzRGF0YVVSTCIsInJlc3BvbnNlIiwib3BlbiIsInJlc3BvbnNlVHlwZSIsInNlbmQiLCJpbWFnZVVybCIsImltZyIsIkltYWdlIiwiZGF0YVVyaSIsInNyYyIsImNhbnZhc0FzcGVjdCIsImltZ0FzcGVjdCIsInVwZGF0ZWRMZWZ0IiwidXBkYXRlZFRvcCIsInNjYWxlRmFjdG9yIiwiYmluZCIsIm9yaWdpblgiLCJvcmlnaW5ZIiwic2NhbGVYIiwic2NhbGVZIiwiY2VudGVyIiwiZ2V0Q2VudGVyIiwiY2xlYXIiLCJzYXZlSW1hZ2UiLCJ0b0RhdGFVUkwiLCJ1cGxvYWRJbWFnZSIsImUiLCJldmVudCIsImltZ09iaiIsInRhcmdldCIsImltYWdlIiwidG9KU09OIiwiZmlsZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUNBLElBQUlBLE9BQU8sR0FBRyxFQUFkO0FBQ0EsSUFBSUMsT0FBTyxHQUFHLEVBQWQ7QUFDQSxJQUFJQyxZQUFZLEdBQUcsRUFBbkI7QUFDQSxJQUFJQyxLQUFLLEdBQUc7QUFDVkMsRUFBQUEsS0FBSyxFQUFFLE1BREc7QUFFVkMsRUFBQUEsUUFBUSxFQUFFLEVBRkE7QUFHVkMsRUFBQUEsV0FBVyxFQUFFLENBSEg7QUFJVkMsRUFBQUEsV0FBVyxFQUFFO0FBSkgsQ0FBWjtBQU1BLElBQUlDLE1BQUo7O0FBQ08sSUFBTUMsZUFBZSxHQUFHLFNBQWxCQSxlQUFrQixHQUFNO0FBQ25DLFNBQU9OLEtBQUssQ0FBQ0MsS0FBYjtBQUNELENBRk07Ozs7QUFHQSxJQUFNTSxVQUFVLEdBQUcs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UCxDQUFxQjBCLENBQUMsQ0FBQ0csTUFBRixDQUFTRyxLQUFULENBQWUsQ0FBZixDQUFyQjtBQUNEO0FBR0YsQ0F0RE0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmYWJyaWMgfSBmcm9tICdmYWJyaWMnO1xyXG5pbXBvcnQgQ2FudmFzSGlzdG9yeSBmcm9tICcuLi8uLi9hc3NldHMvanMvY2FudmFzSGlzdG9yeSdcclxuaW1wb3J0IFNoYXBlIGZyb20gJy4uLy4uL2Fzc2V0cy9qcy9zaGFwZSc7XHJcbmltcG9ydCBUZXh0IGZyb20gJy4uLy4uL2Fzc2V0cy9qcy90ZXh0JztcclxuaW1wb3J0IEFycm93IGZyb20gJy4uLy4uL2Fzc2V0cy9qcy9hcnJvdyc7XHJcbmltcG9ydCBDcm9wSW1hZ2UgZnJvbSAnLi4vLi4vYXNzZXRzL2pzL2Nyb3AnO1xyXG5sZXQgaGlzdG9yeSA9IFtdO1xyXG5sZXQgb2JqZWN0cyA9IFtdO1xyXG5sZXQgY3VzdG9tUGFyYW1zID0ge307XHJcbmxldCBzdGF0ZSA9IHtcclxuICBjb2xvcjogXCIjMDAwXCIsXHJcbiAgZm9udFNpemU6IDMyLFxyXG4gIHN0cm9rZVdpZHRoOiA3LFxyXG4gIGN1cnJlbnRUb29sOiBudWxsXHJcbn07XHJcbmxldCBjYW52YXM7XHJcbmV4cG9ydCBjb25zdCBnZXRDdXJyZW50Q29sb3IgPSAoKSA9PiB7XHJcbiAgcmV0dXJuIHN0YXRlLmNvbG9yO1xyXG59XHJcbmV4cG9ydCBjb25zdCBjYW52YXNJbml0ID0gKGMpID0+IHtcclxuICBjYW52YXMgPSBuZXcgZmFicmljLkNhbnZhcyhjKTtcclxuICBjYW52YXMuYmFja2dyb3VuZENvbG9yID0gJyNmZmYnO1xyXG4gIG5ldyBDYW52YXNIaXN0b3J5KGNhbnZhcyk7XHJcbiAgcmV0dXJuIGNhbnZhcztcclxufVxyXG5leHBvcnQgY29uc3QgY2hhbmdlQ29sb3IgPSAoY29sb3JQcm9wZXJ0eSkgPT4ge1xyXG4gIHN0YXRlLmNvbG9yID0gY29sb3JQcm9wZXJ0eTtcclxuICBzZXQoc3RhdGUuY3VycmVudFRvb2wpXHJcbn1cclxuZXhwb3J0IGNvbnN0IGRyYWcgPSAoKSA9PiB7XHJcbiAgY2FudmFzLmlzRHJhd2luZ01vZGUgPSBmYWxzZTtcclxuICBjYW52YXMuZm9yRWFjaE9iamVjdChvYmplY3QgPT4ge1xyXG4gICAgb2JqZWN0LnNlbGVjdGFibGUgPSB0cnVlO1xyXG4gICAgb2JqZWN0LmV2ZW50ZWQgPSB0cnVlO1xyXG4gIH0pO1xyXG4gIG5ldyBBcnJvdyhjYW52YXMsIGZhbHNlKTtcclxuICBuZXcgU2hhcGUoY2FudmFzLCBmYWxzZSk7XHJcbiAgbmV3IFRleHQoY2FudmFzLCBmYWxzZSk7XHJcbiAgbmV3IENyb3BJbWFnZShjYW52YXMsIGZhbHNlLCBmYWxzZSwgdHJ1ZSlcclxufVxyXG5leHBvcnQgY29uc3Qgc2V0ID0gKHR5cGUsIHBhcmFtcykgPT4ge1xyXG4gIGRyYWcoKTtcclxuICBzdGF0ZS5jdXJyZW50VG9vbCA9IHR5cGU7XHJcbiAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICBjYXNlIFwidGV4dFwiOlxyXG4gICAgICBjdXN0b21QYXJhbXMgPSB7XHJcbiAgICAgICAgZmlsbDogKHBhcmFtcyAmJiBwYXJhbXMuZmlsbCkgPyBwYXJhbXMuZmlsbCA6IHN0YXRlLmNvbG9yLFxyXG4gICAgICAgIGZvbnRGYW1pbHk6IChwYXJhbXMgJiYgcGFyYW1zLmZvbnRGYW1pbHkpID8gcGFyYW1zLmZvbnRGYW1pbHkgOiAnQXJpYWwnLFxyXG4gICAgICAgIGZvbnRTaXplOiAocGFyYW1zICYmIHBhcmFtcy5mb250U2l6ZSkgPyBwYXJhbXMuZm9udFNpemUgOiBzdGF0ZS5mb250U2l6ZSxcclxuICAgICAgICBwbGFjZWhvbGRlcjogKHBhcmFtcyAmJiBwYXJhbXMucGxhY2Vob2xkZXIpID8gcGFyYW1zLnBsYWNlaG9sZGVyIDogJ0FkZCBUZXh0JyxcclxuICAgICAgfTtcclxuICAgICAgbmV3IFRleHQoY2FudmFzLCB0cnVlLCBjdXN0b21QYXJhbXMpO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgXCJjaXJjbGVcIjpcclxuICAgICAgY3VzdG9tUGFyYW1zID0ge1xyXG4gICAgICAgIGZpbGw6IChwYXJhbXMgJiYgcGFyYW1zLmZpbGwpID8gcGFyYW1zLmZpbGwgOiAndHJhbnNwYXJlbnQnLFxyXG4gICAgICAgIHN0cm9rZTogKHBhcmFtcyAmJiBwYXJhbXMuc3Ryb2tlKSA/IHBhcmFtcy5zdHJva2UgOiBzdGF0ZS5jb2xvcixcclxuICAgICAgICBzdHJva2VXaWR0aDogKHBhcmFtcyAmJiBwYXJhbXMuc3Ryb2tlV2lkdGgpID8gcGFyYW1zLnN0cm9rZVdpZHRoIDogc3RhdGUuc3Ryb2tlV2lkdGgsXHJcbiAgICAgICAgZGlzYWJsZUNpcmNsZUVkaXRpbmc6IChwYXJhbXMgJiYgcGFyYW1zLmRpc2FibGVDaXJjbGVFZGl0aW5nKSA/IHBhcmFtcy5kaXNhYmxlQ2lyY2xlRWRpdGluZyA6IGZhbHNlLFxyXG4gICAgICAgIHRvcDogKHBhcmFtcyAmJiBwYXJhbXMudG9wKSA/IHBhcmFtcy50b3AgOiAwLFxyXG4gICAgICAgIGxlZnQ6IChwYXJhbXMgJiYgcGFyYW1zLmxlZnQpID8gcGFyYW1zLmxlZnQgOiAwLFxyXG4gICAgICAgIHJhZGl1czogKHBhcmFtcyAmJiBwYXJhbXMucmFkaXVzKSA/IHBhcmFtcy5yYWRpdXMgOiAyMCxcclxuICAgICAgICBzdHJva2VVbmlmb3JtOiAocGFyYW1zICYmIHBhcmFtcy5zdHJva2VVbmlmb3JtKSA/IHBhcmFtcy5zdHJva2VVbmlmb3JtIDogdHJ1ZSxcclxuICAgICAgICBub1NjYWxlQ2FjaGU6IChwYXJhbXMgJiYgcGFyYW1zLm5vU2NhbGVDYWNoZSkgPyBwYXJhbXMubm9TY2FsZUNhY2hlIDogZmFsc2UsXHJcbiAgICAgIH07XHJcbiAgICAgIG5ldyBTaGFwZShjYW52YXMsIHRydWUsIHR5cGUsIGN1c3RvbVBhcmFtcyk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSBcInJlY3RcIjpcclxuICAgICAgY3VzdG9tUGFyYW1zID0ge1xyXG4gICAgICAgIGZpbGw6IChwYXJhbXMgJiYgcGFyYW1zLmZpbGwpID8gcGFyYW1zLmZpbGwgOiAndHJhbnNwYXJlbnQnLFxyXG4gICAgICAgIHN0cm9rZTogKHBhcmFtcyAmJiBwYXJhbXMuc3Ryb2tlKSA/IHBhcmFtcy5zdHJva2UgOiBzdGF0ZS5jb2xvcixcclxuICAgICAgICBzdHJva2VXaWR0aDogKHBhcmFtcyAmJiBwYXJhbXMuc3Ryb2tlV2lkdGgpID8gcGFyYW1zLnN0cm9rZVdpZHRoIDogc3RhdGUuc3Ryb2tlV2lkdGgsXHJcbiAgICAgICAgYW5nbGU6IChwYXJhbXMgJiYgcGFyYW1zLmFuZ2xlKSA/IHBhcmFtcy5hbmdsZSA6IDAsXHJcbiAgICAgICAgd2lkdGg6IChwYXJhbXMgJiYgcGFyYW1zLndpZHRoKSA/IHBhcmFtcy53aWR0aCA6IG51bGwsXHJcbiAgICAgICAgaGVpZ2h0OiAocGFyYW1zICYmIHBhcmFtcy5oZWlnaHQpID8gcGFyYW1zLmhlaWdodCA6IG51bGwsXHJcbiAgICAgICAgdG9wOiAocGFyYW1zICYmIHBhcmFtcy50b3ApID8gcGFyYW1zLnRvcCA6IDAsXHJcbiAgICAgICAgbGVmdDogKHBhcmFtcyAmJiBwYXJhbXMubGVmdCkgPyBwYXJhbXMubGVmdCA6IDAsXHJcbiAgICAgICAgb3BhY2l0eTogKHBhcmFtcyAmJiBwYXJhbXMub3BhY2l0eSkgPyBwYXJhbXMub3BhY2l0eSA6IDEsXHJcbiAgICAgICAgc3Ryb2tlVW5pZm9ybTogKHBhcmFtcyAmJiBwYXJhbXMuc3Ryb2tlVW5pZm9ybSkgPyBwYXJhbXMuc3Ryb2tlVW5pZm9ybSA6IHRydWUsXHJcbiAgICAgICAgbm9TY2FsZUNhY2hlOiAocGFyYW1zICYmIHBhcmFtcy5ub1NjYWxlQ2FjaGUpID8gcGFyYW1zLm5vU2NhbGVDYWNoZSA6IGZhbHNlLFxyXG4gICAgICB9O1xyXG4gICAgICBuZXcgU2hhcGUoY2FudmFzLCB0cnVlLCB0eXBlLCBjdXN0b21QYXJhbXMpO1xyXG4gICAgICBicmVhaztcclxuICAgIGNhc2UgJ3NlbGVjdE1vZGUnOlxyXG4gICAgICBkcmFnKCk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnYXJyb3cnOlxyXG4gICAgICBjdXN0b21QYXJhbXMgPSB7XHJcbiAgICAgICAgZmlsbDogKHBhcmFtcyAmJiBwYXJhbXMuZmlsbCkgPyBwYXJhbXMuZmlsbCA6ICd0cmFuc3BhcmVudCcsXHJcbiAgICAgICAgc3Ryb2tlOiAocGFyYW1zICYmIHBhcmFtcy5zdHJva2UpID8gcGFyYW1zLnN0cm9rZSA6IHN0YXRlLmNvbG9yLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAocGFyYW1zICYmIHBhcmFtcy5zdHJva2VXaWR0aCkgPyBwYXJhbXMuc3Ryb2tlV2lkdGggOiBzdGF0ZS5zdHJva2VXaWR0aCxcclxuICAgICAgICBzdHJva2VVbmlmb3JtOiAocGFyYW1zICYmIHBhcmFtcy5zdHJva2VVbmlmb3JtKSA/IHBhcmFtcy5zdHJva2VVbmlmb3JtIDogdHJ1ZSxcclxuICAgICAgICBub1NjYWxlQ2FjaGU6IChwYXJhbXMgJiYgcGFyYW1zLm5vU2NhbGVDYWNoZSkgPyBwYXJhbXMubm9TY2FsZUNhY2hlIDogZmFsc2UsXHJcbiAgICAgIH07XHJcbiAgICAgIG5ldyBBcnJvdyhjYW52YXMsIHRydWUsIGN1c3RvbVBhcmFtcyk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnZnJlZURyYXdpbmcnOlxyXG4gICAgICBjdXN0b21QYXJhbXMgPSB7XHJcbiAgICAgICAgc3Ryb2tlOiAocGFyYW1zICYmIHBhcmFtcy5zdHJva2UpID8gcGFyYW1zLnN0cm9rZSA6IHN0YXRlLmNvbG9yLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoOiAocGFyYW1zICYmIHBhcmFtcy5zdHJva2VXaWR0aCkgPyBwYXJhbXMuc3Ryb2tlV2lkdGggOiBzdGF0ZS5zdHJva2VXaWR0aCxcclxuICAgICAgICBkcmF3aW5nTW9kZTogKHBhcmFtcyAmJiBwYXJhbXMuZHJhd2luZ01vZGUpID8gcGFyYW1zLmRyYXdpbmdNb2RlIDogdHJ1ZSxcclxuICAgICAgfTtcclxuICAgICAgY2FudmFzLmlzRHJhd2luZ01vZGUgPSBjdXN0b21QYXJhbXMuZHJhd2luZ01vZGU7XHJcbiAgICAgIGNhbnZhcy5mcmVlRHJhd2luZ0JydXNoLmNvbG9yID0gY3VzdG9tUGFyYW1zLnN0cm9rZTtcclxuICAgICAgY2FudmFzLmZyZWVEcmF3aW5nQnJ1c2gud2lkdGggPSBjdXN0b21QYXJhbXMuc3Ryb2tlV2lkdGg7XHJcbiAgICAgIGNhbnZhcy5mcmVlRHJhd2luZ0JydXNoLnNoYWRvdyA9IG5ldyBmYWJyaWMuU2hhZG93KHtcclxuICAgICAgICBibHVyOiAwLFxyXG4gICAgICAgIGFmZmVjdFN0cm9rZTogdHJ1ZSxcclxuICAgICAgICBjb2xvcjogY3VzdG9tUGFyYW1zLnN0cm9rZSxcclxuICAgICAgfSk7XHJcbiAgICAgIGNhbnZhcy5vbihcIm9iamVjdDphZGRlZFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKGNhbnZhcy5pc0RyYXdpbmdNb2RlKSB7XHJcbiAgICAgICAgICBuZXcgQ2FudmFzSGlzdG9yeShjYW52YXMpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBjYW52YXMucmVuZGVyQWxsKCk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnY3JvcCc6XHJcbiAgICAgIGN1c3RvbVBhcmFtcyA9IHtcclxuICAgICAgICB3aWR0aDogKHBhcmFtcyAmJiBwYXJhbXMud2lkdGgpID8gcGFyYW1zLndpZHRoIDogMjAwLFxyXG4gICAgICAgIGhlaWdodDogKHBhcmFtcyAmJiBwYXJhbXMuaGVpZ2h0KSA/IHBhcmFtcy5oZWlnaHQgOiAyMDAsXHJcbiAgICAgICAgb3ZlcmxheUNvbG9yOiAocGFyYW1zICYmIHBhcmFtcy5vdmVybGF5Q29sb3IpID8gcGFyYW1zLm92ZXJsYXlDb2xvciA6IFwiIzAwMFwiLFxyXG4gICAgICAgIG92ZXJsYXlPcGFjaXR5OiAocGFyYW1zICYmIHBhcmFtcy5vdmVybGF5T3BhY2l0eSkgPyBwYXJhbXMub3ZlcmxheU9wYWNpdHkgOiAwLjcsXHJcbiAgICAgICAgdHJhbnNwYXJlbnRDb3JuZXI6IChwYXJhbXMgJiYgcGFyYW1zLnRyYW5zcGFyZW50Q29ybmVyKSA/IHBhcmFtcy50cmFuc3BhcmVudENvcm5lciA6IGZhbHNlLFxyXG4gICAgICAgIGhhc1JvdGF0aW5nUG9pbnQ6IChwYXJhbXMgJiYgcGFyYW1zLmhhc1JvdGF0aW5nUG9pbnQpID8gcGFyYW1zLmhhc1JvdGF0aW5nUG9pbnQgOiBmYWxzZSxcclxuICAgICAgICBoYXNDb250cm9sczogKHBhcmFtcyAmJiBwYXJhbXMuaGFzQ29udHJvbHMpID8gcGFyYW1zLmhhc0NvbnRyb2xzIDogdHJ1ZSxcclxuICAgICAgICBjb3JuZXJTaXplOiAocGFyYW1zICYmIHBhcmFtcy5jb3JuZXJTaXplKSA/IHBhcmFtcy5jb3JuZXJTaXplIDogMTAsXHJcbiAgICAgICAgYm9yZGVyQ29sb3I6IChwYXJhbXMgJiYgcGFyYW1zLmJvcmRlckNvbG9yKSA/IHBhcmFtcy5ib3JkZXJDb2xvciA6IFwiIzAwMFwiLFxyXG4gICAgICAgIGNvcm5lckNvbG9yOiAocGFyYW1zICYmIHBhcmFtcy5jb3JuZXJDb2xvcikgPyBwYXJhbXMuY29ybmVyQ29sb3IgOiBcIiMwMDBcIixcclxuICAgICAgICBjb3JuZXJTdHlsZTogKHBhcmFtcyAmJiBwYXJhbXMuY29ybmVyU3R5bGUpID8gcGFyYW1zLmNvcm5lclN0eWxlIDogXCJjaXJjbGVcIixcclxuICAgICAgfTtcclxuICAgICAgc3RhdGUuY3VycmVudFRvb2wgPSAnc2VsZWN0TW9kZSc7XHJcbiAgICAgIG5ldyBDcm9wSW1hZ2UoY2FudmFzLHRydWUsZmFsc2UsZmFsc2UsY3VzdG9tUGFyYW1zKTtcclxuICBcclxuICAgICAgYnJlYWs7XHJcbiAgICBkZWZhdWx0OlxyXG4gIH1cclxufVxyXG5leHBvcnQgY29uc3QgYXBwbHlDcm9wcGluZyA9ICgpID0+IHtcclxuICBcclxuICBuZXcgQ3JvcEltYWdlKGNhbnZhcywgdHJ1ZSwgdHJ1ZSk7XHJcbiAgZHJhZygpXHJcbn1cclxuZXhwb3J0IGNvbnN0IHJlZG8gPSAoKSA9PiB7XHJcbiAgZHJhZygpO1xyXG4gIGlmIChvYmplY3RzLmxlbmd0aCA+IDApIHtcclxuICAgIGlmIChvYmplY3RzW29iamVjdHMubGVuZ3RoIC0gMV0gJiYgb2JqZWN0c1tvYmplY3RzLmxlbmd0aCAtIDFdLmNyb3BwZWRJbWFnZSkge1xyXG4gICAgICBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iamVjdHNbb2JqZWN0cy5sZW5ndGggLSAxXSkpXHJcbiAgICAgIGNhbnZhcy5sb2FkRnJvbUpTT04ob2JqZWN0c1tvYmplY3RzLmxlbmd0aCAtIDFdLmpzb24pXHJcbiAgICAgIHNldEJhY2tncm91bmRJbWFnZShvYmplY3RzW29iamVjdHMubGVuZ3RoIC0gMV0uY3JvcHBlZEltYWdlKTtcclxuICAgICAgbmV3IENhbnZhc0hpc3RvcnkoZmFsc2UsIGZhbHNlLCBvYmplY3RzLnBvcCgpKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2FudmFzLmxvYWRGcm9tSlNPTihvYmplY3RzW29iamVjdHMubGVuZ3RoIC0gMV0pXHJcbiAgICAgIG5ldyBDYW52YXNIaXN0b3J5KGZhbHNlLCBmYWxzZSwgb2JqZWN0cy5wb3AoKSlcclxuICAgIH1cclxuICB9XHJcbn1cclxuZXhwb3J0IGNvbnN0IHVuZG8gPSAoKSA9PiB7XHJcbiAgaWYgKGNhbnZhcy5nZXRBY3RpdmVPYmplY3QoKSkge1xyXG4gICAgY2FudmFzLmRpc2NhcmRBY3RpdmVPYmplY3QoKS5yZW5kZXJBbGwoKVxyXG4gIH1cclxuICBkcmFnKCk7XHJcbiAgaGlzdG9yeSA9IG5ldyBDYW52YXNIaXN0b3J5KCk7XHJcbiAgaWYgKGhpc3RvcnkubGVuZ3RoKSB7XHJcbiAgICBvYmplY3RzLnB1c2goaGlzdG9yeS5wb3AoKSlcclxuICAgIGlmIChoaXN0b3J5W2hpc3RvcnkubGVuZ3RoIC0gMV0gJiYgaGlzdG9yeVtoaXN0b3J5Lmxlbmd0aCAtIDFdLmNyb3BwZWRJbWFnZSkge1xyXG5cclxuICAgICAgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShoaXN0b3J5W2hpc3RvcnkubGVuZ3RoIC0gMV0pKVxyXG4gICAgICBjYW52YXMubG9hZEZyb21KU09OKGhpc3RvcnlbaGlzdG9yeS5sZW5ndGggLSAxXS5qc29uKVxyXG4gICAgICBzZXRCYWNrZ3JvdW5kSW1hZ2UoaGlzdG9yeVtoaXN0b3J5Lmxlbmd0aCAtIDFdLmNyb3BwZWRJbWFnZSlcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBjYW52YXMubG9hZEZyb21KU09OKGhpc3RvcnlbaGlzdG9yeS5sZW5ndGggLSAxXSlcclxuICAgICAgY2FudmFzLnJlbmRlckFsbCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5leHBvcnQgY29uc3QgdG9EYXRhVXJsID0gKHVybCwgY2FsbGJhY2spID0+IHtcclxuICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcclxuICAgICAgY2FsbGJhY2socmVhZGVyLnJlc3VsdCk7XHJcbiAgICB9XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTCh4aHIucmVzcG9uc2UpO1xyXG4gIH07XHJcbiAgeGhyLm9wZW4oJ0dFVCcsIHVybCk7XHJcbiAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJztcclxuICB4aHIuc2VuZCgpO1xyXG59XHJcbmV4cG9ydCBjb25zdCBzZXRCYWNrZ3JvdW5kSW1hZ2UgPSAoaW1hZ2VVcmwpID0+IHtcclxuICBsZXQgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgdG9EYXRhVXJsKGltYWdlVXJsLCAoZGF0YVVyaSkgPT4ge1xyXG4gICAgaW1nLnNyYyA9IGRhdGFVcmk7XHJcbiAgICBpZiAoY2FudmFzLndpZHRoIDw9IGltZy53aWR0aCB8fCBjYW52YXMuaGVpZ2h0IDw9IGltZy5oZWlnaHQpIHtcclxuICAgICAgbGV0IGNhbnZhc0FzcGVjdCA9IGNhbnZhcy53aWR0aCAvIGNhbnZhcy5oZWlnaHQ7XHJcbiAgICAgIGxldCBpbWdBc3BlY3QgPSBpbWcud2lkdGggLyBpbWcuaGVpZ2h0O1xyXG4gICAgICBsZXQgdXBkYXRlZExlZnQsIHVwZGF0ZWRUb3AsIHNjYWxlRmFjdG9yO1xyXG4gICAgICBpZiAoY2FudmFzQXNwZWN0ID49IGltZ0FzcGVjdCkge1xyXG4gICAgICAgIHNjYWxlRmFjdG9yID0gY2FudmFzLndpZHRoIC8gaW1nLndpZHRoO1xyXG4gICAgICAgIHVwZGF0ZWRMZWZ0ID0gMDtcclxuICAgICAgICB1cGRhdGVkVG9wID0gLSgoaW1nLmhlaWdodCAqIHNjYWxlRmFjdG9yKSAtIGNhbnZhcy5oZWlnaHQpIC8gMjtcclxuXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2NhbGVGYWN0b3IgPSBjYW52YXMuaGVpZ2h0IC8gaW1nLmhlaWdodDtcclxuICAgICAgICB1cGRhdGVkVG9wID0gMDtcclxuICAgICAgICB1cGRhdGVkTGVmdCA9IC0oKGltZy53aWR0aCAqIHNjYWxlRmFjdG9yKSAtIGNhbnZhcy53aWR0aCkgLyAyO1xyXG4gICAgICB9XHJcbiAgICAgIGltZy53aWR0aCA9IGNhbnZhcy53aWR0aDtcclxuICAgICAgaW1nLmhlaWdodCA9IGNhbnZhcy5oZWlnaHQ7XHJcblxyXG4gICAgICBjYW52YXMuc2V0QmFja2dyb3VuZEltYWdlKGRhdGFVcmksIGNhbnZhcy5yZW5kZXJBbGwuYmluZChjYW52YXMpLCB7XHJcbiAgICAgICAgdG9wOiB1cGRhdGVkVG9wLFxyXG4gICAgICAgIGxlZnQ6IHVwZGF0ZWRMZWZ0LFxyXG4gICAgICAgIG9yaWdpblg6ICdsZWZ0JyxcclxuICAgICAgICBvcmlnaW5ZOiAndG9wJyxcclxuICAgICAgICBzY2FsZVg6IHNjYWxlRmFjdG9yLFxyXG4gICAgICAgIHNjYWxlWTogc2NhbGVGYWN0b3JcclxuICAgICAgfSk7XHJcbiAgICAgIGNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBjZW50ZXIgPSBjYW52YXMuZ2V0Q2VudGVyKCk7XHJcbiAgICAgIGNhbnZhcy5zZXRCYWNrZ3JvdW5kSW1hZ2UoZGF0YVVyaSwgY2FudmFzLnJlbmRlckFsbC5iaW5kKGNhbnZhcyksIHtcclxuICAgICAgICB0b3A6IGNlbnRlci50b3AsXHJcbiAgICAgICAgbGVmdDogY2VudGVyLmxlZnQsXHJcbiAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXHJcbiAgICAgICAgb3JpZ2luWTogJ2NlbnRlcidcclxuICAgICAgfSk7XHJcbiAgICAgIGNhbnZhcy5yZW5kZXJBbGwoKVxyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcbmV4cG9ydCBjb25zdCBjbGVhciA9ICgpID0+IHtcclxuICBkcmFnKCk7XHJcbiAgY2FudmFzLmNsZWFyKCk7XHJcbn1cclxuZXhwb3J0IGNvbnN0IHNhdmVJbWFnZSA9ICgpID0+IHtcclxuICBkcmFnKCk7XHJcbiAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCAxKTtcclxufVxyXG5leHBvcnQgY29uc3QgdXBsb2FkSW1hZ2UgPSAoZSkgPT4ge1xyXG4gIGRyYWcoKTtcclxuXHJcbiAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgbGV0IGltZ09iaiA9IG5ldyBJbWFnZSgpO1xyXG4gICAgaW1nT2JqLnNyYyA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7XHJcbiAgICBpbWdPYmoub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICBsZXQgaW1hZ2UgPSBuZXcgZmFicmljLkltYWdlKGltZ09iaik7XHJcbiAgICAgIGlmIChjYW52YXMud2lkdGggPD0gaW1hZ2Uud2lkdGggfHwgY2FudmFzLmhlaWdodCA8PSBpbWFnZS5oZWlnaHQpIHtcclxuICAgICAgICBsZXQgY2FudmFzQXNwZWN0ID0gY2FudmFzLndpZHRoIC8gY2FudmFzLmhlaWdodDtcclxuICAgICAgICBsZXQgaW1nQXNwZWN0ID0gaW1hZ2Uud2lkdGggLyBpbWFnZS5oZWlnaHQ7XHJcbiAgICAgICAgbGV0IHRvcCwgbGVmdCwgc2NhbGVGYWN0b3I7XHJcbiAgICAgICAgaWYgKGNhbnZhc0FzcGVjdCA+PSBpbWdBc3BlY3QpIHtcclxuICAgICAgICAgIHNjYWxlRmFjdG9yID0gY2FudmFzLmhlaWdodCAvIGltYWdlLmhlaWdodFxyXG4gICAgICAgICAgdG9wID0gMDtcclxuICAgICAgICAgIGxlZnQgPSAtKChpbWFnZS53aWR0aCAqIHNjYWxlRmFjdG9yKSAtIGNhbnZhcy53aWR0aCkgLyAyO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzY2FsZUZhY3RvciA9IGNhbnZhcy53aWR0aCAvIGltYWdlLndpZHRoO1xyXG4gICAgICAgICAgbGVmdCA9IDA7XHJcbiAgICAgICAgICB0b3AgPSAtKChpbWFnZS5oZWlnaHQgKiBzY2FsZUZhY3RvcikgLSBjYW52YXMuaGVpZ2h0KSAvIDI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhbnZhcy5jbGVhcigpXHJcbiAgICAgICAgY2FudmFzLnNldEJhY2tncm91bmRJbWFnZShpbWFnZSwgY2FudmFzLnJlbmRlckFsbC5iaW5kKGNhbnZhcyksIHtcclxuICAgICAgICAgIHRvcDogdG9wLFxyXG4gICAgICAgICAgbGVmdDogbGVmdCxcclxuICAgICAgICAgIHNjYWxlWDogc2NhbGVGYWN0b3IsXHJcbiAgICAgICAgICBzY2FsZVk6IHNjYWxlRmFjdG9yXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbGV0IGNyb3BwZWRJbWFnZSA9IHsganNvbjogY2FudmFzLnRvSlNPTigpLCBjcm9wcGVkSW1hZ2U6IGNhbnZhcy50b0RhdGFVUkwoKSB9O1xyXG4gICAgICAgIG5ldyBDYW52YXNIaXN0b3J5KGNhbnZhcywgY3JvcHBlZEltYWdlKVxyXG4gICAgICAgIGNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgY2VudGVyID0gY2FudmFzLmdldENlbnRlcigpO1xyXG4gICAgICAgIGNhbnZhcy5jbGVhcigpXHJcbiAgICAgICAgY2FudmFzLnNldEJhY2tncm91bmRJbWFnZShpbWFnZSwgY2FudmFzLnJlbmRlckFsbC5iaW5kKGNhbnZhcyksIHtcclxuICAgICAgICAgIHRvcDogY2VudGVyLnRvcCxcclxuICAgICAgICAgIGxlZnQ6IGNlbnRlci5sZWZ0LFxyXG4gICAgICAgICAgb3JpZ2luWDogJ2NlbnRlcicsXHJcbiAgICAgICAgICBvcmlnaW5ZOiAnY2VudGVyJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCBjcm9wcGVkSW1hZ2UgPSB7IGpzb246IGNhbnZhcy50b0pTT04oKSwgY3JvcHBlZEltYWdlOiBjYW52YXMudG9EYXRhVVJMKCkgfTtcclxuICAgICAgICBuZXcgQ2FudmFzSGlzdG9yeShjYW52YXMsIGNyb3BwZWRJbWFnZSlcclxuICAgICAgICBjYW52YXMucmVuZGVyQWxsKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gIH1cclxuICBpZiAoZS50YXJnZXQgJiYgZS50YXJnZXQuZmlsZXMgJiYgZS50YXJnZXQuZmlsZXNbMF0pIHtcclxuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGUudGFyZ2V0LmZpbGVzWzBdKTtcclxuICB9XHJcblxyXG5cclxufSJdfQ==