mybatis3
Version:
mybatis3 mapper
2 lines • 48.6 kB
JavaScript
require("source-map-support").install(),function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r():"function"==typeof define&&define.amd?define("library",[],r):"object"==typeof exports?exports.library=r():e.library=r()}(global,(function(){return function(e){var r={};function t(n){if(r[n])return r[n].exports;var a=r[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,t),a.l=!0,a.exports}return t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,r){if(1&r&&(e=t(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var a in e)t.d(n,a,function(r){return e[r]}.bind(null,a));return n},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},t.p="",t(t.s=12)}([function(e,r){e.exports=require("@babel/runtime/regenerator")},function(e,r){e.exports=require("@babel/runtime/helpers/asyncToGenerator")},function(e,r){e.exports=require("lodash")},function(e,r){e.exports=require("bluebird")},function(e,r){e.exports=require("node-eval")},function(e,r){e.exports=require("path")},function(e,r){e.exports=require("@babel/runtime/helpers/defineProperty")},function(e,r){e.exports=require("@babel/runtime/helpers/classCallCheck")},function(e,r){e.exports=require("@babel/runtime/helpers/createClass")},function(e,r){e.exports=require("xml2js")},function(e,r){e.exports=require("fs")},function(e,r){e.exports=require("sqlstring")},function(e,r,t){"use strict";t.r(r);var n=t(6),a=t.n(n),s=t(0),c=t.n(s),i=t(1),u=t.n(i),o=t(7),p=t.n(o),f=t(8),l=t.n(f),h=t(9),x=t.n(h),b=t(4),v=t.n(b),y=t(10),d=t(2),k=t(3),m=t.n(k),g={queryFormat:/:([\w_.()]+)/g,stringifyObjects:!1,timezone:!1},w=t(11),O=t.n(w),_=t(5),j=new x.a.Parser({trim:!0,normalize:!0,preserveChildrenOrder:!0,explicitChildren:!0,explicitCharkey:!0,charsAsChildren:!0}),$=function(){function e(){p()(this,e),this.tablesRaw=[],this.tables=[],this.lastQuery={},this.sqlData={},this.references=[]}var r,t,n,s,i,o,f,h,x,b,k,w,$;return l()(e,[{key:"setConnection",value:function(e){this.pool=e,this.pool.getConnectionAsync=m.a.promisify(this.pool.getConnection)}},{key:"getConnection",value:function(){return Object(d.isFunction)(this.pool)?this.pool():this.pool}},{key:"fnModel",value:function(e,r){var t={},n=this.getQuery(e),a=this;return Object(d.forEach)(n,(function(n,s){"lastQuery"===s?Object.defineProperty(t,s,{get:function(){return a.lastQuery[e]}}):t[s]=Object(d.partialRight)(n,r)})),t}},{key:"transaction",value:($=u()(c.a.mark((function e(r){var t,n;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,this.pool.getConnectionAsync();case 3:return(t=e.sent).table=Object(d.partialRight)(this.fnModel,t).bind(this),e.next=7,t.beginTransaction();case 7:return e.next=9,r(t);case 9:return n=e.sent,e.next=12,t.commit();case 12:t.release(),e.next=21;break;case 15:return e.prev=15,e.t0=e.catch(0),e.next=19,t.rollback();case 19:throw t.release(),e.t0;case 21:return e.abrupt("return",n);case 22:case"end":return e.stop()}}),e,this,[[0,15]])}))),function(e){return $.apply(this,arguments)})},{key:"loadQuery",value:function(e,r,t){var n=this;Object(d.forEach)(t,(function(e,t){n.sqlData=0===t?{}:n.sqlData;var a=Object(_.extname)(e)?Object(_.join)(r,e):Object(_.join)(r,e+".xml"),s=Object(y.readFileSync)(a,"utf-8");j.parseString(s,(function(e,r){if(e)return console.error(e.stack||e);var t=r.query;n.references=t.sql;Object(d.chain)(["select","update","insert","delete"]).map((function(e){return t[e]||[]})).flatten().map((function(e){return n.sqlData[e.$.id]=e})).value()}))})),this.tablesRaw[e]=this.sqlData,delete this.tables[e]}},{key:"table",value:function(e,r,t){if(!t)return this.getQuery(e);this.loadQuery(e,r,t)}},{key:"model",value:function(){}},{key:"getQuery",value:function(e){var r=this;if(this.tables[e])return this.tables[e];var t=this,n=this.tablesRaw[e],a={get lastQuery(){return t.lastQuery[e]}};return Object(d.forEach)(n,(function(s,i){a[i]=function(){var a=u()(c.a.mark((function a(s,u){var o,p;return c.a.wrap((function(a){for(;;)switch(a.prev=a.next){case 0:return a.next=2,r.process(n[i],s).then((function(e){return r.processVariable(e._,s)})).catch((function(e){return console.error(e.stack)}));case 2:if(o=a.sent,t.lastQuery[e]=o,!u){a.next=8;break}return a.abrupt("return",u.query(o).finally((function(){return u.release()})));case 8:if(!(p=r.getConnection())){a.next=13;break}return a.abrupt("return",p.query(o));case 13:return a.abrupt("return",o);case 14:case"end":return a.stop()}}),a)})));return function(e,r){return a.apply(this,arguments)}}()})),this.tables[e]=a,a}},{key:"process",value:(w=u()(c.a.mark((function e(r,t){var n=this;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",m.a.resolve(r).then(function(){var e=u()(c.a.mark((function e(r){return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r._="",e.next=3,m.a.each(r.$$,function(){var e=u()(c.a.mark((function e(r){var a;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if("__text__"!==r["#name"]){e.next=3;break}e.next=6;break;case 3:return a="process".concat(n.capitalizeFirstLetter(r["#name"])),e.next=6,n[a](r,t);case 6:case"end":return e.stop()}}),e)})));return function(r){return e.apply(this,arguments)}}());case 3:return n.merge_(r),e.abrupt("return",r);case 5:case"end":return e.stop()}}),e)})));return function(r){return e.apply(this,arguments)}}()));case 1:case"end":return e.stop()}}),e)}))),function(e,r){return w.apply(this,arguments)})},{key:"processInclude",value:(k=u()(c.a.mark((function e(r,t){var n,a;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=r.$.refid,a=Object(d.find)(this.references,{$:{id:n}})){e.next=4;break}throw new Error("There is no include id: ".concat(n));case 4:return e.next=6,this.processDeep(a,t);case 6:r._=a._;case 7:case"end":return e.stop()}}),e,this)}))),function(e,r){return k.apply(this,arguments)})},{key:"processDeep",value:(b=u()(c.a.mark((function e(r,t){return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0===Object.keys(r).filter((function(e){return!/_|\${1,2}|#name/.test(e)})).length){e.next=4;break}return e.next=4,this.process(r,t);case 4:case"end":return e.stop()}}),e,this)}))),function(e,r){return b.apply(this,arguments)})},{key:"processIf",value:(x=u()(c.a.mark((function e(r,t){var n;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.processVariable(r.$.test,t).then(this.changeAndOr);case 2:if(n=e.sent,!v()(n)){e.next=11;break}return e.next=6,this.processDeep(r,t);case 6:return e.next=8,this.processVariable(r._,t);case 8:r._=e.sent,e.next=12;break;case 11:r._="";case 12:case"end":return e.stop()}}),e,this)}))),function(e,r){return x.apply(this,arguments)})},{key:"processChoose",value:(h=u()(c.a.mark((function e(r,t){var n=this;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,m.a.each(r.$$,function(){var e=u()(c.a.mark((function e(r){var a,s;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(a=Object(d.get)(r,"$.test"))){e.next=15;break}return e.next=4,n.processVariable(a,t).then(n.changeAndOr);case 4:if(s=e.sent,!v()(s)){e.next=14;break}return e.next=8,n.processDeep(r,t);case 8:return e.next=10,n.processVariable(r._,t);case 10:throw r._=e.sent,new m.a.CancellationError("matched");case 14:r._="";case 15:case"end":return e.stop()}}),e)})));return function(r){return e.apply(this,arguments)}}()).catch(m.a.CancellationError,(function(){return""}));case 2:this.merge_(r,!0);case 3:case"end":return e.stop()}}),e,this)}))),function(e,r){return h.apply(this,arguments)})},{key:"processTrim",value:(f=u()(c.a.mark((function e(r,t){var n=this;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,m.a.each(r.$$,function(){var e=u()(c.a.mark((function e(r){var a,s;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(a=Object(d.get)(r,"$.test"))){e.next=14;break}return e.next=4,n.processVariable(a,t).then(n.changeAndOr);case 4:if(s=e.sent,!v()(s)){e.next=13;break}return e.next=8,n.processDeep(r,t);case 8:return e.next=10,n.processVariable(r._,t);case 10:r._=e.sent,e.next=14;break;case 13:r._="";case 14:case"end":return e.stop()}}),e)})));return function(r){return e.apply(this,arguments)}}());case 2:this.merge_(r),this.processFix(r,r);case 4:case"end":return e.stop()}}),e,this)}))),function(e,r){return f.apply(this,arguments)})},{key:"processWhere",value:(o=u()(c.a.mark((function e(r,t){var n=this;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,m.a.each(r.$$,function(){var e=u()(c.a.mark((function e(r){var a,s;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(a=Object(d.get)(r,"$.test"))){e.next=14;break}return e.next=4,n.processVariable(a,t).then(n.changeAndOr);case 4:if(s=e.sent,!v()(s)){e.next=13;break}return e.next=8,n.processDeep(r,t);case 8:return e.next=10,n.processVariable(r._,t);case 10:r._=e.sent,e.next=14;break;case 13:r._="";case 14:case"end":return e.stop()}}),e)})));return function(r){return e.apply(this,arguments)}}());case 2:this.merge_(r),this.processFix(r,{$:{prefixOverrides:"and |or ",prefix:"WHERE"}});case 4:case"end":return e.stop()}}),e,this)}))),function(e,r){return o.apply(this,arguments)})},{key:"processSet",value:(i=u()(c.a.mark((function e(r,t){var n=this;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,m.a.each(r.$$,function(){var e=u()(c.a.mark((function e(r){var a,s;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(a=Object(d.get)(r,"$.test"))){e.next=14;break}return e.next=4,n.processVariable(a,t).then(n.changeAndOr);case 4:if(s=e.sent,!v()(s)){e.next=13;break}return e.next=8,n.processDeep(r,t);case 8:return e.next=10,n.processVariable(r._,t);case 10:r._=e.sent,e.next=14;break;case 13:r._="";case 14:case"end":return e.stop()}}),e)})));return function(r){return e.apply(this,arguments)}}());case 2:this.merge_(r),this.processFix(r,{$:{suffixOverrides:",",prefix:"SET"}});case 4:case"end":return e.stop()}}),e,this)}))),function(e,r){return i.apply(this,arguments)})},{key:"processForeach",value:(s=u()(c.a.mark((function e(r,t){var n,s,i=this;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.processDeep(r,t);case 2:return n=Object(d.get)(t,r.$.collection)||[],s=[],e.next=6,m.a.each(n,function(){var e=u()(c.a.mark((function e(t,n){var u,o;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,i.processVariable(r._,(u={},a()(u,r.$.item,t),a()(u,r.$.index,n),u));case 2:o=e.sent,s.push(o);case 4:case"end":return e.stop()}}),e)})));return function(r,t){return e.apply(this,arguments)}}());case 6:r._=s.join(r.$.separator),r.$.suffixOverrides=r.$.separator,r.$.prefix=r.$.open,r.$.suffix=r.$.close,this.processFix(r,r);case 11:case"end":return e.stop()}}),e,this)}))),function(e,r){return s.apply(this,arguments)})},{key:"processBind",value:(n=u()(c.a.mark((function e(r,t){var n;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,this.processVariable(r.$.value,t).then(this.changeAndOr);case 2:n=e.sent,t[r.$.name]=v()(n);case 4:case"end":return e.stop()}}),e,this)}))),function(e,r){return n.apply(this,arguments)})},{key:"processVariable",value:(t=u()(c.a.mark((function e(r,t){var n,a,s;return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t||(n=r),a=O.a.escape,s=g.queryFormat?new RegExp(g.queryFormat,"g"):/#{([\w_.]+)}/g,n=r.replace(/\)/g," )").replace(/\( \)/g,"()").replace(s,(function(e,r){r=r.replace(/\(\)/g,"");var n=Object(d.get)(t,r);return Object(d.isFunction)(n)?n=n():(Object(d.isObject)(n)||Object(d.isArray)(n))&&(n=!0),a(n,g.stringifyObjects,g.timezone)})),e.abrupt("return",n.replace(/^\s+|\s+$/g,"").replace(/\s+/g," ").replace(/NULL/g,"undefined"));case 5:case"end":return e.stop()}}),e)}))),function(e,r){return t.apply(this,arguments)})},{key:"changeAndOr",value:(r=u()(c.a.mark((function e(r){return c.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",r.replace(/ and /gi," && ").replace(/ or /gi," || "));case 1:case"end":return e.stop()}}),e)}))),function(e){return r.apply(this,arguments)})},{key:"processFix",value:function(e,r){if(r.$.prefixOverrides){var t=new RegExp("^".concat(r.$.prefixOverrides),"gi");e._=e._.replace(t,"")}if(r.$.suffixOverrides){var n=new RegExp("".concat(r.$.suffixOverrides,"$"),"gi");e._=e._.replace(n,"")}Object(d.isEmpty)(e._)||(e._="".concat(r.$.prefix||""," ").concat(e._," ").concat(r.$.suffix||""))}},{key:"capitalizeFirstLetter",value:function(e){return e.charAt(0).toUpperCase()+e.slice(1)}},{key:"merge_",value:function(e,r){var t=[];Object(d.forEach)(e.$$,(function(e){if(e._&&(t.push(e._),r))return!1})),e._=t.join(" ")}}]),e}();r.default=new $}])}));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9saWJyYXJ5L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9saWJyYXJ5L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2xpYnJhcnkvZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiIiwid2VicGFjazovL2xpYnJhcnkvZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIiIsIndlYnBhY2s6Ly9saWJyYXJ5L2V4dGVybmFsIFwibG9kYXNoXCIiLCJ3ZWJwYWNrOi8vbGlicmFyeS9leHRlcm5hbCBcImJsdWViaXJkXCIiLCJ3ZWJwYWNrOi8vbGlicmFyeS9leHRlcm5hbCBcIm5vZGUtZXZhbFwiIiwid2VicGFjazovL2xpYnJhcnkvZXh0ZXJuYWwgXCJwYXRoXCIiLCJ3ZWJwYWNrOi8vbGlicmFyeS9leHRlcm5hbCBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIiIsIndlYnBhY2s6Ly9saWJyYXJ5L2V4dGVybmFsIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiIiwid2VicGFjazovL2xpYnJhcnkvZXh0ZXJuYWwgXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIiLCJ3ZWJwYWNrOi8vbGlicmFyeS9leHRlcm5hbCBcInhtbDJqc1wiIiwid2VicGFjazovL2xpYnJhcnkvZXh0ZXJuYWwgXCJmc1wiIiwid2VicGFjazovL2xpYnJhcnkvZXh0ZXJuYWwgXCJzcWxzdHJpbmdcIiIsIndlYnBhY2s6Ly9saWJyYXJ5Ly4vc3JjL2NvbmZpZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9saWJyYXJ5Ly4vc3JjL2luZGV4LmpzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsImdsb2JhbCIsImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJyZXF1aXJlIiwicXVlcnlGb3JtYXQiLCJzdHJpbmdpZnlPYmplY3RzIiwidGltZXpvbmUiLCJwYXJzZXIiLCJ4bWwyanMiLCJQYXJzZXIiLCJ0cmltIiwibm9ybWFsaXplIiwicHJlc2VydmVDaGlsZHJlbk9yZGVyIiwiZXhwbGljaXRDaGlsZHJlbiIsImV4cGxpY2l0Q2hhcmtleSIsImNoYXJzQXNDaGlsZHJlbiIsIk15YmF0aXMzIiwidGhpcyIsInRhYmxlc1JhdyIsInRhYmxlcyIsImxhc3RRdWVyeSIsInNxbERhdGEiLCJyZWZlcmVuY2VzIiwicG9vbCIsImdldENvbm5lY3Rpb25Bc3luYyIsIlByb21pc2UiLCJwcm9taXNpZnkiLCJnZXRDb25uZWN0aW9uIiwiaXNGdW5jdGlvbiIsImNvbm4iLCJjdHgiLCJ0YWJsZSIsImdldFF1ZXJ5Iiwic2VsZiIsImZvckVhY2giLCJmbiIsInBhcnRpYWxSaWdodCIsImV4ZWNRdWVyeSIsImNvbm5lY3Rpb24iLCJmbk1vZGVsIiwiYmVnaW5UcmFuc2FjdGlvbiIsInJzdCIsImNvbW1pdCIsInJlbGVhc2UiLCJyb2xsYmFjayIsInRhYmxlTmFtZSIsInBhdGgiLCJ4bWxGaWxlbmFtZXMiLCJmaWxlbmFtZSIsImlkeCIsImRpciIsImV4dG5hbWUiLCJqb2luIiwieG1sIiwicmVhZEZpbGVTeW5jIiwicGFyc2VTdHJpbmciLCJlcnIiLCJkYXRhIiwiY29uc29sZSIsImVycm9yIiwic3RhY2siLCJqc29uRGF0YSIsInF1ZXJ5Iiwic3FsIiwiY2hhaW4iLCJtYXAiLCJjbWQiLCJmbGF0dGVuIiwiaXRlbSIsIiQiLCJpZCIsInhtbHMiLCJsb2FkUXVlcnkiLCJwYXJhbXMiLCJhIiwicHJvY2VzcyIsInRoZW4iLCJwcm9jZXNzVmFyaWFibGUiLCJfIiwicXJ5IiwiX2Nvbm4iLCJyZXNvbHZlIiwiZWFjaCIsIiQkIiwicHJvYyIsImNhcGl0YWxpemVGaXJzdExldHRlciIsIm1lcmdlXyIsInJlZmlkIiwiZmluZCIsIkVycm9yIiwicHJvY2Vzc0RlZXAiLCJrZXlzIiwiZmlsdGVyIiwidGVzdCIsImxlbmd0aCIsImNoYW5nZUFuZE9yIiwibm9kZUV2YWwiLCJfY2FzZSIsInRlc3RTdHIiLCJDYW5jZWxsYXRpb25FcnJvciIsInByb2Nlc3NGaXgiLCJwcmVmaXhPdmVycmlkZXMiLCJwcmVmaXgiLCJzdWZmaXhPdmVycmlkZXMiLCJjb2xsZWN0aW9uIiwicHJvY2Vzc2VkQXJyIiwiY29sIiwiaW5kZXgiLCJwdXNoIiwic2VwYXJhdG9yIiwib3BlbiIsInN1ZmZpeCIsImNsb3NlIiwiZXNjYXBlIiwic3Fsc3RyaW5nIiwicmVnIiwiY29uZmlnIiwiUmVnRXhwIiwicmVwbGFjZSIsInR4dCIsInZhbCIsImlzT2JqZWN0IiwiaXNBcnJheSIsInN0ciIsImlzRW1wdHkiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwiY2hvb3NlIl0sIm1hcHBpbmdzIjoid0NBQUEsU0FBMkNBLEVBQU1DLEdBQzFCLGlCQUFaQyxTQUEwQyxpQkFBWEMsT0FDeENBLE9BQU9ELFFBQVVELElBQ1EsbUJBQVhHLFFBQXlCQSxPQUFPQyxJQUM5Q0QsT0FBTyxVQUFXLEdBQUlILEdBQ0ksaUJBQVpDLFFBQ2RBLFFBQWlCLFFBQUlELElBRXJCRCxFQUFjLFFBQUlDLElBUnBCLENBU0dLLFFBQVEsV0FDWCxPLFlDVEUsSUFBSUMsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdBQUdGLEVBQWlCRSxHQUNuQixPQUFPRixFQUFpQkUsR0FBVVAsUUFHbkMsSUFBSUMsRUFBU0ksRUFBaUJFLEdBQVksQ0FDekNDLEVBQUdELEVBQ0hFLEdBQUcsRUFDSFQsUUFBUyxJQVVWLE9BTkFVLEVBQVFILEdBQVVJLEtBQUtWLEVBQU9ELFFBQVNDLEVBQVFBLEVBQU9ELFFBQVNNLEdBRy9ETCxFQUFPUSxHQUFJLEVBR0pSLEVBQU9ELFFBMERmLE9BckRBTSxFQUFvQk0sRUFBSUYsRUFHeEJKLEVBQW9CTyxFQUFJUixFQUd4QkMsRUFBb0JRLEVBQUksU0FBU2QsRUFBU2UsRUFBTUMsR0FDM0NWLEVBQW9CVyxFQUFFakIsRUFBU2UsSUFDbENHLE9BQU9DLGVBQWVuQixFQUFTZSxFQUFNLENBQUVLLFlBQVksRUFBTUMsSUFBS0wsS0FLaEVWLEVBQW9CZ0IsRUFBSSxTQUFTdEIsR0FDWCxvQkFBWHVCLFFBQTBCQSxPQUFPQyxhQUMxQ04sT0FBT0MsZUFBZW5CLEVBQVN1QixPQUFPQyxZQUFhLENBQUVDLE1BQU8sV0FFN0RQLE9BQU9DLGVBQWVuQixFQUFTLGFBQWMsQ0FBRXlCLE9BQU8sS0FRdkRuQixFQUFvQm9CLEVBQUksU0FBU0QsRUFBT0UsR0FFdkMsR0FEVSxFQUFQQSxJQUFVRixFQUFRbkIsRUFBb0JtQixJQUMvQixFQUFQRSxFQUFVLE9BQU9GLEVBQ3BCLEdBQVcsRUFBUEUsR0FBOEIsaUJBQVZGLEdBQXNCQSxHQUFTQSxFQUFNRyxXQUFZLE9BQU9ILEVBQ2hGLElBQUlJLEVBQUtYLE9BQU9ZLE9BQU8sTUFHdkIsR0FGQXhCLEVBQW9CZ0IsRUFBRU8sR0FDdEJYLE9BQU9DLGVBQWVVLEVBQUksVUFBVyxDQUFFVCxZQUFZLEVBQU1LLE1BQU9BLElBQ3RELEVBQVBFLEdBQTRCLGlCQUFURixFQUFtQixJQUFJLElBQUlNLEtBQU9OLEVBQU9uQixFQUFvQlEsRUFBRWUsRUFBSUUsRUFBSyxTQUFTQSxHQUFPLE9BQU9OLEVBQU1NLElBQVFDLEtBQUssS0FBTUQsSUFDOUksT0FBT0YsR0FJUnZCLEVBQW9CMkIsRUFBSSxTQUFTaEMsR0FDaEMsSUFBSWUsRUFBU2YsR0FBVUEsRUFBTzJCLFdBQzdCLFdBQXdCLE9BQU8zQixFQUFnQixTQUMvQyxXQUE4QixPQUFPQSxHQUV0QyxPQURBSyxFQUFvQlEsRUFBRUUsRUFBUSxJQUFLQSxHQUM1QkEsR0FJUlYsRUFBb0JXLEVBQUksU0FBU2lCLEVBQVFDLEdBQVksT0FBT2pCLE9BQU9rQixVQUFVQyxlQUFlMUIsS0FBS3VCLEVBQVFDLElBR3pHN0IsRUFBb0JnQyxFQUFJLEdBSWpCaEMsRUFBb0JBLEVBQW9CaUMsRUFBSSxJLGdCQ2xGckR0QyxFQUFPRCxRQUFVd0MsUUFBUSwrQixjQ0F6QnZDLEVBQU9ELFFBQVV3QyxRQUFRLDRDLGNDQXpCdkMsRUFBT0QsUUFBVXdDLFFBQVEsVyxjQ0F6QnZDLEVBQU9ELFFBQVV3QyxRQUFRLGEsY0NBekJ2QyxFQUFPRCxRQUFVd0MsUUFBUSxjLGNDQXpCdkMsRUFBT0QsUUFBVXdDLFFBQVEsUyxjQ0F6QnZDLEVBQU9ELFFBQVV3QyxRQUFRLDBDLGNDQXpCdkMsRUFBT0QsUUFBVXdDLFFBQVEsMEMsY0NBekJ2QyxFQUFPRCxRQUFVd0MsUUFBUSx1QyxjQ0F6QnZDLEVBQU9ELFFBQVV3QyxRQUFRLFcsY0NBekJ2QyxFQUFPRCxRQUFVd0MsUUFBUSxPLGNDQXpCdkMsRUFBT0QsUUFBVXdDLFFBQVEsYyx1TENBVixFQUNSLENBQ0hDLFlBQWEsZ0JBQ2JDLGtCQUFrQixFQUNsQkMsVUFBVSxHLHdCQ2VSQyxFQUFTLElBQUlDLElBQU9DLE9BQU8sQ0FDL0JDLE1BQU0sRUFDTkMsV0FBVyxFQUNYQyx1QkFBdUIsRUFDdkJDLGtCQUFrQixFQUNsQkMsaUJBQWlCLEVBQ2pCQyxpQkFBaUIsSUFJYkMsRSxXQUNKLGFBQWMsWUFDWkMsS0FBS0MsVUFBWSxHQUNqQkQsS0FBS0UsT0FBUyxHQUNkRixLQUFLRyxVQUFZLEdBQ2pCSCxLQUFLSSxRQUFVLEdBQ2ZKLEtBQUtLLFdBQWEsRyxnRkFHTkMsR0FDWk4sS0FBS00sS0FBT0EsRUFDWk4sS0FBS00sS0FBS0MsbUJBQXFCQyxJQUFRQyxVQUFVVCxLQUFLTSxLQUFLSSxpQixzQ0FJM0QsT0FBSUMscUJBQVdYLEtBQUtNLE1BQ1hOLEtBQUtNLE9BRUxOLEtBQUtNLE8sOEJBSVI3QyxFQUFNbUQsR0FDWixJQUFNQyxFQUFNLEdBQ05DLEVBQVFkLEtBQUtlLFNBQVN0RCxHQUN0QnVELEVBQU9oQixLQVViLE9BVEFpQixrQkFBUUgsR0FBTyxTQUFDSSxFQUFJekMsR0FDTixjQUFSQSxFQUNGYixPQUFPQyxlQUFlZ0QsRUFBS3BDLEVBQUssQ0FDOUJWLElBQUssa0JBQU1pRCxFQUFLYixVQUFVMUMsTUFHNUJvRCxFQUFJcEMsR0FBTzBDLHVCQUFhRCxFQUFJTixNQUd6QkMsSSxxREFHU08sRyxrR0FHS3BCLEtBQUtNLEtBQUtDLHFCLGNBQTdCYyxFLFFBQ1dQLE1BQVFLLHVCQUFhbkIsS0FBS3NCLFFBQVNELEdBQVkzQyxLQUFLc0IsTSxTQUN6RHFCLEVBQVdFLG1CLHVCQUNMSCxFQUFVQyxHLGNBQXRCRyxFLGlCQUNNSCxFQUFXSSxTLFFBQ2pCSixFQUFXSyxVLG1FQUVMTCxFQUFXTSxXLGNBQ2pCTixFQUFXSyxVLHNDQUdORixHLHdJQUlDSSxFQUFXQyxFQUFNQyxHQUFjLFdBQ3ZDYixrQkFBUWEsR0FBYyxTQUFDQyxFQUFVQyxHQUMvQixFQUFLNUIsUUFBa0IsSUFBUjRCLEVBQVksR0FBSyxFQUFLNUIsUUFDckMsSUFDTTZCLEVBRE1DLGtCQUFRSCxHQUNGSSxlQUFLTixFQUFNRSxHQUFZSSxlQUFLTixFQUFNRSxFQUFXLFFBQ3pESyxFQUFNQyx1QkFBYUosRUFBSyxTQUU5QjNDLEVBQU9nRCxZQUFZRixHQUFLLFNBQUNHLEVBQUtDLEdBQzVCLEdBQUlELEVBQ0YsT0FBT0UsUUFBUUMsTUFBTUgsRUFBSUksT0FBU0osR0FFcEMsSUFBTUssRUFBV0osRUFBS0ssTUFDdEIsRUFBS3hDLFdBQWF1QyxFQUFTRSxJQUUzQkMsZ0JBRGlCLENBQUMsU0FBVSxTQUFVLFNBQVUsV0FFN0NDLEtBQUksU0FBQUMsR0FBRyxPQUFJTCxFQUFTSyxJQUFRLE1BQzVCQyxVQUNBRixLQUFJLFNBQUFHLEdBQUksT0FBSyxFQUFLL0MsUUFBUStDLEVBQUtDLEVBQUVDLElBQU1GLEtBQ3ZDaEYsY0FHUDZCLEtBQUtDLFVBQVUyQixHQUFhNUIsS0FBS0ksZUFDMUJKLEtBQUtFLE9BQU8wQixLLDRCQUlmQSxFQUFXSyxFQUFLcUIsR0FDcEIsSUFBSUEsRUFHRixPQUFPdEQsS0FBS2UsU0FBU2EsR0FGckI1QixLQUFLdUQsVUFBVTNCLEVBQVdLLEVBQUtxQixLLGdFQVcxQjFCLEdBQVcsV0FDbEIsR0FBSTVCLEtBQUtFLE9BQU8wQixHQUFZLE9BQU81QixLQUFLRSxPQUFPMEIsR0FDL0MsSUFBTVosRUFBT2hCLEtBQ1BJLEVBQVVKLEtBQUtDLFVBQVUyQixHQUN6QkosRUFBTSxDQUNWLGdCQUNFLE9BQU9SLEVBQUtiLFVBQVV5QixLQXlCMUIsT0F0QkFYLGtCQUFRYixHQUFTLFNBQUMwQyxFQUFLckUsR0FDckIrQyxFQUFJL0MsR0FBSiwrQkFBVyxXQUFPK0UsRUFBUTVDLEdBQWYsaUJBQUE2QyxFQUFBLHNFQUNTLEVBQUtDLFFBQVF0RCxFQUFRM0IsR0FBTStFLEdBQzFDRyxNQUFLLFNBQUF2QixHQUFHLE9BQUksRUFBS3dCLGdCQUFnQnhCLEVBQUl5QixFQUFHTCxNQUR6QixPQUVULFNBQUFqQixHQUFHLE9BQUlFLFFBQVFDLE1BQU1ILEVBQUlJLFVBSHpCLFVBQ0htQixFQURHLE9BS1Q5QyxFQUFLYixVQUFVeUIsR0FBYWtDLEdBRXhCbEQsRUFQSyx5Q0FRQUEsRUFBS2lDLE1BQU1pQixHQUFYLFNBQXdCLGtCQUFNbEQsRUFBS2MsY0FSbkMsWUFVRHFDLEVBQVEsRUFBS3JELGlCQVZaLDBDQVlFcUQsRUFBTWxCLE1BQU1pQixJQVpkLGlDQWNFQSxHQWRGLDRDQUFYLDJEQW9CRjlELEtBQUtFLE9BQU8wQixHQUFhSixFQUNsQkEsSSxpREFHS1ksRUFBS29CLEcscUdBRVZoRCxJQUFRd0QsUUFBUTVCLEdBQUt1QixLQUFyQiwrQkFBMEIsV0FBTXZCLEdBQU4sU0FBQXFCLEVBQUEsNkRBRS9CckIsRUFBSXlCLEVBQUksR0FGdUIsU0FHekJyRCxJQUFReUQsS0FBSzdCLEVBQUk4QixHQUFqQiwrQkFBcUIsV0FBTWYsR0FBTixlQUFBTSxFQUFBLHlEQUVILGFBQWxCTixFQUFLLFNBRmdCLDZDQUlqQmdCLEVBSmlCLGlCQUlBLEVBQUtDLHNCQUFzQmpCLEVBQUssV0FKaEMsU0FLakIsRUFBS2dCLEdBQU1oQixFQUFNSyxHQUxBLDJDQUFyQix1REFIeUIsY0FhL0IsRUFBS2EsT0FBT2pDLEdBYm1CLGtCQWdCeEJBLEdBaEJ3QiwyQ0FBMUIsd0QsbUpBb0JZZSxFQUFNSyxHLDRFQUVuQkgsRUFBS0YsRUFBS0MsRUFBRWtCLE1BQ1psRyxFQUFJbUcsZUFBS3ZFLEtBQUtLLFdBQVksQ0FBRStDLEVBQUcsQ0FBRUMsR0FBSUEsSyxzQkFFbkMsSUFBSW1CLE1BQUosa0NBQXFDbkIsSSx1QkFHdkNyRCxLQUFLeUUsWUFBWXJHLEVBQUdvRixHLE9BQzFCTCxFQUFLVSxFQUFJekYsRUFBRXlGLEUscUpBR0t6QixFQUFLb0IsRyxvRUFJRCxJQURQNUYsT0FBTzhHLEtBQUt0QyxHQUFLdUMsUUFBTyxTQUFBbEcsR0FBRyxPQUFLLGtCQUFrQm1HLEtBQUtuRyxNQUMzRG9HLE8sZ0NBQ0Q3RSxLQUFLMEQsUUFBUXRCLEVBQUtvQixHLG1KQUlaTCxFQUFNSyxHLHVGQUVEeEQsS0FBSzRELGdCQUFnQlQsRUFBS0MsRUFBRXdCLEtBQU1wQixHQUFRRyxLQUFLM0QsS0FBSzhFLGEsVUFBakVGLEUsUUFDRkcsSUFBU0gsRyxpQ0FDTDVFLEtBQUt5RSxZQUFZdEIsRUFBTUssRyx1QkFDZHhELEtBQUs0RCxnQkFBZ0JULEVBQUtVLEVBQUdMLEcsT0FBNUNMLEVBQUtVLEUsK0JBRUxWLEVBQUtVLEVBQUksRyx3SkFJT1YsRUFBTUssRyw0RkFHbEJoRCxJQUFReUQsS0FBS2QsRUFBS2UsR0FBbEIsK0JBQXNCLFdBQU1jLEdBQU4saUJBQUF2QixFQUFBLDJEQUVwQndCLEVBQVVsSCxjQUFJaUgsRUFBTyxXQUZELGlDQUlMLEVBQUtwQixnQkFBZ0JxQixFQUFTekIsR0FBUUcsS0FBSyxFQUFLbUIsYUFKM0MsVUFJbEJGLEVBSmtCLFFBTXBCRyxJQUFTSCxHQU5XLGlDQU9oQixFQUFLSCxZQUFZTyxFQUFPeEIsR0FQUix3QkFRTixFQUFLSSxnQkFBZ0JvQixFQUFNbkIsRUFBR0wsR0FSeEIsY0FRdEJ3QixFQUFNbkIsRUFSZ0IsT0FTaEIsSUFBSXJELElBQVEwRSxrQkFBa0IsV0FUZCxRQVd0QkYsRUFBTW5CLEVBQUksR0FYWSw0Q0FBdEIsNkRBZUdyRCxJQUFRMEUsbUJBQW1CLGlCQUFNLE0sT0FDMUNsRixLQUFLcUUsT0FBT2xCLEdBQU0sRyxxSkFJRkEsRUFBTUssRyw0RkFHaEJoRCxJQUFReUQsS0FBS2QsRUFBS2UsR0FBbEIsK0JBQXNCLFdBQU1jLEdBQU4saUJBQUF2QixFQUFBLDJEQUVwQndCLEVBQVVsSCxjQUFJaUgsRUFBTyxXQUZELGlDQUlMLEVBQUtwQixnQkFBZ0JxQixFQUFTekIsR0FBUUcsS0FBSyxFQUFLbUIsYUFKM0MsVUFJbEJGLEVBSmtCLFFBTXBCRyxJQUFTSCxHQU5XLGlDQU9oQixFQUFLSCxZQUFZTyxFQUFPeEIsR0FQUix3QkFRTixFQUFLSSxnQkFBZ0JvQixFQUFNbkIsRUFBR0wsR0FSeEIsUUFRdEJ3QixFQUFNbkIsRUFSZ0IsK0JBVXRCbUIsRUFBTW5CLEVBQUksR0FWWSw0Q0FBdEIsdUQsT0FlTjdELEtBQUtxRSxPQUFPbEIsR0FDWm5ELEtBQUttRixXQUFXaEMsRUFBTUEsRyxzSkFHTEEsRUFBTUssRyw0RkFHakJoRCxJQUFReUQsS0FBS2QsRUFBS2UsR0FBbEIsK0JBQXNCLFdBQU1jLEdBQU4saUJBQUF2QixFQUFBLDJEQUVwQndCLEVBQVVsSCxjQUFJaUgsRUFBTyxXQUZELGlDQUlMLEVBQUtwQixnQkFBZ0JxQixFQUFTekIsR0FBUUcsS0FBSyxFQUFLbUIsYUFKM0MsVUFJbEJGLEVBSmtCLFFBTXBCRyxJQUFTSCxHQU5XLGlDQU9oQixFQUFLSCxZQUFZTyxFQUFPeEIsR0FQUix3QkFRTixFQUFLSSxnQkFBZ0JvQixFQUFNbkIsRUFBR0wsR0FSeEIsUUFRdEJ3QixFQUFNbkIsRUFSZ0IsK0JBVXRCbUIsRUFBTW5CLEVBQUksR0FWWSw0Q0FBdEIsdUQsT0FlTjdELEtBQUtxRSxPQUFPbEIsR0FDWm5ELEtBQUttRixXQUFXaEMsRUFBTSxDQUFFQyxFQUFHLENBQUVnQyxnQkFBaUIsV0FBWUMsT0FBUSxXLG9KQUluRGxDLEVBQU1LLEcsNEZBR2ZoRCxJQUFReUQsS0FBS2QsRUFBS2UsR0FBbEIsK0JBQXNCLFdBQU1jLEdBQU4saUJBQUF2QixFQUFBLDJEQUVwQndCLEVBQVVsSCxjQUFJaUgsRUFBTyxXQUZELGlDQUlMLEVBQUtwQixnQkFBZ0JxQixFQUFTekIsR0FBUUcsS0FBSyxFQUFLbUIsYUFKM0MsVUFJbEJGLEVBSmtCLFFBTXBCRyxJQUFTSCxHQU5XLGlDQU9oQixFQUFLSCxZQUFZTyxFQUFPeEIsR0FQUix3QkFRTixFQUFLSSxnQkFBZ0JvQixFQUFNbkIsRUFBR0wsR0FSeEIsUUFRdEJ3QixFQUFNbkIsRUFSZ0IsK0JBVXRCbUIsRUFBTW5CLEVBQUksR0FWWSw0Q0FBdEIsdUQsT0FlTjdELEtBQUtxRSxPQUFPbEIsR0FDWm5ELEtBQUttRixXQUFXaEMsRUFBTSxDQUFFQyxFQUFHLENBQUVrQyxnQkFBaUIsSUFBS0QsT0FBUSxTLHdKQUl4Q2xDLEVBQU1LLEcsZ0dBR25CeEQsS0FBS3lFLFlBQVl0QixFQUFNSyxHLGNBQ3ZCK0IsRUFBYXhILGNBQUl5RixFQUFRTCxFQUFLQyxFQUFFbUMsYUFBZSxHQUMvQ0MsRUFBZSxHLFNBRWZoRixJQUFReUQsS0FBS3NCLEVBQWIsK0JBQXlCLFdBQU9FLEVBQUt6RCxHQUFaLGlCQUFBeUIsRUFBQSxzRUFDWCxFQUFLRyxnQkFBZ0JULEVBQUtVLEdBQTFCLFdBQ2ZWLEVBQUtDLEVBQUVELEtBQU9zQyxHQURDLE1BRWZ0QyxFQUFLQyxFQUFFc0MsTUFBUTFELEdBRkEsSUFEVyxPQUN2QjhCLEVBRHVCLE9BSzdCMEIsRUFBYUcsS0FBSzdCLEdBTFcsMkNBQXpCLHlELE9BT05YLEVBQUtVLEVBQUkyQixFQUFhckQsS0FBS2dCLEVBQUtDLEVBQUV3QyxXQUNsQ3pDLEVBQUtDLEVBQUVrQyxnQkFBa0JuQyxFQUFLQyxFQUFFd0MsVUFDaEN6QyxFQUFLQyxFQUFFaUMsT0FBU2xDLEVBQUtDLEVBQUV5QyxLQUN2QjFDLEVBQUtDLEVBQUUwQyxPQUFTM0MsRUFBS0MsRUFBRTJDLE1BQ3ZCL0YsS0FBS21GLFdBQVdoQyxFQUFNQSxHLHNKQUlOQSxFQUFNSyxHLHVGQUdOeEQsS0FBSzRELGdCQUFnQlQsRUFBS0MsRUFBRWpGLE1BQU9xRixHQUFRRyxLQUFLM0QsS0FBSzhFLGEsT0FBL0Q3RixFLE9BQ051RSxFQUFPTCxFQUFLQyxFQUFFM0YsTUFBUXNILElBQVM5RixHLHlKQUdYNkUsRUFBS04sRyxrRkFFcEJBLElBQ0hoQyxFQUFNc0MsR0FHRmtDLEVBQVNDLElBQVVELE9BQ25CRSxFQUFNQyxFQUFXaEgsWUFBYyxJQUFJaUgsT0FBT0QsRUFBV2hILFlBQWEsS0FBTyxnQkFDL0VxQyxFQUFNc0MsRUFDSHVDLFFBQVEsTUFBTyxNQUNmQSxRQUFRLFNBQVUsTUFDbEJBLFFBQVFILEdBQUssU0FBQ0ksRUFBSzdILEdBQ2xCQSxFQUFNQSxFQUFJNEgsUUFBUSxRQUFTLElBQzNCLElBQUlFLEVBQU14SSxjQUFJeUYsRUFBUS9FLEdBTXRCLE9BTElrQyxxQkFBVzRGLEdBQ2JBLEVBQU1BLEtBQ0dDLG1CQUFTRCxJQUFRRSxrQkFBUUYsTUFDbENBLEdBQU0sR0FFRFAsRUFBT08sRUFBS0osRUFBVy9HLGlCQUFrQitHLEVBQVc5RyxhLGtCQUV4RG1DLEVBQ0o2RSxRQUFRLGFBQWMsSUFDdEJBLFFBQVEsT0FBUSxLQUNoQkEsUUFBUSxRQUFTLGMsZ0pBR0pLLEcsMEZBQ1RBLEVBQUlMLFFBQVEsVUFBVyxRQUFRQSxRQUFRLFNBQVUsUywwSEFHL0NsRCxFQUFNZixHQUNmLEdBQUlBLEVBQUlnQixFQUFFZ0MsZ0JBQWlCLENBQ3pCLElBQU1jLEVBQU0sSUFBSUUsT0FBSixXQUFlaEUsRUFBSWdCLEVBQUVnQyxpQkFBbUIsTUFDcERqQyxFQUFLVSxFQUFJVixFQUFLVSxFQUFFd0MsUUFBUUgsRUFBSyxJQUcvQixHQUFJOUQsRUFBSWdCLEVBQUVrQyxnQkFBaUIsQ0FDekIsSUFBTVksRUFBTSxJQUFJRSxPQUFKLFVBQWNoRSxFQUFJZ0IsRUFBRWtDLGdCQUFwQixLQUF3QyxNQUNwRG5DLEVBQUtVLEVBQUlWLEVBQUtVLEVBQUV3QyxRQUFRSCxFQUFLLElBRzFCUyxrQkFBUXhELEVBQUtVLEtBQ2hCVixFQUFLVSxFQUFMLFVBQVl6QixFQUFJZ0IsRUFBRWlDLFFBQVUsR0FBNUIsWUFBa0NsQyxFQUFLVSxFQUF2QyxZQUE0Q3pCLEVBQUlnQixFQUFFMEMsUUFBVSxPLDRDQUsxQ1ksR0FDcEIsT0FBT0EsRUFBSUUsT0FBTyxHQUFHQyxjQUFnQkgsRUFBSUksTUFBTSxLLDZCQUcxQzFFLEVBQUsyRSxHQUNWLElBQU12QixFQUFlLEdBQ3JCdkUsa0JBQVFtQixFQUFJOEIsSUFBSSxTQUFBZixHQUNkLEdBQUlBLEVBQUtVLElBQ1AyQixFQUFhRyxLQUFLeEMsRUFBS1UsR0FFbkJrRCxHQUNGLE9BQU8sS0FLYjNFLEVBQUl5QixFQUFJMkIsRUFBYXJELEtBQUssUyxLQUlmLGNBQUlwQyIsImZpbGUiOiJsaWJyYXJ5Lm1pbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwibGlicmFyeVwiLCBbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJsaWJyYXJ5XCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImxpYnJhcnlcIl0gPSBmYWN0b3J5KCk7XG59KShnbG9iYWwsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxMik7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9yZWdlbmVyYXRvclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2FzeW5jVG9HZW5lcmF0b3JcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibG9kYXNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImJsdWViaXJkXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGUtZXZhbFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJwYXRoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVja1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2NyZWF0ZUNsYXNzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInhtbDJqc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzcWxzdHJpbmdcIik7IiwiZXhwb3J0IGRlZmF1bHQge1xuICBzcWw6IHtcbiAgICBxdWVyeUZvcm1hdDogLzooW1xcd18uKCldKykvZyxcbiAgICBzdHJpbmdpZnlPYmplY3RzOiBmYWxzZSxcbiAgICB0aW1lem9uZTogZmFsc2VcbiAgfSxcbiAgbG9nOiB7XG4gICAgbGV2ZWw6ICdpbmZvJywgLy8gJ2ZhdGFsJywgJ2Vycm9yJywgJ3dhcm4nLCAnaW5mbycsICdkZWJ1ZycsICd0cmFjZSdcbiAgICB0cmFjZUxpbmVudW1iZXI6IHRydWUsXG4gICAgdGltZUZvcm1hdDogJ1lZWVktTU0tREQgQSBoaDptbTpzcycsXG4gICAgcHJldHR5OiB0cnVlLFxuICAgIG1hcDoge1xuICAgICAgbXliYXRpczM6ICdmYXRhbCcsXG4gICAgICAnKic6ICd0cmFjZSdcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB4bWwyanMgZnJvbSAneG1sMmpzJ1xuaW1wb3J0IG5vZGVFdmFsIGZyb20gJ25vZGUtZXZhbCdcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJ1xuaW1wb3J0IHtcbiAgZm9yRWFjaCxcbiAgZmluZCxcbiAgY2hhaW4sXG4gIGlzRW1wdHksXG4gIHBhcnRpYWxSaWdodCxcbiAgZ2V0LFxuICBpc0FycmF5LFxuICBpc09iamVjdCxcbiAgaXNGdW5jdGlvblxufSBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgUHJvbWlzZSBmcm9tICdibHVlYmlyZCdcbmltcG9ydCBjb25maWcgZnJvbSAnLi9jb25maWcnXG5pbXBvcnQgc3Fsc3RyaW5nIGZyb20gJ3NxbHN0cmluZydcbmltcG9ydCB7IGpvaW4sIGV4dG5hbWUgfSBmcm9tICdwYXRoJ1xuLy8gaW1wb3J0ICRsb2cgZnJvbSAnLi9sb2cnXG5jb25zdCBwYXJzZXIgPSBuZXcgeG1sMmpzLlBhcnNlcih7XG4gIHRyaW06IHRydWUsXG4gIG5vcm1hbGl6ZTogdHJ1ZSxcbiAgcHJlc2VydmVDaGlsZHJlbk9yZGVyOiB0cnVlLFxuICBleHBsaWNpdENoaWxkcmVuOiB0cnVlLFxuICBleHBsaWNpdENoYXJrZXk6IHRydWUsXG4gIGNoYXJzQXNDaGlsZHJlbjogdHJ1ZVxufSlcbi8vIGNvbnN0IGxvZyA9ICRsb2cuZ2V0SW5zdGFuY2UoJ215YmF0aXMzJylcblxuY2xhc3MgTXliYXRpczMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnRhYmxlc1JhdyA9IFtdXG4gICAgdGhpcy50YWJsZXMgPSBbXVxuICAgIHRoaXMubGFzdFF1ZXJ5ID0ge31cbiAgICB0aGlzLnNxbERhdGEgPSB7fSAvLyB4bWwgcmF3IHF1ZXJ5XG4gICAgdGhpcy5yZWZlcmVuY2VzID0gW10gLy8gaW5jbHVkZeqwgCDsoJXsnZjrkJwgYXJyYXlcbiAgfVxuXG4gIHNldENvbm5lY3Rpb24ocG9vbCkge1xuICAgIHRoaXMucG9vbCA9IHBvb2xcbiAgICB0aGlzLnBvb2wuZ2V0Q29ubmVjdGlvbkFzeW5jID0gUHJvbWlzZS5wcm9taXNpZnkodGhpcy5wb29sLmdldENvbm5lY3Rpb24pXG4gIH1cblxuICBnZXRDb25uZWN0aW9uKCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMucG9vbCkpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvb2woKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wb29sXG4gICAgfVxuICB9XG5cbiAgZm5Nb2RlbChuYW1lLCBjb25uKSB7XG4gICAgY29uc3QgY3R4ID0ge31cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuZ2V0UXVlcnkobmFtZSlcbiAgICBjb25zdCBzZWxmID0gdGhpc1xuICAgIGZvckVhY2godGFibGUsIChmbiwga2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSAnbGFzdFF1ZXJ5Jykge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3R4LCBrZXksIHtcbiAgICAgICAgICBnZXQ6ICgpID0+IHNlbGYubGFzdFF1ZXJ5W25hbWVdXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdHhba2V5XSA9IHBhcnRpYWxSaWdodChmbiwgY29ubilcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBjdHhcbiAgfVxuXG4gIGFzeW5jIHRyYW5zYWN0aW9uKGV4ZWNRdWVyeSkge1xuICAgIGxldCBjb25uZWN0aW9uLCByc3RcbiAgICB0cnkge1xuICAgICAgY29ubmVjdGlvbiA9IGF3YWl0IHRoaXMucG9vbC5nZXRDb25uZWN0aW9uQXN5bmMoKVxuICAgICAgY29ubmVjdGlvbi50YWJsZSA9IHBhcnRpYWxSaWdodCh0aGlzLmZuTW9kZWwsIGNvbm5lY3Rpb24pLmJpbmQodGhpcylcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uYmVnaW5UcmFuc2FjdGlvbigpXG4gICAgICByc3QgPSBhd2FpdCBleGVjUXVlcnkoY29ubmVjdGlvbilcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uY29tbWl0KClcbiAgICAgIGNvbm5lY3Rpb24ucmVsZWFzZSgpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXdhaXQgY29ubmVjdGlvbi5yb2xsYmFjaygpXG4gICAgICBjb25uZWN0aW9uLnJlbGVhc2UoKVxuICAgICAgdGhyb3cgZVxuICAgIH1cbiAgICByZXR1cm4gcnN0XG4gIH1cblxuICAvLyBsb2FkUXVlcnkocGF0aCwgaWR4KSB7XG4gIGxvYWRRdWVyeSh0YWJsZU5hbWUsIHBhdGgsIHhtbEZpbGVuYW1lcykge1xuICAgIGZvckVhY2goeG1sRmlsZW5hbWVzLCAoZmlsZW5hbWUsIGlkeCkgPT4ge1xuICAgICAgdGhpcy5zcWxEYXRhID0gaWR4ID09PSAwID8ge30gOiB0aGlzLnNxbERhdGFcbiAgICAgIGNvbnN0IGV4dCA9IGV4dG5hbWUoZmlsZW5hbWUpXG4gICAgICBjb25zdCBkaXIgPSBleHQgPyBqb2luKHBhdGgsIGZpbGVuYW1lKSA6IGpvaW4ocGF0aCwgZmlsZW5hbWUgKyAnLnhtbCcpXG4gICAgICBjb25zdCB4bWwgPSByZWFkRmlsZVN5bmMoZGlyLCAndXRmLTgnKVxuICAgICAgLy8gbG9nLmRlYnVnKCd4bWxzJywgeG1sKVxuICAgICAgcGFyc2VyLnBhcnNlU3RyaW5nKHhtbCwgKGVyciwgZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrIHx8IGVycilcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBqc29uRGF0YSA9IGRhdGEucXVlcnlcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VzID0ganNvbkRhdGEuc3FsXG4gICAgICAgIGNvbnN0IGNvbW1hbmRzID0gWydzZWxlY3QnLCAndXBkYXRlJywgJ2luc2VydCcsICdkZWxldGUnXVxuICAgICAgICBjaGFpbihjb21tYW5kcylcbiAgICAgICAgICAubWFwKGNtZCA9PiBqc29uRGF0YVtjbWRdIHx8IFtdKVxuICAgICAgICAgIC5mbGF0dGVuKClcbiAgICAgICAgICAubWFwKGl0ZW0gPT4gKHRoaXMuc3FsRGF0YVtpdGVtLiQuaWRdID0gaXRlbSkpXG4gICAgICAgICAgLnZhbHVlKClcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0aGlzLnRhYmxlc1Jhd1t0YWJsZU5hbWVdID0gdGhpcy5zcWxEYXRhXG4gICAgZGVsZXRlIHRoaXMudGFibGVzW3RhYmxlTmFtZV1cbiAgICAvLyBsb2cuZGVidWcodGhpcy5zcWxEYXRhKVxuICB9XG5cbiAgdGFibGUodGFibGVOYW1lLCBkaXIsIHhtbHMpIHtcbiAgICBpZiAoeG1scykge1xuICAgICAgdGhpcy5sb2FkUXVlcnkodGFibGVOYW1lLCBkaXIsIHhtbHMpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5KHRhYmxlTmFtZSlcbiAgICB9XG4gIH1cblxuICBtb2RlbCgpIHsgfVxuXG4gIC8qKlxuICAgKiBxdWVyeeyXkCDrjIDtlZwgZnVuY3Rpb27snLzroZwg67CY7ZmYIOuwm+q4sFxuICAgKi9cbiAgZ2V0UXVlcnkodGFibGVOYW1lKSB7XG4gICAgaWYgKHRoaXMudGFibGVzW3RhYmxlTmFtZV0pIHJldHVybiB0aGlzLnRhYmxlc1t0YWJsZU5hbWVdXG4gICAgY29uc3Qgc2VsZiA9IHRoaXNcbiAgICBjb25zdCBzcWxEYXRhID0gdGhpcy50YWJsZXNSYXdbdGFibGVOYW1lXVxuICAgIGNvbnN0IHJzdCA9IHtcbiAgICAgIGdldCBsYXN0UXVlcnkoKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmxhc3RRdWVyeVt0YWJsZU5hbWVdXG4gICAgICB9XG4gICAgfVxuICAgIGZvckVhY2goc3FsRGF0YSwgKHNxbCwga2V5KSA9PiB7XG4gICAgICByc3Rba2V5XSA9IGFzeW5jIChwYXJhbXMsIGNvbm4pID0+IHtcbiAgICAgICAgY29uc3QgcXJ5ID0gYXdhaXQgdGhpcy5wcm9jZXNzKHNxbERhdGFba2V5XSwgcGFyYW1zKVxuICAgICAgICAgIC50aGVuKHhtbCA9PiB0aGlzLnByb2Nlc3NWYXJpYWJsZSh4bWwuXywgcGFyYW1zKSlcbiAgICAgICAgICAuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrKSlcblxuICAgICAgICBzZWxmLmxhc3RRdWVyeVt0YWJsZU5hbWVdID0gcXJ5XG5cbiAgICAgICAgaWYgKGNvbm4pIHtcbiAgICAgICAgICByZXR1cm4gY29ubi5xdWVyeShxcnkpLmZpbmFsbHkoKCkgPT4gY29ubi5yZWxlYXNlKCkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgX2Nvbm4gPSB0aGlzLmdldENvbm5lY3Rpb24oKVxuICAgICAgICAgIGlmIChfY29ubikge1xuICAgICAgICAgICAgcmV0dXJuIF9jb25uLnF1ZXJ5KHFyeSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHFyeVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLnRhYmxlc1t0YWJsZU5hbWVdID0gcnN0XG4gICAgcmV0dXJuIHJzdFxuICB9XG5cbiAgYXN5bmMgcHJvY2Vzcyh4bWwsIHBhcmFtcykge1xuICAgIC8vIGxvZy5kZWJ1Zyh4bWwpXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh4bWwpLnRoZW4oYXN5bmMgeG1sID0+IHtcbiAgICAgIC8vIHByb2Nlc3MgeG1sLiQkXG4gICAgICB4bWwuXyA9ICcnXG4gICAgICBhd2FpdCBQcm9taXNlLmVhY2goeG1sLiQkLCBhc3luYyBpdGVtID0+IHtcbiAgICAgICAgLy8gbG9nLmRlYnVnKGl0ZW0pXG4gICAgICAgIGlmIChpdGVtWycjbmFtZSddID09PSAnX190ZXh0X18nKSB7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcHJvYyA9IGBwcm9jZXNzJHt0aGlzLmNhcGl0YWxpemVGaXJzdExldHRlcihpdGVtWycjbmFtZSddKX1gXG4gICAgICAgICAgYXdhaXQgdGhpc1twcm9jXShpdGVtLCBwYXJhbXMpXG4gICAgICAgIH1cbiAgICAgICAgLy8gbG9nLmRlYnVnKGl0ZW0pXG4gICAgICB9KVxuICAgICAgLy8geG1sIC0+IHhtbC4kJCAtPiB4bWwuXyBidWlsZFxuICAgICAgdGhpcy5tZXJnZV8oeG1sKVxuICAgICAgLy8gbG9nLmRlYnVnKHhtbCwgJ3Byb2Nlc3NlZCcpXG4gICAgICAvLyBsb2cuZGVidWcoeG1sWyckJCddWzFdLCAncHJvY2Vzc2VkJylcbiAgICAgIHJldHVybiB4bWxcbiAgICB9KVxuICB9XG5cbiAgYXN5bmMgcHJvY2Vzc0luY2x1ZGUoaXRlbSwgcGFyYW1zKSB7XG4gICAgLy8gbG9nLmluZm8oJy0tLSBwcm9jZXNzIGluY2x1ZGUnKVxuICAgIGNvbnN0IGlkID0gaXRlbS4kLnJlZmlkXG4gICAgY29uc3QgdCA9IGZpbmQodGhpcy5yZWZlcmVuY2VzLCB7ICQ6IHsgaWQ6IGlkIH0gfSlcbiAgICBpZiAoIXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlcmUgaXMgbm8gaW5jbHVkZSBpZDogJHtpZH1gKVxuICAgIH1cbiAgICAvLyBsb2cuZGVidWcodCwgJ3QnKVxuICAgIGF3YWl0IHRoaXMucHJvY2Vzc0RlZXAodCwgcGFyYW1zKVxuICAgIGl0ZW0uXyA9IHQuX1xuICB9XG5cbiAgYXN5bmMgcHJvY2Vzc0RlZXAoeG1sLCBwYXJhbXMpIHtcbiAgICAvLyBsb2cuaW5mbygnLS0tIHByb2Nlc3MgZGVlcCcpXG4gICAgLy8gbG9nLmRlYnVnKHhtbClcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoeG1sKS5maWx0ZXIoa2V5ID0+ICEvX3xcXCR7MSwyfXwjbmFtZS8udGVzdChrZXkpKVxuICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzKHhtbCwgcGFyYW1zKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3NJZihpdGVtLCBwYXJhbXMpIHtcbiAgICAvLyBsb2cuaW5mbygnLS0tIHByb2Nlc3MgaWYnKVxuICAgIGNvbnN0IHRlc3QgPSBhd2FpdCB0aGlzLnByb2Nlc3NWYXJpYWJsZShpdGVtLiQudGVzdCwgcGFyYW1zKS50aGVuKHRoaXMuY2hhbmdlQW5kT3IpXG4gICAgaWYgKG5vZGVFdmFsKHRlc3QpKSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2Nlc3NEZWVwKGl0ZW0sIHBhcmFtcylcbiAgICAgIGl0ZW0uXyA9IGF3YWl0IHRoaXMucHJvY2Vzc1ZhcmlhYmxlKGl0ZW0uXywgcGFyYW1zKVxuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtLl8gPSAnJ1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3NDaG9vc2UoaXRlbSwgcGFyYW1zKSB7XG4gICAgLy8gbG9nLmluZm8oJy0tLSBwcm9jZXNzIENob29zZScpXG4gICAgLy8gbG9nLmRlYnVnKGl0ZW0sICdpdGVtJylcbiAgICBhd2FpdCBQcm9taXNlLmVhY2goaXRlbS4kJCwgYXN5bmMgX2Nhc2UgPT4ge1xuICAgICAgLy8gbG9nLmRlYnVnKF9jYXNlLCAnX2Nhc2UnKVxuICAgICAgY29uc3QgdGVzdFN0ciA9IGdldChfY2FzZSwgJyQudGVzdCcpXG4gICAgICBpZiAodGVzdFN0cikge1xuICAgICAgICBjb25zdCB0ZXN0ID0gYXdhaXQgdGhpcy5wcm9jZXNzVmFyaWFibGUodGVzdFN0ciwgcGFyYW1zKS50aGVuKHRoaXMuY2hhbmdlQW5kT3IpXG4gICAgICAgIC8vIC8vIGxvZy5kZWJ1ZyhwYXJhbXMsIHRlc3QpXG4gICAgICAgIGlmIChub2RlRXZhbCh0ZXN0KSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0RlZXAoX2Nhc2UsIHBhcmFtcylcbiAgICAgICAgICBfY2FzZS5fID0gYXdhaXQgdGhpcy5wcm9jZXNzVmFyaWFibGUoX2Nhc2UuXywgcGFyYW1zKVxuICAgICAgICAgIHRocm93IG5ldyBQcm9taXNlLkNhbmNlbGxhdGlvbkVycm9yKCdtYXRjaGVkJylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfY2FzZS5fID0gJydcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gbG9nLmRlYnVnKF9jYXNlKVxuICAgIH0pLmNhdGNoKFByb21pc2UuQ2FuY2VsbGF0aW9uRXJyb3IsICgpID0+ICcnKVxuICAgIHRoaXMubWVyZ2VfKGl0ZW0sIHRydWUpXG4gICAgLy8gbG9nLmRlYnVnKGl0ZW0sICdpdGVtJylcbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3NUcmltKGl0ZW0sIHBhcmFtcykge1xuICAgIC8vIGxvZy5pbmZvKCctLS0gcHJvY2VzcyB0cmltJylcbiAgICAvLyBsb2cuZGVidWcoaXRlbSwgJ2l0ZW0nKVxuICAgIGF3YWl0IFByb21pc2UuZWFjaChpdGVtLiQkLCBhc3luYyBfY2FzZSA9PiB7XG4gICAgICAvLyBsb2cuZGVidWcoX2Nhc2UsICdfY2FzZScpXG4gICAgICBjb25zdCB0ZXN0U3RyID0gZ2V0KF9jYXNlLCAnJC50ZXN0JylcbiAgICAgIGlmICh0ZXN0U3RyKSB7XG4gICAgICAgIGNvbnN0IHRlc3QgPSBhd2FpdCB0aGlzLnByb2Nlc3NWYXJpYWJsZSh0ZXN0U3RyLCBwYXJhbXMpLnRoZW4odGhpcy5jaGFuZ2VBbmRPcilcbiAgICAgICAgLy8gLy8gbG9nLmRlYnVnKHBhcmFtcywgdGVzdClcbiAgICAgICAgaWYgKG5vZGVFdmFsKHRlc3QpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzRGVlcChfY2FzZSwgcGFyYW1zKVxuICAgICAgICAgIF9jYXNlLl8gPSBhd2FpdCB0aGlzLnByb2Nlc3NWYXJpYWJsZShfY2FzZS5fLCBwYXJhbXMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX2Nhc2UuXyA9ICcnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGxvZy5kZWJ1ZyhfY2FzZSlcbiAgICB9KVxuICAgIHRoaXMubWVyZ2VfKGl0ZW0pXG4gICAgdGhpcy5wcm9jZXNzRml4KGl0ZW0sIGl0ZW0pXG4gIH1cblxuICBhc3luYyBwcm9jZXNzV2hlcmUoaXRlbSwgcGFyYW1zKSB7XG4gICAgLy8gbG9nLmluZm8oJy0tLSBwcm9jZXNzIHdoZXJlJylcbiAgICAvLyBsb2cuZGVidWcoaXRlbSwgJ2l0ZW0nKVxuICAgIGF3YWl0IFByb21pc2UuZWFjaChpdGVtLiQkLCBhc3luYyBfY2FzZSA9PiB7XG4gICAgICAvLyBsb2cuZGVidWcoX2Nhc2UsICdfY2FzZScpXG4gICAgICBjb25zdCB0ZXN0U3RyID0gZ2V0KF9jYXNlLCAnJC50ZXN0JylcbiAgICAgIGlmICh0ZXN0U3RyKSB7XG4gICAgICAgIGNvbnN0IHRlc3QgPSBhd2FpdCB0aGlzLnByb2Nlc3NWYXJpYWJsZSh0ZXN0U3RyLCBwYXJhbXMpLnRoZW4odGhpcy5jaGFuZ2VBbmRPcilcbiAgICAgICAgLy8gLy8gbG9nLmRlYnVnKHBhcmFtcywgdGVzdClcbiAgICAgICAgaWYgKG5vZGVFdmFsKHRlc3QpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzRGVlcChfY2FzZSwgcGFyYW1zKVxuICAgICAgICAgIF9jYXNlLl8gPSBhd2FpdCB0aGlzLnByb2Nlc3NWYXJpYWJsZShfY2FzZS5fLCBwYXJhbXMpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX2Nhc2UuXyA9ICcnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGxvZy5kZWJ1ZyhfY2FzZSlcbiAgICB9KVxuICAgIHRoaXMubWVyZ2VfKGl0ZW0pXG4gICAgdGhpcy5wcm9jZXNzRml4KGl0ZW0sIHsgJDogeyBwcmVmaXhPdmVycmlkZXM6ICdhbmQgfG9yICcsIHByZWZpeDogJ1dIRVJFJyB9IH0pXG4gICAgLy8gbG9nLmRlYnVnKGl0ZW0sICdpdGVtJylcbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3NTZXQoaXRlbSwgcGFyYW1zKSB7XG4gICAgLy8gbG9nLmluZm8oJy0tLSBwcm9jZXNzIHNldCcpXG4gICAgLy8gbG9nLmRlYnVnKGl0ZW0sICdpdGVtJylcbiAgICBhd2FpdCBQcm9taXNlLmVhY2goaXRlbS4kJCwgYXN5bmMgX2Nhc2UgPT4ge1xuICAgICAgLy8gbG9nLmRlYnVnKF9jYXNlLCAnX2Nhc2UnKVxuICAgICAgY29uc3QgdGVzdFN0ciA9IGdldChfY2FzZSwgJyQudGVzdCcpXG4gICAgICBpZiAodGVzdFN0cikge1xuICAgICAgICBjb25zdCB0ZXN0ID0gYXdhaXQgdGhpcy5wcm9jZXNzVmFyaWFibGUodGVzdFN0ciwgcGFyYW1zKS50aGVuKHRoaXMuY2hhbmdlQW5kT3IpXG4gICAgICAgIC8vIC8vIGxvZy5kZWJ1ZyhwYXJhbXMsIHRlc3QpXG4gICAgICAgIGlmIChub2RlRXZhbCh0ZXN0KSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHJvY2Vzc0RlZXAoX2Nhc2UsIHBhcmFtcylcbiAgICAgICAgICBfY2FzZS5fID0gYXdhaXQgdGhpcy5wcm9jZXNzVmFyaWFibGUoX2Nhc2UuXywgcGFyYW1zKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9jYXNlLl8gPSAnJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBsb2cuZGVidWcoX2Nhc2UpXG4gICAgfSlcbiAgICB0aGlzLm1lcmdlXyhpdGVtKVxuICAgIHRoaXMucHJvY2Vzc0ZpeChpdGVtLCB7ICQ6IHsgc3VmZml4T3ZlcnJpZGVzOiAnLCcsIHByZWZpeDogJ1NFVCcgfSB9KVxuICAgIC8vIGxvZy5kZWJ1ZyhpdGVtLCAnaXRlbScpXG4gIH1cblxuICBhc3luYyBwcm9jZXNzRm9yZWFjaChpdGVtLCBwYXJhbXMpIHtcbiAgICAvLyBsb2cuaW5mbygnLS0tIHByb2Nlc3MgZm9yZWFjaCcpXG4gICAgLy8gbG9nLmRlYnVnKGl0ZW0sICdpdGVtJylcbiAgICBhd2FpdCB0aGlzLnByb2Nlc3NEZWVwKGl0ZW0sIHBhcmFtcylcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gZ2V0KHBhcmFtcywgaXRlbS4kLmNvbGxlY3Rpb24pIHx8IFtdXG4gICAgY29uc3QgcHJvY2Vzc2VkQXJyID0gW11cbiAgICAvLyBsb2cuZGVidWcoY29sbGVjdGlvbiwgJ2NvbGxlY3Rpb24nKVxuICAgIGF3YWl0IFByb21pc2UuZWFjaChjb2xsZWN0aW9uLCBhc3luYyAoY29sLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHFyeSA9IGF3YWl0IHRoaXMucHJvY2Vzc1ZhcmlhYmxlKGl0ZW0uXywge1xuICAgICAgICBbaXRlbS4kLml0ZW1dOiBjb2wsXG4gICAgICAgIFtpdGVtLiQuaW5kZXhdOiBpZHhcbiAgICAgIH0pXG4gICAgICBwcm9jZXNzZWRBcnIucHVzaChxcnkpXG4gICAgfSlcbiAgICBpdGVtLl8gPSBwcm9jZXNzZWRBcnIuam9pbihpdGVtLiQuc2VwYXJhdG9yKVxuICAgIGl0ZW0uJC5zdWZmaXhPdmVycmlkZXMgPSBpdGVtLiQuc2VwYXJhdG9yXG4gICAgaXRlbS4kLnByZWZpeCA9IGl0ZW0uJC5vcGVuXG4gICAgaXRlbS4kLnN1ZmZpeCA9IGl0ZW0uJC5jbG9zZVxuICAgIHRoaXMucHJvY2Vzc0ZpeChpdGVtLCBpdGVtKVxuICAgIC8vIGxvZy5kZWJ1ZyhpdGVtLCAnaXRlbScpXG4gIH1cblxuICBhc3luYyBwcm9jZXNzQmluZChpdGVtLCBwYXJhbXMpIHtcbiAgICAvLyBsb2cuaW5mbygnLS0tIHByb2Nlc3MgYmluZCcpXG4gICAgLy8gbG9nLmRlYnVnKGl0ZW0sICdpdGVtJylcbiAgICBjb25zdCBzID0gYXdhaXQgdGhpcy5wcm9jZXNzVmFyaWFibGUoaXRlbS4kLnZhbHVlLCBwYXJhbXMpLnRoZW4odGhpcy5jaGFuZ2VBbmRPcilcbiAgICBwYXJhbXNbaXRlbS4kLm5hbWVdID0gbm9kZUV2YWwocylcbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3NWYXJpYWJsZShxcnksIHBhcmFtcykge1xuICAgIGxldCByc3RcbiAgICBpZiAoIXBhcmFtcykge1xuICAgICAgcnN0ID0gcXJ5XG4gICAgfVxuXG4gICAgY29uc3QgZXNjYXBlID0gc3Fsc3RyaW5nLmVzY2FwZVxuICAgIGNvbnN0IHJlZyA9IGNvbmZpZy5zcWwucXVlcnlGb3JtYXQgPyBuZXcgUmVnRXhwKGNvbmZpZy5zcWwucXVlcnlGb3JtYXQsICdnJykgOiAvI3soW1xcd18uXSspfS9nXG4gICAgcnN0ID0gcXJ5XG4gICAgICAucmVwbGFjZSgvXFwpL2csICcgKScpXG4gICAgICAucmVwbGFjZSgvXFwoIFxcKS9nLCAnKCknKVxuICAgICAgLnJlcGxhY2UocmVnLCAodHh0LCBrZXkpID0+IHtcbiAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoL1xcKFxcKS9nLCAnJylcbiAgICAgICAgbGV0IHZhbCA9IGdldChwYXJhbXMsIGtleSlcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsKSkge1xuICAgICAgICAgIHZhbCA9IHZhbCgpXG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsKSB8fCBpc0FycmF5KHZhbCkpIHtcbiAgICAgICAgICB2YWwgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVzY2FwZSh2YWwsIGNvbmZpZy5zcWwuc3RyaW5naWZ5T2JqZWN0cywgY29uZmlnLnNxbC50aW1lem9uZSlcbiAgICAgIH0pXG4gICAgcmV0dXJuIHJzdFxuICAgICAgLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxuICAgICAgLnJlcGxhY2UoL1xccysvZywgJyAnKVxuICAgICAgLnJlcGxhY2UoL05VTEwvZywgJ3VuZGVmaW5lZCcpXG4gIH1cblxuICBhc3luYyBjaGFuZ2VBbmRPcihzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyBhbmQgL2dpLCAnICYmICcpLnJlcGxhY2UoLyBvciAvZ2ksICcgfHwgJylcbiAgfVxuXG4gIHByb2Nlc3NGaXgoaXRlbSwgeG1sKSB7XG4gICAgaWYgKHhtbC4kLnByZWZpeE92ZXJyaWRlcykge1xuICAgICAgY29uc3QgcmVnID0gbmV3IFJlZ0V4cChgXiR7eG1sLiQucHJlZml4T3ZlcnJpZGVzfWAsICdnaScpXG4gICAgICBpdGVtLl8gPSBpdGVtLl8ucmVwbGFjZShyZWcsICcnKVxuICAgIH1cbiAgICAvLyBsb2cuZGVidWcoJ2ZpeCcsIGl0ZW0uXylcbiAgICBpZiAoeG1sLiQuc3VmZml4T3ZlcnJpZGVzKSB7XG4gICAgICBjb25zdCByZWcgPSBuZXcgUmVnRXhwKGAke3htbC4kLnN1ZmZpeE92ZXJyaWRlc30kYCwgJ2dpJylcbiAgICAgIGl0ZW0uXyA9IGl0ZW0uXy5yZXBsYWNlKHJlZywgJycpXG4gICAgfVxuICAgIC8vIGxvZy5kZWJ1ZygnZml4JywgJ3wnICsgaXRlbS5fICsgJ3wnKVxuICAgIGlmICghaXNFbXB0eShpdGVtLl8pKSB7XG4gICAgICBpdGVtLl8gPSBgJHt4bWwuJC5wcmVmaXggfHwgJyd9ICR7aXRlbS5ffSAke3htbC4kLnN1ZmZpeCB8fCAnJ31gXG4gICAgfVxuICAgIC8vIGxvZy5kZWJ1ZygnZml4JywgaXRlbS5fKVxuICB9XG5cbiAgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKHN0cikge1xuICAgIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSlcbiAgfVxuXG4gIG1lcmdlXyh4bWwsIGNob29zZSkge1xuICAgIGNvbnN0IHByb2Nlc3NlZEFyciA9IFtdXG4gICAgZm9yRWFjaCh4bWwuJCQsIGl0ZW0gPT4ge1xuICAgICAgaWYgKGl0ZW0uXykge1xuICAgICAgICBwcm9jZXNzZWRBcnIucHVzaChpdGVtLl8pXG5cbiAgICAgICAgaWYgKGNob29zZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBpdGVtLl8gJiYgcHJvY2Vzc2VkQXJyLnB1c2goaXRlbS5fKVxuICAgIH0pXG4gICAgeG1sLl8gPSBwcm9jZXNzZWRBcnIuam9pbignICcpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IE15YmF0aXMzKClcbiJdLCJzb3VyY2VSb290IjoiIn0=