-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy path109.37fa0b5a.iframe.bundle.js
More file actions
3 lines (3 loc) · 68.1 KB
/
109.37fa0b5a.iframe.bundle.js
File metadata and controls
3 lines (3 loc) · 68.1 KB
1
2
3
/*! For license information please see 109.37fa0b5a.iframe.bundle.js.LICENSE.txt */
(self.webpackChunkblockly_mooc=self.webpackChunkblockly_mooc||[]).push([[109,3333,5714,3281,8095,5662,8043,476,424,6138,8519,900,2329,4710,6394,4013,1156,8775,3537,680,8299,5442,3061,3585,5966,8347,2857,5238,7619,0,4285,6666,2742,361,7504,5123,3218,837,7980,5599,3694,1313],{"./node_modules/classnames/index.js":(module,exports)=>{var __WEBPACK_AMD_DEFINE_RESULT__;!function(){"use strict";var hasOwn={}.hasOwnProperty;function classNames(){for(var classes=[],i=0;i<arguments.length;i++){var arg=arguments[i];if(arg){var argType=typeof arg;if("string"===argType||"number"===argType)classes.push(arg);else if(Array.isArray(arg)){if(arg.length){var inner=classNames.apply(null,arg);inner&&classes.push(inner)}}else if("object"===argType){if(arg.toString!==Object.prototype.toString&&!arg.toString.toString().includes("[native code]")){classes.push(arg.toString());continue}for(var key in arg)hasOwn.call(arg,key)&&arg[key]&&classes.push(key)}}}return classes.join(" ")}module.exports?(classNames.default=classNames,module.exports=classNames):void 0===(__WEBPACK_AMD_DEFINE_RESULT__=function(){return classNames}.apply(exports,[]))||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)}()},"./node_modules/js-cookie/src/js.cookie.js":(module,exports,__webpack_require__)=>{var __WEBPACK_AMD_DEFINE_FACTORY__,__WEBPACK_AMD_DEFINE_RESULT__;!function(factory){if(void 0===(__WEBPACK_AMD_DEFINE_RESULT__="function"==typeof(__WEBPACK_AMD_DEFINE_FACTORY__=factory)?__WEBPACK_AMD_DEFINE_FACTORY__.call(exports,__webpack_require__,exports,module):__WEBPACK_AMD_DEFINE_FACTORY__)||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__),!0,module.exports=factory(),!!0){var OldCookies=window.Cookies,api=window.Cookies=factory();api.noConflict=function(){return window.Cookies=OldCookies,api}}}((function(){function extend(){for(var i=0,result={};i<arguments.length;i++){var attributes=arguments[i];for(var key in attributes)result[key]=attributes[key]}return result}return function init(converter){function api(key,value,attributes){var result;if("undefined"!=typeof document){if(arguments.length>1){if("number"==typeof(attributes=extend({path:"/"},api.defaults,attributes)).expires){var expires=new Date;expires.setMilliseconds(expires.getMilliseconds()+864e5*attributes.expires),attributes.expires=expires}try{result=JSON.stringify(value),/^[\{\[]/.test(result)&&(value=result)}catch(e){}return value=converter.write?converter.write(value,key):encodeURIComponent(String(value)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),key=(key=(key=encodeURIComponent(String(key))).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent)).replace(/[\(\)]/g,escape),document.cookie=[key,"=",value,attributes.expires?"; expires="+attributes.expires.toUTCString():"",attributes.path?"; path="+attributes.path:"",attributes.domain?"; domain="+attributes.domain:"",attributes.secure?"; secure":""].join("")}key||(result={});for(var cookies=document.cookie?document.cookie.split("; "):[],rdecode=/(%[0-9A-Z]{2})+/g,i=0;i<cookies.length;i++){var parts=cookies[i].split("="),cookie=parts.slice(1).join("=");'"'===cookie.charAt(0)&&(cookie=cookie.slice(1,-1));try{var name=parts[0].replace(rdecode,decodeURIComponent);if(cookie=converter.read?converter.read(cookie,name):converter(cookie,name)||cookie.replace(rdecode,decodeURIComponent),this.json)try{cookie=JSON.parse(cookie)}catch(e){}if(key===name){result=cookie;break}key||(result[name]=cookie)}catch(e){}}return result}}return api.set=api,api.get=function(key){return api.call(api,key)},api.getJSON=function(){return api.apply({json:!0},[].slice.call(arguments))},api.defaults={},api.remove=function(key,attributes){api(key,"",extend(attributes,{expires:-1}))},api.withConverter=init,api}((function(){}))}))},"./node_modules/prop-types/factoryWithThrowingShims.js":(module,__unused_webpack_exports,__webpack_require__)=>{"use strict";var ReactPropTypesSecret=__webpack_require__("./node_modules/prop-types/lib/ReactPropTypesSecret.js");function emptyFunction(){}module.exports=function(){function shim(props,propName,componentName,location,propFullName,secret){if(secret!==ReactPropTypesSecret){var err=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw err.name="Invariant Violation",err}}function getShim(){return shim}shim.isRequired=shim;var ReactPropTypes={array:shim,bool:shim,func:shim,number:shim,object:shim,string:shim,symbol:shim,any:shim,arrayOf:getShim,element:shim,instanceOf:getShim,node:shim,objectOf:getShim,oneOf:getShim,oneOfType:getShim,shape:getShim,exact:getShim};return ReactPropTypes.checkPropTypes=emptyFunction,ReactPropTypes.PropTypes=ReactPropTypes,ReactPropTypes}},"./node_modules/prop-types/index.js":(module,__unused_webpack_exports,__webpack_require__)=>{module.exports=__webpack_require__("./node_modules/prop-types/factoryWithThrowingShims.js")()},"./node_modules/prop-types/lib/ReactPropTypesSecret.js":module=>{"use strict";module.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},"./node_modules/query-string/index.js":(__unused_webpack_module,exports,__webpack_require__)=>{"use strict";var strictUriEncode=__webpack_require__("./node_modules/strict-uri-encode/index.js");function encode(value,strict){return strict?strictUriEncode(value):encodeURIComponent(value)}exports.extract=function(str){return str.split("?")[1]||""},exports.parse=function(str){var ret=Object.create(null);return"string"!=typeof str?ret:(str=str.trim().replace(/^(\?|#|&)/,""))?(str.split("&").forEach((function(param){var parts=param.replace(/\+/g," ").split("="),key=parts.shift(),val=parts.length>0?parts.join("="):void 0;key=decodeURIComponent(key),val=void 0===val?null:decodeURIComponent(val),void 0===ret[key]?ret[key]=val:Array.isArray(ret[key])?ret[key].push(val):ret[key]=[ret[key],val]})),ret):ret},exports.stringify=function(obj,opts){var strict=!1!==(opts=opts||{}).strict;return obj?Object.keys(obj).sort().map((function(key){var val=obj[key];if(void 0===val)return"";if(null===val)return key;if(Array.isArray(val)){var result=[];return val.slice().sort().forEach((function(val2){void 0!==val2&&(null===val2?result.push(encode(key,strict)):result.push(encode(key,strict)+"="+encode(val2,strict)))})),result.join("&")}return encode(key,strict)+"="+encode(val,strict)})).filter((function(x){return x.length>0})).join("&"):""}},"./node_modules/strict-uri-encode/index.js":module=>{"use strict";module.exports=function(str){return encodeURIComponent(str).replace(/[!'()*]/g,(function(c){return"%"+c.charCodeAt(0).toString(16).toUpperCase()}))}},"./node_modules/whatwg-fetch/fetch.js":function(){!function(self){"use strict";if(!self.fetch){var support_searchParams="URLSearchParams"in self,support_iterable="Symbol"in self&&"iterator"in Symbol,support_blob="FileReader"in self&&"Blob"in self&&function(){try{return new Blob,!0}catch(e){return!1}}(),support_formData="FormData"in self,support_arrayBuffer="ArrayBuffer"in self;if(support_arrayBuffer)var viewClasses=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],isDataView=function(obj){return obj&&DataView.prototype.isPrototypeOf(obj)},isArrayBufferView=ArrayBuffer.isView||function(obj){return obj&&viewClasses.indexOf(Object.prototype.toString.call(obj))>-1};Headers.prototype.append=function(name,value){name=normalizeName(name),value=normalizeValue(value);var oldValue=this.map[name];this.map[name]=oldValue?oldValue+","+value:value},Headers.prototype.delete=function(name){delete this.map[normalizeName(name)]},Headers.prototype.get=function(name){return name=normalizeName(name),this.has(name)?this.map[name]:null},Headers.prototype.has=function(name){return this.map.hasOwnProperty(normalizeName(name))},Headers.prototype.set=function(name,value){this.map[normalizeName(name)]=normalizeValue(value)},Headers.prototype.forEach=function(callback,thisArg){for(var name in this.map)this.map.hasOwnProperty(name)&&callback.call(thisArg,this.map[name],name,this)},Headers.prototype.keys=function(){var items=[];return this.forEach((function(value,name){items.push(name)})),iteratorFor(items)},Headers.prototype.values=function(){var items=[];return this.forEach((function(value){items.push(value)})),iteratorFor(items)},Headers.prototype.entries=function(){var items=[];return this.forEach((function(value,name){items.push([name,value])})),iteratorFor(items)},support_iterable&&(Headers.prototype[Symbol.iterator]=Headers.prototype.entries);var methods=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];Request.prototype.clone=function(){return new Request(this,{body:this._bodyInit})},Body.call(Request.prototype),Body.call(Response.prototype),Response.prototype.clone=function(){return new Response(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new Headers(this.headers),url:this.url})},Response.error=function(){var response=new Response(null,{status:0,statusText:""});return response.type="error",response};var redirectStatuses=[301,302,303,307,308];Response.redirect=function(url,status){if(-1===redirectStatuses.indexOf(status))throw new RangeError("Invalid status code");return new Response(null,{status,headers:{location:url}})},self.Headers=Headers,self.Request=Request,self.Response=Response,self.fetch=function(input,init){return new Promise((function(resolve,reject){var request=new Request(input,init),xhr=new XMLHttpRequest;xhr.onload=function(){var rawHeaders,headers,options={status:xhr.status,statusText:xhr.statusText,headers:(rawHeaders=xhr.getAllResponseHeaders()||"",headers=new Headers,rawHeaders.split(/\r?\n/).forEach((function(line){var parts=line.split(":"),key=parts.shift().trim();if(key){var value=parts.join(":").trim();headers.append(key,value)}})),headers)};options.url="responseURL"in xhr?xhr.responseURL:options.headers.get("X-Request-URL");var body="response"in xhr?xhr.response:xhr.responseText;resolve(new Response(body,options))},xhr.onerror=function(){reject(new TypeError("Network request failed"))},xhr.ontimeout=function(){reject(new TypeError("Network request failed"))},xhr.open(request.method,request.url,!0),"include"===request.credentials&&(xhr.withCredentials=!0),"responseType"in xhr&&support_blob&&(xhr.responseType="blob"),request.headers.forEach((function(value,name){xhr.setRequestHeader(name,value)})),xhr.send(void 0===request._bodyInit?null:request._bodyInit)}))},self.fetch.polyfill=!0}function normalizeName(name){if("string"!=typeof name&&(name=String(name)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name))throw new TypeError("Invalid character in header field name");return name.toLowerCase()}function normalizeValue(value){return"string"!=typeof value&&(value=String(value)),value}function iteratorFor(items){var iterator={next:function(){var value=items.shift();return{done:void 0===value,value}}};return support_iterable&&(iterator[Symbol.iterator]=function(){return iterator}),iterator}function Headers(headers){this.map={},headers instanceof Headers?headers.forEach((function(value,name){this.append(name,value)}),this):Array.isArray(headers)?headers.forEach((function(header){this.append(header[0],header[1])}),this):headers&&Object.getOwnPropertyNames(headers).forEach((function(name){this.append(name,headers[name])}),this)}function consumed(body){if(body.bodyUsed)return Promise.reject(new TypeError("Already read"));body.bodyUsed=!0}function fileReaderReady(reader){return new Promise((function(resolve,reject){reader.onload=function(){resolve(reader.result)},reader.onerror=function(){reject(reader.error)}}))}function readBlobAsArrayBuffer(blob){var reader=new FileReader,promise=fileReaderReady(reader);return reader.readAsArrayBuffer(blob),promise}function bufferClone(buf){if(buf.slice)return buf.slice(0);var view=new Uint8Array(buf.byteLength);return view.set(new Uint8Array(buf)),view.buffer}function Body(){return this.bodyUsed=!1,this._initBody=function(body){if(this._bodyInit=body,body)if("string"==typeof body)this._bodyText=body;else if(support_blob&&Blob.prototype.isPrototypeOf(body))this._bodyBlob=body;else if(support_formData&&FormData.prototype.isPrototypeOf(body))this._bodyFormData=body;else if(support_searchParams&&URLSearchParams.prototype.isPrototypeOf(body))this._bodyText=body.toString();else if(support_arrayBuffer&&support_blob&&isDataView(body))this._bodyArrayBuffer=bufferClone(body.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer]);else{if(!support_arrayBuffer||!ArrayBuffer.prototype.isPrototypeOf(body)&&!isArrayBufferView(body))throw new Error("unsupported BodyInit type");this._bodyArrayBuffer=bufferClone(body)}else this._bodyText="";this.headers.get("content-type")||("string"==typeof body?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):support_searchParams&&URLSearchParams.prototype.isPrototypeOf(body)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},support_blob&&(this.blob=function(){var rejected=consumed(this);if(rejected)return rejected;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?consumed(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(readBlobAsArrayBuffer)}),this.text=function(){var rejected=consumed(this);if(rejected)return rejected;if(this._bodyBlob)return function readBlobAsText(blob){var reader=new FileReader,promise=fileReaderReady(reader);return reader.readAsText(blob),promise}(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(function readArrayBufferAsText(buf){for(var view=new Uint8Array(buf),chars=new Array(view.length),i=0;i<view.length;i++)chars[i]=String.fromCharCode(view[i]);return chars.join("")}(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},support_formData&&(this.formData=function(){return this.text().then(decode)}),this.json=function(){return this.text().then(JSON.parse)},this}function Request(input,options){var body=(options=options||{}).body;if(input instanceof Request){if(input.bodyUsed)throw new TypeError("Already read");this.url=input.url,this.credentials=input.credentials,options.headers||(this.headers=new Headers(input.headers)),this.method=input.method,this.mode=input.mode,body||null==input._bodyInit||(body=input._bodyInit,input.bodyUsed=!0)}else this.url=String(input);if(this.credentials=options.credentials||this.credentials||"omit",!options.headers&&this.headers||(this.headers=new Headers(options.headers)),this.method=function normalizeMethod(method){var upcased=method.toUpperCase();return methods.indexOf(upcased)>-1?upcased:method}(options.method||this.method||"GET"),this.mode=options.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&body)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(body)}function decode(body){var form=new FormData;return body.trim().split("&").forEach((function(bytes){if(bytes){var split=bytes.split("="),name=split.shift().replace(/\+/g," "),value=split.join("=").replace(/\+/g," ");form.append(decodeURIComponent(name),decodeURIComponent(value))}})),form}function Response(bodyInit,options){options||(options={}),this.type="default",this.status="status"in options?options.status:200,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in options?options.statusText:"OK",this.headers=new Headers(options.headers),this.url=options.url||"",this._initBody(bodyInit)}}("undefined"!=typeof self?self:this)}}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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T0FBUyxJQUM5Q2xHLEtBQUttRyxXQUFhLGVBQWdCa0IsUUFBVUEsUUFBUWxCLFdBQWEsS0FDakVuRyxLQUFLb0csUUFBVSxJQUFJdEIsUUFBUXVDLFFBQVFqQixTQUNuQ3BHLEtBQUtxRyxJQUFNZ0IsUUFBUWhCLEtBQU8sR0FDMUJyRyxLQUFLeUosVUFBVXdCLFNBQ2pCLENBMkVELENBNWNELENBNGNtQixvQkFBVGhILEtBQXVCQSxLQUFPakUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9ub2RlX21vZHVsZXMvY2xhc3NuYW1lcy9pbmRleC5qcyIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9ub2RlX21vZHVsZXMvanMtY29va2llL3NyYy9qcy5jb29raWUuanMiLCJ3ZWJwYWNrOi8vYmxvY2tseS1tb29jLy4vbm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zLmpzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2luZGV4LmpzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL25vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9ub2RlX21vZHVsZXMvcXVlcnktc3RyaW5nL2luZGV4LmpzIiwid2VicGFjazovL2Jsb2NrbHktbW9vYy8uL25vZGVfbW9kdWxlcy9zdHJpY3QtdXJpLWVuY29kZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9ibG9ja2x5LW1vb2MvLi9ub2RlX21vZHVsZXMvd2hhdHdnLWZldGNoL2ZldGNoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuXHRDb3B5cmlnaHQgKGMpIDIwMTggSmVkIFdhdHNvbi5cblx0TGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWVcblx0aHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuKi9cbi8qIGdsb2JhbCBkZWZpbmUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBoYXNPd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblx0dmFyIG5hdGl2ZUNvZGVTdHJpbmcgPSAnW25hdGl2ZSBjb2RlXSc7XG5cblx0ZnVuY3Rpb24gY2xhc3NOYW1lcygpIHtcblx0XHR2YXIgY2xhc3NlcyA9IFtdO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG5cdFx0XHRpZiAoIWFyZykgY29udGludWU7XG5cblx0XHRcdHZhciBhcmdUeXBlID0gdHlwZW9mIGFyZztcblxuXHRcdFx0aWYgKGFyZ1R5cGUgPT09ICdzdHJpbmcnIHx8IGFyZ1R5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdGNsYXNzZXMucHVzaChhcmcpO1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcblx0XHRcdFx0aWYgKGFyZy5sZW5ndGgpIHtcblx0XHRcdFx0XHR2YXIgaW5uZXIgPSBjbGFzc05hbWVzLmFwcGx5KG51bGwsIGFyZyk7XG5cdFx0XHRcdFx0aWYgKGlubmVyKSB7XG5cdFx0XHRcdFx0XHRjbGFzc2VzLnB1c2goaW5uZXIpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChhcmdUeXBlID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRpZiAoYXJnLnRvU3RyaW5nICE9PSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nICYmICFhcmcudG9TdHJpbmcudG9TdHJpbmcoKS5pbmNsdWRlcygnW25hdGl2ZSBjb2RlXScpKSB7XG5cdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGFyZy50b1N0cmluZygpKTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAodmFyIGtleSBpbiBhcmcpIHtcblx0XHRcdFx0XHRpZiAoaGFzT3duLmNhbGwoYXJnLCBrZXkpICYmIGFyZ1trZXldKSB7XG5cdFx0XHRcdFx0XHRjbGFzc2VzLnB1c2goa2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG5cdH1cblxuXHRpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRjbGFzc05hbWVzLmRlZmF1bHQgPSBjbGFzc05hbWVzO1xuXHRcdG1vZHVsZS5leHBvcnRzID0gY2xhc3NOYW1lcztcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBkZWZpbmUuYW1kID09PSAnb2JqZWN0JyAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0Ly8gcmVnaXN0ZXIgYXMgJ2NsYXNzbmFtZXMnLCBjb25zaXN0ZW50IHdpdGggbnBtIHBhY2thZ2UgbmFtZVxuXHRcdGRlZmluZSgnY2xhc3NuYW1lcycsIFtdLCBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gY2xhc3NOYW1lcztcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHR3aW5kb3cuY2xhc3NOYW1lcyA9IGNsYXNzTmFtZXM7XG5cdH1cbn0oKSk7XG4iLCIvKiFcbiAqIEphdmFTY3JpcHQgQ29va2llIHYyLjEuM1xuICogaHR0cHM6Ly9naXRodWIuY29tL2pzLWNvb2tpZS9qcy1jb29raWVcbiAqXG4gKiBDb3B5cmlnaHQgMjAwNiwgMjAxNSBLbGF1cyBIYXJ0bCAmIEZhZ25lciBCcmFja1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKi9cbjsoZnVuY3Rpb24gKGZhY3RvcnkpIHtcblx0dmFyIHJlZ2lzdGVyZWRJbk1vZHVsZUxvYWRlciA9IGZhbHNlO1xuXHRpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG5cdFx0ZGVmaW5lKGZhY3RvcnkpO1xuXHRcdHJlZ2lzdGVyZWRJbk1vZHVsZUxvYWRlciA9IHRydWU7XG5cdH1cblx0aWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRcdHJlZ2lzdGVyZWRJbk1vZHVsZUxvYWRlciA9IHRydWU7XG5cdH1cblx0aWYgKCFyZWdpc3RlcmVkSW5Nb2R1bGVMb2FkZXIpIHtcblx0XHR2YXIgT2xkQ29va2llcyA9IHdpbmRvdy5Db29raWVzO1xuXHRcdHZhciBhcGkgPSB3aW5kb3cuQ29va2llcyA9IGZhY3RvcnkoKTtcblx0XHRhcGkubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdHdpbmRvdy5Db29raWVzID0gT2xkQ29va2llcztcblx0XHRcdHJldHVybiBhcGk7XG5cdFx0fTtcblx0fVxufShmdW5jdGlvbiAoKSB7XG5cdGZ1bmN0aW9uIGV4dGVuZCAoKSB7XG5cdFx0dmFyIGkgPSAwO1xuXHRcdHZhciByZXN1bHQgPSB7fTtcblx0XHRmb3IgKDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGF0dHJpYnV0ZXMgPSBhcmd1bWVudHNbIGkgXTtcblx0XHRcdGZvciAodmFyIGtleSBpbiBhdHRyaWJ1dGVzKSB7XG5cdFx0XHRcdHJlc3VsdFtrZXldID0gYXR0cmlidXRlc1trZXldO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0ZnVuY3Rpb24gaW5pdCAoY29udmVydGVyKSB7XG5cdFx0ZnVuY3Rpb24gYXBpIChrZXksIHZhbHVlLCBhdHRyaWJ1dGVzKSB7XG5cdFx0XHR2YXIgcmVzdWx0O1xuXHRcdFx0aWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXcml0ZVxuXG5cdFx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0YXR0cmlidXRlcyA9IGV4dGVuZCh7XG5cdFx0XHRcdFx0cGF0aDogJy8nXG5cdFx0XHRcdH0sIGFwaS5kZWZhdWx0cywgYXR0cmlidXRlcyk7XG5cblx0XHRcdFx0aWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmV4cGlyZXMgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdFx0dmFyIGV4cGlyZXMgPSBuZXcgRGF0ZSgpO1xuXHRcdFx0XHRcdGV4cGlyZXMuc2V0TWlsbGlzZWNvbmRzKGV4cGlyZXMuZ2V0TWlsbGlzZWNvbmRzKCkgKyBhdHRyaWJ1dGVzLmV4cGlyZXMgKiA4NjRlKzUpO1xuXHRcdFx0XHRcdGF0dHJpYnV0ZXMuZXhwaXJlcyA9IGV4cGlyZXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHJlc3VsdCA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcblx0XHRcdFx0XHRpZiAoL15bXFx7XFxbXS8udGVzdChyZXN1bHQpKSB7XG5cdFx0XHRcdFx0XHR2YWx1ZSA9IHJlc3VsdDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cblx0XHRcdFx0aWYgKCFjb252ZXJ0ZXIud3JpdGUpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcodmFsdWUpKVxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8M0F8M0N8M0V8M0R8MkZ8M0Z8NDB8NUJ8NUR8NUV8NjB8N0J8N0R8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFsdWUgPSBjb252ZXJ0ZXIud3JpdGUodmFsdWUsIGtleSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXkgPSBlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGtleSkpO1xuXHRcdFx0XHRrZXkgPSBrZXkucmVwbGFjZSgvJSgyM3wyNHwyNnwyQnw1RXw2MHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KTtcblx0XHRcdFx0a2V5ID0ga2V5LnJlcGxhY2UoL1tcXChcXCldL2csIGVzY2FwZSk7XG5cblx0XHRcdFx0cmV0dXJuIChkb2N1bWVudC5jb29raWUgPSBbXG5cdFx0XHRcdFx0a2V5LCAnPScsIHZhbHVlLFxuXHRcdFx0XHRcdGF0dHJpYnV0ZXMuZXhwaXJlcyA/ICc7IGV4cGlyZXM9JyArIGF0dHJpYnV0ZXMuZXhwaXJlcy50b1VUQ1N0cmluZygpIDogJycsIC8vIHVzZSBleHBpcmVzIGF0dHJpYnV0ZSwgbWF4LWFnZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IElFXG5cdFx0XHRcdFx0YXR0cmlidXRlcy5wYXRoID8gJzsgcGF0aD0nICsgYXR0cmlidXRlcy5wYXRoIDogJycsXG5cdFx0XHRcdFx0YXR0cmlidXRlcy5kb21haW4gPyAnOyBkb21haW49JyArIGF0dHJpYnV0ZXMuZG9tYWluIDogJycsXG5cdFx0XHRcdFx0YXR0cmlidXRlcy5zZWN1cmUgPyAnOyBzZWN1cmUnIDogJydcblx0XHRcdFx0XS5qb2luKCcnKSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlYWRcblxuXHRcdFx0aWYgKCFrZXkpIHtcblx0XHRcdFx0cmVzdWx0ID0ge307XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRvIHByZXZlbnQgdGhlIGZvciBsb29wIGluIHRoZSBmaXJzdCBwbGFjZSBhc3NpZ24gYW4gZW1wdHkgYXJyYXlcblx0XHRcdC8vIGluIGNhc2UgdGhlcmUgYXJlIG5vIGNvb2tpZXMgYXQgYWxsLiBBbHNvIHByZXZlbnRzIG9kZCByZXN1bHQgd2hlblxuXHRcdFx0Ly8gY2FsbGluZyBcImdldCgpXCJcblx0XHRcdHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW107XG5cdFx0XHR2YXIgcmRlY29kZSA9IC8oJVswLTlBLVpdezJ9KSsvZztcblx0XHRcdHZhciBpID0gMDtcblxuXHRcdFx0Zm9yICg7IGkgPCBjb29raWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHZhciBwYXJ0cyA9IGNvb2tpZXNbaV0uc3BsaXQoJz0nKTtcblx0XHRcdFx0dmFyIGNvb2tpZSA9IHBhcnRzLnNsaWNlKDEpLmpvaW4oJz0nKTtcblxuXHRcdFx0XHRpZiAoY29va2llLmNoYXJBdCgwKSA9PT0gJ1wiJykge1xuXHRcdFx0XHRcdGNvb2tpZSA9IGNvb2tpZS5zbGljZSgxLCAtMSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHZhciBuYW1lID0gcGFydHNbMF0ucmVwbGFjZShyZGVjb2RlLCBkZWNvZGVVUklDb21wb25lbnQpO1xuXHRcdFx0XHRcdGNvb2tpZSA9IGNvbnZlcnRlci5yZWFkID9cblx0XHRcdFx0XHRcdGNvbnZlcnRlci5yZWFkKGNvb2tpZSwgbmFtZSkgOiBjb252ZXJ0ZXIoY29va2llLCBuYW1lKSB8fFxuXHRcdFx0XHRcdFx0Y29va2llLnJlcGxhY2UocmRlY29kZSwgZGVjb2RlVVJJQ29tcG9uZW50KTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLmpzb24pIHtcblx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdGNvb2tpZSA9IEpTT04ucGFyc2UoY29va2llKTtcblx0XHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGtleSA9PT0gbmFtZSkge1xuXHRcdFx0XHRcdFx0cmVzdWx0ID0gY29va2llO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCFrZXkpIHtcblx0XHRcdFx0XHRcdHJlc3VsdFtuYW1lXSA9IGNvb2tpZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0YXBpLnNldCA9IGFwaTtcblx0XHRhcGkuZ2V0ID0gZnVuY3Rpb24gKGtleSkge1xuXHRcdFx0cmV0dXJuIGFwaS5jYWxsKGFwaSwga2V5KTtcblx0XHR9O1xuXHRcdGFwaS5nZXRKU09OID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGFwaS5hcHBseSh7XG5cdFx0XHRcdGpzb246IHRydWVcblx0XHRcdH0sIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG5cdFx0fTtcblx0XHRhcGkuZGVmYXVsdHMgPSB7fTtcblxuXHRcdGFwaS5yZW1vdmUgPSBmdW5jdGlvbiAoa2V5LCBhdHRyaWJ1dGVzKSB7XG5cdFx0XHRhcGkoa2V5LCAnJywgZXh0ZW5kKGF0dHJpYnV0ZXMsIHtcblx0XHRcdFx0ZXhwaXJlczogLTFcblx0XHRcdH0pKTtcblx0XHR9O1xuXG5cdFx0YXBpLndpdGhDb252ZXJ0ZXIgPSBpbml0O1xuXG5cdFx0cmV0dXJuIGFwaTtcblx0fVxuXG5cdHJldHVybiBpbml0KGZ1bmN0aW9uICgpIHt9KTtcbn0pKTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuXG5mdW5jdGlvbiBlbXB0eUZ1bmN0aW9uKCkge31cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gc2hpbShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgIGlmIChzZWNyZXQgPT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAvLyBJdCBpcyBzdGlsbCBzYWZlIHdoZW4gY2FsbGVkIGZyb20gUmVhY3QuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAnVXNlIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICApO1xuICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIHRocm93IGVycjtcbiAgfTtcbiAgc2hpbS5pc1JlcXVpcmVkID0gc2hpbTtcbiAgZnVuY3Rpb24gZ2V0U2hpbSgpIHtcbiAgICByZXR1cm4gc2hpbTtcbiAgfTtcbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBzaGltLFxuICAgIGJvb2w6IHNoaW0sXG4gICAgZnVuYzogc2hpbSxcbiAgICBudW1iZXI6IHNoaW0sXG4gICAgb2JqZWN0OiBzaGltLFxuICAgIHN0cmluZzogc2hpbSxcbiAgICBzeW1ib2w6IHNoaW0sXG5cbiAgICBhbnk6IHNoaW0sXG4gICAgYXJyYXlPZjogZ2V0U2hpbSxcbiAgICBlbGVtZW50OiBzaGltLFxuICAgIGluc3RhbmNlT2Y6IGdldFNoaW0sXG4gICAgbm9kZTogc2hpbSxcbiAgICBvYmplY3RPZjogZ2V0U2hpbSxcbiAgICBvbmVPZjogZ2V0U2hpbSxcbiAgICBvbmVPZlR5cGU6IGdldFNoaW0sXG4gICAgc2hhcGU6IGdldFNoaW0sXG4gICAgZXhhY3Q6IGdldFNoaW1cbiAgfTtcblxuICBSZWFjdFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyA9IGVtcHR5RnVuY3Rpb247XG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIFN5bWJvbC5mb3IgJiZcbiAgICBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykpIHx8XG4gICAgMHhlYWM3O1xuXG4gIHZhciBpc1ZhbGlkRWxlbWVudCA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgb2JqZWN0ICE9PSBudWxsICYmXG4gICAgICBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbiAgfTtcblxuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBkZXZlbG9wbWVudCBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IHRydWU7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn0gZWxzZSB7XG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcycpKCk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBzdHJpY3RVcmlFbmNvZGUgPSByZXF1aXJlKCdzdHJpY3QtdXJpLWVuY29kZScpO1xuXG5mdW5jdGlvbiBlbmNvZGUodmFsdWUsIHN0cmljdCkge1xuXHRyZXR1cm4gc3RyaWN0ID8gc3RyaWN0VXJpRW5jb2RlKHZhbHVlKSA6IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG59XG5cbmV4cG9ydHMuZXh0cmFjdCA9IGZ1bmN0aW9uIChzdHIpIHtcblx0cmV0dXJuIHN0ci5zcGxpdCgnPycpWzFdIHx8ICcnO1xufTtcblxuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uIChzdHIpIHtcblx0Ly8gQ3JlYXRlIGFuIG9iamVjdCB3aXRoIG5vIHByb3RvdHlwZVxuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3F1ZXJ5LXN0cmluZy9pc3N1ZXMvNDdcblx0dmFyIHJldCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cblx0aWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIHJldDtcblx0fVxuXG5cdHN0ciA9IHN0ci50cmltKCkucmVwbGFjZSgvXihcXD98I3wmKS8sICcnKTtcblxuXHRpZiAoIXN0cikge1xuXHRcdHJldHVybiByZXQ7XG5cdH1cblxuXHRzdHIuc3BsaXQoJyYnKS5mb3JFYWNoKGZ1bmN0aW9uIChwYXJhbSkge1xuXHRcdHZhciBwYXJ0cyA9IHBhcmFtLnJlcGxhY2UoL1xcKy9nLCAnICcpLnNwbGl0KCc9Jyk7XG5cdFx0Ly8gRmlyZWZveCAocHJlIDQwKSBkZWNvZGVzIGAlM0RgIHRvIGA9YFxuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvcXVlcnktc3RyaW5nL3B1bGwvMzdcblx0XHR2YXIga2V5ID0gcGFydHMuc2hpZnQoKTtcblx0XHR2YXIgdmFsID0gcGFydHMubGVuZ3RoID4gMCA/IHBhcnRzLmpvaW4oJz0nKSA6IHVuZGVmaW5lZDtcblxuXHRcdGtleSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXkpO1xuXG5cdFx0Ly8gbWlzc2luZyBgPWAgc2hvdWxkIGJlIGBudWxsYDpcblx0XHQvLyBodHRwOi8vdzMub3JnL1RSLzIwMTIvV0QtdXJsLTIwMTIwNTI0LyNjb2xsZWN0LXVybC1wYXJhbWV0ZXJzXG5cdFx0dmFsID0gdmFsID09PSB1bmRlZmluZWQgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KHZhbCk7XG5cblx0XHRpZiAocmV0W2tleV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0W2tleV0gPSB2YWw7XG5cdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJldFtrZXldKSkge1xuXHRcdFx0cmV0W2tleV0ucHVzaCh2YWwpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXRba2V5XSA9IFtyZXRba2V5XSwgdmFsXTtcblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiByZXQ7XG59O1xuXG5leHBvcnRzLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIChvYmosIG9wdHMpIHtcblx0b3B0cyA9IG9wdHMgfHwge307XG5cblx0dmFyIHN0cmljdCA9IG9wdHMuc3RyaWN0ICE9PSBmYWxzZTtcblxuXHRyZXR1cm4gb2JqID8gT2JqZWN0LmtleXMob2JqKS5zb3J0KCkubWFwKGZ1bmN0aW9uIChrZXkpIHtcblx0XHR2YXIgdmFsID0gb2JqW2tleV07XG5cblx0XHRpZiAodmFsID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiAnJztcblx0XHR9XG5cblx0XHRpZiAodmFsID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4ga2V5O1xuXHRcdH1cblxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcblx0XHRcdHZhciByZXN1bHQgPSBbXTtcblxuXHRcdFx0dmFsLnNsaWNlKCkuc29ydCgpLmZvckVhY2goZnVuY3Rpb24gKHZhbDIpIHtcblx0XHRcdFx0aWYgKHZhbDIgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2YWwyID09PSBudWxsKSB7XG5cdFx0XHRcdFx0cmVzdWx0LnB1c2goZW5jb2RlKGtleSwgc3RyaWN0KSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmVzdWx0LnB1c2goZW5jb2RlKGtleSwgc3RyaWN0KSArICc9JyArIGVuY29kZSh2YWwyLCBzdHJpY3QpKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHJldHVybiByZXN1bHQuam9pbignJicpO1xuXHRcdH1cblxuXHRcdHJldHVybiBlbmNvZGUoa2V5LCBzdHJpY3QpICsgJz0nICsgZW5jb2RlKHZhbCwgc3RyaWN0KTtcblx0fSkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7XG5cdFx0cmV0dXJuIHgubGVuZ3RoID4gMDtcblx0fSkuam9pbignJicpIDogJyc7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoc3RyKSB7XG5cdHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKS5yZXBsYWNlKC9bIScoKSpdL2csIGZ1bmN0aW9uIChjKSB7XG5cdFx0cmV0dXJuICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0fSk7XG59O1xuIiwiKGZ1bmN0aW9uKHNlbGYpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGlmIChzZWxmLmZldGNoKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICB2YXIgc3VwcG9ydCA9IHtcbiAgICBzZWFyY2hQYXJhbXM6ICdVUkxTZWFyY2hQYXJhbXMnIGluIHNlbGYsXG4gICAgaXRlcmFibGU6ICdTeW1ib2wnIGluIHNlbGYgJiYgJ2l0ZXJhdG9yJyBpbiBTeW1ib2wsXG4gICAgYmxvYjogJ0ZpbGVSZWFkZXInIGluIHNlbGYgJiYgJ0Jsb2InIGluIHNlbGYgJiYgKGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IEJsb2IoKVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH0pKCksXG4gICAgZm9ybURhdGE6ICdGb3JtRGF0YScgaW4gc2VsZixcbiAgICBhcnJheUJ1ZmZlcjogJ0FycmF5QnVmZmVyJyBpbiBzZWxmXG4gIH1cblxuICBpZiAoc3VwcG9ydC5hcnJheUJ1ZmZlcikge1xuICAgIHZhciB2aWV3Q2xhc3NlcyA9IFtcbiAgICAgICdbb2JqZWN0IEludDhBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgVWludDhBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcbiAgICAgICdbb2JqZWN0IEludDE2QXJyYXldJyxcbiAgICAgICdbb2JqZWN0IFVpbnQxNkFycmF5XScsXG4gICAgICAnW29iamVjdCBJbnQzMkFycmF5XScsXG4gICAgICAnW29iamVjdCBVaW50MzJBcnJheV0nLFxuICAgICAgJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsXG4gICAgICAnW29iamVjdCBGbG9hdDY0QXJyYXldJ1xuICAgIF1cblxuICAgIHZhciBpc0RhdGFWaWV3ID0gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIERhdGFWaWV3LnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKG9iailcbiAgICB9XG5cbiAgICB2YXIgaXNBcnJheUJ1ZmZlclZpZXcgPSBBcnJheUJ1ZmZlci5pc1ZpZXcgfHwgZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHZpZXdDbGFzc2VzLmluZGV4T2YoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikpID4gLTFcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBub3JtYWxpemVOYW1lKG5hbWUpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lID0gU3RyaW5nKG5hbWUpXG4gICAgfVxuICAgIGlmICgvW15hLXowLTlcXC0jJCUmJyorLlxcXl9gfH5dL2kudGVzdChuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBjaGFyYWN0ZXIgaW4gaGVhZGVyIGZpZWxkIG5hbWUnKVxuICAgIH1cbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICBmdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvLyBCdWlsZCBhIGRlc3RydWN0aXZlIGl0ZXJhdG9yIGZvciB0aGUgdmFsdWUgbGlzdFxuICBmdW5jdGlvbiBpdGVyYXRvckZvcihpdGVtcykge1xuICAgIHZhciBpdGVyYXRvciA9IHtcbiAgICAgIG5leHQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBpdGVtcy5zaGlmdCgpXG4gICAgICAgIHJldHVybiB7ZG9uZTogdmFsdWUgPT09IHVuZGVmaW5lZCwgdmFsdWU6IHZhbHVlfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdXBwb3J0Lml0ZXJhYmxlKSB7XG4gICAgICBpdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvclxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpdGVyYXRvclxuICB9XG5cbiAgZnVuY3Rpb24gSGVhZGVycyhoZWFkZXJzKSB7XG4gICAgdGhpcy5tYXAgPSB7fVxuXG4gICAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICB9LCB0aGlzKVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uKGhlYWRlcikge1xuICAgICAgICB0aGlzLmFwcGVuZChoZWFkZXJbMF0sIGhlYWRlclsxXSlcbiAgICAgIH0sIHRoaXMpXG4gICAgfSBlbHNlIGlmIChoZWFkZXJzKSB7XG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhoZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgdGhpcy5hcHBlbmQobmFtZSwgaGVhZGVyc1tuYW1lXSlcbiAgICAgIH0sIHRoaXMpXG4gICAgfVxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKVxuICAgIHZhbHVlID0gbm9ybWFsaXplVmFsdWUodmFsdWUpXG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5tYXBbbmFtZV1cbiAgICB0aGlzLm1hcFtuYW1lXSA9IG9sZFZhbHVlID8gb2xkVmFsdWUrJywnK3ZhbHVlIDogdmFsdWVcbiAgfVxuXG4gIEhlYWRlcnMucHJvdG90eXBlWydkZWxldGUnXSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBkZWxldGUgdGhpcy5tYXBbbm9ybWFsaXplTmFtZShuYW1lKV1cbiAgfVxuXG4gIEhlYWRlcnMucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBuYW1lID0gbm9ybWFsaXplTmFtZShuYW1lKVxuICAgIHJldHVybiB0aGlzLmhhcyhuYW1lKSA/IHRoaXMubWFwW25hbWVdIDogbnVsbFxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShub3JtYWxpemVOYW1lKG5hbWUpKVxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICB0aGlzLm1hcFtub3JtYWxpemVOYW1lKG5hbWUpXSA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKVxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrLCB0aGlzQXJnKSB7XG4gICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzLm1hcCkge1xuICAgICAgaWYgKHRoaXMubWFwLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpcy5tYXBbbmFtZV0sIG5hbWUsIHRoaXMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgSGVhZGVycy5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpdGVtcyA9IFtdXG4gICAgdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7IGl0ZW1zLnB1c2gobmFtZSkgfSlcbiAgICByZXR1cm4gaXRlcmF0b3JGb3IoaXRlbXMpXG4gIH1cblxuICBIZWFkZXJzLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbXMgPSBbXVxuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBpdGVtcy5wdXNoKHZhbHVlKSB9KVxuICAgIHJldHVybiBpdGVyYXRvckZvcihpdGVtcylcbiAgfVxuXG4gIEhlYWRlcnMucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaXRlbXMgPSBbXVxuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkgeyBpdGVtcy5wdXNoKFtuYW1lLCB2YWx1ZV0pIH0pXG4gICAgcmV0dXJuIGl0ZXJhdG9yRm9yKGl0ZW1zKVxuICB9XG5cbiAgaWYgKHN1cHBvcnQuaXRlcmFibGUpIHtcbiAgICBIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gSGVhZGVycy5wcm90b3R5cGUuZW50cmllc1xuICB9XG5cbiAgZnVuY3Rpb24gY29uc3VtZWQoYm9keSkge1xuICAgIGlmIChib2R5LmJvZHlVc2VkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFR5cGVFcnJvcignQWxyZWFkeSByZWFkJykpXG4gICAgfVxuICAgIGJvZHkuYm9keVVzZWQgPSB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQpXG4gICAgICB9XG4gICAgICByZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZWplY3QocmVhZGVyLmVycm9yKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiByZWFkQmxvYkFzQXJyYXlCdWZmZXIoYmxvYikge1xuICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gICAgdmFyIHByb21pc2UgPSBmaWxlUmVhZGVyUmVhZHkocmVhZGVyKVxuICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKVxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICBmdW5jdGlvbiByZWFkQmxvYkFzVGV4dChibG9iKSB7XG4gICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKClcbiAgICB2YXIgcHJvbWlzZSA9IGZpbGVSZWFkZXJSZWFkeShyZWFkZXIpXG4gICAgcmVhZGVyLnJlYWRBc1RleHQoYmxvYilcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZEFycmF5QnVmZmVyQXNUZXh0KGJ1Zikge1xuICAgIHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmKVxuICAgIHZhciBjaGFycyA9IG5ldyBBcnJheSh2aWV3Lmxlbmd0aClcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykge1xuICAgICAgY2hhcnNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHZpZXdbaV0pXG4gICAgfVxuICAgIHJldHVybiBjaGFycy5qb2luKCcnKVxuICB9XG5cbiAgZnVuY3Rpb24gYnVmZmVyQ2xvbmUoYnVmKSB7XG4gICAgaWYgKGJ1Zi5zbGljZSkge1xuICAgICAgcmV0dXJuIGJ1Zi5zbGljZSgwKVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KGJ1Zi5ieXRlTGVuZ3RoKVxuICAgICAgdmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmKSlcbiAgICAgIHJldHVybiB2aWV3LmJ1ZmZlclxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIEJvZHkoKSB7XG4gICAgdGhpcy5ib2R5VXNlZCA9IGZhbHNlXG5cbiAgICB0aGlzLl9pbml0Qm9keSA9IGZ1bmN0aW9uKGJvZHkpIHtcbiAgICAgIHRoaXMuX2JvZHlJbml0ID0gYm9keVxuICAgICAgaWYgKCFib2R5KSB7XG4gICAgICAgIHRoaXMuX2JvZHlUZXh0ID0gJydcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuX2JvZHlUZXh0ID0gYm9keVxuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmJsb2IgJiYgQmxvYi5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICB0aGlzLl9ib2R5QmxvYiA9IGJvZHlcbiAgICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5mb3JtRGF0YSAmJiBGb3JtRGF0YS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICB0aGlzLl9ib2R5Rm9ybURhdGEgPSBib2R5XG4gICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICB0aGlzLl9ib2R5VGV4dCA9IGJvZHkudG9TdHJpbmcoKVxuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIHN1cHBvcnQuYmxvYiAmJiBpc0RhdGFWaWV3KGJvZHkpKSB7XG4gICAgICAgIHRoaXMuX2JvZHlBcnJheUJ1ZmZlciA9IGJ1ZmZlckNsb25lKGJvZHkuYnVmZmVyKVxuICAgICAgICAvLyBJRSAxMC0xMSBjYW4ndCBoYW5kbGUgYSBEYXRhVmlldyBib2R5LlxuICAgICAgICB0aGlzLl9ib2R5SW5pdCA9IG5ldyBCbG9iKFt0aGlzLl9ib2R5QXJyYXlCdWZmZXJdKVxuICAgICAgfSBlbHNlIGlmIChzdXBwb3J0LmFycmF5QnVmZmVyICYmIChBcnJheUJ1ZmZlci5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSB8fCBpc0FycmF5QnVmZmVyVmlldyhib2R5KSkpIHtcbiAgICAgICAgdGhpcy5fYm9keUFycmF5QnVmZmVyID0gYnVmZmVyQ2xvbmUoYm9keSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndW5zdXBwb3J0ZWQgQm9keUluaXQgdHlwZScpXG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJykpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTgnKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlCbG9iICYmIHRoaXMuX2JvZHlCbG9iLnR5cGUpIHtcbiAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCB0aGlzLl9ib2R5QmxvYi50eXBlKVxuICAgICAgICB9IGVsc2UgaWYgKHN1cHBvcnQuc2VhcmNoUGFyYW1zICYmIFVSTFNlYXJjaFBhcmFtcy5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihib2R5KSkge1xuICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoJ2NvbnRlbnQtdHlwZScsICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCcpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3VwcG9ydC5ibG9iKSB7XG4gICAgICB0aGlzLmJsb2IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICAgICAgaWYgKHJlamVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdGVkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fYm9keUJsb2IpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlCbG9iKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyBibG9iJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCbG9iKFt0aGlzLl9ib2R5VGV4dF0pKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYXJyYXlCdWZmZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikge1xuICAgICAgICAgIHJldHVybiBjb25zdW1lZCh0aGlzKSB8fCBQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUFycmF5QnVmZmVyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLmJsb2IoKS50aGVuKHJlYWRCbG9iQXNBcnJheUJ1ZmZlcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGV4dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJlamVjdGVkID0gY29uc3VtZWQodGhpcylcbiAgICAgIGlmIChyZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0ZWRcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2JvZHlCbG9iKSB7XG4gICAgICAgIHJldHVybiByZWFkQmxvYkFzVGV4dCh0aGlzLl9ib2R5QmxvYilcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fYm9keUFycmF5QnVmZmVyKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVhZEFycmF5QnVmZmVyQXNUZXh0KHRoaXMuX2JvZHlBcnJheUJ1ZmZlcikpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2JvZHlGb3JtRGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgdGV4dCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlUZXh0KVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdXBwb3J0LmZvcm1EYXRhKSB7XG4gICAgICB0aGlzLmZvcm1EYXRhID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKGRlY29kZSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmpzb24gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRleHQoKS50aGVuKEpTT04ucGFyc2UpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8vIEhUVFAgbWV0aG9kcyB3aG9zZSBjYXBpdGFsaXphdGlvbiBzaG91bGQgYmUgbm9ybWFsaXplZFxuICB2YXIgbWV0aG9kcyA9IFsnREVMRVRFJywgJ0dFVCcsICdIRUFEJywgJ09QVElPTlMnLCAnUE9TVCcsICdQVVQnXVxuXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZChtZXRob2QpIHtcbiAgICB2YXIgdXBjYXNlZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpXG4gICAgcmV0dXJuIChtZXRob2RzLmluZGV4T2YodXBjYXNlZCkgPiAtMSkgPyB1cGNhc2VkIDogbWV0aG9kXG4gIH1cblxuICBmdW5jdGlvbiBSZXF1ZXN0KGlucHV0LCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cbiAgICB2YXIgYm9keSA9IG9wdGlvbnMuYm9keVxuXG4gICAgaWYgKGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdCkge1xuICAgICAgaWYgKGlucHV0LmJvZHlVc2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FscmVhZHkgcmVhZCcpXG4gICAgICB9XG4gICAgICB0aGlzLnVybCA9IGlucHV0LnVybFxuICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzXG4gICAgICBpZiAoIW9wdGlvbnMuaGVhZGVycykge1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgSGVhZGVycyhpbnB1dC5oZWFkZXJzKVxuICAgICAgfVxuICAgICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2RcbiAgICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGVcbiAgICAgIGlmICghYm9keSAmJiBpbnB1dC5fYm9keUluaXQgIT0gbnVsbCkge1xuICAgICAgICBib2R5ID0gaW5wdXQuX2JvZHlJbml0XG4gICAgICAgIGlucHV0LmJvZHlVc2VkID0gdHJ1ZVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVybCA9IFN0cmluZyhpbnB1dClcbiAgICB9XG5cbiAgICB0aGlzLmNyZWRlbnRpYWxzID0gb3B0aW9ucy5jcmVkZW50aWFscyB8fCB0aGlzLmNyZWRlbnRpYWxzIHx8ICdvbWl0J1xuICAgIGlmIChvcHRpb25zLmhlYWRlcnMgfHwgIXRoaXMuaGVhZGVycykge1xuICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucy5oZWFkZXJzKVxuICAgIH1cbiAgICB0aGlzLm1ldGhvZCA9IG5vcm1hbGl6ZU1ldGhvZChvcHRpb25zLm1ldGhvZCB8fCB0aGlzLm1ldGhvZCB8fCAnR0VUJylcbiAgICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlIHx8IG51bGxcbiAgICB0aGlzLnJlZmVycmVyID0gbnVsbFxuXG4gICAgaWYgKCh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJykgJiYgYm9keSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9keSBub3QgYWxsb3dlZCBmb3IgR0VUIG9yIEhFQUQgcmVxdWVzdHMnKVxuICAgIH1cbiAgICB0aGlzLl9pbml0Qm9keShib2R5KVxuICB9XG5cbiAgUmVxdWVzdC5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IFJlcXVlc3QodGhpcywgeyBib2R5OiB0aGlzLl9ib2R5SW5pdCB9KVxuICB9XG5cbiAgZnVuY3Rpb24gZGVjb2RlKGJvZHkpIHtcbiAgICB2YXIgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgYm9keS50cmltKCkuc3BsaXQoJyYnKS5mb3JFYWNoKGZ1bmN0aW9uKGJ5dGVzKSB7XG4gICAgICBpZiAoYnl0ZXMpIHtcbiAgICAgICAgdmFyIHNwbGl0ID0gYnl0ZXMuc3BsaXQoJz0nKVxuICAgICAgICB2YXIgbmFtZSA9IHNwbGl0LnNoaWZ0KCkucmVwbGFjZSgvXFwrL2csICcgJylcbiAgICAgICAgdmFyIHZhbHVlID0gc3BsaXQuam9pbignPScpLnJlcGxhY2UoL1xcKy9nLCAnICcpXG4gICAgICAgIGZvcm0uYXBwZW5kKGRlY29kZVVSSUNvbXBvbmVudChuYW1lKSwgZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBmb3JtXG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUhlYWRlcnMocmF3SGVhZGVycykge1xuICAgIHZhciBoZWFkZXJzID0gbmV3IEhlYWRlcnMoKVxuICAgIHJhd0hlYWRlcnMuc3BsaXQoL1xccj9cXG4vKS5mb3JFYWNoKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgIHZhciBwYXJ0cyA9IGxpbmUuc3BsaXQoJzonKVxuICAgICAgdmFyIGtleSA9IHBhcnRzLnNoaWZ0KCkudHJpbSgpXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHBhcnRzLmpvaW4oJzonKS50cmltKClcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICBCb2R5LmNhbGwoUmVxdWVzdC5wcm90b3R5cGUpXG5cbiAgZnVuY3Rpb24gUmVzcG9uc2UoYm9keUluaXQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB7fVxuICAgIH1cblxuICAgIHRoaXMudHlwZSA9ICdkZWZhdWx0J1xuICAgIHRoaXMuc3RhdHVzID0gJ3N0YXR1cycgaW4gb3B0aW9ucyA/IG9wdGlvbnMuc3RhdHVzIDogMjAwXG4gICAgdGhpcy5vayA9IHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMFxuICAgIHRoaXMuc3RhdHVzVGV4dCA9ICdzdGF0dXNUZXh0JyBpbiBvcHRpb25zID8gb3B0aW9ucy5zdGF0dXNUZXh0IDogJ09LJ1xuICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycylcbiAgICB0aGlzLnVybCA9IG9wdGlvbnMudXJsIHx8ICcnXG4gICAgdGhpcy5faW5pdEJvZHkoYm9keUluaXQpXG4gIH1cblxuICBCb2R5LmNhbGwoUmVzcG9uc2UucHJvdG90eXBlKVxuXG4gIFJlc3BvbnNlLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UodGhpcy5fYm9keUluaXQsIHtcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBzdGF0dXNUZXh0OiB0aGlzLnN0YXR1c1RleHQsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh0aGlzLmhlYWRlcnMpLFxuICAgICAgdXJsOiB0aGlzLnVybFxuICAgIH0pXG4gIH1cblxuICBSZXNwb25zZS5lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiAwLCBzdGF0dXNUZXh0OiAnJ30pXG4gICAgcmVzcG9uc2UudHlwZSA9ICdlcnJvcidcbiAgICByZXR1cm4gcmVzcG9uc2VcbiAgfVxuXG4gIHZhciByZWRpcmVjdFN0YXR1c2VzID0gWzMwMSwgMzAyLCAzMDMsIDMwNywgMzA4XVxuXG4gIFJlc3BvbnNlLnJlZGlyZWN0ID0gZnVuY3Rpb24odXJsLCBzdGF0dXMpIHtcbiAgICBpZiAocmVkaXJlY3RTdGF0dXNlcy5pbmRleE9mKHN0YXR1cykgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCBzdGF0dXMgY29kZScpXG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7c3RhdHVzOiBzdGF0dXMsIGhlYWRlcnM6IHtsb2NhdGlvbjogdXJsfX0pXG4gIH1cblxuICBzZWxmLkhlYWRlcnMgPSBIZWFkZXJzXG4gIHNlbGYuUmVxdWVzdCA9IFJlcXVlc3RcbiAgc2VsZi5SZXNwb25zZSA9IFJlc3BvbnNlXG5cbiAgc2VsZi5mZXRjaCA9IGZ1bmN0aW9uKGlucHV0LCBpbml0KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdClcbiAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuXG4gICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgIHN0YXR1czogeGhyLnN0YXR1cyxcbiAgICAgICAgICBzdGF0dXNUZXh0OiB4aHIuc3RhdHVzVGV4dCxcbiAgICAgICAgICBoZWFkZXJzOiBwYXJzZUhlYWRlcnMoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpIHx8ICcnKVxuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMudXJsID0gJ3Jlc3BvbnNlVVJMJyBpbiB4aHIgPyB4aHIucmVzcG9uc2VVUkwgOiBvcHRpb25zLmhlYWRlcnMuZ2V0KCdYLVJlcXVlc3QtVVJMJylcbiAgICAgICAgdmFyIGJvZHkgPSAncmVzcG9uc2UnIGluIHhociA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHRcbiAgICAgICAgcmVzb2x2ZShuZXcgUmVzcG9uc2UoYm9keSwgb3B0aW9ucykpXG4gICAgICB9XG5cbiAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKCdOZXR3b3JrIHJlcXVlc3QgZmFpbGVkJykpXG4gICAgICB9XG5cbiAgICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoJ05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnKSlcbiAgICAgIH1cblxuICAgICAgeGhyLm9wZW4ocmVxdWVzdC5tZXRob2QsIHJlcXVlc3QudXJsLCB0cnVlKVxuXG4gICAgICBpZiAocmVxdWVzdC5jcmVkZW50aWFscyA9PT0gJ2luY2x1ZGUnKSB7XG4gICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlXG4gICAgICB9XG5cbiAgICAgIGlmICgncmVzcG9uc2VUeXBlJyBpbiB4aHIgJiYgc3VwcG9ydC5ibG9iKSB7XG4gICAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYmxvYidcbiAgICAgIH1cblxuICAgICAgcmVxdWVzdC5oZWFkZXJzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpXG4gICAgICB9KVxuXG4gICAgICB4aHIuc2VuZCh0eXBlb2YgcmVxdWVzdC5fYm9keUluaXQgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IHJlcXVlc3QuX2JvZHlJbml0KVxuICAgIH0pXG4gIH1cbiAgc2VsZi5mZXRjaC5wb2x5ZmlsbCA9IHRydWVcbn0pKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB0aGlzKTtcbiJdLCJuYW1lcyI6WyJoYXNPd24iLCJoYXNPd25Qcm9wZXJ0eSIsImNsYXNzTmFtZXMiLCJjbGFzc2VzIiwiaSIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFyZyIsImFyZ1R5cGUiLCJwdXNoIiwiQXJyYXkiLCJpc0FycmF5IiwiaW5uZXIiLCJhcHBseSIsInRvU3RyaW5nIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaW5jbHVkZXMiLCJrZXkiLCJjYWxsIiwiam9pbiIsIm1vZHVsZSIsImV4cG9ydHMiLCJkZWZhdWx0IiwiZmFjdG9yeSIsIk9sZENvb2tpZXMiLCJ3aW5kb3ciLCJDb29raWVzIiwiYXBpIiwibm9Db25mbGljdCIsImV4dGVuZCIsInJlc3VsdCIsImF0dHJpYnV0ZXMiLCJpbml0IiwiY29udmVydGVyIiwidmFsdWUiLCJkb2N1bWVudCIsInBhdGgiLCJkZWZhdWx0cyIsImV4cGlyZXMiLCJEYXRlIiwic2V0TWlsbGlzZWNvbmRzIiwiZ2V0TWlsbGlzZWNvbmRzIiwiSlNPTiIsInN0cmluZ2lmeSIsInRlc3QiLCJlIiwid3JpdGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJTdHJpbmciLCJyZXBsYWNlIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwiY29va2llIiwidG9VVENTdHJpbmciLCJkb21haW4iLCJzZWN1cmUiLCJjb29raWVzIiwic3BsaXQiLCJyZGVjb2RlIiwicGFydHMiLCJzbGljZSIsImNoYXJBdCIsIm5hbWUiLCJyZWFkIiwidGhpcyIsImpzb24iLCJwYXJzZSIsInNldCIsImdldCIsImdldEpTT04iLCJyZW1vdmUiLCJ3aXRoQ29udmVydGVyIiwiUmVhY3RQcm9wVHlwZXNTZWNyZXQiLCJlbXB0eUZ1bmN0aW9uIiwic2hpbSIsInByb3BzIiwicHJvcE5hbWUiLCJjb21wb25lbnROYW1lIiwibG9jYXRpb24iLCJwcm9wRnVsbE5hbWUiLCJzZWNyZXQiLCJlcnIiLCJFcnJvciIsImdldFNoaW0iLCJpc1JlcXVpcmVkIiwiUmVhY3RQcm9wVHlwZXMiLCJhcnJheSIsImJvb2wiLCJmdW5jIiwibnVtYmVyIiwib2JqZWN0Iiwic3RyaW5nIiwic3ltYm9sIiwiYW55IiwiYXJyYXlPZiIsImVsZW1lbnQiLCJpbnN0YW5jZU9mIiwibm9kZSIsIm9iamVjdE9mIiwib25lT2YiLCJvbmVPZlR5cGUiLCJzaGFwZSIsImV4YWN0IiwiY2hlY2tQcm9wVHlwZXMiLCJQcm9wVHlwZXMiLCJzdHJpY3RVcmlFbmNvZGUiLCJlbmNvZGUiLCJzdHJpY3QiLCJleHRyYWN0Iiwic3RyIiwicmV0IiwiY3JlYXRlIiwidHJpbSIsImZvckVhY2giLCJwYXJhbSIsInNoaWZ0IiwidmFsIiwidW5kZWZpbmVkIiwib2JqIiwib3B0cyIsImtleXMiLCJzb3J0IiwibWFwIiwidmFsMiIsImZpbHRlciIsIngiLCJjIiwiY2hhckNvZGVBdCIsInRvVXBwZXJDYXNlIiwic2VsZiIsImZldGNoIiwic3VwcG9ydCIsIlN5bWJvbCIsIkJsb2IiLCJ2aWV3Q2xhc3NlcyIsImlzRGF0YVZpZXciLCJEYXRhVmlldyIsImlzUHJvdG90eXBlT2YiLCJpc0FycmF5QnVmZmVyVmlldyIsIkFycmF5QnVmZmVyIiwiaXNWaWV3IiwiaW5kZXhPZiIsIkhlYWRlcnMiLCJhcHBlbmQiLCJub3JtYWxpemVOYW1lIiwibm9ybWFsaXplVmFsdWUiLCJvbGRWYWx1ZSIsImhhcyIsImNhbGxiYWNrIiwidGhpc0FyZyIsIml0ZW1zIiwiaXRlcmF0b3JGb3IiLCJ2YWx1ZXMiLCJlbnRyaWVzIiwiaXRlcmF0b3IiLCJtZXRob2RzIiwiUmVxdWVzdCIsImNsb25lIiwiYm9keSIsIl9ib2R5SW5pdCIsIkJvZHkiLCJSZXNwb25zZSIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJoZWFkZXJzIiwidXJsIiwiZXJyb3IiLCJyZXNwb25zZSIsInR5cGUiLCJyZWRpcmVjdFN0YXR1c2VzIiwicmVkaXJlY3QiLCJSYW5nZUVycm9yIiwiaW5wdXQiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInJlcXVlc3QiLCJ4aHIiLCJYTUxIdHRwUmVxdWVzdCIsIm9ubG9hZCIsInJhd0hlYWRlcnMiLCJvcHRpb25zIiwiZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIiwibGluZSIsInJlc3BvbnNlVVJMIiwicmVzcG9uc2VUZXh0Iiwib25lcnJvciIsIlR5cGVFcnJvciIsIm9udGltZW91dCIsIm9wZW4iLCJtZXRob2QiLCJjcmVkZW50aWFscyIsIndpdGhDcmVkZW50aWFscyIsInJlc3BvbnNlVHlwZSIsInNldFJlcXVlc3RIZWFkZXIiLCJzZW5kIiwicG9seWZpbGwiLCJ0b0xvd2VyQ2FzZSIsIm5leHQiLCJkb25lIiwiaGVhZGVyIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImNvbnN1bWVkIiwiYm9keVVzZWQiLCJmaWxlUmVhZGVyUmVhZHkiLCJyZWFkZXIiLCJyZWFkQmxvYkFzQXJyYXlCdWZmZXIiLCJibG9iIiwiRmlsZVJlYWRlciIsInByb21pc2UiLCJyZWFkQXNBcnJheUJ1ZmZlciIsImJ1ZmZlckNsb25lIiwiYnVmIiwidmlldyIsIlVpbnQ4QXJyYXkiLCJieXRlTGVuZ3RoIiwiYnVmZmVyIiwiX2luaXRCb2R5IiwiX2JvZHlUZXh0IiwiX2JvZHlCbG9iIiwiRm9ybURhdGEiLCJfYm9keUZvcm1EYXRhIiwiVVJMU2VhcmNoUGFyYW1zIiwiX2JvZHlBcnJheUJ1ZmZlciIsInJlamVjdGVkIiwiYXJyYXlCdWZmZXIiLCJ0aGVuIiwidGV4dCIsInJlYWRCbG9iQXNUZXh0IiwicmVhZEFzVGV4dCIsInJlYWRBcnJheUJ1ZmZlckFzVGV4dCIsImNoYXJzIiwiZnJvbUNoYXJDb2RlIiwiZm9ybURhdGEiLCJkZWNvZGUiLCJtb2RlIiwibm9ybWFsaXplTWV0aG9kIiwidXBjYXNlZCIsInJlZmVycmVyIiwiZm9ybSIsImJ5dGVzIiwiYm9keUluaXQiLCJvayJdLCJzb3VyY2VSb290IjoiIn0=