image-uploader-crop
Version:
cropper and uploader of images that uses another libraries
3 lines • 56.3 kB
JavaScript
!function(i){"use strict";"function"==typeof define&&define.amd?define(["jquery"],i):"object"==typeof module&&module.exports?module.exports=i(require("jquery")):i(jQuery)}(function(i){"use strict";var t=Array.prototype.slice,s=(Array.prototype.splice,{formCrop:null,btnToCrop:null,imgCrop:null,previewImg:null,uploaderImg:null,templateImgUploader:"",configImg:{maxWidthImg:0,maxHeightImg:0,minWidthImg:0,minHeightImg:0,allowedExtensions:["jpeg","jpg","png"],sizeLimit:0,sendOriginal:!0,defaultQuality:100},uploadding:{inputName:"file",endpoint:"",params:{}},cropping:{endpoint:"",params:{}},extraDropzones:[i("#wrapper-image-crop")],callbacks:{onCropping:function(i){},onCropComplete:function(i,t,s){},onCropError:function(i,t,s){},onLoadImg:function(i,t,s){},onCompleteLoad:function(i,t,s,e){}},messages:{},showMessage:function(i){return alertify.alert(i)},showConfirm:function(i){var t=new qq.Promise;return alertify.confirm(i,function(i){return i?t.success(i):t.failure()}),t},showPrompt:function(i,t){var s=new qq.Promise;return alertify.prompt(i,function(i,t){return i?s.success(t):s.failure(t)},t),s}}),e={reassignActions:function(){this.settings.uploaderImg.off("complete"),this.settings.uploaderImg.on("complete",e.onCompleteLoadImg.bind(this)),this.settings.btnToCrop?(this.settings.btnToCrop.unbind().off("click",e.submitCropImage.bind(this)),this.settings.btnToCrop.on("click",e.submitCropImage.bind(this))):(this.settings.formCrop.off("submit",e.submitCropImage.bind(this)),this.settings.formCrop.on("submit",e.submitCropImage.bind(this)))},destroy:function(){void 0!==this.settings.imgCrop.data("Jcrop")&&this.jcrop_img.destroy(),this.settings.uploaderImg.off("complete"),this.settings.formCrop.off("submit"),this.$element.removeData("imageUploaderCrop")},setImage:function(t,s){t||(t=this.settings.imgCrop.attr("src"))||(t="");try{if(!this.settings.imgCrop)throw"The imgCrop element have not went assign"}catch(i){console.error("Error: "+i+".")}var n=this;void 0!==this.settings.imgCrop.data("Jcrop")?(this.jcrop_img=this.settings.imgCrop.data("Jcrop"),this.jcrop_img.setImage(t,function(){var i=[];i=this.settings.configImg.minWidthImg&&this.settings.configImg.minHeightImg?[this.settings.configImg.minWidthImg,this.settings.configImg.minHeightImg]:this.jcrop_img.getBounds(),e.changeOptsCrop.call(n,{imgSet:t,minWidth:n.settings.configImg.minWidthImg,minHeight:n.settings.configImg.minHeightImg,imgWidth:i[0],imgHeight:i[1]}),n.settings.formCrop.find("input#crop_type").val("url"),n.settings.formCrop.find("input#file_name").val(t),n.settings.formCrop.find("input#file_type").val(t.split(".").slice(-1))})):(this.settings.imgCrop.attr("src",t),e.renderImageCrop.call(this,this.settings.imgCrop,function(){var i=[];i=this.settings.configImg.minWidthImg&&this.settings.configImg.minHeightImg?[this.settings.configImg.minWidthImg,this.settings.configImg.minHeightImg]:this.jcrop_img.getBounds(),e.changeOptsCrop.call(this,{imgSet:t,minWidth:this.settings.configImg.minWidthImg,minHeight:this.settings.configImg.minHeightImg,imgWidth:i[0],imgHeight:i[1]}),this.settings.formCrop.find("input#crop_type").val("url"),this.settings.formCrop.find("input#file_name").val(t),this.settings.formCrop.find("input#file_type").val(t.split(".").slice(-1))}.bind(this))),i.isFunction(s)&&s.call()},renderUploaderImg:function(t){if(!{}.hasOwnProperty.call(i.fn,"fineUploader"))return console.error("Error: The imageUploaderCrop jQuery library do need of the fine-uploader jQuery library."),!1;t.fineUploader({debug:!1,template:this.settings.templateImgUploader,request:this.settings.uploadding,thumbnails:{placeholders:{waitingPath:"img/waiting-generic.png",notAvailablePath:"img/not_available-generic.png"}},autoUpload:!0,multiple:!1,validation:{image:{maxWidth:this.settings.configImg.maxWidthImg||s.configImg.maxWidthImg,maxHeight:this.settings.configImg.maxHeightImg||s.configImg.maxHeightImg},allowedExtensions:this.settings.configImg.allowedExtensions||s.configImg.allowedExtensions,sizeLimit:this.settings.configImg.sizeLimit||s.configImg.sizeLimit,stopOnFirstInvalidFile:!1,itemLimit:0},scaling:{sendOriginal:this.settings.configImg.sendOriginal||s.configImg.sendOriginal,defaultQuality:this.settings.configImg.defaultQuality||s.configImg.defaultQuality},callbacks:{onUpload:e.onLoadImg.bind(this)},messages:i.extend({},this.settings.messages),dragAndDrop:{extraDropzones:this.settings.extraDropzones},showMessage:this.settings.showMessage,showConfirm:this.settings.showConfirm,showPrompt:this.settings.showPrompt})},renderImageCrop:function(t,s){if(!{}.hasOwnProperty.call(i.fn,"Jcrop"))return console.error("Error: The imageUploaderCrop jQuery library needs of the jcrop jQuery library."),!1;var n=this;t.Jcrop({onSelect:e.setCoords.bind(this),onChange:e.setCoords.bind(this),onRelease:function(){},bgColor:"black",bgOpacity:.4,setSelect:[0,0,this.settings.configImg.minWidthImg,this.settings.configImg.minHeightImg],aspectRatio:this.settings.configImg.minWidthImg/this.settings.configImg.minHeightImg,boxWidth:t.parent().width(),boxHeight:0,allowSelect:!1,allowResize:!0},function(){n.jcrop_img=this;var i=n.jcrop_img.getBounds();e.changeOptsCrop.call(n,{imgSet:t.attr("src"),minWidth:n.settings.configImg.minWidthImg,minHeight:n.settings.configImg.minHeightImg,imgWidth:i[0],imgHeight:i[1]}),"function"==typeof s&&s.call()})},changeOptsCrop:function(t,s){var e={imgSet:"",minWidth:0,minHeight:0,imgWidth:0,imgHeight:0,dimSelect:[0,0],ix:0,iy:0};i.extend(e,t),e.dimSelect=function(i,t){var s=Math.min(i,t);return i==t?[i,t]:[s,s]}(e.imgWidth,e.imgHeight),e.ix=(e.imgWidth-e.dimSelect[0])/2,this.jcrop_img.setOptions({trueSize:[Math.floor(e.imgWidth),Math.floor(e.imgHeight)]}),this.settings.previewImg.attr("src",e.imgSet),this.jcrop_img.setSelect([e.ix,e.iy,e.dimSelect[0],e.dimSelect[1]]),"function"==typeof s&&s.call()},submitCropImage:function(t){t.preventDefault();var s=function(t){var s={},e=[];return e=i.prototype.isPrototypeOf(t)?t.serializeArray():i(t).serializeArray(),i.each(e,function(){void 0!==s[this.name]?(s[this.name].push||(s[this.name]=[s[this.name]]),s[this.name].push(this.value||"")):s[this.name]=this.value||""}),s}(this.settings.formCrop);s.targ_w=this.settings.configImg.minWidthImg,s.targ_h=this.settings.configImg.minHeightImg,i.extend(s,this.settings.cropping.params),i.isFunction(this.settings.callbacks.onCropping)&&this.settings.callbacks.onCropping.call(this,this.jcrop_img),this.settings.formCrop.find(":submit").addClass("disabled"),i.post(this.settings.cropping.endpoint,s,e.onSuccessCrop.bind(this)).fail(e.onErrorCrop.bind(this))},setCoords:function(t){var s=this.settings.configImg.minHeightImg/this.settings.configImg.minWidthImg,e=null!==this.jcrop_img&&this.jcrop_img.getBounds(),n=i(this.settings.previewImg.parent()[0]).width()/t.w,o=s*i(this.settings.previewImg.parent()[0]).width()/t.h;this.settings.previewImg.attr("src")&&i(this.settings.previewImg.parent()[0]).height(s*i(this.settings.previewImg.parent()[0]).width()),this.settings.formCrop.find("input.crop-x").val(t.x),this.settings.formCrop.find("input.crop-y").val(t.y),this.settings.formCrop.find("input.crop-w").val(t.w),this.settings.formCrop.find("input.crop-h").val(t.h),e&&this.settings.previewImg.css({width:Math.round(n*e[0])+"px",height:Math.round(o*e[1])+"px",minWidth:Math.round(n*e[0])+"px",minHeight:Math.round(o*e[1])+"px",marginLeft:"-"+Math.round(n*t.x)+"px",marginTop:"-"+Math.round(o*t.y)+"px"})},onLoadImg:function(t,s){var n=this.settings.uploaderImg.fineUploader("getDropTarget",t);void 0!==n&&n.length&&(n.hasClass("image-area-drop")||n.hasClass("wrapper-image-crop"))&&(e.reassignActions.call(this),e.setImage.call(this)),i.isFunction(this.settings.callbacks.onLoadImg)&&this.settings.callbacks.onLoadImg.call(this,this.settings.uploaderImg,t,s)},onCompleteLoadImg:function(t,s,n,o){o.success&&(void 0!==this.settings.imgCrop.data("Jcrop")?this.jcrop_img.setImage(o.file_path,function(){o.file_width,o.file_height;e.changeOptsCrop.call(this,{imgSet:o.file_path,minWidth:this.settings.configImg.minWidthImg,minHeight:this.settings.configImg.minHeightImg,imgWidth:o.file_width,imgHeight:o.file_height},function(){i.isFunction(this.settings.callbacks.onCompleteLoad)&&this.settings.callbacks.onCompleteLoad.call(this,this.settings.uploaderImg,s,n,o)}.bind(this))}.bind(this)):(this.settings.imgCrop.attr("src",o.file_path),e.renderImageCrop.call(this,this.settings.imgCrop,function(){e.changeOptsCrop.call(this,{imgSet:o.file_path,minWidth:this.settings.configImg.minWidthImg,minHeight:this.settings.configImg.minHeightImg,imgWidth:o.file_width,imgHeight:o.file_height},function(){i.isFunction(this.settings.callbacks.onCompleteLoad)&&this.settings.callbacks.onCompleteLoad.call(this,this.settings.uploaderImg,s,n,o)}.bind(this))}.bind(this))),this.settings.formCrop.find("input#crop_type").val("name"),this.settings.formCrop.find("input#file_name").val(o.file_name),this.settings.formCrop.find("input#file_type").val(o.file_type))},onSuccessCrop:function(t,s,e){this.settings.formCrop.find(":submit").removeClass("disabled"),i.isFunction(this.settings.callbacks.onCropComplete)&&this.settings.callbacks.onCropComplete.call(this,this.jcrop_img,t,e)},onErrorCrop:function(t,s,e){this.settings.formCrop.find(":submit").removeClass("disabled"),i.isFunction(this.settings.callbacks.onCropError)&&this.settings.callbacks.onCropError.call(this,this.jcrop_img,t,e)}};i.imageUploaderCrop=function(t,s){s||(s={});this.jcrop_img=null,this.element=t,this.$element=i(t),i.isFunction(this.init)&&this.init(t,s)},i.imageUploaderCrop.prototype={settings:{},init:function(t,n){this.settings=i.extend({},s,n),this.settings.imgCrop&&void 0!==this.settings.imgCrop.data("Jcrop")&&(this.jcrop_img=this.settings.imgCrop.data("Jcrop"),this.jcrop_img.destroy()),e.reassignActions.call(this),e.renderUploaderImg.call(this,this.settings.uploaderImg),e.renderImageCrop.call(this,this.settings.imgCrop)},changeImage:function(i,t){e.reassignActions.call(this),e.setImage.call(this,i,t)},getImgCrop:function(){return this.settings.imgCrop},getFormCrop:function(){return this.settings.formCrop},getUploaderImg:function(){return this.settings.uploaderImg},getPreviewImg:function(){return this.settings.previewImg},destroy:function(){e.destroy.call(this)}},i.fn.imageUploaderCrop=function(s){var e=arguments;if(void 0!==i(this).data("imageUploaderCrop")&&i.isFunction(i(this).data("imageUploaderCrop")[s])){var n=i(this).data("imageUploaderCrop");return n[s].apply(n,t.call(e,1))}if("object"==typeof s||!s)return this.each(function(t,e){var n=new i.imageUploaderCrop(this,s);i(this).data("imageUploaderCrop",n)});i.error('Method "'+s+'" does not exist in imageUploaderCrop - (krobing) plugin!')}});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImltYWdlLXVwbG9hZGVyLWNyb3AuanMiXSwibmFtZXMiOlsiZmFjdG9yeSIsImRlZmluZSIsImFtZCIsIm1vZHVsZSIsImV4cG9ydHMiLCJyZXF1aXJlIiwialF1ZXJ5IiwiJCIsInNsaWNlIiwiQXJyYXkiLCJwcm90b3R5cGUiLCJkZWZhdWx0cyIsInNwbGljZSIsImZvcm1Dcm9wIiwiYnRuVG9Dcm9wIiwiaW1nQ3JvcCIsInByZXZpZXdJbWciLCJ1cGxvYWRlckltZyIsInRlbXBsYXRlSW1nVXBsb2FkZXIiLCJjb25maWdJbWciLCJtYXhXaWR0aEltZyIsIm1heEhlaWdodEltZyIsIm1pbldpZHRoSW1nIiwibWluSGVpZ2h0SW1nIiwiYWxsb3dlZEV4dGVuc2lvbnMiLCJzaXplTGltaXQiLCJzZW5kT3JpZ2luYWwiLCJkZWZhdWx0UXVhbGl0eSIsInVwbG9hZGRpbmciLCJpbnB1dE5hbWUiLCJlbmRwb2ludCIsInBhcmFtcyIsImNyb3BwaW5nIiwiZXh0cmFEcm9wem9uZXMiLCJjYWxsYmFja3MiLCJvbkNyb3BwaW5nIiwiamNyb3BfaW1nIiwib25Dcm9wQ29tcGxldGUiLCJyZXNwIiwianFYSFIiLCJvbkNyb3BFcnJvciIsImVycm9yIiwib25Mb2FkSW1nIiwiJHVwbG9hZGVySW1nIiwiaWQiLCJuYW1lIiwib25Db21wbGV0ZUxvYWQiLCJyZXMiLCJtZXNzYWdlcyIsInNob3dNZXNzYWdlIiwibWVzc2FnZSIsImFsZXJ0aWZ5IiwiYWxlcnQiLCJzaG93Q29uZmlybSIsInByb21pc2UiLCJxcSIsIlByb21pc2UiLCJjb25maXJtIiwicmVzdWx0Iiwic3VjY2VzcyIsImZhaWx1cmUiLCJzaG93UHJvbXB0IiwiZGVmYXVsdFZhbHVlIiwicHJvbXB0IiwiaW5TdHIiLCJtZXRob2RzIiwicmVhc3NpZ25BY3Rpb25zIiwidGhpcyIsInNldHRpbmdzIiwib2ZmIiwib24iLCJvbkNvbXBsZXRlTG9hZEltZyIsImJpbmQiLCJ1bmJpbmQiLCJzdWJtaXRDcm9wSW1hZ2UiLCJkZXN0cm95IiwidW5kZWZpbmVkIiwiZGF0YSIsIiRlbGVtZW50IiwicmVtb3ZlRGF0YSIsInNldEltYWdlIiwidXJsSW1hZ2UiLCJjYWxsYmFjayIsImF0dHIiLCJlcnIiLCJjb25zb2xlIiwiX3RoaXMiLCJkaW1JbWciLCJnZXRCb3VuZHMiLCJjaGFuZ2VPcHRzQ3JvcCIsImNhbGwiLCJpbWdTZXQiLCJtaW5XaWR0aCIsIm1pbkhlaWdodCIsImltZ1dpZHRoIiwiaW1nSGVpZ2h0IiwiZmluZCIsInZhbCIsInNwbGl0IiwicmVuZGVySW1hZ2VDcm9wIiwiaXNGdW5jdGlvbiIsInJlbmRlclVwbG9hZGVySW1nIiwiaGFzT3duUHJvcGVydHkiLCJmbiIsImZpbmVVcGxvYWRlciIsImRlYnVnIiwidGVtcGxhdGUiLCJyZXF1ZXN0IiwidGh1bWJuYWlscyIsInBsYWNlaG9sZGVycyIsIndhaXRpbmdQYXRoIiwibm90QXZhaWxhYmxlUGF0aCIsImF1dG9VcGxvYWQiLCJtdWx0aXBsZSIsInZhbGlkYXRpb24iLCJpbWFnZSIsIm1heFdpZHRoIiwibWF4SGVpZ2h0Iiwic3RvcE9uRmlyc3RJbnZhbGlkRmlsZSIsIml0ZW1MaW1pdCIsInNjYWxpbmciLCJvblVwbG9hZCIsImV4dGVuZCIsImRyYWdBbmREcm9wIiwiJGltZ0Nyb3AiLCJKY3JvcCIsIm9uU2VsZWN0Iiwic2V0Q29vcmRzIiwib25DaGFuZ2UiLCJvblJlbGVhc2UiLCJiZ0NvbG9yIiwiYmdPcGFjaXR5Iiwic2V0U2VsZWN0IiwiYXNwZWN0UmF0aW8iLCJib3hXaWR0aCIsInBhcmVudCIsIndpZHRoIiwiYm94SGVpZ2h0IiwiYWxsb3dTZWxlY3QiLCJhbGxvd1Jlc2l6ZSIsImRpbURlZmF1bHQiLCJvcHRpb25zIiwiZGltU2VsZWN0IiwiaXgiLCJpeSIsIm1pbkRpbSIsIk1hdGgiLCJtaW4iLCJzZXRTcXVhcmUiLCJzZXRPcHRpb25zIiwidHJ1ZVNpemUiLCJmbG9vciIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInNlbGVjdG9yIiwibyIsImEiLCJpc1Byb3RvdHlwZU9mIiwic2VyaWFsaXplQXJyYXkiLCJlYWNoIiwicHVzaCIsInZhbHVlIiwiZm9ybVRvSnNvbiIsInRhcmdfdyIsInRhcmdfaCIsImFkZENsYXNzIiwicG9zdCIsIm9uU3VjY2Vzc0Nyb3AiLCJmYWlsIiwib25FcnJvckNyb3AiLCJjb29yZHMiLCJyYXRpb0xlc3NlciIsInJ4IiwidyIsInJ5IiwiaCIsImhlaWdodCIsIngiLCJ5IiwiY3NzIiwicm91bmQiLCJtYXJnaW5MZWZ0IiwibWFyZ2luVG9wIiwiJGFyZWFEcm9wIiwibGVuZ3RoIiwiaGFzQ2xhc3MiLCJldmVudCIsImZpbGVfcGF0aCIsImZpbGVfd2lkdGgiLCJmaWxlX2hlaWdodCIsImZpbGVfbmFtZSIsImZpbGVfdHlwZSIsInN0YXR1cyIsInJlbW92ZUNsYXNzIiwiaW1hZ2VVcGxvYWRlckNyb3AiLCJlbGVtZW50IiwiaW5pdCIsImNoYW5nZUltYWdlIiwiZ2V0SW1nQ3JvcCIsImdldEZvcm1Dcm9wIiwiZ2V0VXBsb2FkZXJJbWciLCJnZXRQcmV2aWV3SW1nIiwib3B0c09yQ21kIiwic2VsZkFyZ3MiLCJhcmd1bWVudHMiLCJwbHVnIiwiYXBwbHkiLCJpbmRleCIsImVsIiwicGx1Z2luIl0sIm1hcHBpbmdzIjoiQ0FVQSxTQUFBQSxHQUFBLGFBQ0EsbUJBQUFDLFFBQUFBLE9BQUFDLElBRUFELFFBQUEsVUFBQUQsR0FDQSxpQkFBQUcsUUFBQUEsT0FBQUMsUUFFQUQsT0FBQUMsUUFBQUosRUFBQUssUUFBQSxXQUdBTCxFQUFBTSxRQVRBLENBV0EsU0FBQUMsR0FBQSxhQUNBLElBQUFDLEVBQUFDLE1BQUFDLFVBQUFGLE1BSUFHLEdBSEFGLE1BQUFDLFVBQUFFLFFBSUFDLFNBQUEsS0FDQUMsVUFBQSxLQUNBQyxRQUFBLEtBQ0FDLFdBQUEsS0FDQUMsWUFBQSxLQUNBQyxvQkFBQSxHQUNBQyxXQUNBQyxZQUFBLEVBQ0FDLGFBQUEsRUFDQUMsWUFBQSxFQUNBQyxhQUFBLEVBQ0FDLG1CQUFBLE9BQUEsTUFBQSxPQUNB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S0FBQSxTQUNBVixLQUFBL0IsVUFBQXVDLFdBSUFWLEVBQUFDLGdCQUFBd0IsS0FBQXZCLE1BQ0FGLEVBQUFvQyxrQkFBQVgsS0FBQXZCLEtBQUFBLEtBQUFDLFNBQUFuRCxhQUNBZ0QsRUFBQWtDLGdCQUFBVCxLQUFBdkIsS0FBQUEsS0FBQUMsU0FBQXJELFVBY0FzTCxZQUFBLFNBQUFwSCxFQUFBQyxHQUNBakIsRUFBQUMsZ0JBQUF3QixLQUFBdkIsTUFDQUYsRUFBQWUsU0FBQVUsS0FBQXZCLEtBQUFjLEVBQUFDLElBTUFvSCxXQUFBLFdBQ0EsT0FBQW5JLEtBQUFDLFNBQUFyRCxTQU1Bd0wsWUFBQSxXQUNBLE9BQUFwSSxLQUFBQyxTQUFBdkQsVUFNQTJMLGVBQUEsV0FDQSxPQUFBckksS0FBQUMsU0FBQW5ELGFBTUF3TCxjQUFBLFdBQ0EsT0FBQXRJLEtBQUFDLFNBQUFwRCxZQU1BMkQsUUFBQSxXQUNBVixFQUFBVSxRQUFBZSxLQUFBdkIsUUFJQTVELEVBQUFnRyxHQUFBMkYsa0JBQUEsU0FBQVEsR0FDQSxJQUFBQyxFQUFBQyxVQUVBLFFBQUFoSSxJQUFBckUsRUFBQTRELE1BQUFVLEtBQUEsc0JBQUF0RSxFQUFBNkYsV0FBQTdGLEVBQUE0RCxNQUFBVSxLQUFBLHFCQUFBNkgsSUFBQSxDQUVBLElBQUFHLEVBQUF0TSxFQUFBNEQsTUFBQVUsS0FBQSxxQkFDQSxPQUFBZ0ksRUFBQUgsR0FBQUksTUFBQUQsRUFBQXJNLEVBQUFrRixLQUFBaUgsRUFBQSxJQUVBLEdBQUEsaUJBQUFELElBQUFBLEVBRUEsT0FBQXZJLEtBQUE0RixLQUFBLFNBQUFnRCxFQUFBQyxHQUVBLElBQUFDLEVBQUEsSUFBQTFNLEVBQUEyTCxrQkFBQS9ILEtBQUF1SSxHQUVBbk0sRUFBQTRELE1BQUFVLEtBQUEsb0JBQUFvSSxLQUlBMU0sRUFBQWtDLE1BQUEsV0FBQWlLLEVBQUEiLCJmaWxlIjoiaW1hZ2UtdXBsb2FkZXItY3JvcC5taW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbWFnZS11cGxvYWRlci1jcm9wIHYwLjEuMSBmb3IgalF1ZXJ5IHRoYXQgdXNlcyBmaW5lLXVwbG9hZGVyLCBqY3JvcFxuLy8gKGMpIDIwMTcsIE1JVCBsaWNlbnNlZC4gaHR0cDovL3R1cHJveWVjdG8uY29tXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGVwZW5kZW5jaWVzOiBqUXVlcnksIGZpbmUtdXBsb2FkZXIsIGpjcm9wXG4vLyBBdXRob3I6IFR1UHJveWVjdG8uY29tXG4vLyBEZXZlbG9wZXI6IEBrcm9iaW5nXG4vLyBDcmVhdGVkOiAwNC8wMy8yMDE2XG4vLyBXZWJzaXRlOiBodHRwOi8vdHVwcm95ZWN0by5jb21cbi8vIERlc2NyaXB0aW9uOiBjcm9wcGVyIGFuZCB1cGxvYWRlciBvZiBpbWFnZXMgdGhhdCB1c2VzIGFub3RoZXIgbGlicmFyaWVzXG5cbiEoZnVuY3Rpb24gKGZhY3RvcnkpIHsgJ3VzZSBzdHJpY3QnXG5cdGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuXG5cdFx0ZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0Ly8gTm9kZS9Db21tb25KU1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCdqcXVlcnknKSk7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gQnJvd3NlciBnbG9iYWxzXG5cdFx0ZmFjdG9yeShqUXVlcnkpO1xuXHR9XG59KGZ1bmN0aW9uICgkKSB7ICd1c2Ugc3RyaWN0Jztcblx0dmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOyAvLyBzYXZlIHJlZiB0byBvcmlnaW5hbCBzbGljZSgpXG5cdHZhciBzcGxpY2UgPSBBcnJheS5wcm90b3R5cGUuc3BsaWNlOyAvLyBzYXZlIHJlZiB0byBvcmlnaW5hbCBzbGljZSgpXG5cblx0Ly8gZGVmYXVsdCBvcHRpb25zXG5cdHZhciBkZWZhdWx0cyA9IHtcblx0XHRmb3JtQ3JvcDogbnVsbCxcblx0XHRidG5Ub0Nyb3A6IG51bGwsXG5cdFx0aW1nQ3JvcDogbnVsbCxcblx0XHRwcmV2aWV3SW1nOiBudWxsLFxuXHRcdHVwbG9hZGVySW1nOiBudWxsLFxuXHRcdHRlbXBsYXRlSW1nVXBsb2FkZXI6ICcnLFxuXHRcdGNvbmZpZ0ltZzoge1xuXHRcdFx0bWF4V2lkdGhJbWcgOiAwLCAvLyA2NDYgKiAyXG5cdFx0XHRtYXhIZWlnaHRJbWcgOiAwLCAvLyAzNzQgKiAyXG5cdFx0XHRtaW5XaWR0aEltZyA6IDAsXG5cdFx0XHRtaW5IZWlnaHRJbWcgOiAwLFxuXHRcdFx0YWxsb3dlZEV4dGVuc2lvbnM6IFsnanBlZycsICdqcGcnLCAncG5nJ10sXG5cdFx0XHRzaXplTGltaXQ6IDAsIC8vIDUwIGtCID0gNTAgKiAxMDI0IGJ5dGVzLFxuXHRcdFx0c2VuZE9yaWdpbmFsOiB0cnVlLCAvLyBzZW5kIGltYWdlcyBvcmlnaW5hbCBpbiB0cnVlXG5cdFx0XHRkZWZhdWx0UXVhbGl0eTogMTAwIC8vIHF1YWxpdHkgb2YgdGhlIGltYWdlLCByYW5nZSggMSAtIDEwMCApXG5cdFx0fSxcblx0XHR1cGxvYWRkaW5nOiB7XG5cdFx0XHRpbnB1dE5hbWU6ICdmaWxlJyxcblx0XHRcdGVuZHBvaW50OiAnJyxcblx0XHRcdHBhcmFtczoge31cblx0XHR9LFxuXHRcdGNyb3BwaW5nOiB7XG5cdFx0XHRlbmRwb2ludDogJycsXG5cdFx0XHRwYXJhbXM6IHt9XG5cdFx0fSxcblx0XHRleHRyYURyb3B6b25lczogWyQoJyN3cmFwcGVyLWltYWdlLWNyb3AnKV0sXG5cdFx0Ly8gRXZlbnRzIGhhbmRsZXJzXG5cdFx0Y2FsbGJhY2tzOiB7XG5cdFx0XHRvbkNyb3BwaW5nOiBmdW5jdGlvbiAoamNyb3BfaW1nKSB7fSxcblx0XHRcdG9uQ3JvcENvbXBsZXRlOiBmdW5jdGlvbiAoamNyb3BfaW1nLCByZXNwLCBqcVhIUikge30sXG5cdFx0XHRvbkNyb3BFcnJvcjogZnVuY3Rpb24gKGpjcm9wX2ltZywganFYSFIsIGVycm9yKSB7fSxcblx0XHRcdG9uTG9hZEltZzogZnVuY3Rpb24gKCR1cGxvYWRlckltZywgaWQsIG5hbWUpIHt9LFxuXHRcdFx0b25Db21wbGV0ZUxvYWQ6IGZ1bmN0aW9uICgkdXBsb2FkZXJJbWcsIGlkLCBuYW1lLCByZXMpIHt9XG5cdFx0fSxcbiAgICAgICAgbWVzc2FnZXM6IHt9LFxuXHRcdHNob3dNZXNzYWdlOiBmdW5jdGlvbiAobWVzc2FnZSkge1xuXHRcdFx0cmV0dXJuIGFsZXJ0aWZ5LmFsZXJ0KG1lc3NhZ2UpO1xuXHRcdH0sXG5cdFx0c2hvd0NvbmZpcm06IGZ1bmN0aW9uIChtZXNzYWdlKSB7XG5cdFx0XHR2YXIgcHJvbWlzZSA9IG5ldyBxcS5Qcm9taXNlKCk7XG5cdFx0XHRhbGVydGlmeS5jb25maXJtKG1lc3NhZ2UsIGZ1bmN0aW9uKHJlc3VsdCkge1xuXHRcdFx0XHRpZiAocmVzdWx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb21pc2Uuc3VjY2VzcyhyZXN1bHQpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBwcm9taXNlLmZhaWx1cmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gcHJvbWlzZTtcblx0XHR9LFxuXHRcdHNob3dQcm9tcHQ6IGZ1bmN0aW9uIChtZXNzYWdlLCBkZWZhdWx0VmFsdWUpIHtcblx0XHRcdHZhciBwcm9taXNlID0gbmV3IHFxLlByb21pc2UoKTtcblxuXHRcdFx0YWxlcnRpZnkucHJvbXB0KG1lc3NhZ2UsIGZ1bmN0aW9uKHJlc3VsdCwgaW5TdHIpIHtcblx0XHRcdFx0aWYgKHJlc3VsdCkge1xuXHRcdFx0XHRcdHJldHVybiBwcm9taXNlLnN1Y2Nlc3MoaW5TdHIpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBwcm9taXNlLmZhaWx1cmUoaW5TdHIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCBkZWZhdWx0VmFsdWUpO1xuXHRcdFx0cmV0dXJuIHByb21pc2U7XG5cdFx0fVxuXHR9O1xuXG5cdC8vID09PT09PT09PT09PT09XG5cdC8vIGhlbHBlcnMgbWV0aG9kXG5cdC8vID09PT09PT09PT09PT09XG5cdC8qKlxuXHQqICBTZXJpYWxpemUgZm9ybSBpbnRvIGpzb24gZm9ybWF0XG5cdCogIEBwYXJhbSB7IHN0cmluZyB9IG5hbWUgY2xhc3Mgb3IgaWQgb2YgdGhlIGh0bWwgZWxlbWVudCB0byBlbWJlZCB0aGUgbG9hZGVyXG5cdCogIEByZXR1cm4geyBvYmplY3QgfSBmb3JtIGludG8ganNvblxuXHQqL1xuXHRmdW5jdGlvbiBmb3JtVG9Kc29uICggc2VsZWN0b3IgKXtcblxuXHRcdHZhciBvID0ge30sIGEgPSBbXTtcblx0XHRpZiggJC5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihzZWxlY3RvcikgKXtcblx0XHRcdGEgPSBzZWxlY3Rvci5zZXJpYWxpemVBcnJheSgpO1xuXHRcdH1cblx0XHRlbHNle1xuXHRcdFx0YSA9ICQoc2VsZWN0b3IpLnNlcmlhbGl6ZUFycmF5KCk7XG5cdFx0fVxuXG5cdFx0JC5lYWNoKCBhLCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggb1sgdGhpcy5uYW1lIF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0aWYgKCAhIG9bdGhpcy5uYW1lXS5wdXNoICkge1xuXHRcdFx0XHRcdG9bIHRoaXMubmFtZSBdID0gWyBvWyB0aGlzLm5hbWUgXSBdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0b1sgdGhpcy5uYW1lIF0ucHVzaCggdGhpcy52YWx1ZSB8fCAnJyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvWyB0aGlzLm5hbWUgXSA9IHRoaXMudmFsdWUgfHwgJyc7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gbztcblx0fVxuXG5cdC8qKlxuXHQqIFNldCBzZWxlY3Qgb24gaW1hZ2UgY3JvcFxuXHQqIEBwYXJhbSBOdW1iZXIgaW1nV2lkdGhcblx0KiBAcGFyYW0gTnVtYmVyIGltZ0hlaWdodFxuXHQqL1xuXHRmdW5jdGlvbiBzZXRTcXVhcmUgKGltZ1dpZHRoLCBpbWdIZWlnaHQpIHtcblx0XHR2YXIgbWluRGltID0gTWF0aC5taW4oaW1nV2lkdGgsIGltZ0hlaWdodCk7XG5cblx0XHRpZiggaW1nV2lkdGggPT0gaW1nSGVpZ2h0ICl7XG5cdFx0XHRyZXR1cm4gW2ltZ1dpZHRoLCBpbWdIZWlnaHRdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbbWluRGltLCBtaW5EaW1dO1xuXHR9XG5cblx0Ly8gY2hlY2sgb3V0IGlmIGV4aXRzIGpRdWVyeSBwbHVnaW4gZmluZXVwbG9hZGVyXG5cdGZ1bmN0aW9uIGV4aXN0VXBsb2FkZXJQbHVnaW4gKCkge1xuXG5cdFx0aWYoICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCgkLmZuLCAnZmluZVVwbG9hZGVyJykgKXtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1lbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvLyBjaGVjayBvdXQgaWYgZXhpdHMgalF1ZXJ5IHBsdWdpbiBqY3JvcFxuXHRmdW5jdGlvbiBleGlzdENyb3BQbHVnaW4gKCkge1xuXG5cdFx0aWYoICh7fSkuaGFzT3duUHJvcGVydHkuY2FsbCgkLmZuLCAnSmNyb3AnKSApe1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fWVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQqIHByaXZhdGVzIG1ldGhvZHNcblx0Ki9cblx0dmFyIG1ldGhvZHMgPSB7XG5cdFx0LyoqXG5cdFx0KiByZWFzc2lnbiBldmVudHMgYW5kIGFub3RoZXIgdGhpbmdzXG5cdFx0Ki9cblx0XHRyZWFzc2lnbkFjdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy5zZXR0aW5ncy51cGxvYWRlckltZy5vZmYoJ2NvbXBsZXRlJyk7XG5cdFx0XHR0aGlzLnNldHRpbmdzLnVwbG9hZGVySW1nLm9uKCdjb21wbGV0ZScsIG1ldGhvZHMub25Db21wbGV0ZUxvYWRJbWcuYmluZCh0aGlzKSk7XG5cblx0XHRcdC8vIGlmIHdhcyBkZWZpbmVkIGEgYnV0dG9uIHRvIGV4ZWN1dGUgYWN0aW9uIHRvIGNyb3Bcblx0XHRcdGlmKHRoaXMuc2V0dGluZ3MuYnRuVG9Dcm9wKSB7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MuYnRuVG9Dcm9wLnVuYmluZCgpLm9mZignY2xpY2snLCBtZXRob2RzLnN1Ym1pdENyb3BJbWFnZS5iaW5kKHRoaXMpKTtcblx0XHRcdFx0dGhpcy5zZXR0aW5ncy5idG5Ub0Nyb3Aub24oJ2NsaWNrJywgbWV0aG9kcy5zdWJtaXRDcm9wSW1hZ2UuYmluZCh0aGlzKSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnNldHRpbmdzLmZvcm1Dcm9wLm9mZignc3VibWl0JywgbWV0aG9kcy5zdWJtaXRDcm9wSW1hZ2UuYmluZCh0aGlzKSk7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MuZm9ybUNyb3Aub24oJ3N1Ym1pdCcsIG1ldGhvZHMuc3VibWl0Q3JvcEltYWdlLmJpbmQodGhpcykpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKipcblx0XHQqIGRlc3Ryb3kgcGx1Z2luXG5cdFx0Ki9cblx0XHRkZXN0cm95OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHQvLyBkZXN0cm95IGpjcm9wXG5cdFx0XHRpZiggdGhpcy5zZXR0aW5ncy5pbWdDcm9wLmRhdGEoJ0pjcm9wJykgIT09IHVuZGVmaW5lZCApe1xuXHRcdFx0XHR0aGlzLmpjcm9wX2ltZy5kZXN0cm95KCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHVuZGVsZWdhdGUgZXZlbnRzXG5cdFx0XHQvLyB0aGlzLnNldHRpbmdzLnVwbG9hZGVySW1nLm9mZigndXBsb2FkJyk7XG5cdFx0XHR0aGlzLnNldHRpbmdzLnVwbG9hZGVySW1nLm9mZignY29tcGxldGUnKTtcblx0XHRcdHRoaXMuc2V0dGluZ3MuZm9ybUNyb3Aub2ZmKCdzdWJtaXQnKTtcblxuXHRcdFx0Ly8gcmVtb3ZlIG9iamVjdCBwbHVnaW4gaW4gZGF0YVxuXHRcdFx0dGhpcy4kZWxlbWVudC5yZW1vdmVEYXRhKCdpbWFnZVVwbG9hZGVyQ3JvcCcpO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQqIHNldCBpbWFnZVxuXHRcdCogQHBhcmFtIHtTdHJpbmd9IHVybEltYWdlXG5cdFx0KiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuXHRcdCovXG5cdFx0c2V0SW1hZ2U6IGZ1bmN0aW9uICh1cmxJbWFnZSwgY2FsbGJhY2spIHtcblx0XHRcdHVybEltYWdlIHx8ICh1cmxJbWFnZSA9IHRoaXMuc2V0dGluZ3MuaW1nQ3JvcC5hdHRyKCdzcmMnKSkgfHwgKHVybEltYWdlID0gJycpO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmKCAhdGhpcy5zZXR0aW5ncy5pbWdDcm9wICkgeyB0aHJvdyBcIlRoZSBpbWdDcm9wIGVsZW1lbnQgaGF2ZSBub3Qgd2VudCBhc3NpZ25cIjsgfVxuICAgICAgICAgICAgfWNhdGNoKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiAnKyBlcnIgKyBcIi5cIik7XG4gICAgICAgICAgICB9XG5cblx0XHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cblx0XHRcdC8vIHZhbGlkYXRlIGlmIGFscmVhZHkgb3Igbm90IHdhcyBjcmVhdGVkIHRoZSBjcm9wIGltYWdlXG5cdFx0XHRpZiggdGhpcy5zZXR0aW5ncy5pbWdDcm9wLmRhdGEoJ0pjcm9wJykgIT09IHVuZGVmaW5lZCApe1xuXHRcdFx0XHR0aGlzLmpjcm9wX2ltZyA9IHRoaXMuc2V0dGluZ3MuaW1nQ3JvcC5kYXRhKCdKY3JvcCcpO1xuXG5cdFx0XHRcdC8vIHNldCBpbWFnZSBjcm9wXG5cdFx0XHRcdHRoaXMuamNyb3BfaW1nLnNldEltYWdlKHVybEltYWdlLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHR2YXIgZGltSW1nID0gW107XG5cdFx0XHRcdFx0Ly8gaW1hZ2UgY3JvcCBzZXR0aW5nc1xuXHRcdFx0XHRcdGlmKCB0aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5taW5XaWR0aEltZyAmJiB0aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5taW5IZWlnaHRJbWcgKSB7XG5cdFx0XHRcdFx0XHRkaW1JbWcgPSBbdGhpcy5zZXR0aW5ncy5jb25maWdJbWcubWluV2lkdGhJbWcsIHRoaXMuc2V0dGluZ3MuY29uZmlnSW1nLm1pbkhlaWdodEltZ107XG5cdFx0XHRcdFx0fWVsc2Uge1xuXHRcdFx0XHRcdFx0ZGltSW1nID0gdGhpcy5qY3JvcF9pbWcuZ2V0Qm91bmRzKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bWV0aG9kcy5jaGFuZ2VPcHRzQ3JvcC5jYWxsKF90aGlzLCB7XG5cdFx0XHRcdFx0XHRpbWdTZXQ6IHVybEltYWdlLFxuXHRcdFx0XHRcdFx0bWluV2lkdGg6IF90aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5taW5XaWR0aEltZyxcblx0XHRcdFx0XHRcdG1pbkhlaWdodDogX3RoaXMuc2V0dGluZ3MuY29uZmlnSW1nLm1pbkhlaWdodEltZyxcblx0XHRcdFx0XHRcdGltZ1dpZHRoOiBkaW1JbWdbMF0sXG5cdFx0XHRcdFx0XHRpbWdIZWlnaHQ6IGRpbUltZ1sxXVxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0Ly8gYWRkIHZhbHVlcyB0byB0aGUgY3JvcCBmb3JtXG5cdFx0XHRcdFx0X3RoaXMuc2V0dGluZ3MuZm9ybUNyb3AuZmluZCgnaW5wdXQjY3JvcF90eXBlJykudmFsKCAndXJsJyApO1xuXHRcdFx0XHRcdF90aGlzLnNldHRpbmdzLmZvcm1Dcm9wLmZpbmQoJ2lucHV0I2ZpbGVfbmFtZScpLnZhbCggdXJsSW1hZ2UgKTtcblx0XHRcdFx0XHRfdGhpcy5zZXR0aW5ncy5mb3JtQ3JvcC5maW5kKCdpbnB1dCNmaWxlX3R5cGUnKS52YWwoIHVybEltYWdlLnNwbGl0KCcuJykuc2xpY2UoLTEpICk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHR9ZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5zZXR0aW5ncy5pbWdDcm9wLmF0dHIoJ3NyYycsIHVybEltYWdlKTtcblxuXHRcdFx0XHQvLyBjcmVhdGUgY3JvcCB3aGV0aGVyIGRvZXMgbm90IGV4aXN0XG5cdFx0XHRcdG1ldGhvZHMucmVuZGVySW1hZ2VDcm9wLmNhbGwodGhpcywgdGhpcy5zZXR0aW5ncy5pbWdDcm9wLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHR2YXIgZGltSW1nID0gW107XG5cdFx0XHRcdFx0Ly8gc2V0dGluZ3MgaW1hZ2UgY3JvcFxuXHRcdFx0XHRcdGlmKCB0aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5taW5XaWR0aEltZyAmJiB0aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5taW5IZWlnaHRJbWcgKSB7XG5cdFx0XHRcdFx0XHRkaW1JbWcgPSBbdGhpcy5zZXR0aW5ncy5jb25maWdJbWcubWluV2lkdGhJbWcsIHRoaXMuc2V0dGluZ3MuY29uZmlnSW1nLm1pbkhlaWdodEltZ107XG5cdFx0XHRcdFx0fWVsc2Uge1xuXHRcdFx0XHRcdFx0ZGltSW1nID0gdGhpcy5qY3JvcF9pbWcuZ2V0Qm91bmRzKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bWV0aG9kcy5jaGFuZ2VPcHRzQ3JvcC5jYWxsKHRoaXMsIHtcblx0XHRcdFx0XHRcdGltZ1NldDogdXJsSW1hZ2UsXG5cdFx0XHRcdFx0XHRtaW5XaWR0aDogdGhpcy5zZXR0aW5ncy5jb25maWdJbWcubWluV2lkdGhJbWcsXG5cdFx0XHRcdFx0XHRtaW5IZWlnaHQ6IHRoaXMuc2V0dGluZ3MuY29uZmlnSW1nLm1pbkhlaWdodEltZyxcblx0XHRcdFx0XHRcdGltZ1dpZHRoOiBkaW1JbWdbMF0sXG5cdFx0XHRcdFx0XHRpbWdIZWlnaHQ6IGRpbUltZ1sxXVxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0Ly8gQWRkIHZhbHVlcyB0byB0aGUgY3JvcCBmb3JtXG5cdFx0XHRcdFx0dGhpcy5zZXR0aW5ncy5mb3JtQ3JvcC5maW5kKCdpbnB1dCNjcm9wX3R5cGUnKS52YWwoICd1cmwnICk7XG5cdFx0XHRcdFx0dGhpcy5zZXR0aW5ncy5mb3JtQ3JvcC5maW5kKCdpbnB1dCNmaWxlX25hbWUnKS52YWwoIHVybEltYWdlICk7XG5cdFx0XHRcdFx0dGhpcy5zZXR0aW5ncy5mb3JtQ3JvcC5maW5kKCdpbnB1dCNmaWxlX3R5cGUnKS52YWwoIHVybEltYWdlLnNwbGl0KCcuJykuc2xpY2UoLTEpICk7XG5cblx0XHRcdFx0fS5iaW5kKHRoaXMpKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gY2FsbCBjYWxsYmFja1xuXHRcdFx0aWYoICQuaXNGdW5jdGlvbihjYWxsYmFjaykgKVxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCogUmVuZGVyIEZpbmVVcGxvYWRlciBwbHVnaW4gZm9yIHVzZXIgcHJvZHVjdCBpbWFnZVxuXHRcdCogQHBhcmFtIHtFbGVtZW50IGpRdWVyeX0gJHVwbG9hZGVySW1nXG5cdFx0Ki9cblx0XHRyZW5kZXJVcGxvYWRlckltZzogZnVuY3Rpb24gKCR1cGxvYWRlckltZykge1xuXG5cdFx0XHRpZiggIWV4aXN0VXBsb2FkZXJQbHVnaW4oKSApIHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcignRXJyb3I6IFRoZSBpbWFnZVVwbG9hZGVyQ3JvcCBqUXVlcnkgbGlicmFyeSBkbyBuZWVkIG9mIHRoZSBmaW5lLXVwbG9hZGVyIGpRdWVyeSBsaWJyYXJ5LicpO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cblx0XHRcdHZhciBfdGhpcyA9IHRoaXM7XG5cblx0XHRcdCR1cGxvYWRlckltZy5maW5lVXBsb2FkZXIoe1xuXHRcdFx0XHRkZWJ1ZzogZmFsc2UsXG5cdFx0XHRcdHRlbXBsYXRlOiB0aGlzLnNldHRpbmdzLnRlbXBsYXRlSW1nVXBsb2FkZXIsXG5cdFx0XHRcdHJlcXVlc3Q6IHRoaXMuc2V0dGluZ3MudXBsb2FkZGluZyxcblx0XHRcdFx0dGh1bWJuYWlsczoge1xuXHRcdFx0XHRcdHBsYWNlaG9sZGVyczoge1xuXHRcdFx0XHRcdFx0d2FpdGluZ1BhdGg6ICdpbWcvd2FpdGluZy1nZW5lcmljLnBuZycsXG5cdFx0XHRcdFx0XHRub3RBdmFpbGFibGVQYXRoOiAnaW1nL25vdF9hdmFpbGFibGUtZ2VuZXJpYy5wbmcnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRhdXRvVXBsb2FkOiB0cnVlLFxuXHRcdFx0XHRtdWx0aXBsZTogZmFsc2UsXG5cdFx0XHRcdHZhbGlkYXRpb246IHtcblx0XHRcdFx0XHRpbWFnZToge1xuXHRcdFx0XHRcdFx0Ly8gbWluV2lkdGg6IHRoaXMuc2V0dGluZ3MuY29uZmlnSW1nLm1pbldpZHRoSW1nIHx8IGRlZmF1bHRzLmNvbmZpZ0ltZy5taW5XaWR0aEltZyxcblx0XHRcdFx0XHRcdC8vIG1pbkhlaWdodDogdGhpcy5zZXR0aW5ncy5jb25maWdJbWcubWluSGVpZ2h0SW1nIHx8IGRlZmF1bHRzLmNvbmZpZ0ltZy5taW5IZWlnaHRJbWcsXG5cdFx0XHRcdFx0XHRtYXhXaWR0aDogdGhpcy5zZXR0aW5ncy5jb25maWdJbWcubWF4V2lkdGhJbWcgfHwgZGVmYXVsdHMuY29uZmlnSW1nLm1heFdpZHRoSW1nLFxuXHRcdFx0XHRcdFx0bWF4SGVpZ2h0OiB0aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5tYXhIZWlnaHRJbWcgfHwgZGVmYXVsdHMuY29uZmlnSW1nLm1heEhlaWdodEltZ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0YWxsb3dlZEV4dGVuc2lvbnM6IHRoaXMuc2V0dGluZ3MuY29uZmlnSW1nLmFsbG93ZWRFeHRlbnNpb25zIHx8IGRlZmF1bHRzLmNvbmZpZ0ltZy5hbGxvd2VkRXh0ZW5zaW9ucyxcblx0XHRcdFx0XHRzaXplTGltaXQ6IHRoaXMuc2V0dGluZ3MuY29uZmlnSW1nLnNpemVMaW1pdCB8fCBkZWZhdWx0cy5jb25maWdJbWcuc2l6ZUxpbWl0LFxuXHRcdFx0XHRcdHN0b3BPbkZpcnN0SW52YWxpZEZpbGU6IGZhbHNlLFxuXHRcdFx0XHRcdGl0ZW1MaW1pdDogMFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzY2FsaW5nOiB7XG5cdFx0XHRcdFx0c2VuZE9yaWdpbmFsOiB0aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5zZW5kT3JpZ2luYWwgfHwgZGVmYXVsdHMuY29uZmlnSW1nLnNlbmRPcmlnaW5hbCxcblx0XHRcdFx0XHRkZWZhdWx0UXVhbGl0eTogdGhpcy5zZXR0aW5ncy5jb25maWdJbWcuZGVmYXVsdFF1YWxpdHkgfHwgZGVmYXVsdHMuY29uZmlnSW1nLmRlZmF1bHRRdWFsaXR5XG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIEV2ZW50cyBoYW5kbGVyc1xuXHRcdFx0XHRjYWxsYmFja3M6IHtcblx0XHRcdFx0XHRvblVwbG9hZDogbWV0aG9kcy5vbkxvYWRJbWcuYmluZCh0aGlzKVxuXHRcdFx0XHR9LFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiAkLmV4dGVuZCh7fSwgdGhpcy5zZXR0aW5ncy5tZXNzYWdlcyksXG5cdFx0XHRcdGRyYWdBbmREcm9wOiB7XG5cdFx0XHRcdFx0ZXh0cmFEcm9wem9uZXM6IHRoaXMuc2V0dGluZ3MuZXh0cmFEcm9wem9uZXNcblx0XHRcdFx0fSxcblx0XHRcdFx0c2hvd01lc3NhZ2U6IHRoaXMuc2V0dGluZ3Muc2hvd01lc3NhZ2UsXG5cdFx0XHRcdHNob3dDb25maXJtOiB0aGlzLnNldHRpbmdzLnNob3dDb25maXJtLFxuXHRcdFx0XHRzaG93UHJvbXB0OiB0aGlzLnNldHRpbmdzLnNob3dQcm9tcHRcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQqIHNldCBpbWFnZSBjcm9wIHBsdWdpblxuXHRcdCogQHBhcmFtIHtFbGVtZW50IGpRdWVyeX0gJGltZ0Nyb3Bcblx0XHQqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG5cdFx0Ki9cblx0XHRyZW5kZXJJbWFnZUNyb3A6IGZ1bmN0aW9uICgkaW1nQ3JvcCwgY2FsbGJhY2spIHtcblxuXHRcdFx0aWYoICFleGlzdENyb3BQbHVnaW4oKSApIHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcignRXJyb3I6IFRoZSBpbWFnZVVwbG9hZGVyQ3JvcCBqUXVlcnkgbGlicmFyeSBuZWVkcyBvZiB0aGUgamNyb3AgalF1ZXJ5IGxpYnJhcnkuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG5cdFx0XHQvL2ltYWdlcyBjcm9wXG5cdFx0XHR2YXIgX3RoaXMgPSB0aGlzO1xuXG5cdFx0XHQkaW1nQ3JvcC5KY3JvcCh7XG5cdFx0XHRcdG9uU2VsZWN0OiBtZXRob2RzLnNldENvb3Jkcy5iaW5kKHRoaXMpLFxuXHRcdFx0XHRvbkNoYW5nZTogbWV0aG9kcy5zZXRDb29yZHMuYmluZCh0aGlzKSxcblx0XHRcdFx0b25SZWxlYXNlOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIG1pblNpemU6IFt0aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5taW5XaWR0aEltZywgdGhpcy5zZXR0aW5ncy5jb25maWdJbWcubWluSGVpZ2h0SW1nXSxcblx0XHRcdFx0Ly8gbWF4U2l6ZTogW3RoaXMuc2V0dGluZ3MuY29uZmlnSW1nLm1heFdpZHRoSW1nLCB0aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5tYXhIZWlnaHRJbWddLFxuXHRcdFx0XHRiZ0NvbG9yOiAnYmxhY2snLFxuXHRcdFx0XHRiZ09wYWNpdHk6IDAuNCxcblx0XHRcdFx0c2V0U2VsZWN0OiBbIDAsIDAsIHRoaXMuc2V0dGluZ3MuY29uZmlnSW1nLm1pbldpZHRoSW1nLCB0aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5taW5IZWlnaHRJbWcgXSxcblx0XHRcdFx0YXNwZWN0UmF0aW86ICB0aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5taW5XaWR0aEltZyAvIHRoaXMuc2V0dGluZ3MuY29uZmlnSW1nLm1pbkhlaWdodEltZyxcblx0XHRcdFx0Ym94V2lkdGg6ICRpbWdDcm9wLnBhcmVudCgpLndpZHRoKCksXG5cdFx0XHRcdGJveEhlaWdodDogMCxcblx0XHRcdFx0YWxsb3dTZWxlY3Q6IGZhbHNlLFxuXHRcdFx0XHRhbGxvd1Jlc2l6ZTogdHJ1ZVxuXG5cdFx0XHR9LGZ1bmN0aW9uKCl7XG5cdFx0XHRcdF90aGlzLmpjcm9wX2ltZyA9IHRoaXM7XG5cblx0XHRcdFx0dmFyIGRpbURlZmF1bHQgPSBfdGhpcy5qY3JvcF9pbWcuZ2V0Qm91bmRzKCk7XG5cblx0XHRcdFx0bWV0aG9kcy5jaGFuZ2VPcHRzQ3JvcC5jYWxsKF90aGlzLCB7XG5cdFx0XHRcdFx0aW1nU2V0OiAkaW1nQ3JvcC5hdHRyKCdzcmMnKSxcblx0XHRcdFx0XHRtaW5XaWR0aDogX3RoaXMuc2V0dGluZ3MuY29uZmlnSW1nLm1pbldpZHRoSW1nLFxuXHRcdFx0XHRcdG1pbkhlaWdodDogX3RoaXMuc2V0dGluZ3MuY29uZmlnSW1nLm1pbkhlaWdodEltZyxcblx0XHRcdFx0XHRpbWdXaWR0aDogZGltRGVmYXVsdFswXSxcblx0XHRcdFx0XHRpbWdIZWlnaHQ6IGRpbURlZmF1bHRbMV1cblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKHR5cGVvZiBjYWxsYmFjayA9PSAnZnVuY3Rpb24nKXtcblx0XHRcdFx0XHRjYWxsYmFjay5jYWxsKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQqIFNldCBzZWxlY3Qgb24gaW1hZ2UgY3JvcFxuXHRcdCogQHBhcmFtIE51bWJlciBpbWdXaWR0aFxuXHRcdCogQHBhcmFtIE51bWJlciBpbWdIZWlnaHRcblx0XHQqL1xuXHRcdGNoYW5nZU9wdHNDcm9wOiBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGJhY2spIHtcblxuXHRcdFx0dmFyIHNldHRpbmdzID0ge1xuXHRcdFx0XHRpbWdTZXQ6ICcnLFxuXHRcdFx0XHRtaW5XaWR0aDogMCxcblx0XHRcdFx0bWluSGVpZ2h0OiAwLFxuXHRcdFx0XHRpbWdXaWR0aDogMCxcblx0XHRcdFx0aW1nSGVpZ2h0OiAwLFxuXHRcdFx0XHRkaW1TZWxlY3Q6IFswLDBdLFxuXHRcdFx0XHRpeDogMCxcblx0XHRcdFx0aXk6IDBcblx0XHRcdH07XG5cblx0XHRcdCQuZXh0ZW5kKHNldHRpbmdzLCBvcHRpb25zKTtcblxuXHRcdFx0Ly8gc2V0IHByb3BlcnRpZXNcblx0XHRcdHNldHRpbmdzLmRpbVNlbGVjdCA9IHNldFNxdWFyZShzZXR0aW5ncy5pbWdXaWR0aCwgc2V0dGluZ3MuaW1nSGVpZ2h0KTtcblx0XHRcdHNldHRpbmdzLml4ID0gKHNldHRpbmdzLmltZ1dpZHRoIC0gc2V0dGluZ3MuZGltU2VsZWN0WzBdKS8yO1xuXG5cdFx0XHQvLyByZWZyZXNoIG9wdGlvbnMgY3JvcFxuXHRcdFx0dGhpcy5qY3JvcF9pbWcuc2V0T3B0aW9ucyh7XG5cdFx0XHRcdHRydWVTaXplOiBbIE1hdGguZmxvb3Ioc2V0dGluZ3MuaW1nV2lkdGgpLCBNYXRoLmZsb29yKHNldHRpbmdzLmltZ0hlaWdodCkgXVxuXHRcdFx0XHQvLyBvdXRlckltYWdlOiBzZXR0aW5ncy5pbWdTZXRcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLnNldHRpbmdzLnByZXZpZXdJbWcuYXR0cignc3JjJywgc2V0dGluZ3MuaW1nU2V0KTtcblxuICAgICAgICAgICAgdGhpcy5qY3JvcF9pbWcuc2V0U2VsZWN0KCBbc2V0dGluZ3MuaXgsIHNldHRpbmdzLml5LCBzZXR0aW5ncy5kaW1TZWxlY3RbMF0sIHNldHRpbmdzLmRpbVNlbGVjdFsxXV0gKTtcblxuXHRcdFx0Ly9ydW4gY2FsbGJhY2tcblx0XHRcdGlmICh0eXBlb2YgY2FsbGJhY2sgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCogc3VibWl0IGV2ZW50IGZvciBpbWFnZSBjcm9wXG5cdFx0Ki9cblx0XHRzdWJtaXRDcm9wSW1hZ2U6IGZ1bmN0aW9uKGUpIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0dmFyIF90aGlzID0gdGhpcztcblxuXHRcdFx0dmFyIGRhdGEgPSBmb3JtVG9Kc29uKCB0aGlzLnNldHRpbmdzLmZvcm1Dcm9wICk7XG5cdFx0XHRkYXRhLnRhcmdfdyA9IHRoaXMuc2V0dGluZ3MuY29uZmlnSW1nLm1pbldpZHRoSW1nO1xuXHRcdFx0ZGF0YS50YXJnX2ggPSB0aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5taW5IZWlnaHRJbWc7XG5cblx0XHRcdCQuZXh0ZW5kKGRhdGEsIHRoaXMuc2V0dGluZ3MuY3JvcHBpbmcucGFyYW1zKTtcblxuXHRcdFx0Ly8gZW1pdCBjYWxsYmFja1xuXHRcdFx0aWYoICQuaXNGdW5jdGlvbih0aGlzLnNldHRpbmdzLmNhbGxiYWNrc1snb25Dcm9wcGluZyddKSApXG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MuY2FsbGJhY2tzWydvbkNyb3BwaW5nJ10uY2FsbCh0aGlzLCB0aGlzLmpjcm9wX2ltZyk7XG5cblx0XHRcdHRoaXMuc2V0dGluZ3MuZm9ybUNyb3AuZmluZCgnOnN1Ym1pdCcpLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xuXG5cdFx0XHQkLnBvc3QodGhpcy5zZXR0aW5ncy5jcm9wcGluZy5lbmRwb2ludCwgZGF0YSwgbWV0aG9kcy5vblN1Y2Nlc3NDcm9wLmJpbmQodGhpcykpXG5cdFx0XHQgLmZhaWwobWV0aG9kcy5vbkVycm9yQ3JvcC5iaW5kKHRoaXMpKTtcblx0XHR9LFxuXG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS1cblx0XHQvLyBldmVudHMgaGFuZGxlclxuXHRcdC8vIC0tLS0tLS0tLS0tLS0tXG5cdFx0LyoqXG5cdFx0KiBoYW5kbGVyIGZvciBzZXQgdG8gY29vcmRzIG9mIGltYWdlIGNyb3Bcblx0XHQqIEBwYXJhbSBPYmplY3QgY29vcmRzXG5cdFx0Ki9cblx0XHRzZXRDb29yZHM6IGZ1bmN0aW9uIChjb29yZHMpe1xuXG5cdFx0XHR2YXIgcmF0aW9MZXNzZXIgPSB0aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5taW5IZWlnaHRJbWcgLyB0aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5taW5XaWR0aEltZztcblx0XHRcdHZhciBkaW1JbWcgPSB0aGlzLmpjcm9wX2ltZyAhPT0gbnVsbCA/IHRoaXMuamNyb3BfaW1nLmdldEJvdW5kcygpIDogZmFsc2UsXG5cdFx0XHRcdHJ4ID0gJCh0aGlzLnNldHRpbmdzLnByZXZpZXdJbWcucGFyZW50KClbMF0pLndpZHRoKCkgLyBjb29yZHMudyxcblx0XHRcdFx0cnkgPSAocmF0aW9MZXNzZXIgKiAkKHRoaXMuc2V0dGluZ3MucHJldmlld0ltZy5wYXJlbnQoKVswXSkud2lkdGgoKSkgLyBjb29yZHMuaDtcblxuXHRcdFx0Ly8gc2V0IGNvbnRlbnQgaGVpZ2h0IG9mIGNvbnRlbnQgcHJldmlld1xuICAgICAgICAgICAgaWYoIHRoaXMuc2V0dGluZ3MucHJldmlld0ltZy5hdHRyKCdzcmMnKSApIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMuc2V0dGluZ3MucHJldmlld0ltZy5wYXJlbnQoKVswXSkuaGVpZ2h0KCByYXRpb0xlc3NlciAqICQodGhpcy5zZXR0aW5ncy5wcmV2aWV3SW1nLnBhcmVudCgpWzBdKS53aWR0aCgpICk7XG4gICAgICAgICAgICB9XG5cblx0XHRcdHRoaXMuc2V0dGluZ3MuZm9ybUNyb3AuZmluZCgnaW5wdXQuY3JvcC14JykudmFsKCBjb29yZHMueCApO1xuXHRcdFx0dGhpcy5zZXR0aW5ncy5mb3JtQ3JvcC5maW5kKCdpbnB1dC5jcm9wLXknKS52YWwoIGNvb3Jkcy55ICk7XG5cdFx0XHR0aGlzLnNldHRpbmdzLmZvcm1Dcm9wLmZpbmQoJ2lucHV0LmNyb3AtdycpLnZhbCggY29vcmRzLncgKTtcblx0XHRcdHRoaXMuc2V0dGluZ3MuZm9ybUNyb3AuZmluZCgnaW5wdXQuY3JvcC1oJykudmFsKCBjb29yZHMuaCApO1xuXG5cdFx0XHQvLyBzZXQgcHJldmlldyBpbWFnZVxuXHRcdFx0aWYoIGRpbUltZyApe1xuXHRcdFx0XHR0aGlzLnNldHRpbmdzLnByZXZpZXdJbWcuY3NzKHtcblx0XHRcdFx0XHR3aWR0aDogTWF0aC5yb3VuZChyeCAqIGRpbUltZ1swXSkgKyAncHgnLFxuXHRcdFx0XHRcdGhlaWdodDogTWF0aC5yb3VuZChyeSAqIGRpbUltZ1sxXSkgKyAncHgnLFxuXHRcdFx0XHRcdG1pbldpZHRoOiBNYXRoLnJvdW5kKHJ4ICogZGltSW1nWzBdKSArICdweCcsXG5cdFx0XHRcdFx0bWluSGVpZ2h0OiBNYXRoLnJvdW5kKHJ5ICogZGltSW1nWzFdKSArICdweCcsXG5cdFx0XHRcdFx0bWFyZ2luTGVmdDogJy0nICsgTWF0aC5yb3VuZChyeCAqIGNvb3Jkcy54KSArICdweCcsXG5cdFx0XHRcdFx0bWFyZ2luVG9wOiAnLScgKyBNYXRoLnJvdW5kKHJ5ICogY29vcmRzLnkpICsgJ3B4J1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0KiB3aWxsIHVwbG9hZCBpbWFnZVxuXHRcdCogQHBhcmFtIE51bWJlciBpZFxuXHRcdCogQHBhcmFtIFN0cmluZyBuYW1lXG5cdFx0Ki9cblx0XHRvbkxvYWRJbWc6IGZ1bmN0aW9uIChpZCwgbmFtZSkge1xuXG5cdFx0XHR2YXIgJGFyZWFEcm9wID0gdGhpcy5zZXR0aW5ncy51cGxvYWRlckltZy5maW5lVXBsb2FkZXIoJ2dldERyb3BUYXJnZXQnLCBpZCk7XG5cblx0XHRcdC8vIHdoZW4gdGhlIGltYWdlIHdhcyBsb2FkZWQgd2l0aCBhIGRyb3Agem9uZVxuXHRcdFx0aWYoICRhcmVhRHJvcCAhPT0gdW5kZWZpbmVkICYmICRhcmVhRHJvcC5sZW5ndGggKXtcblx0XHRcdFx0aWYoICRhcmVhRHJvcC5oYXNDbGFzcygnaW1hZ2UtYXJlYS1kcm9wJykgfHwgJGFyZWFEcm9wLmhhc0NsYXNzKCd3cmFwcGVyLWltYWdlLWNyb3AnKSApe1xuXG5cdFx0XHRcdFx0bWV0aG9kcy5yZWFzc2lnbkFjdGlvbnMuY2FsbCh0aGlzKTtcblx0XHRcdFx0XHRtZXRob2RzLnNldEltYWdlLmNhbGwodGhpcyk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYoICQuaXNGdW5jdGlvbih0aGlzLnNldHRpbmdzLmNhbGxiYWNrc1snb25Mb2FkSW1nJ10pICkge1xuXHRcdFx0XHR0aGlzLnNldHRpbmdzLmNhbGxiYWNrc1snb25Mb2FkSW1nJ10uY2FsbCh0aGlzLCB0aGlzLnNldHRpbmdzLnVwbG9hZGVySW1nLCBpZCwgbmFtZSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCogY29tcGxldGUgZXZlbnQgZm9yIHVwbG9hZCBpbWFnZVxuXHRcdCogQHBhcmFtIE51bWJlciBpZFxuXHRcdCogQHBhcmFtIFN0cmluZyBuYW1lXG5cdFx0KiBAcGFyYW0gT2JqZWN0IHJlc1xuXHRcdCogQHBhcmFtIE9iamVjdCB4aHJcblx0XHQqL1xuXHRcdG9uQ29tcGxldGVMb2FkSW1nOiBmdW5jdGlvbiAoZXZlbnQsIGlkLCBuYW1lLCByZXMpIHtcblxuXHRcdFx0dmFyIF90aGlzID0gdGhpcztcblxuXHRcdFx0aWYoICFyZXMuc3VjY2VzcyApXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0Ly8gc2V0dGluZ3MgaW1hZ2UgY3JvcFxuXHRcdFx0aWYoIHRoaXMuc2V0dGluZ3MuaW1nQ3JvcC5kYXRhKCdKY3JvcCcpICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGhpcy5qY3JvcF9pbWcuc2V0SW1hZ2UocmVzLmZpbGVfcGF0aCwgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0dmFyIGRpbUltZyA9IFtyZXMuZmlsZV93aWR0aCwgcmVzLmZpbGVfaGVpZ2h0XTtcblxuXHRcdFx0XHRcdG1ldGhvZHMuY2hhbmdlT3B0c0Nyb3AuY2FsbCh0aGlzLCB7XG5cdFx0XHRcdFx0XHRpbWdTZXQ6IHJlcy5maWxlX3BhdGgsXG5cdFx0XHRcdFx0XHRtaW5XaWR0aDogdGhpcy5zZXR0aW5ncy5jb25maWdJbWcubWluV2lkdGhJbWcsXG5cdFx0XHRcdFx0XHRtaW5IZWlnaHQ6IHRoaXMuc2V0dGluZ3MuY29uZmlnSW1nLm1pbkhlaWdodEltZyxcblx0XHRcdFx0XHRcdGltZ1dpZHRoOiByZXMuZmlsZV93aWR0aCxcblx0XHRcdFx0XHRcdGltZ0hlaWdodDogcmVzLmZpbGVfaGVpZ2h0XG5cblx0XHRcdFx0XHR9LCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHQvLyBlbWl0IGNhbGxiYWNrXG5cdFx0XHRcdFx0XHRpZiggJC5pc0Z1bmN0aW9uKHRoaXMuc2V0dGluZ3MuY2FsbGJhY2tzWydvbkNvbXBsZXRlTG9hZCddKSApXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2V0dGluZ3MuY2FsbGJhY2tzWydvbkNvbXBsZXRlTG9hZCddLmNhbGwodGhpcywgdGhpcy5zZXR0aW5ncy51cGxvYWRlckltZywgaWQsIG5hbWUsIHJlcyk7XG5cdFx0XHRcdFx0fS5iaW5kKHRoaXMpKTtcblxuXHRcdFx0XHR9LmJpbmQodGhpcykpO1xuXG5cdFx0XHR9ZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5zZXR0aW5ncy5pbWdDcm9wLmF0dHIoJ3NyYycsIHJlcy5maWxlX3BhdGgpO1xuXG5cdFx0XHRcdG1ldGhvZHMucmVuZGVySW1hZ2VDcm9wLmNhbGwodGhpcywgdGhpcy5zZXR0aW5ncy5pbWdDcm9wLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHRtZXRob2RzLmNoYW5nZU9wdHNDcm9wLmNhbGwodGhpcywge1xuXHRcdFx0XHRcdFx0aW1nU2V0OiByZXMuZmlsZV9wYXRoLFxuXHRcdFx0XHRcdFx0bWluV2lkdGg6IHRoaXMuc2V0dGluZ3MuY29uZmlnSW1nLm1pbldpZHRoSW1nLFxuXHRcdFx0XHRcdFx0bWluSGVpZ2h0OiB0aGlzLnNldHRpbmdzLmNvbmZpZ0ltZy5taW5IZWlnaHRJbWcsXG5cdFx0XHRcdFx0XHRpbWdXaWR0aDogcmVzLmZpbGVfd2lkdGgsXG5cdFx0XHRcdFx0XHRpbWdIZWlnaHQ6IHJlcy5maWxlX2hlaWdodFxuXHRcdFx0XHRcdH0sIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdC8vIGVtaXQgY2FsbGJhY2tcblx0XHRcdFx0XHRcdGlmKCAkLmlzRnVuY3Rpb24odGhpcy5zZXR0aW5ncy5jYWxsYmFja3NbJ29uQ29tcGxldGVMb2FkJ10pICkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnNldHRpbmdzLmNhbGxiYWNrc1snb25Db21wbGV0ZUxvYWQnXS5jYWxsKHRoaXMsIHRoaXMuc2V0dGluZ3MudXBsb2FkZXJJbWcsIGlkLCBuYW1lLCByZXMpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0uYmluZCh0aGlzKSk7XG5cblx0XHRcdFx0fS5iaW5kKHRoaXMpKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHZhbHVlcyB0byB0aGUgY3JvcCBmb3JtXG5cdFx0XHR0aGlzLnNldHRpbmdzLmZvcm1Dcm9wLmZpbmQoJ2lucHV0I2Nyb3BfdHlwZScpLnZhbCggJ25hbWUnICk7XG5cdFx0XHR0aGlzLnNldHRpbmdzLmZvcm1Dcm9wLmZpbmQoJ2lucHV0I2ZpbGVfbmFtZScpLnZhbCggcmVzLmZpbGVfbmFtZSApO1xuXHRcdFx0dGhpcy5zZXR0aW5ncy5mb3JtQ3JvcC5maW5kKCdpbnB1dCNmaWxlX3R5cGUnKS52YWwoIHJlcy5maWxlX3R5cGUgKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0KiBzdWNjZXNzIGV2ZW50IGZvciBjcm9wIGltYWdlXG5cdFx0KiBAcGFyYW0gT2JqZWN0IHJlc1xuXHRcdCogQHBhcmFtIFN0cmluZyBzdGF0dXNcblx0XHQqIEBwYXJhbSBPYmplY3QganFYSFJcblx0XHQqL1xuXHRcdG9uU3VjY2Vzc0Nyb3A6IGZ1bmN0aW9uIChyZXNwLCBzdGF0dXMsIGpxWEhSKSB7XG5cblx0XHRcdHRoaXMuc2V0dGluZ3MuZm9ybUNyb3AuZmluZCgnOnN1Ym1pdCcpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuXG5cdFx0XHQvLyBjYWxsIGNyb3AgY29tcGxldGVcblx0XHRcdGlmKCAkLmlzRnVuY3Rpb24odGhpcy5zZXR0aW5ncy5jYWxsYmFja3NbJ29uQ3JvcENvbXBsZXRlJ10pICkge1xuXHRcdFx0XHR0aGlzLnNldHRpbmdzLmNhbGxiYWNrc1snb25Dcm9wQ29tcGxldGUnXS5jYWxsKHRoaXMsIHRoaXMuamNyb3BfaW1nLCByZXNwLCBqcVhIUik7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCogZXJyb3IgZXZlbnQgZm9yIGNyb3AgaW1hZ2Vcblx0XHQqIEBwYXJhbSBPYmplY3QganFYSFJcblx0XHQqIEBwYXJhbSBTdHJpbmcgc3RhdHVzXG5cdFx0KiBAcGFyYW0gU3RyaW5nIGVycm9yXG5cdFx0Ki9cblx0XHRvbkVycm9yQ3JvcDogZnVuY3Rpb24oanFYSFIsIHN0YXR1cywgZXJyb3IpIHtcblxuXHRcdFx0dGhpcy5zZXR0aW5ncy5mb3JtQ3JvcC5maW5kKCc6c3VibWl0JykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7XG5cblx0XHRcdC8vIGNhbGwgY3JvcCBlcnJvclxuXHRcdFx0aWYoICQuaXNGdW5jdGlvbih0aGlzLnNldHRpbmdzLmNhbGxiYWNrc1snb25Dcm9wRXJyb3InXSkgKSB7XG5cdFx0XHRcdHRoaXMuc2V0dGluZ3MuY2FsbGJhY2tzWydvbkNyb3BFcnJvciddLmNhbGwodGhpcywgdGhpcy5qY3JvcF9pbWcsIGpxWEhSLCBlcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8vIHBsdWdpbiBjbGFzc1xuXHQvLyBpbnN0YW5jZSB0aGUgcGx1Z2luXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cblx0JC5pbWFnZVVwbG9hZGVyQ3JvcCA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XG5cdFx0b3B0aW9ucyB8fCAob3B0aW9ucyA9IHt9KTtcblxuXHRcdC8vIHBhcmFtZXRlcnNcblx0XHR2YXIgcGx1Z2luID0gdGhpcztcblxuXHRcdC8vIHNldCBhdHRyaWJ1dGVzXG5cdFx0dGhpcy5qY3JvcF9pbWcgPSBudWxsO1xuXHRcdHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7XG5cdFx0dGhpcy4kZWxlbWVudCA9ICQoZWxlbWVudCk7XG5cblx0XHQvLyBpbml0aWFsaXplIHBsdWdpblxuXHRcdGlmKCAkLmlzRnVuY3Rpb24ocGx1Z2luLmluaXQpIClcblx0XHRcdHBsdWdpbi5pbml0KGVsZW1lbnQsIG9wdGlvbnMpO1xuXHR9O1xuXG5cdC8vIGV4dGVuZHMgcHJvdG90eXBlIG9mIHBsdWdpblxuXHQkLmltYWdlVXBsb2FkZXJDcm9wLnByb3RvdHlwZSA9IHtcblxuXHRcdC8vIHBsdWdpbidzIHNldHRpbmdzXG5cdFx0c2V0dGluZ3MgOiB7fSxcblxuXHRcdC8qKlxuXHRcdCogQ29uc3RydWN0b3IgbWV0aG9kXG5cdFx0Ki9cblx0XHRpbml0IDogZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucykge1xuXG5cdFx0XHR0aGlzLnNldHRpbmdzID0gJC5leHRlbmQoe30sIGRlZmF1bHRzLCBvcHRpb25zKTtcblxuXHRcdFx0Ly8gY2hlY2sgb3V0IGlmIGFscmVhZHkgd2FzIGFzc2lnbmVkIHRoZSBqY3JvcCBsaWJyYXJ5XG5cdFx0XHRpZiggdGhpcy5zZXR0aW5ncy5pbWdDcm9wICYmIHRoaXMuc2V0dGluZ3MuaW1nQ3JvcC5kYXRhKCdKY3JvcCcpICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHRoaXMuamNyb3BfaW1nID0gdGhpcy5zZXR0aW5ncy5pbWdDcm9wLmRhdGEoJ0pjcm9wJyk7XG5cdFx0XHRcdHRoaXMuamNyb3BfaW1nLmRlc3Ryb3koKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSW5pdCBpbWFnZSB1cGxvYWRlciBhbmQgYWN0aW9uc1xuXHRcdFx0bWV0aG9kcy5yZWFzc2lnbkFjdGlvbnMuY2FsbCh0aGlzKTtcblx0XHRcdG1ldGhvZHMucmVuZGVyVXBsb2FkZXJJbWcuY2FsbCh0aGlzLCB0aGlzLnNldHRpbmdzLnVwbG9hZGVySW1nKTtcblx0XHRcdG1ldGhvZHMucmVuZGVySW1hZ2VDcm9wLmNhbGwodGhpcywgdGhpcy5zZXR0aW5ncy5pbWdDcm9wKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0KiAtLS0tLS0tLS0tLVxuXHRcdCogQXBpIG1ldGhvZHNcblx0XHQqIC0tLS0tLS0tLS0tXG5cdFx0Ki9cblxuXHRcdC8qKlxuXHRcdCogY2hhbmdlIEltYWdlXG5cdFx0KiBAcGFyYW0gU3RyaW5nIHVybEltYWdlXG5cdFx0KiBAcGFyYW0gRnVuY3Rpb24gY2FsbGJhY2tcblx0XHQqL1xuXHRcdGNoYW5nZUltYWdlIDogZnVuY3Rpb24odXJsSW1hZ2UsIGNhbGxiYWNrKSB7XG5cdFx0XHRtZXRob2RzLnJlYXNzaWduQWN0aW9ucy5jYWxsKHRoaXMpO1xuXHRcdFx0bWV0aG9kcy5zZXRJbWFnZS5jYWxsKHRoaXMsIHVybEltYWdlLCBjYWxsYmFjayk7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCogZ2V0IGltYWdlIGNyb3AgZWxlbWVudFxuXHRcdCovXG5cdFx0Z2V0SW1nQ3JvcCA6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiB0aGlzLnNldHRpbmdzLmltZ0Nyb3A7XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCogZ2V0IGZvcm0gY3JvcCBlbGVtZW50XG5cdFx0Ki9cblx0XHRnZXRGb3JtQ3JvcCA6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiB0aGlzLnNldHRpbmdzLmZvcm1Dcm9wO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQqIGdldCB1cGxvYWRlciBpbWFnZSBlbGVtZW50XG5cdFx0Ki9cblx0XHRnZXRVcGxvYWRlckltZyA6IGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiB0aGlzLnNldHRpbmdzLnVwbG9hZGVySW1nO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQqIGdldCBpbWFnZSBwcmV2aWV3IGVsZW1lbnRcblx0XHQqL1xuXHRcdGdldFByZXZpZXdJbWcgOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5zZXR0aW5ncy5wcmV2aWV3SW1nO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQqIGRlc3Ryb3kgb2JqZWN0IHBsdWdpblxuXHRcdCovXG5cdFx0ZGVzdHJveSA6IGZ1bmN0aW9uICgpIHtcblx0XHRcdG1ldGhvZHMuZGVzdHJveS5jYWxsKHRoaXMpO1xuXHRcdH1cblx0fTtcblxuXHQkLmZuLmltYWdlVXBsb2FkZXJDcm9wID0gZnVuY3Rpb24ob3B0c09yQ21kKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzLCBzZWxmQXJncyA9IGFyZ3VtZW50cywgcmV0VmFscyA9IFtdO1xuXG5cdFx0aWYgKCAkKHRoaXMpLmRhdGEoJ2ltYWdlVXBsb2FkZXJDcm9wJykgIT09IHVuZGVmaW5lZCAmJiAkLmlzRnVuY3Rpb24oJCh0aGlzKS5kYXRhKCdpbWFnZVVwbG9hZGVyQ3JvcCcpW29wdHNPckNtZF0pICkge1xuXG5cdFx0XHR2YXIgcGx1ZyA9ICQodGhpcykuZGF0YSgnaW1hZ2VVcGxvYWRlckNyb3AnKTtcblx0XHRcdHJldHVybiBwbHVnW29wdHNPckNtZF0uYXBwbHkocGx1Zywgc2xpY2UuY2FsbChzZWxmQXJncywgMSkpO1xuXG5cdFx0fSBlbHNlIGlmICh0eXBlb2Ygb3B0c09yQ21kID09PSAnb2JqZWN0JyB8fCAhb3B0c09yQ21kKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaW5kZXgsIGVsKSB7XG5cblx0XHRcdFx0dmFyIHBsdWdpbiA9IG5ldyAkLmltYWdlVXBsb2FkZXJDcm9wKHRoaXMsIG9wdHNPckNtZCk7XG5cblx0XHRcdFx0JCh0aGlzKS5kYXRhKCdpbWFnZVVwbG9hZGVyQ3JvcCcsIHBsdWdpbik7XG5cdFx0XHR9KTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQkLmVycm9yKCAnTWV0aG9kIFwiJyArICBvcHRzT3JDbWQgKyAnXCIgZG9lcyBub3QgZXhpc3QgaW4gaW1hZ2VVcGxvYWRlckNyb3AgLSAoa3JvYmluZykgcGx1Z2luIScpO1xuXHRcdH1cblx0fTtcblxufSkpO1xuIl19