xiaowang/public/assets/build/app.js
2022-07-22 15:40:31 +02:00

482 lines
No EOL
372 KiB
JavaScript

/******/ (function() { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "./node_modules/circletype/dist/circletype.min.js":
/*!********************************************************!*\
!*** ./node_modules/circletype/dist/circletype.min.js ***!
\********************************************************/
/***/ (function(module) {
/*!
* circletype 2.3.0
* A JavaScript library that lets you curve type on the web.
* Copyright © 2014-2018 Peter Hrynkow
* Licensed MIT
* https://github.com/peterhry/CircleType#readme
*/
!function(t,e){ true?module.exports=e():0}("undefined"!=typeof self?self:this,function(){return function(t){function e(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,r){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=29)}([function(t,e,n){var r=n(24)("wks"),i=n(12),o=n(1).Symbol,u="function"==typeof o;(t.exports=function(t){return r[t]||(r[t]=u&&o[t]||(u?o:i)("Symbol."+t))}).store=r},function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e){var n=t.exports={version:"2.5.6"};"number"==typeof __e&&(__e=n)},function(t,e,n){var r=n(4),i=n(11);t.exports=n(6)?function(t,e,n){return r.f(t,e,i(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(5),i=n(34),o=n(35),u=Object.defineProperty;e.f=n(6)?Object.defineProperty:function(t,e,n){if(r(t),e=o(e,!0),r(n),i)try{return u(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},function(t,e,n){var r=n(10);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,e,n){t.exports=!n(17)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e){t.exports={}},function(t,e,n){var r=n(24)("keys"),i=n(12);t.exports=function(t){return r[t]||(r[t]=i(t))}},function(t,e){t.exports=!1},function(t,e,n){var r=n(1),i=n(2),o=n(3),u=n(19),c=n(20),f=function(t,e,n){var a,s,l,p,h=t&f.F,d=t&f.G,v=t&f.S,y=t&f.P,_=t&f.B,m=d?r:v?r[e]||(r[e]={}):(r[e]||{}).prototype,g=d?i:i[e]||(i[e]={}),x=g.prototype||(g.prototype={});d&&(n=e);for(a in n)s=!h&&m&&void 0!==m[a],l=(s?m:n)[a],p=_&&s?c(l,r):y&&"function"==typeof l?c(Function.call,l):l,m&&u(m,a,l,t&f.U),g[a]!=l&&o(g,a,p),y&&x[a]!=l&&(x[a]=l)};r.core=i,f.F=1,f.G=2,f.S=4,f.P=8,f.B=16,f.W=32,f.U=64,f.R=128,t.exports=f},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,n){var r=n(10),i=n(1).document,o=r(i)&&r(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,e,n){var r=n(1),i=n(3),o=n(7),u=n(12)("src"),c=Function.toString,f=(""+c).split("toString");n(2).inspectSource=function(t){return c.call(t)},(t.exports=function(t,e,n,c){var a="function"==typeof n;a&&(o(n,"name")||i(n,"name",e)),t[e]!==n&&(a&&(o(n,u)||i(n,u,t[e]?""+t[e]:f.join(String(e)))),t===r?t[e]=n:c?t[e]?t[e]=n:i(t,e,n):(delete t[e],i(t,e,n)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[u]||c.call(this)})},function(t,e,n){var r=n(36);t.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,i){return t.call(e,n,r,i)}}return function(){return t.apply(e,arguments)}}},function(t,e,n){var r=n(42),i=n(9);t.exports=function(t){return r(i(t))}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e,n){var r=n(8),i=Math.min;t.exports=function(t){return t>0?i(r(t),9007199254740991):0}},function(t,e,n){var r=n(2),i=n(1),o=i["__core-js_shared__"]||(i["__core-js_shared__"]={});(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:r.version,mode:n(15)?"pure":"global",copyright:"© 2018 Denis Pushkarev (zloirock.ru)"})},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,n){var r=n(4).f,i=n(7),o=n(0)("toStringTag");t.exports=function(t,e,n){t&&!i(t=n?t:t.prototype,o)&&r(t,o,{configurable:!0,value:e})}},function(t,e,n){var r=n(9);t.exports=function(t){return Object(r(t))}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=Math.PI/180;e.default=function(t){return t*r}},function(t,e,n){"use strict";n(30);var r=n(54),i=function(t){return t&&t.__esModule?t:{default:t}}(r);t.exports=i.default},function(t,e,n){n(31),n(47),t.exports=n(2).Array.from},function(t,e,n){"use strict";var r=n(32)(!0);n(33)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=r(e,n),this._i+=t.length,{value:t,done:!1})})},function(t,e,n){var r=n(8),i=n(9);t.exports=function(t){return function(e,n){var o,u,c=String(i(e)),f=r(n),a=c.length;return f<0||f>=a?t?"":void 0:(o=c.charCodeAt(f),o<55296||o>56319||f+1===a||(u=c.charCodeAt(f+1))<56320||u>57343?t?c.charAt(f):o:t?c.slice(f,f+2):u-56320+(o-55296<<10)+65536)}}},function(t,e,n){"use strict";var r=n(15),i=n(16),o=n(19),u=n(3),c=n(13),f=n(37),a=n(26),s=n(46),l=n(0)("iterator"),p=!([].keys&&"next"in[].keys()),h=function(){return this};t.exports=function(t,e,n,d,v,y,_){f(n,e,d);var m,g,x,b=function(t){if(!p&&t in M)return M[t];switch(t){case"keys":case"values":return function(){return new n(this,t)}}return function(){return new n(this,t)}},O=e+" Iterator",w="values"==v,j=!1,M=t.prototype,S=M[l]||M["@@iterator"]||v&&M[v],P=S||b(v),A=v?w?b("entries"):P:void 0,T="Array"==e?M.entries||S:S;if(T&&(x=s(T.call(new t)))!==Object.prototype&&x.next&&(a(x,O,!0),r||"function"==typeof x[l]||u(x,l,h)),w&&S&&"values"!==S.name&&(j=!0,P=function(){return S.call(this)}),r&&!_||!p&&!j&&M[l]||u(M,l,P),c[e]=P,c[O]=h,v)if(m={values:w?P:b("values"),keys:y?P:b("keys"),entries:A},_)for(g in m)g in M||o(M,g,m[g]);else i(i.P+i.F*(p||j),e,m);return m}},function(t,e,n){t.exports=!n(6)&&!n(17)(function(){return 7!=Object.defineProperty(n(18)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(10);t.exports=function(t,e){if(!r(t))return t;var n,i;if(e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;if("function"==typeof(n=t.valueOf)&&!r(i=n.call(t)))return i;if(!e&&"function"==typeof(n=t.toString)&&!r(i=n.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,n){"use strict";var r=n(38),i=n(11),o=n(26),u={};n(3)(u,n(0)("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=r(u,{next:i(1,n)}),o(t,e+" Iterator")}},function(t,e,n){var r=n(5),i=n(39),o=n(25),u=n(14)("IE_PROTO"),c=function(){},f=function(){var t,e=n(18)("iframe"),r=o.length;for(e.style.display="none",n(45).appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("<script>document.F=Object<\/script>"),t.close(),f=t.F;r--;)delete f.prototype[o[r]];return f()};t.exports=Object.create||function(t,e){var n;return null!==t?(c.prototype=r(t),n=new c,c.prototype=null,n[u]=t):n=f(),void 0===e?n:i(n,e)}},function(t,e,n){var r=n(4),i=n(5),o=n(40);t.exports=n(6)?Object.defineProperties:function(t,e){i(t);for(var n,u=o(e),c=u.length,f=0;c>f;)r.f(t,n=u[f++],e[n]);return t}},function(t,e,n){var r=n(41),i=n(25);t.exports=Object.keys||function(t){return r(t,i)}},function(t,e,n){var r=n(7),i=n(21),o=n(43)(!1),u=n(14)("IE_PROTO");t.exports=function(t,e){var n,c=i(t),f=0,a=[];for(n in c)n!=u&&r(c,n)&&a.push(n);for(;e.length>f;)r(c,n=e[f++])&&(~o(a,n)||a.push(n));return a}},function(t,e,n){var r=n(22);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e,n){var r=n(21),i=n(23),o=n(44);t.exports=function(t){return function(e,n,u){var c,f=r(e),a=i(f.length),s=o(u,a);if(t&&n!=n){for(;a>s;)if((c=f[s++])!=c)return!0}else for(;a>s;s++)if((t||s in f)&&f[s]===n)return t||s||0;return!t&&-1}}},function(t,e,n){var r=n(8),i=Math.max,o=Math.min;t.exports=function(t,e){return t=r(t),t<0?i(t+e,0):o(t,e)}},function(t,e,n){var r=n(1).document;t.exports=r&&r.documentElement},function(t,e,n){var r=n(7),i=n(27),o=n(14)("IE_PROTO"),u=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=i(t),r(t,o)?t[o]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,e,n){"use strict";var r=n(20),i=n(16),o=n(27),u=n(48),c=n(49),f=n(23),a=n(50),s=n(51);i(i.S+i.F*!n(53)(function(t){Array.from(t)}),"Array",{from:function(t){var e,n,i,l,p=o(t),h="function"==typeof this?this:Array,d=arguments.length,v=d>1?arguments[1]:void 0,y=void 0!==v,_=0,m=s(p);if(y&&(v=r(v,d>2?arguments[2]:void 0,2)),void 0==m||h==Array&&c(m))for(e=f(p.length),n=new h(e);e>_;_++)a(n,_,y?v(p[_],_):p[_]);else for(l=m.call(p),n=new h;!(i=l.next()).done;_++)a(n,_,y?u(l,v,[i.value,_],!0):i.value);return n.length=_,n}})},function(t,e,n){var r=n(5);t.exports=function(t,e,n,i){try{return i?e(r(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&r(o.call(t)),e}}},function(t,e,n){var r=n(13),i=n(0)("iterator"),o=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||o[i]===t)}},function(t,e,n){"use strict";var r=n(4),i=n(11);t.exports=function(t,e,n){e in t?r.f(t,e,i(0,n)):t[e]=n}},function(t,e,n){var r=n(52),i=n(0)("iterator"),o=n(13);t.exports=n(2).getIteratorMethod=function(t){if(void 0!=t)return t[i]||t["@@iterator"]||o[r(t)]}},function(t,e,n){var r=n(22),i=n(0)("toStringTag"),o="Arguments"==r(function(){return arguments}()),u=function(t,e){try{return t[e]}catch(t){}};t.exports=function(t){var e,n,c;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=u(e=Object(t),i))?n:o?r(e):"Object"==(c=r(e))&&"function"==typeof e.callee?"Arguments":c}},function(t,e,n){var r=n(0)("iterator"),i=!1;try{var o=[7][r]();o.return=function(){i=!0},Array.from(o,function(){throw 2})}catch(t){}t.exports=function(t,e){if(!e&&!i)return!1;var n=!1;try{var o=[7],u=o[r]();u.next=function(){return{done:n=!0}},o[r]=function(){return u},t(o)}catch(t){}return n}},function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),u=n(55),c=r(u),f=n(56),a=r(f),s=n(57),l=r(s),p=n(58),h=r(p),d=n(59),v=r(d),y=Math.PI,_=Math.max,m=Math.min,g=function(){function t(e,n){i(this,t),this.element=e,this.originalHTML=this.element.innerHTML;var r=document.createElement("div"),o=document.createDocumentFragment();r.setAttribute("aria-label",e.innerText),r.style.position="relative",this.container=r,this._letters=(0,a.default)(e,n),this._letters.forEach(function(t){return o.appendChild(t)}),r.appendChild(o),this.element.innerHTML="",this.element.appendChild(r);var u=window.getComputedStyle(this.element),f=u.fontSize,s=u.lineHeight;this._fontSize=parseFloat(f),this._lineHeight=parseFloat(s)||this._fontSize,this._metrics=this._letters.map(c.default);var l=this._metrics.reduce(function(t,e){return t+e.width},0);this._minRadius=l/y/2+this._lineHeight,this._dir=1,this._forceWidth=!1,this._forceHeight=!0,this._radius=this._minRadius,this._invalidate()}return o(t,[{key:"radius",value:function(t){return void 0!==t?(this._radius=_(this._minRadius,t),this._invalidate(),this):this._radius}},{key:"dir",value:function(t){return void 0!==t?(this._dir=t,this._invalidate(),this):this._dir}},{key:"forceWidth",value:function(t){return void 0!==t?(this._forceWidth=t,this._invalidate(),this):this._forceWidth}},{key:"forceHeight",value:function(t){return void 0!==t?(this._forceHeight=t,this._invalidate(),this):this._forceHeight}},{key:"refresh",value:function(){return this._invalidate()}},{key:"destroy",value:function(){return this.element.innerHTML=this.originalHTML,this}},{key:"_invalidate",value:function(){var t=this;return cancelAnimationFrame(this._raf),this._raf=requestAnimationFrame(function(){t._layout()}),this}},{key:"_layout",value:function(){var t=this,e=this._radius,n=this._dir,r=-1===n?-e+this._lineHeight:e,i="center "+r/this._fontSize+"em",o=e-this._lineHeight,u=(0,v.default)(this._metrics,o),c=u.rotations,f=u.θ;if(this._letters.forEach(function(e,r){var o=e.style,u=(-.5*f+c[r])*n,a=-.5*t._metrics[r].width/t._fontSize,s="translateX("+a+"em) rotate("+u+"deg)";o.position="absolute",o.bottom=-1===n?0:"auto",o.left="50%",o.transform=s,o.transformOrigin=i,o.webkitTransform=s,o.webkitTransformOrigin=i}),this._forceHeight){var a=f>180?(0,l.default)(e,f):(0,l.default)(o,f)+this._lineHeight;this.container.style.height=a/this._fontSize+"em"}if(this._forceWidth){var s=(0,h.default)(e,m(180,f));this.container.style.width=s/this._fontSize+"em"}return this}}]),t}();e.default=g},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){var e=t.getBoundingClientRect();return{height:e.height,left:e.left+window.pageXOffset,top:e.top+window.pageYOffset,width:e.width}}},function(t,e,n){"use strict";function r(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e<t.length;e++)n[e]=t[e];return n}return Array.from(t)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,e){var n=document.createElement("span"),i=t.innerText.trim();return(e?e(i):[].concat(r(i))).map(function(t){var e=n.cloneNode();return e.insertAdjacentHTML("afterbegin"," "===t?"&nbsp;":t),e})}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(28),i=function(t){return t&&t.__esModule?t:{default:t}}(r);e.default=function(t,e){return t*(1-Math.cos((0,i.default)(e/2)))}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(28),i=function(t){return t&&t.__esModule?t:{default:t}}(r);e.default=function(t,e){return 2*t*Math.sin((0,i.default)(e/2))}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(60),i=function(t){return t&&t.__esModule?t:{default:t}}(r);e.default=function(t,e){return t.reduce(function(t,n){var r=n.width,o=(0,i.default)(r/e);return{"θ":t.θ+o,rotations:t.rotations.concat([t.θ+o/2])}},{"θ":0,rotations:[]})}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=180/Math.PI;e.default=function(t){return t*r}}])});
/***/ }),
/***/ "./node_modules/plyr/dist/plyr.min.js":
/*!********************************************!*\
!*** ./node_modules/plyr/dist/plyr.min.js ***!
\********************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
"object"==typeof navigator&&function(e,t){ true?module.exports=t():0}(this,(function(){"use strict";function e(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function t(e,t){for(var i=0;i<t.length;i++){var s=t[i];s.enumerable=s.enumerable||!1,s.configurable=!0,"value"in s&&(s.writable=!0),Object.defineProperty(e,s.key,s)}}function i(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function s(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);t&&(s=s.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,s)}return i}function n(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?s(Object(n),!0).forEach((function(t){i(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):s(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var a={addCSS:!0,thumbWidth:15,watch:!0};function l(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}var o=function(e){return null!=e?e.constructor:null},r=function(e,t){return!!(e&&t&&e instanceof t)},c=function(e){return null==e},h=function(e){return o(e)===Object},u=function(e){return o(e)===String},d=function(e){return Array.isArray(e)},m=function(e){return r(e,NodeList)},p=u,g=d,f=m,b=function(e){return r(e,Element)},y=function(e){return r(e,Event)},v=function(e){return c(e)||(u(e)||d(e)||m(e))&&!e.length||h(e)&&!Object.keys(e).length};function w(e,t){if(1>t){var i=function(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}(t);return parseFloat(e.toFixed(i))}return Math.round(e/t)*t}var T=function(){function e(t,i){(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,e),b(t)?this.element=t:p(t)&&(this.element=document.querySelector(t)),b(this.element)&&v(this.element.rangeTouch)&&(this.config=n({},a,{},i),this.init())}return function(e,i,s){i&&t(e.prototype,i),s&&t(e,s)}(e,[{key:"init",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="",this.element.style.webKitUserSelect="",this.element.style.touchAction=""),this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,i=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach((function(e){t.element[i](e,(function(e){return t.set(e)}),!1)}))}},{key:"get",value:function(t){if(!e.enabled||!y(t))return null;var i,s=t.target,n=t.changedTouches[0],a=parseFloat(s.getAttribute("min"))||0,l=parseFloat(s.getAttribute("max"))||100,o=parseFloat(s.getAttribute("step"))||1,r=s.getBoundingClientRect(),c=100/r.width*(this.config.thumbWidth/2)/100;return 0>(i=100/r.width*(n.clientX-r.left))?i=0:100<i&&(i=100),50>i?i-=(100-2*i)*c:50<i&&(i+=2*(i-50)*c),a+w(i/100*(l-a),o)}},{key:"set",value:function(t){e.enabled&&y(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),function(e,t){if(e&&t){var i=new Event(t,{bubbles:!0});e.dispatchEvent(i)}}(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var i=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},s=null;if(v(t)||p(t)?s=Array.from(document.querySelectorAll(p(t)?t:'input[type="range"]')):b(t)?s=[t]:f(t)?s=Array.from(t):g(t)&&(s=t.filter(b)),v(s))return null;var o=n({},a,{},i);if(p(t)&&o.watch){var r=new MutationObserver((function(i){Array.from(i).forEach((function(i){Array.from(i.addedNodes).forEach((function(i){b(i)&&l(i,t)&&new e(i,o)}))}))}));r.observe(document.body,{childList:!0,subtree:!0})}return s.map((function(t){return new e(t,i)}))}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}();const k=e=>null!=e?e.constructor:null,C=(e,t)=>Boolean(e&&t&&e instanceof t),A=e=>null==e,S=e=>k(e)===Object,E=e=>k(e)===String,P=e=>k(e)===Function,M=e=>Array.isArray(e),N=e=>C(e,NodeList),x=e=>A(e)||(E(e)||M(e)||N(e))&&!e.length||S(e)&&!Object.keys(e).length;var I=A,L=S,$=e=>k(e)===Number&&!Number.isNaN(e),_=E,O=e=>k(e)===Boolean,j=P,D=M,q=N,H=e=>null!==e&&"object"==typeof e&&1===e.nodeType&&"object"==typeof e.style&&"object"==typeof e.ownerDocument,R=e=>C(e,Event),F=e=>C(e,KeyboardEvent),V=e=>C(e,TextTrack)||!A(e)&&E(e.kind),B=e=>C(e,Promise)&&P(e.then),U=e=>{if(C(e,window.URL))return!0;if(!E(e))return!1;let t=e;e.startsWith("http://")&&e.startsWith("https://")||(t=`http://${e}`);try{return!x(new URL(t).hostname)}catch(e){return!1}},W=x;const z=(()=>{const e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},i=Object.keys(t).find((t=>void 0!==e.style[t]));return!!_(i)&&t[i]})();function K(e,t){setTimeout((()=>{try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch(e){}}),t)}const Y={isIE:Boolean(window.document.documentMode),isEdge:window.navigator.userAgent.includes("Edge"),isWebkit:"WebkitAppearance"in document.documentElement.style&&!/Edge/.test(navigator.userAgent),isIPhone:/(iPhone|iPod)/gi.test(navigator.platform),isIos:"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1||/(iPad|iPhone|iPod)/gi.test(navigator.platform)};function Q(e,t){return t.split(".").reduce(((e,t)=>e&&e[t]),e)}function X(e={},...t){if(!t.length)return e;const i=t.shift();return L(i)?(Object.keys(i).forEach((t=>{L(i[t])?(Object.keys(e).includes(t)||Object.assign(e,{[t]:{}}),X(e[t],i[t])):Object.assign(e,{[t]:i[t]})})),X(e,...t)):e}function J(e,t){const i=e.length?e:[e];Array.from(i).reverse().forEach(((e,i)=>{const s=i>0?t.cloneNode(!0):t,n=e.parentNode,a=e.nextSibling;s.appendChild(e),a?n.insertBefore(s,a):n.appendChild(s)}))}function G(e,t){H(e)&&!W(t)&&Object.entries(t).filter((([,e])=>!I(e))).forEach((([t,i])=>e.setAttribute(t,i)))}function Z(e,t,i){const s=document.createElement(e);return L(t)&&G(s,t),_(i)&&(s.innerText=i),s}function ee(e,t,i,s){H(t)&&t.appendChild(Z(e,i,s))}function te(e){q(e)||D(e)?Array.from(e).forEach(te):H(e)&&H(e.parentNode)&&e.parentNode.removeChild(e)}function ie(e){if(!H(e))return;let{length:t}=e.childNodes;for(;t>0;)e.removeChild(e.lastChild),t-=1}function se(e,t){return H(t)&&H(t.parentNode)&&H(e)?(t.parentNode.replaceChild(e,t),e):null}function ne(e,t){if(!_(e)||W(e))return{};const i={},s=X({},t);return e.split(",").forEach((e=>{const t=e.trim(),n=t.replace(".",""),a=t.replace(/[[\]]/g,"").split("="),[l]=a,o=a.length>1?a[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":_(s.class)?i.class=`${s.class} ${n}`:i.class=n;break;case"#":i.id=t.replace("#","");break;case"[":i[l]=o}})),X(s,i)}function ae(e,t){if(!H(e))return;let i=t;O(i)||(i=!e.hidden),e.hidden=i}function le(e,t,i){if(q(e))return Array.from(e).map((e=>le(e,t,i)));if(H(e)){let s="toggle";return void 0!==i&&(s=i?"add":"remove"),e.classList[s](t),e.classList.contains(t)}return!1}function oe(e,t){return H(e)&&e.classList.contains(t)}function re(e,t){const{prototype:i}=Element;return(i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function ce(e){return this.elements.container.querySelectorAll(e)}function he(e){return this.elements.container.querySelector(e)}function ue(e=null,t=!1){H(e)&&(e.focus({preventScroll:!0}),t&&le(e,this.config.classNames.tabFocus))}const de={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},me={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check(e,t,i){const s=Y.isIPhone&&i&&me.playsinline,n=me[e]||"html5"!==t;return{api:n,ui:n&&me.rangeInput&&("video"!==e||!Y.isIPhone||s)}},pip:!(Y.isIPhone||!j(Z("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||Z("video").disablePictureInPicture)),airplay:j(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime(e){if(W(e))return!1;const[t]=e.split("/");let i=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(de).includes(i)&&(i+=`; codecs="${de[e]}"`);try{return Boolean(i&&this.media.canPlayType(i).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(()=>{const e=document.createElement("input");return e.type="range","range"===e.type})(),touch:"ontouchstart"in document.documentElement,transitions:!1!==z,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},pe=(()=>{let e=!1;try{const t=Object.defineProperty({},"passive",{get:()=>(e=!0,null)});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e})();function ge(e,t,i,s=!1,n=!0,a=!1){if(!e||!("addEventListener"in e)||W(t)||!j(i))return;const l=t.split(" ");let o=a;pe&&(o={passive:n,capture:a}),l.forEach((t=>{this&&this.eventListeners&&s&&this.eventListeners.push({element:e,type:t,callback:i,options:o}),e[s?"addEventListener":"removeEventListener"](t,i,o)}))}function fe(e,t="",i,s=!0,n=!1){ge.call(this,e,t,i,!0,s,n)}function be(e,t="",i,s=!0,n=!1){ge.call(this,e,t,i,!1,s,n)}function ye(e,t="",i,s=!0,n=!1){const a=(...l)=>{be(e,t,a,s,n),i.apply(this,l)};ge.call(this,e,t,a,!0,s,n)}function ve(e,t="",i=!1,s={}){if(!H(e)||W(t))return;const n=new CustomEvent(t,{bubbles:i,detail:{...s,plyr:this}});e.dispatchEvent(n)}function we(){this&&this.eventListeners&&(this.eventListeners.forEach((e=>{const{element:t,type:i,callback:s,options:n}=e;t.removeEventListener(i,s,n)})),this.eventListeners=[])}function Te(){return new Promise((e=>this.ready?setTimeout(e,0):fe.call(this,this.elements.container,"ready",e))).then((()=>{}))}function ke(e){B(e)&&e.then(null,(()=>{}))}function Ce(e){return D(e)?e.filter(((t,i)=>e.indexOf(t)===i)):e}function Ae(e,t){return D(e)&&e.length?e.reduce(((e,i)=>Math.abs(i-t)<Math.abs(e-t)?i:e)):null}function Se(e){return!(!window||!window.CSS)&&window.CSS.supports(e)}const Ee=[[1,1],[4,3],[3,4],[5,4],[4,5],[3,2],[2,3],[16,10],[10,16],[16,9],[9,16],[21,9],[9,21],[32,9],[9,32]].reduce(((e,[t,i])=>({...e,[t/i]:[t,i]})),{});function Pe(e){if(!(D(e)||_(e)&&e.includes(":")))return!1;return(D(e)?e:e.split(":")).map(Number).every($)}function Me(e){if(!D(e)||!e.every($))return null;const[t,i]=e,s=(e,t)=>0===t?e:s(t,e%t),n=s(t,i);return[t/n,i/n]}function Ne(e){const t=e=>Pe(e)?e.split(":").map(Number):null;let i=t(e);if(null===i&&(i=t(this.config.ratio)),null===i&&!W(this.embed)&&D(this.embed.ratio)&&({ratio:i}=this.embed),null===i&&this.isHTML5){const{videoWidth:e,videoHeight:t}=this.media;i=[e,t]}return Me(i)}function xe(e){if(!this.isVideo)return{};const{wrapper:t}=this.elements,i=Ne.call(this,e);if(!D(i))return{};const[s,n]=Me(i),a=100/s*n;if(Se(`aspect-ratio: ${s}/${n}`)?t.style.aspectRatio=`${s}/${n}`:t.style.paddingBottom=`${a}%`,this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){const e=100/this.media.offsetWidth*parseInt(window.getComputedStyle(this.media).paddingBottom,10),i=(e-a)/(e/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform=`translateY(-${i}%)`}else this.isHTML5&&t.classList.add(this.config.classNames.videoFixedRatio);return{padding:a,ratio:i}}function Ie(e,t,i=.05){const s=e/t,n=Ae(Object.keys(Ee),s);return Math.abs(n-s)<=i?Ee[n]:[e,t]}const Le={getSources(){if(!this.isHTML5)return[];return Array.from(this.media.querySelectorAll("source")).filter((e=>{const t=e.getAttribute("type");return!!W(t)||me.mime.call(this,t)}))},getQualityOptions(){return this.config.quality.forced?this.config.quality.options:Le.getSources.call(this).map((e=>Number(e.getAttribute("size")))).filter(Boolean)},setup(){if(!this.isHTML5)return;const e=this;e.options.speed=e.config.speed.options,W(this.config.ratio)||xe.call(e),Object.defineProperty(e.media,"quality",{get(){const t=Le.getSources.call(e).find((t=>t.getAttribute("src")===e.source));return t&&Number(t.getAttribute("size"))},set(t){if(e.quality!==t){if(e.config.quality.forced&&j(e.config.quality.onChange))e.config.quality.onChange(t);else{const i=Le.getSources.call(e).find((e=>Number(e.getAttribute("size"))===t));if(!i)return;const{currentTime:s,paused:n,preload:a,readyState:l,playbackRate:o}=e.media;e.media.src=i.getAttribute("src"),("none"!==a||l)&&(e.once("loadedmetadata",(()=>{e.speed=o,e.currentTime=s,n||ke(e.play())})),e.media.load())}ve.call(e,e.media,"qualitychange",!1,{quality:t})}}})},cancelRequests(){this.isHTML5&&(te(Le.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function $e(e,...t){return W(e)?e:e.toString().replace(/{(\d+)}/g,((e,i)=>t[i].toString()))}const _e=(e="",t="",i="")=>e.replace(new RegExp(t.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g,"\\$1"),"g"),i.toString()),Oe=(e="")=>e.toString().replace(/\w\S*/g,(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()));function je(e=""){let t=e.toString();return t=function(e=""){let t=e.toString();return t=_e(t,"-"," "),t=_e(t,"_"," "),t=Oe(t),_e(t," ","")}(t),t.charAt(0).toLowerCase()+t.slice(1)}function De(e){const t=document.createElement("div");return t.appendChild(e),t.innerHTML}const qe={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},He={get(e="",t={}){if(W(e)||W(t))return"";let i=Q(t.i18n,e);if(W(i))return Object.keys(qe).includes(e)?qe[e]:"";const s={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(s).forEach((([e,t])=>{i=_e(i,e,t)})),i}};class Re{constructor(t){e(this,"get",(e=>{if(!Re.supported||!this.enabled)return null;const t=window.localStorage.getItem(this.key);if(W(t))return null;const i=JSON.parse(t);return _(e)&&e.length?i[e]:i})),e(this,"set",(e=>{if(!Re.supported||!this.enabled)return;if(!L(e))return;let t=this.get();W(t)&&(t={}),X(t,e);try{window.localStorage.setItem(this.key,JSON.stringify(t))}catch(e){}})),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}static get supported(){try{if(!("localStorage"in window))return!1;const e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}}}function Fe(e,t="text"){return new Promise(((i,s)=>{try{const s=new XMLHttpRequest;if(!("withCredentials"in s))return;s.addEventListener("load",(()=>{if("text"===t)try{i(JSON.parse(s.responseText))}catch(e){i(s.responseText)}else i(s.response)})),s.addEventListener("error",(()=>{throw new Error(s.status)})),s.open("GET",e,!0),s.responseType=t,s.send()}catch(e){s(e)}}))}function Ve(e,t){if(!_(e))return;const i=_(t);let s=!1;const n=()=>null!==document.getElementById(t),a=(e,t)=>{e.innerHTML=t,i&&n()||document.body.insertAdjacentElement("afterbegin",e)};if(!i||!n()){const n=Re.supported,l=document.createElement("div");if(l.setAttribute("hidden",""),i&&l.setAttribute("id",t),n){const e=window.localStorage.getItem(`cache-${t}`);if(s=null!==e,s){const t=JSON.parse(e);a(l,t.content)}}Fe(e).then((e=>{if(!W(e)){if(n)try{window.localStorage.setItem(`cache-${t}`,JSON.stringify({content:e}))}catch(e){}a(l,e)}})).catch((()=>{}))}}const Be=e=>Math.trunc(e/60/60%60,10);function Ue(e=0,t=!1,i=!1){if(!$(e))return Ue(void 0,t,i);const s=e=>`0${e}`.slice(-2);let n=Be(e);const a=(l=e,Math.trunc(l/60%60,10));var l;const o=(e=>Math.trunc(e%60,10))(e);return n=t||n>0?`${n}:`:"",`${i&&e>0?"-":""}${n}${s(a)}:${s(o)}`}const We={getIconUrl(){const e=new URL(this.config.iconUrl,window.location),t=window.location.host?window.location.host:window.top.location.host,i=e.host!==t||Y.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:i}},findElements(){try{return this.elements.controls=he.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:ce.call(this,this.config.selectors.buttons.play),pause:he.call(this,this.config.selectors.buttons.pause),restart:he.call(this,this.config.selectors.buttons.restart),rewind:he.call(this,this.config.selectors.buttons.rewind),fastForward:he.call(this,this.config.selectors.buttons.fastForward),mute:he.call(this,this.config.selectors.buttons.mute),pip:he.call(this,this.config.selectors.buttons.pip),airplay:he.call(this,this.config.selectors.buttons.airplay),settings:he.call(this,this.config.selectors.buttons.settings),captions:he.call(this,this.config.selectors.buttons.captions),fullscreen:he.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=he.call(this,this.config.selectors.progress),this.elements.inputs={seek:he.call(this,this.config.selectors.inputs.seek),volume:he.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:he.call(this,this.config.selectors.display.buffer),currentTime:he.call(this,this.config.selectors.display.currentTime),duration:he.call(this,this.config.selectors.display.duration)},H(this.elements.progress)&&(this.elements.display.seekTooltip=this.elements.progress.querySelector(`.${this.config.classNames.tooltip}`)),!0}catch(e){return this.debug.warn("It looks like there is a problem with your custom controls HTML",e),this.toggleNativeControls(!0),!1}},createIcon(e,t){const i="http://www.w3.org/2000/svg",s=We.getIconUrl.call(this),n=`${s.cors?"":s.url}#${this.config.iconPrefix}`,a=document.createElementNS(i,"svg");G(a,X(t,{"aria-hidden":"true",focusable:"false"}));const l=document.createElementNS(i,"use"),o=`${n}-${e}`;return"href"in l&&l.setAttributeNS("http://www.w3.org/1999/xlink","href",o),l.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",o),a.appendChild(l),a},createLabel(e,t={}){const i=He.get(e,this.config);return Z("span",{...t,class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")},i)},createBadge(e){if(W(e))return null;const t=Z("span",{class:this.config.classNames.menu.value});return t.appendChild(Z("span",{class:this.config.classNames.menu.badge},e)),t},createButton(e,t){const i=X({},t);let s=je(e);const n={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach((e=>{Object.keys(i).includes(e)&&(n[e]=i[e],delete i[e])})),"button"!==n.element||Object.keys(i).includes("type")||(i.type="button"),Object.keys(i).includes("class")?i.class.split(" ").some((e=>e===this.config.classNames.control))||X(i,{class:`${i.class} ${this.config.classNames.control}`}):i.class=this.config.classNames.control,e){case"play":n.toggle=!0,n.label="play",n.labelPressed="pause",n.icon="play",n.iconPressed="pause";break;case"mute":n.toggle=!0,n.label="mute",n.labelPressed="unmute",n.icon="volume",n.iconPressed="muted";break;case"captions":n.toggle=!0,n.label="enableCaptions",n.labelPressed="disableCaptions",n.icon="captions-off",n.iconPressed="captions-on";break;case"fullscreen":n.toggle=!0,n.label="enterFullscreen",n.labelPressed="exitFullscreen",n.icon="enter-fullscreen",n.iconPressed="exit-fullscreen";break;case"play-large":i.class+=` ${this.config.classNames.control}--overlaid`,s="play",n.label="play",n.icon="play";break;default:W(n.label)&&(n.label=s),W(n.icon)&&(n.icon=e)}const a=Z(n.element);return n.toggle?(a.appendChild(We.createIcon.call(this,n.iconPressed,{class:"icon--pressed"})),a.appendChild(We.createIcon.call(this,n.icon,{class:"icon--not-pressed"})),a.appendChild(We.createLabel.call(this,n.labelPressed,{class:"label--pressed"})),a.appendChild(We.createLabel.call(this,n.label,{class:"label--not-pressed"}))):(a.appendChild(We.createIcon.call(this,n.icon)),a.appendChild(We.createLabel.call(this,n.label))),X(i,ne(this.config.selectors.buttons[s],i)),G(a,i),"play"===s?(D(this.elements.buttons[s])||(this.elements.buttons[s]=[]),this.elements.buttons[s].push(a)):this.elements.buttons[s]=a,a},createRange(e,t){const i=Z("input",X(ne(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":He.get(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=i,We.updateRangeFill.call(this,i),T.setup(i),i},createProgress(e,t){const i=Z("progress",X(ne(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){i.appendChild(Z("span",null,"0"));const t={played:"played",buffer:"buffered"}[e],s=t?He.get(t,this.config):"";i.innerText=`% ${s.toLowerCase()}`}return this.elements.display[e]=i,i},createTime(e,t){const i=ne(this.config.selectors.display[e],t),s=Z("div",X(i,{class:`${i.class?i.class:""} ${this.config.classNames.display.time} `.trim(),"aria-label":He.get(e,this.config)}),"00:00");return this.elements.display[e]=s,s},bindMenuItemShortcuts(e,t){fe.call(this,e,"keydown keyup",(i=>{if(!["Space","ArrowUp","ArrowDown","ArrowRight"].includes(i.key))return;if(i.preventDefault(),i.stopPropagation(),"keydown"===i.type)return;const s=re(e,'[role="menuitemradio"]');if(!s&&["Space","ArrowRight"].includes(i.key))We.showMenuPanel.call(this,t,!0);else{let t;"Space"!==i.key&&("ArrowDown"===i.key||s&&"ArrowRight"===i.key?(t=e.nextElementSibling,H(t)||(t=e.parentNode.firstElementChild)):(t=e.previousElementSibling,H(t)||(t=e.parentNode.lastElementChild)),ue.call(this,t,!0))}}),!1),fe.call(this,e,"keyup",(e=>{"Return"===e.key&&We.focusFirstMenuItem.call(this,null,!0)}))},createMenuItem({value:e,list:t,type:i,title:s,badge:n=null,checked:a=!1}){const l=ne(this.config.selectors.inputs[i]),o=Z("button",X(l,{type:"button",role:"menuitemradio",class:`${this.config.classNames.control} ${l.class?l.class:""}`.trim(),"aria-checked":a,value:e})),r=Z("span");r.innerHTML=s,H(n)&&r.appendChild(n),o.appendChild(r),Object.defineProperty(o,"checked",{enumerable:!0,get:()=>"true"===o.getAttribute("aria-checked"),set(e){e&&Array.from(o.parentNode.children).filter((e=>re(e,'[role="menuitemradio"]'))).forEach((e=>e.setAttribute("aria-checked","false"))),o.setAttribute("aria-checked",e?"true":"false")}}),this.listeners.bind(o,"click keyup",(t=>{if(!F(t)||"Space"===t.key){switch(t.preventDefault(),t.stopPropagation(),o.checked=!0,i){case"language":this.currentTrack=Number(e);break;case"quality":this.quality=e;break;case"speed":this.speed=parseFloat(e)}We.showMenuPanel.call(this,"home",F(t))}}),i,!1),We.bindMenuItemShortcuts.call(this,o,i),t.appendChild(o)},formatTime(e=0,t=!1){if(!$(e))return e;return Ue(e,Be(this.duration)>0,t)},updateTimeDisplay(e=null,t=0,i=!1){H(e)&&$(t)&&(e.innerText=We.formatTime(t,i))},updateVolume(){this.supported.ui&&(H(this.elements.inputs.volume)&&We.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),H(this.elements.buttons.mute)&&(this.elements.buttons.mute.pressed=this.muted||0===this.volume))},setRange(e,t=0){H(e)&&(e.value=t,We.updateRangeFill.call(this,e))},updateProgress(e){if(!this.supported.ui||!R(e))return;let t=0;const i=(e,t)=>{const i=$(t)?t:0,s=H(e)?e:this.elements.display.buffer;if(H(s)){s.value=i;const e=s.getElementsByTagName("span")[0];H(e)&&(e.childNodes[0].nodeValue=i)}};if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":s=this.currentTime,n=this.duration,t=0===s||0===n||Number.isNaN(s)||Number.isNaN(n)?0:(s/n*100).toFixed(2),"timeupdate"===e.type&&We.setRange.call(this,this.elements.inputs.seek,t);break;case"playing":case"progress":i(this.elements.display.buffer,100*this.buffered)}var s,n},updateRangeFill(e){const t=R(e)?e.target:e;if(H(t)&&"range"===t.getAttribute("type")){if(re(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);const e=We.formatTime(this.currentTime),i=We.formatTime(this.duration),s=He.get("seekLabel",this.config);t.setAttribute("aria-valuetext",s.replace("{currentTime}",e).replace("{duration}",i))}else if(re(t,this.config.selectors.inputs.volume)){const e=100*t.value;t.setAttribute("aria-valuenow",e),t.setAttribute("aria-valuetext",`${e.toFixed(1)}%`)}else t.setAttribute("aria-valuenow",t.value);Y.isWebkit&&t.style.setProperty("--value",t.value/t.max*100+"%")}},updateSeekTooltip(e){var t,i;if(!this.config.tooltips.seek||!H(this.elements.inputs.seek)||!H(this.elements.display.seekTooltip)||0===this.duration)return;const s=this.elements.display.seekTooltip,n=`${this.config.classNames.tooltip}--visible`,a=e=>le(s,n,e);if(this.touch)return void a(!1);let l=0;const o=this.elements.progress.getBoundingClientRect();if(R(e))l=100/o.width*(e.pageX-o.left);else{if(!oe(s,n))return;l=parseFloat(s.style.left,10)}l<0?l=0:l>100&&(l=100);const r=this.duration/100*l;s.innerText=We.formatTime(r);const c=null===(t=this.config.markers)||void 0===t||null===(i=t.points)||void 0===i?void 0:i.find((({time:e})=>e===Math.round(r)));c&&s.insertAdjacentHTML("afterbegin",`${c.label}<br>`),s.style.left=`${l}%`,R(e)&&["mouseenter","mouseleave"].includes(e.type)&&a("mouseenter"===e.type)},timeUpdate(e){const t=!H(this.elements.display.duration)&&this.config.invertTime;We.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||We.updateProgress.call(this,e)},durationUpdate(){if(!this.supported.ui||!this.config.invertTime&&this.currentTime)return;if(this.duration>=2**32)return ae(this.elements.display.currentTime,!0),void ae(this.elements.progress,!0);H(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);const e=H(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&We.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&We.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),this.config.markers.enabled&&We.setMarkers.call(this),We.updateSeekTooltip.call(this)},toggleMenuButton(e,t){ae(this.elements.settings.buttons[e],!t)},updateSetting(e,t,i){const s=this.elements.settings.panels[e];let n=null,a=t;if("captions"===e)n=this.currentTrack;else{if(n=W(i)?this[e]:i,W(n)&&(n=this.config[e].default),!W(this.options[e])&&!this.options[e].includes(n))return void this.debug.warn(`Unsupported value of '${n}' for ${e}`);if(!this.config[e].options.includes(n))return void this.debug.warn(`Disabled value of '${n}' for ${e}`)}if(H(a)||(a=s&&s.querySelector('[role="menu"]')),!H(a))return;this.elements.settings.buttons[e].querySelector(`.${this.config.classNames.menu.value}`).innerHTML=We.getLabel.call(this,e,n);const l=a&&a.querySelector(`[value="${n}"]`);H(l)&&(l.checked=!0)},getLabel(e,t){switch(e){case"speed":return 1===t?He.get("normal",this.config):`${t}&times;`;case"quality":if($(t)){const e=He.get(`qualityLabel.${t}`,this.config);return e.length?e:`${t}p`}return Oe(t);case"captions":return Ye.getLabel.call(this);default:return null}},setQualityMenu(e){if(!H(this.elements.settings.panels.quality))return;const t="quality",i=this.elements.settings.panels.quality.querySelector('[role="menu"]');D(e)&&(this.options.quality=Ce(e).filter((e=>this.config.quality.options.includes(e))));const s=!W(this.options.quality)&&this.options.quality.length>1;if(We.toggleMenuButton.call(this,t,s),ie(i),We.checkMenu.call(this),!s)return;const n=e=>{const t=He.get(`qualityBadge.${e}`,this.config);return t.length?We.createBadge.call(this,t):null};this.options.quality.sort(((e,t)=>{const i=this.config.quality.options;return i.indexOf(e)>i.indexOf(t)?1:-1})).forEach((e=>{We.createMenuItem.call(this,{value:e,list:i,type:t,title:We.getLabel.call(this,"quality",e),badge:n(e)})})),We.updateSetting.call(this,t,i)},setCaptionsMenu(){if(!H(this.elements.settings.panels.captions))return;const e="captions",t=this.elements.settings.panels.captions.querySelector('[role="menu"]'),i=Ye.getTracks.call(this),s=Boolean(i.length);if(We.toggleMenuButton.call(this,e,s),ie(t),We.checkMenu.call(this),!s)return;const n=i.map(((e,i)=>({value:i,checked:this.captions.toggled&&this.currentTrack===i,title:Ye.getLabel.call(this,e),badge:e.language&&We.createBadge.call(this,e.language.toUpperCase()),list:t,type:"language"})));n.unshift({value:-1,checked:!this.captions.toggled,title:He.get("disabled",this.config),list:t,type:"language"}),n.forEach(We.createMenuItem.bind(this)),We.updateSetting.call(this,e,t)},setSpeedMenu(){if(!H(this.elements.settings.panels.speed))return;const e="speed",t=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter((e=>e>=this.minimumSpeed&&e<=this.maximumSpeed));const i=!W(this.options.speed)&&this.options.speed.length>1;We.toggleMenuButton.call(this,e,i),ie(t),We.checkMenu.call(this),i&&(this.options.speed.forEach((i=>{We.createMenuItem.call(this,{value:i,list:t,type:e,title:We.getLabel.call(this,"speed",i)})})),We.updateSetting.call(this,e,t))},checkMenu(){const{buttons:e}=this.elements.settings,t=!W(e)&&Object.values(e).some((e=>!e.hidden));ae(this.elements.settings.menu,!t)},focusFirstMenuItem(e,t=!1){if(this.elements.settings.popup.hidden)return;let i=e;H(i)||(i=Object.values(this.elements.settings.panels).find((e=>!e.hidden)));const s=i.querySelector('[role^="menuitem"]');ue.call(this,s,t)},toggleMenu(e){const{popup:t}=this.elements.settings,i=this.elements.buttons.settings;if(!H(t)||!H(i))return;const{hidden:s}=t;let n=s;if(O(e))n=e;else if(F(e)&&"Escape"===e.key)n=!1;else if(R(e)){const s=j(e.composedPath)?e.composedPath()[0]:e.target,a=t.contains(s);if(a||!a&&e.target!==i&&n)return}i.setAttribute("aria-expanded",n),ae(t,!n),le(this.elements.container,this.config.classNames.menu.open,n),n&&F(e)?We.focusFirstMenuItem.call(this,null,!0):n||s||ue.call(this,i,F(e))},getMenuSize(e){const t=e.cloneNode(!0);t.style.position="absolute",t.style.opacity=0,t.removeAttribute("hidden"),e.parentNode.appendChild(t);const i=t.scrollWidth,s=t.scrollHeight;return te(t),{width:i,height:s}},showMenuPanel(e="",t=!1){const i=this.elements.container.querySelector(`#plyr-settings-${this.id}-${e}`);if(!H(i))return;const s=i.parentNode,n=Array.from(s.children).find((e=>!e.hidden));if(me.transitions&&!me.reducedMotion){s.style.width=`${n.scrollWidth}px`,s.style.height=`${n.scrollHeight}px`;const e=We.getMenuSize.call(this,i),t=e=>{e.target===s&&["width","height"].includes(e.propertyName)&&(s.style.width="",s.style.height="",be.call(this,s,z,t))};fe.call(this,s,z,t),s.style.width=`${e.width}px`,s.style.height=`${e.height}px`}ae(n,!0),ae(i,!1),We.focusFirstMenuItem.call(this,i,t)},setDownloadUrl(){const e=this.elements.buttons.download;H(e)&&e.setAttribute("href",this.download)},create(e){const{bindMenuItemShortcuts:t,createButton:i,createProgress:s,createRange:n,createTime:a,setQualityMenu:l,setSpeedMenu:o,showMenuPanel:r}=We;this.elements.controls=null,D(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(i.call(this,"play-large"));const c=Z("div",ne(this.config.selectors.controls.wrapper));this.elements.controls=c;const h={class:"plyr__controls__item"};return Ce(D(this.config.controls)?this.config.controls:[]).forEach((l=>{if("restart"===l&&c.appendChild(i.call(this,"restart",h)),"rewind"===l&&c.appendChild(i.call(this,"rewind",h)),"play"===l&&c.appendChild(i.call(this,"play",h)),"fast-forward"===l&&c.appendChild(i.call(this,"fast-forward",h)),"progress"===l){const t=Z("div",{class:`${h.class} plyr__progress__container`}),i=Z("div",ne(this.config.selectors.progress));if(i.appendChild(n.call(this,"seek",{id:`plyr-seek-${e.id}`})),i.appendChild(s.call(this,"buffer")),this.config.tooltips.seek){const e=Z("span",{class:this.config.classNames.tooltip},"00:00");i.appendChild(e),this.elements.display.seekTooltip=e}this.elements.progress=i,t.appendChild(this.elements.progress),c.appendChild(t)}if("current-time"===l&&c.appendChild(a.call(this,"currentTime",h)),"duration"===l&&c.appendChild(a.call(this,"duration",h)),"mute"===l||"volume"===l){let{volume:t}=this.elements;if(H(t)&&c.contains(t)||(t=Z("div",X({},h,{class:`${h.class} plyr__volume`.trim()})),this.elements.volume=t,c.appendChild(t)),"mute"===l&&t.appendChild(i.call(this,"mute")),"volume"===l&&!Y.isIos){const i={max:1,step:.05,value:this.config.volume};t.appendChild(n.call(this,"volume",X(i,{id:`plyr-volume-${e.id}`})))}}if("captions"===l&&c.appendChild(i.call(this,"captions",h)),"settings"===l&&!W(this.config.settings)){const s=Z("div",X({},h,{class:`${h.class} plyr__menu`.trim(),hidden:""}));s.appendChild(i.call(this,"settings",{"aria-haspopup":!0,"aria-controls":`plyr-settings-${e.id}`,"aria-expanded":!1}));const n=Z("div",{class:"plyr__menu__container",id:`plyr-settings-${e.id}`,hidden:""}),a=Z("div"),l=Z("div",{id:`plyr-settings-${e.id}-home`}),o=Z("div",{role:"menu"});l.appendChild(o),a.appendChild(l),this.elements.settings.panels.home=l,this.config.settings.forEach((i=>{const s=Z("button",X(ne(this.config.selectors.buttons.settings),{type:"button",class:`${this.config.classNames.control} ${this.config.classNames.control}--forward`,role:"menuitem","aria-haspopup":!0,hidden:""}));t.call(this,s,i),fe.call(this,s,"click",(()=>{r.call(this,i,!1)}));const n=Z("span",null,He.get(i,this.config)),l=Z("span",{class:this.config.classNames.menu.value});l.innerHTML=e[i],n.appendChild(l),s.appendChild(n),o.appendChild(s);const c=Z("div",{id:`plyr-settings-${e.id}-${i}`,hidden:""}),h=Z("button",{type:"button",class:`${this.config.classNames.control} ${this.config.classNames.control}--back`});h.appendChild(Z("span",{"aria-hidden":!0},He.get(i,this.config))),h.appendChild(Z("span",{class:this.config.classNames.hidden},He.get("menuBack",this.config))),fe.call(this,c,"keydown",(e=>{"ArrowLeft"===e.key&&(e.preventDefault(),e.stopPropagation(),r.call(this,"home",!0))}),!1),fe.call(this,h,"click",(()=>{r.call(this,"home",!1)})),c.appendChild(h),c.appendChild(Z("div",{role:"menu"})),a.appendChild(c),this.elements.settings.buttons[i]=s,this.elements.settings.panels[i]=c})),n.appendChild(a),s.appendChild(n),c.appendChild(s),this.elements.settings.popup=n,this.elements.settings.menu=s}if("pip"===l&&me.pip&&c.appendChild(i.call(this,"pip",h)),"airplay"===l&&me.airplay&&c.appendChild(i.call(this,"airplay",h)),"download"===l){const e=X({},h,{element:"a",href:this.download,target:"_blank"});this.isHTML5&&(e.download="");const{download:t}=this.config.urls;!U(t)&&this.isEmbed&&X(e,{icon:`logo-${this.provider}`,label:this.provider}),c.appendChild(i.call(this,"download",e))}"fullscreen"===l&&c.appendChild(i.call(this,"fullscreen",h))})),this.isHTML5&&l.call(this,Le.getQualityOptions.call(this)),o.call(this),c},inject(){if(this.config.loadSprite){const e=We.getIconUrl.call(this);e.cors&&Ve(e.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());let e=null;this.elements.controls=null;const t={id:this.id,seektime:this.config.seekTime,title:this.config.title};let i=!0;j(this.config.controls)&&(this.config.controls=this.config.controls.call(this,t)),this.config.controls||(this.config.controls=[]),H(this.config.controls)||_(this.config.controls)?e=this.config.controls:(e=We.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:Ye.getLabel.call(this)}),i=!1);let s;i&&_(this.config.controls)&&(e=(e=>{let i=e;return Object.entries(t).forEach((([e,t])=>{i=_e(i,`{${e}}`,t)})),i})(e)),_(this.config.selectors.controls.container)&&(s=document.querySelector(this.config.selectors.controls.container)),H(s)||(s=this.elements.container);if(s[H(e)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",e),H(this.elements.controls)||We.findElements.call(this),!W(this.elements.buttons)){const e=e=>{const t=this.config.classNames.controlPressed;Object.defineProperty(e,"pressed",{enumerable:!0,get:()=>oe(e,t),set(i=!1){le(e,t,i)}})};Object.values(this.elements.buttons).filter(Boolean).forEach((t=>{D(t)||q(t)?Array.from(t).filter(Boolean).forEach(e):e(t)}))}if(Y.isEdge&&K(s),this.config.tooltips.controls){const{classNames:e,selectors:t}=this.config,i=`${t.controls.wrapper} ${t.labels} .${e.hidden}`,s=ce.call(this,i);Array.from(s).forEach((e=>{le(e,this.config.classNames.hidden,!1),le(e,this.config.classNames.tooltip,!0)}))}},setMediaMetadata(){try{"mediaSession"in navigator&&(navigator.mediaSession.metadata=new window.MediaMetadata({title:this.config.mediaMetadata.title,artist:this.config.mediaMetadata.artist,album:this.config.mediaMetadata.album,artwork:this.config.mediaMetadata.artwork}))}catch(e){}},setMarkers(){var e,t;if(!this.duration||this.elements.markers)return;const i=null===(e=this.config.markers)||void 0===e||null===(t=e.points)||void 0===t?void 0:t.filter((({time:e})=>e>0&&e<this.duration));if(null==i||!i.length)return;const s=document.createDocumentFragment(),n=document.createDocumentFragment();let a=null;const l=`${this.config.classNames.tooltip}--visible`,o=e=>le(a,l,e);i.forEach((e=>{const t=Z("span",{class:this.config.classNames.marker},""),i=e.time/this.duration*100+"%";a&&(t.addEventListener("mouseenter",(()=>{e.label||(a.style.left=i,a.innerHTML=e.label,o(!0))})),t.addEventListener("mouseleave",(()=>{o(!1)}))),t.addEventListener("click",(()=>{this.currentTime=e.time})),t.style.left=i,n.appendChild(t)})),s.appendChild(n),this.config.tooltips.seek||(a=Z("span",{class:this.config.classNames.tooltip},""),s.appendChild(a)),this.elements.markers={points:n,tip:a},this.elements.progress.appendChild(s)}};function ze(e,t=!0){let i=e;if(t){const e=document.createElement("a");e.href=i,i=e.href}try{return new URL(i)}catch(e){return null}}function Ke(e){const t=new URLSearchParams;return L(e)&&Object.entries(e).forEach((([e,i])=>{t.set(e,i)})),t}const Ye={setup(){if(!this.supported.ui)return;if(!this.isVideo||this.isYouTube||this.isHTML5&&!me.textTracks)return void(D(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&We.setCaptionsMenu.call(this));var e,t;if(H(this.elements.captions)||(this.elements.captions=Z("div",ne(this.config.selectors.captions)),e=this.elements.captions,t=this.elements.wrapper,H(e)&&H(t)&&t.parentNode.insertBefore(e,t.nextSibling)),Y.isIE&&window.URL){const e=this.media.querySelectorAll("track");Array.from(e).forEach((e=>{const t=e.getAttribute("src"),i=ze(t);null!==i&&i.hostname!==window.location.href.hostname&&["http:","https:"].includes(i.protocol)&&Fe(t,"blob").then((t=>{e.setAttribute("src",window.URL.createObjectURL(t))})).catch((()=>{te(e)}))}))}const i=Ce((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map((e=>e.split("-")[0])));let s=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();"auto"===s&&([s]=i);let n=this.storage.get("captions");if(O(n)||({active:n}=this.config.captions),Object.assign(this.captions,{toggled:!1,active:n,language:s,languages:i}),this.isHTML5){const e=this.config.captions.update?"addtrack removetrack":"removetrack";fe.call(this,this.media.textTracks,e,Ye.update.bind(this))}setTimeout(Ye.update.bind(this),0)},update(){const e=Ye.getTracks.call(this,!0),{active:t,language:i,meta:s,currentTrackNode:n}=this.captions,a=Boolean(e.find((e=>e.language===i)));this.isHTML5&&this.isVideo&&e.filter((e=>!s.get(e))).forEach((e=>{this.debug.log("Track added",e),s.set(e,{default:"showing"===e.mode}),"showing"===e.mode&&(e.mode="hidden"),fe.call(this,e,"cuechange",(()=>Ye.updateCues.call(this)))})),(a&&this.language!==i||!e.includes(n))&&(Ye.setLanguage.call(this,i),Ye.toggle.call(this,t&&a)),this.elements&&le(this.elements.container,this.config.classNames.captions.enabled,!W(e)),D(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&We.setCaptionsMenu.call(this)},toggle(e,t=!0){if(!this.supported.ui)return;const{toggled:i}=this.captions,s=this.config.classNames.captions.active,n=I(e)?!i:e;if(n!==i){if(t||(this.captions.active=n,this.storage.set({captions:n})),!this.language&&n&&!t){const e=Ye.getTracks.call(this),t=Ye.findTrack.call(this,[this.captions.language,...this.captions.languages],!0);return this.captions.language=t.language,void Ye.set.call(this,e.indexOf(t))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=n),le(this.elements.container,s,n),this.captions.toggled=n,We.updateSetting.call(this,"captions"),ve.call(this,this.media,n?"captionsenabled":"captionsdisabled")}setTimeout((()=>{n&&this.captions.toggled&&(this.captions.currentTrackNode.mode="hidden")}))},set(e,t=!0){const i=Ye.getTracks.call(this);if(-1!==e)if($(e))if(e in i){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;const s=i[e],{language:n}=s||{};this.captions.currentTrackNode=s,We.updateSetting.call(this,"captions"),t||(this.captions.language=n,this.storage.set({language:n})),this.isVimeo&&this.embed.enableTextTrack(n),ve.call(this,this.media,"languagechange")}Ye.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&Ye.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else Ye.toggle.call(this,!1,t)},setLanguage(e,t=!0){if(!_(e))return void this.debug.warn("Invalid language argument",e);const i=e.toLowerCase();this.captions.language=i;const s=Ye.getTracks.call(this),n=Ye.findTrack.call(this,[i]);Ye.set.call(this,s.indexOf(n),t)},getTracks(e=!1){return Array.from((this.media||{}).textTracks||[]).filter((t=>!this.isHTML5||e||this.captions.meta.has(t))).filter((e=>["captions","subtitles"].includes(e.kind)))},findTrack(e,t=!1){const i=Ye.getTracks.call(this),s=e=>Number((this.captions.meta.get(e)||{}).default),n=Array.from(i).sort(((e,t)=>s(t)-s(e)));let a;return e.every((e=>(a=n.find((t=>t.language===e)),!a))),a||(t?n[0]:void 0)},getCurrentTrack(){return Ye.getTracks.call(this)[this.currentTrack]},getLabel(e){let t=e;return!V(t)&&me.textTracks&&this.captions.toggled&&(t=Ye.getCurrentTrack.call(this)),V(t)?W(t.label)?W(t.language)?He.get("enabled",this.config):e.language.toUpperCase():t.label:He.get("disabled",this.config)},updateCues(e){if(!this.supported.ui)return;if(!H(this.elements.captions))return void this.debug.warn("No captions element to render to");if(!I(e)&&!Array.isArray(e))return void this.debug.warn("updateCues: Invalid input",e);let t=e;if(!t){const e=Ye.getCurrentTrack.call(this);t=Array.from((e||{}).activeCues||[]).map((e=>e.getCueAsHTML())).map(De)}const i=t.map((e=>e.trim())).join("\n");if(i!==this.elements.captions.innerHTML){ie(this.elements.captions);const e=Z("span",ne(this.config.selectors.caption));e.innerHTML=i,this.elements.captions.appendChild(e),ve.call(this,this.media,"cuechange")}}},Qe={enabled:!0,title:"",debug:!1,autoplay:!1,autopause:!0,playsinline:!0,seekTime:10,volume:1,muted:!1,duration:null,displayDuration:!0,invertTime:!0,toggleInvert:!0,ratio:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.7.2/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},keyboard:{focused:!0,global:!1},tooltips:{controls:!1,seek:!0},captions:{active:!1,language:"auto",update:!1},fullscreen:{enabled:!0,fallback:!0,iosNative:!1},storage:{enabled:!0,key:"plyr"},controls:["play-large","play","progress","current-time","mute","volume","captions","settings","pip","airplay","fullscreen"],settings:["captions","quality","speed"],i18n:{restart:"Restart",rewind:"Rewind {seektime}s",play:"Play",pause:"Pause",fastForward:"Forward {seektime}s",seek:"Seek",seekLabel:"{currentTime} of {duration}",played:"Played",buffered:"Buffered",currentTime:"Current time",duration:"Duration",volume:"Volume",mute:"Mute",unmute:"Unmute",enableCaptions:"Enable captions",disableCaptions:"Disable captions",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",menuBack:"Go back to previous menu",speed:"Speed",normal:"Normal",quality:"Quality",loop:"Loop",start:"Start",end:"End",all:"All",reset:"Reset",disabled:"Disabled",enabled:"Enabled",advertisement:"Ad",qualityBadge:{2160:"4K",1440:"HD",1080:"HD",720:"HD",576:"SD",480:"SD"}},urls:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},googleIMA:{sdk:"https://imasdk.googleapis.com/js/sdkloader/ima3.js"}},listeners:{seek:null,play:null,pause:null,restart:null,rewind:null,fastForward:null,mute:null,volume:null,captions:null,download:null,fullscreen:null,pip:null,airplay:null,speed:null,quality:null,loop:null,language:null},events:["ended","progress","stalled","playing","waiting","canplay","canplaythrough","loadstart","loadeddata","loadedmetadata","timeupdate","volumechange","play","pause","error","seeking","seeked","emptied","ratechange","cuechange","download","enterfullscreen","exitfullscreen","captionsenabled","captionsdisabled","languagechange","controlshidden","controlsshown","ready","statechange","qualitychange","adsloaded","adscontentpause","adscontentresume","adstarted","adsmidpoint","adscomplete","adsallcomplete","adsimpression","adsclick"],selectors:{editable:"input, textarea, select, [contenteditable]",container:".plyr",controls:{container:null,wrapper:".plyr__controls"},labels:"[data-plyr]",buttons:{play:'[data-plyr="play"]',pause:'[data-plyr="pause"]',restart:'[data-plyr="restart"]',rewind:'[data-plyr="rewind"]',fastForward:'[data-plyr="fast-forward"]',mute:'[data-plyr="mute"]',captions:'[data-plyr="captions"]',download:'[data-plyr="download"]',fullscreen:'[data-plyr="fullscreen"]',pip:'[data-plyr="pip"]',airplay:'[data-plyr="airplay"]',settings:'[data-plyr="settings"]',loop:'[data-plyr="loop"]'},inputs:{seek:'[data-plyr="seek"]',volume:'[data-plyr="volume"]',speed:'[data-plyr="speed"]',language:'[data-plyr="language"]',quality:'[data-plyr="quality"]'},display:{currentTime:".plyr__time--current",duration:".plyr__time--duration",buffer:".plyr__progress__buffer",loop:".plyr__progress__loop",volume:".plyr__volume--display"},progress:".plyr__progress",captions:".plyr__captions",caption:".plyr__caption"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",embedContainer:"plyr__video-embed__container",poster:"plyr__poster",posterEnabled:"plyr__poster-enabled",ads:"plyr__ads",control:"plyr__control",controlPressed:"plyr__control--pressed",playing:"plyr--playing",paused:"plyr--paused",stopped:"plyr--stopped",loading:"plyr--loading",hover:"plyr--hover",tooltip:"plyr__tooltip",cues:"plyr__cues",marker:"plyr__progress__marker",hidden:"plyr__sr-only",hideControls:"plyr--hide-controls",isIos:"plyr--is-ios",isTouch:"plyr--is-touch",uiSupported:"plyr--full-ui",noTransition:"plyr--no-transition",display:{time:"plyr__time"},menu:{value:"plyr__menu__value",badge:"plyr__badge",open:"plyr--menu-open"},captions:{enabled:"plyr--captions-enabled",active:"plyr--captions-active"},fullscreen:{enabled:"plyr--fullscreen-enabled",fallback:"plyr--fullscreen-fallback"},pip:{supported:"plyr--pip-supported",active:"plyr--pip-active"},airplay:{supported:"plyr--airplay-supported",active:"plyr--airplay-active"},tabFocus:"plyr__tab-focus",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id",hash:"data-plyr-embed-hash"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1},mediaMetadata:{title:"",artist:"",album:"",artwork:[]},markers:{enabled:!1,points:[]}},Xe="picture-in-picture",Je="inline",Ge={html5:"html5",youtube:"youtube",vimeo:"vimeo"},Ze="audio",et="video";const tt=()=>{};class it{constructor(e=!1){this.enabled=window.console&&e,this.enabled&&this.log("Debugging enabled")}get log(){return this.enabled?Function.prototype.bind.call(console.log,console):tt}get warn(){return this.enabled?Function.prototype.bind.call(console.warn,console):tt}get error(){return this.enabled?Function.prototype.bind.call(console.error,console):tt}}class st{constructor(t){e(this,"onChange",(()=>{if(!this.enabled)return;const e=this.player.elements.buttons.fullscreen;H(e)&&(e.pressed=this.active);const t=this.target===this.player.media?this.target:this.player.elements.container;ve.call(this.player,t,this.active?"enterfullscreen":"exitfullscreen",!0)})),e(this,"toggleFallback",((e=!1)=>{if(e?this.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(this.scrollPosition.x,this.scrollPosition.y),document.body.style.overflow=e?"hidden":"",le(this.target,this.player.config.classNames.fullscreen.fallback,e),Y.isIos){let t=document.head.querySelector('meta[name="viewport"]');const i="viewport-fit=cover";t||(t=document.createElement("meta"),t.setAttribute("name","viewport"));const s=_(t.content)&&t.content.includes(i);e?(this.cleanupViewport=!s,s||(t.content+=`,${i}`)):this.cleanupViewport&&(t.content=t.content.split(",").filter((e=>e.trim()!==i)).join(","))}this.onChange()})),e(this,"trapFocus",(e=>{if(Y.isIos||!this.active||"Tab"!==e.key)return;const t=document.activeElement,i=ce.call(this.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),[s]=i,n=i[i.length-1];t!==n||e.shiftKey?t===s&&e.shiftKey&&(n.focus(),e.preventDefault()):(s.focus(),e.preventDefault())})),e(this,"update",(()=>{if(this.enabled){let e;e=this.forceFallback?"Fallback (forced)":st.native?"Native":"Fallback",this.player.debug.log(`${e} fullscreen enabled`)}else this.player.debug.log("Fullscreen not supported and fallback disabled");le(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)})),e(this,"enter",(()=>{this.enabled&&(Y.isIos&&this.player.config.fullscreen.iosNative?this.player.isVimeo?this.player.embed.requestFullscreen():this.target.webkitEnterFullscreen():!st.native||this.forceFallback?this.toggleFallback(!0):this.prefix?W(this.prefix)||this.target[`${this.prefix}Request${this.property}`]():this.target.requestFullscreen({navigationUI:"hide"}))})),e(this,"exit",(()=>{if(this.enabled)if(Y.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),ke(this.player.play());else if(!st.native||this.forceFallback)this.toggleFallback(!1);else if(this.prefix){if(!W(this.prefix)){const e="moz"===this.prefix?"Cancel":"Exit";document[`${this.prefix}${e}${this.property}`]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document)})),e(this,"toggle",(()=>{this.active?this.exit():this.enter()})),this.player=t,this.prefix=st.prefix,this.property=st.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===t.config.fullscreen.fallback,this.player.elements.fullscreen=t.config.fullscreen.container&&function(e,t){const{prototype:i}=Element;return(i.closest||function(){let e=this;do{if(re.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}).call(e,t)}(this.player.elements.container,t.config.fullscreen.container),fe.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":`${this.prefix}fullscreenchange`,(()=>{this.onChange()})),fe.call(this.player,this.player.elements.container,"dblclick",(e=>{H(this.player.elements.controls)&&this.player.elements.controls.contains(e.target)||this.player.listeners.proxy(e,this.toggle,"fullscreen")})),fe.call(this,this.player.elements.container,"keydown",(e=>this.trapFocus(e))),this.update()}static get native(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}get usingNative(){return st.native&&!this.forceFallback}static get prefix(){if(j(document.exitFullscreen))return"";let e="";return["webkit","moz","ms"].some((t=>!(!j(document[`${t}ExitFullscreen`])&&!j(document[`${t}CancelFullScreen`]))&&(e=t,!0))),e}static get property(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}get enabled(){return(st.native||this.player.config.fullscreen.fallback)&&this.player.config.fullscreen.enabled&&this.player.supported.ui&&this.player.isVideo}get active(){if(!this.enabled)return!1;if(!st.native||this.forceFallback)return oe(this.target,this.player.config.classNames.fullscreen.fallback);const e=this.prefix?this.target.getRootNode()[`${this.prefix}${this.property}Element`]:this.target.getRootNode().fullscreenElement;return e&&e.shadowRoot?e===this.target.getRootNode().host:e===this.target}get target(){return Y.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen||this.player.elements.container}}function nt(e,t=1){return new Promise(((i,s)=>{const n=new Image,a=()=>{delete n.onload,delete n.onerror,(n.naturalWidth>=t?i:s)(n)};Object.assign(n,{onload:a,onerror:a,src:e})}))}const at={addStyleHook(){le(this.elements.container,this.config.selectors.container.replace(".",""),!0),le(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls(e=!1){e&&this.isHTML5?this.media.setAttribute("controls",""):this.media.removeAttribute("controls")},build(){if(this.listeners.media(),!this.supported.ui)return this.debug.warn(`Basic support only for ${this.provider} ${this.type}`),void at.toggleNativeControls.call(this,!0);H(this.elements.controls)||(We.inject.call(this),this.listeners.controls()),at.toggleNativeControls.call(this),this.isHTML5&&Ye.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,We.updateVolume.call(this),We.timeUpdate.call(this),We.durationUpdate.call(this),at.checkPlaying.call(this),le(this.elements.container,this.config.classNames.pip.supported,me.pip&&this.isHTML5&&this.isVideo),le(this.elements.container,this.config.classNames.airplay.supported,me.airplay&&this.isHTML5),le(this.elements.container,this.config.classNames.isIos,Y.isIos),le(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout((()=>{ve.call(this,this.media,"ready")}),0),at.setTitle.call(this),this.poster&&at.setPoster.call(this,this.poster,!1).catch((()=>{})),this.config.duration&&We.durationUpdate.call(this),this.config.mediaMetadata&&We.setMediaMetadata.call(this)},setTitle(){let e=He.get("play",this.config);if(_(this.config.title)&&!W(this.config.title)&&(e+=`, ${this.config.title}`),Array.from(this.elements.buttons.play||[]).forEach((t=>{t.setAttribute("aria-label",e)})),this.isEmbed){const e=he.call(this,"iframe");if(!H(e))return;const t=W(this.config.title)?"video":this.config.title,i=He.get("frameTitle",this.config);e.setAttribute("title",i.replace("{title}",t))}},togglePoster(e){le(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster(e,t=!0){return t&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),Te.call(this).then((()=>nt(e))).catch((t=>{throw e===this.poster&&at.togglePoster.call(this,!1),t})).then((()=>{if(e!==this.poster)throw new Error("setPoster cancelled by later call to setPoster")})).then((()=>(Object.assign(this.elements.poster.style,{backgroundImage:`url('${e}')`,backgroundSize:""}),at.togglePoster.call(this,!0),e))))},checkPlaying(e){le(this.elements.container,this.config.classNames.playing,this.playing),le(this.elements.container,this.config.classNames.paused,this.paused),le(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach((e=>{Object.assign(e,{pressed:this.playing}),e.setAttribute("aria-label",He.get(this.playing?"pause":"play",this.config))})),R(e)&&"timeupdate"===e.type||at.toggleControls.call(this)},checkLoading(e){this.loading=["stalled","waiting"].includes(e.type),clearTimeout(this.timers.loading),this.timers.loading=setTimeout((()=>{le(this.elements.container,this.config.classNames.loading,this.loading),at.toggleControls.call(this)}),this.loading?250:0)},toggleControls(e){const{controls:t}=this.elements;if(t&&this.config.hideControls){const i=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||i))}},migrateStyles(){Object.values({...this.media.style}).filter((e=>!W(e)&&_(e)&&e.startsWith("--plyr"))).forEach((e=>{this.elements.container.style.setProperty(e,this.media.style.getPropertyValue(e)),this.media.style.removeProperty(e)})),W(this.media.style)&&this.media.removeAttribute("style")}};class lt{constructor(t){e(this,"firstTouch",(()=>{const{player:e}=this,{elements:t}=e;e.touch=!0,le(t.container,e.config.classNames.isTouch,!0)})),e(this,"setTabFocus",(e=>{const{player:t}=this,{elements:i}=t,{key:s,type:n,timeStamp:a}=e;if(clearTimeout(this.focusTimer),"keydown"===n&&"Tab"!==s)return;"keydown"===n&&(this.lastKeyDown=a);const l=a-this.lastKeyDown<=20;("focus"!==n||l)&&((()=>{const e=t.config.classNames.tabFocus;le(ce.call(t,`.${e}`),e,!1)})(),"focusout"!==n&&(this.focusTimer=setTimeout((()=>{const e=document.activeElement;i.container.contains(e)&&le(document.activeElement,t.config.classNames.tabFocus,!0)}),10)))})),e(this,"global",((e=!0)=>{const{player:t}=this;t.config.keyboard.global&&ge.call(t,window,"keydown keyup",this.handleKey,e,!1),ge.call(t,document.body,"click",this.toggleMenu,e),ye.call(t,document.body,"touchstart",this.firstTouch),ge.call(t,document.body,"keydown focus blur focusout",this.setTabFocus,e,!1,!0)})),e(this,"container",(()=>{const{player:e}=this,{config:t,elements:i,timers:s}=e;!t.keyboard.global&&t.keyboard.focused&&fe.call(e,i.container,"keydown keyup",this.handleKey,!1),fe.call(e,i.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",(t=>{const{controls:n}=i;n&&"enterfullscreen"===t.type&&(n.pressed=!1,n.hover=!1);let a=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(at.toggleControls.call(e,!0),a=e.touch?3e3:2e3),clearTimeout(s.controls),s.controls=setTimeout((()=>at.toggleControls.call(e,!1)),a)}));const n=()=>{if(!e.isVimeo||e.config.vimeo.premium)return;const t=i.wrapper,{active:s}=e.fullscreen,[n,a]=Ne.call(e),l=Se(`aspect-ratio: ${n} / ${a}`);if(!s)return void(l?(t.style.width=null,t.style.height=null):(t.style.maxWidth=null,t.style.margin=null));const[o,r]=[Math.max(document.documentElement.clientWidth||0,window.innerWidth||0),Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)],c=o/r>n/a;l?(t.style.width=c?"auto":"100%",t.style.height=c?"100%":"auto"):(t.style.maxWidth=c?r/a*n+"px":null,t.style.margin=c?"0 auto":null)},a=()=>{clearTimeout(s.resized),s.resized=setTimeout(n,50)};fe.call(e,i.container,"enterfullscreen exitfullscreen",(t=>{const{target:s}=e.fullscreen;if(s!==i.container)return;if(!e.isEmbed&&W(e.config.ratio))return;n();("enterfullscreen"===t.type?fe:be).call(e,window,"resize",a)}))})),e(this,"media",(()=>{const{player:e}=this,{elements:t}=e;if(fe.call(e,e.media,"timeupdate seeking seeked",(t=>We.timeUpdate.call(e,t))),fe.call(e,e.media,"durationchange loadeddata loadedmetadata",(t=>We.durationUpdate.call(e,t))),fe.call(e,e.media,"ended",(()=>{e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&(e.restart(),e.pause())})),fe.call(e,e.media,"progress playing seeking seeked",(t=>We.updateProgress.call(e,t))),fe.call(e,e.media,"volumechange",(t=>We.updateVolume.call(e,t))),fe.call(e,e.media,"playing play pause ended emptied timeupdate",(t=>at.checkPlaying.call(e,t))),fe.call(e,e.media,"waiting canplay seeked playing",(t=>at.checkLoading.call(e,t))),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){const i=he.call(e,`.${e.config.classNames.video}`);if(!H(i))return;fe.call(e,t.container,"click",(s=>{([t.container,i].includes(s.target)||i.contains(s.target))&&(e.touch&&e.config.hideControls||(e.ended?(this.proxy(s,e.restart,"restart"),this.proxy(s,(()=>{ke(e.play())}),"play")):this.proxy(s,(()=>{ke(e.togglePlay())}),"play")))}))}e.supported.ui&&e.config.disableContextMenu&&fe.call(e,t.wrapper,"contextmenu",(e=>{e.preventDefault()}),!1),fe.call(e,e.media,"volumechange",(()=>{e.storage.set({volume:e.volume,muted:e.muted})})),fe.call(e,e.media,"ratechange",(()=>{We.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})})),fe.call(e,e.media,"qualitychange",(t=>{We.updateSetting.call(e,"quality",null,t.detail.quality)})),fe.call(e,e.media,"ready qualitychange",(()=>{We.setDownloadUrl.call(e)}));const i=e.config.events.concat(["keyup","keydown"]).join(" ");fe.call(e,e.media,i,(i=>{let{detail:s={}}=i;"error"===i.type&&(s=e.media.error),ve.call(e,t.container,i.type,!0,s)}))})),e(this,"proxy",((e,t,i)=>{const{player:s}=this,n=s.config.listeners[i];let a=!0;j(n)&&(a=n.call(s,e)),!1!==a&&j(t)&&t.call(s,e)})),e(this,"bind",((e,t,i,s,n=!0)=>{const{player:a}=this,l=a.config.listeners[s],o=j(l);fe.call(a,e,t,(e=>this.proxy(e,i,s)),n&&!o)})),e(this,"controls",(()=>{const{player:e}=this,{elements:t}=e,i=Y.isIE?"change":"input";if(t.buttons.play&&Array.from(t.buttons.play).forEach((t=>{this.bind(t,"click",(()=>{ke(e.togglePlay())}),"play")})),this.bind(t.buttons.restart,"click",e.restart,"restart"),this.bind(t.buttons.rewind,"click",(()=>{e.lastSeekTime=Date.now(),e.rewind()}),"rewind"),this.bind(t.buttons.fastForward,"click",(()=>{e.lastSeekTime=Date.now(),e.forward()}),"fastForward"),this.bind(t.buttons.mute,"click",(()=>{e.muted=!e.muted}),"mute"),this.bind(t.buttons.captions,"click",(()=>e.toggleCaptions())),this.bind(t.buttons.download,"click",(()=>{ve.call(e,e.media,"download")}),"download"),this.bind(t.buttons.fullscreen,"click",(()=>{e.fullscreen.toggle()}),"fullscreen"),this.bind(t.buttons.pip,"click",(()=>{e.pip="toggle"}),"pip"),this.bind(t.buttons.airplay,"click",e.airplay,"airplay"),this.bind(t.buttons.settings,"click",(t=>{t.stopPropagation(),t.preventDefault(),We.toggleMenu.call(e,t)}),null,!1),this.bind(t.buttons.settings,"keyup",(t=>{["Space","Enter"].includes(t.key)&&("Enter"!==t.key?(t.preventDefault(),t.stopPropagation(),We.toggleMenu.call(e,t)):We.focusFirstMenuItem.call(e,null,!0))}),null,!1),this.bind(t.settings.menu,"keydown",(t=>{"Escape"===t.key&&We.toggleMenu.call(e,t)})),this.bind(t.inputs.seek,"mousedown mousemove",(e=>{const i=t.progress.getBoundingClientRect(),s=100/i.width*(e.pageX-i.left);e.currentTarget.setAttribute("seek-value",s)})),this.bind(t.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",(t=>{const i=t.currentTarget,s="play-on-seeked";if(F(t)&&!["ArrowLeft","ArrowRight"].includes(t.key))return;e.lastSeekTime=Date.now();const n=i.hasAttribute(s),a=["mouseup","touchend","keyup"].includes(t.type);n&&a?(i.removeAttribute(s),ke(e.play())):!a&&e.playing&&(i.setAttribute(s,""),e.pause())})),Y.isIos){const t=ce.call(e,'input[type="range"]');Array.from(t).forEach((e=>this.bind(e,i,(e=>K(e.target)))))}this.bind(t.inputs.seek,i,(t=>{const i=t.currentTarget;let s=i.getAttribute("seek-value");W(s)&&(s=i.value),i.removeAttribute("seek-value"),e.currentTime=s/i.max*e.duration}),"seek"),this.bind(t.progress,"mouseenter mouseleave mousemove",(t=>We.updateSeekTooltip.call(e,t))),this.bind(t.progress,"mousemove touchmove",(t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.startMove(t)})),this.bind(t.progress,"mouseleave touchend click",(()=>{const{previewThumbnails:t}=e;t&&t.loaded&&t.endMove(!1,!0)})),this.bind(t.progress,"mousedown touchstart",(t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.startScrubbing(t)})),this.bind(t.progress,"mouseup touchend",(t=>{const{previewThumbnails:i}=e;i&&i.loaded&&i.endScrubbing(t)})),Y.isWebkit&&Array.from(ce.call(e,'input[type="range"]')).forEach((t=>{this.bind(t,"input",(t=>We.updateRangeFill.call(e,t.target)))})),e.config.toggleInvert&&!H(t.display.duration)&&this.bind(t.display.currentTime,"click",(()=>{0!==e.currentTime&&(e.config.invertTime=!e.config.invertTime,We.timeUpdate.call(e))})),this.bind(t.inputs.volume,i,(t=>{e.volume=t.target.value}),"volume"),this.bind(t.controls,"mouseenter mouseleave",(i=>{t.controls.hover=!e.touch&&"mouseenter"===i.type})),t.fullscreen&&Array.from(t.fullscreen.children).filter((e=>!e.contains(t.container))).forEach((i=>{this.bind(i,"mouseenter mouseleave",(i=>{t.controls&&(t.controls.hover=!e.touch&&"mouseenter"===i.type)}))})),this.bind(t.controls,"mousedown mouseup touchstart touchend touchcancel",(e=>{t.controls.pressed=["mousedown","touchstart"].includes(e.type)})),this.bind(t.controls,"focusin",(()=>{const{config:i,timers:s}=e;le(t.controls,i.classNames.noTransition,!0),at.toggleControls.call(e,!0),setTimeout((()=>{le(t.controls,i.classNames.noTransition,!1)}),0);const n=this.touch?3e3:4e3;clearTimeout(s.controls),s.controls=setTimeout((()=>at.toggleControls.call(e,!1)),n)})),this.bind(t.inputs.volume,"wheel",(t=>{const i=t.webkitDirectionInvertedFromDevice,[s,n]=[t.deltaX,-t.deltaY].map((e=>i?-e:e)),a=Math.sign(Math.abs(s)>Math.abs(n)?s:n);e.increaseVolume(a/50);const{volume:l}=e.media;(1===a&&l<1||-1===a&&l>0)&&t.preventDefault()}),"volume",!1)})),this.player=t,this.lastKey=null,this.focusTimer=null,this.lastKeyDown=null,this.handleKey=this.handleKey.bind(this),this.toggleMenu=this.toggleMenu.bind(this),this.setTabFocus=this.setTabFocus.bind(this),this.firstTouch=this.firstTouch.bind(this)}handleKey(e){const{player:t}=this,{elements:i}=t,{key:s,type:n,altKey:a,ctrlKey:l,metaKey:o,shiftKey:r}=e,c="keydown"===n,h=c&&s===this.lastKey;if(a||l||o||r)return;if(!s)return;if(c){const n=document.activeElement;if(H(n)){const{editable:s}=t.config.selectors,{seek:a}=i.inputs;if(n!==a&&re(n,s))return;if("Space"===e.key&&re(n,'button, [role^="menuitem"]'))return}switch(["Space","ArrowLeft","ArrowUp","ArrowRight","ArrowDown","0","1","2","3","4","5","6","7","8","9","c","f","k","l","m"].includes(s)&&(e.preventDefault(),e.stopPropagation()),s){case"0":case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":h||(u=parseInt(s,10),t.currentTime=t.duration/10*u);break;case"Space":case"k":h||ke(t.togglePlay());break;case"ArrowUp":t.increaseVolume(.1);break;case"ArrowDown":t.decreaseVolume(.1);break;case"m":h||(t.muted=!t.muted);break;case"ArrowRight":t.forward();break;case"ArrowLeft":t.rewind();break;case"f":t.fullscreen.toggle();break;case"c":h||t.toggleCaptions();break;case"l":t.loop=!t.loop}"Escape"===s&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=s}else this.lastKey=null;var u}toggleMenu(e){We.toggleMenu.call(this.player,e)}}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof __webpack_require__.g?__webpack_require__.g:"undefined"!=typeof self&&self;var ot=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e,t){e.exports=function(){var e=function(){},t={},i={},s={};function n(e,t){e=e.push?e:[e];var n,a,l,o=[],r=e.length,c=r;for(n=function(e,i){i.length&&o.push(e),--c||t(o)};r--;)a=e[r],(l=i[a])?n(a,l):(s[a]=s[a]||[]).push(n)}function a(e,t){if(e){var n=s[e];if(i[e]=t,n)for(;n.length;)n[0](e,t),n.splice(0,1)}}function l(t,i){t.call&&(t={success:t}),i.length?(t.error||e)(i):(t.success||e)(t)}function o(t,i,s,n){var a,l,r=document,c=s.async,h=(s.numRetries||0)+1,u=s.before||e,d=t.replace(/[\?|#].*$/,""),m=t.replace(/^(css|img)!/,"");n=n||0,/(^css!|\.css$)/.test(d)?((l=r.createElement("link")).rel="stylesheet",l.href=m,(a="hideFocus"in l)&&l.relList&&(a=0,l.rel="preload",l.as="style")):/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(d)?(l=r.createElement("img")).src=m:((l=r.createElement("script")).src=t,l.async=void 0===c||c),l.onload=l.onerror=l.onbeforeload=function(e){var r=e.type[0];if(a)try{l.sheet.cssText.length||(r="e")}catch(e){18!=e.code&&(r="e")}if("e"==r){if((n+=1)<h)return o(t,i,s,n)}else if("preload"==l.rel&&"style"==l.as)return l.rel="stylesheet";i(t,r,e.defaultPrevented)},!1!==u(t,l)&&r.head.appendChild(l)}function r(e,t,i){var s,n,a=(e=e.push?e:[e]).length,l=a,r=[];for(s=function(e,i,s){if("e"==i&&r.push(e),"b"==i){if(!s)return;r.push(e)}--a||t(r)},n=0;n<l;n++)o(e[n],s,i)}function c(e,i,s){var n,o;if(i&&i.trim&&(n=i),o=(n?s:i)||{},n){if(n in t)throw"LoadJS";t[n]=!0}function c(t,i){r(e,(function(e){l(o,e),t&&l({success:t,error:i},e),a(n,e)}),o)}if(o.returnPromise)return new Promise(c);c()}return c.ready=function(e,t){return n(e,(function(e){l(t,e)})),c},c.done=function(e){a(e,[])},c.reset=function(){t={},i={},s={}},c.isDefined=function(e){return e in t},c}()}));function rt(e){return new Promise(((t,i)=>{ot(e,{success:t,error:i})}))}function ct(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,ve.call(this,this.media,e?"play":"pause"))}const ht={setup(){const e=this;le(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,xe.call(e),L(window.Vimeo)?ht.ready.call(e):rt(e.config.urls.vimeo.sdk).then((()=>{ht.ready.call(e)})).catch((t=>{e.debug.warn("Vimeo SDK (player.js) failed to load",t)}))},ready(){const e=this,t=e.config.vimeo,{premium:i,referrerPolicy:s,...n}=t;let a=e.media.getAttribute("src"),l="";W(a)?(a=e.media.getAttribute(e.config.attributes.embed.id),l=e.media.getAttribute(e.config.attributes.embed.hash)):l=function(e){const t=e.match(/^.*(vimeo.com\/|video\/)(\d+)(\?.*&*h=|\/)+([\d,a-f]+)/);return t&&5===t.length?t[4]:null}(a);const o=l?{h:l}:{};i&&Object.assign(n,{controls:!1,sidedock:!1});const r=Ke({loop:e.config.loop.active,autoplay:e.autoplay,muted:e.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative,...o,...n}),c=W(h=a)?null:$(Number(h))?h:h.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:h;var h;const u=Z("iframe"),d=$e(e.config.urls.vimeo.iframe,c,r);if(u.setAttribute("src",d),u.setAttribute("allowfullscreen",""),u.setAttribute("allow",["autoplay","fullscreen","picture-in-picture","encrypted-media","accelerometer","gyroscope"].join("; ")),W(s)||u.setAttribute("referrerPolicy",s),i||!t.customControls)u.setAttribute("data-poster",e.poster),e.media=se(u,e.media);else{const t=Z("div",{class:e.config.classNames.embedContainer,"data-poster":e.poster});t.appendChild(u),e.media=se(t,e.media)}t.customControls||Fe($e(e.config.urls.vimeo.api,d)).then((t=>{!W(t)&&t.thumbnail_url&&at.setPoster.call(e,t.thumbnail_url).catch((()=>{}))})),e.embed=new window.Vimeo.Player(u,{autopause:e.config.autopause,muted:e.muted}),e.media.paused=!0,e.media.currentTime=0,e.supported.ui&&e.embed.disableTextTrack(),e.media.play=()=>(ct.call(e,!0),e.embed.play()),e.media.pause=()=>(ct.call(e,!1),e.embed.pause()),e.media.stop=()=>{e.pause(),e.currentTime=0};let{currentTime:m}=e.media;Object.defineProperty(e.media,"currentTime",{get:()=>m,set(t){const{embed:i,media:s,paused:n,volume:a}=e,l=n&&!i.hasPlayed;s.seeking=!0,ve.call(e,s,"seeking"),Promise.resolve(l&&i.setVolume(0)).then((()=>i.setCurrentTime(t))).then((()=>l&&i.pause())).then((()=>l&&i.setVolume(a))).catch((()=>{}))}});let p=e.config.speed.selected;Object.defineProperty(e.media,"playbackRate",{get:()=>p,set(t){e.embed.setPlaybackRate(t).then((()=>{p=t,ve.call(e,e.media,"ratechange")})).catch((()=>{e.options.speed=[1]}))}});let{volume:g}=e.config;Object.defineProperty(e.media,"volume",{get:()=>g,set(t){e.embed.setVolume(t).then((()=>{g=t,ve.call(e,e.media,"volumechange")}))}});let{muted:f}=e.config;Object.defineProperty(e.media,"muted",{get:()=>f,set(t){const i=!!O(t)&&t;e.embed.setVolume(i?0:e.config.volume).then((()=>{f=i,ve.call(e,e.media,"volumechange")}))}});let b,{loop:y}=e.config;Object.defineProperty(e.media,"loop",{get:()=>y,set(t){const i=O(t)?t:e.config.loop.active;e.embed.setLoop(i).then((()=>{y=i}))}}),e.embed.getVideoUrl().then((t=>{b=t,We.setDownloadUrl.call(e)})).catch((e=>{this.debug.warn(e)})),Object.defineProperty(e.media,"currentSrc",{get:()=>b}),Object.defineProperty(e.media,"ended",{get:()=>e.currentTime===e.duration}),Promise.all([e.embed.getVideoWidth(),e.embed.getVideoHeight()]).then((t=>{const[i,s]=t;e.embed.ratio=Ie(i,s),xe.call(this)})),e.embed.setAutopause(e.config.autopause).then((t=>{e.config.autopause=t})),e.embed.getVideoTitle().then((t=>{e.config.title=t,at.setTitle.call(this)})),e.embed.getCurrentTime().then((t=>{m=t,ve.call(e,e.media,"timeupdate")})),e.embed.getDuration().then((t=>{e.media.duration=t,ve.call(e,e.media,"durationchange")})),e.embed.getTextTracks().then((t=>{e.media.textTracks=t,Ye.setup.call(e)})),e.embed.on("cuechange",(({cues:t=[]})=>{const i=t.map((e=>function(e){const t=document.createDocumentFragment(),i=document.createElement("div");return t.appendChild(i),i.innerHTML=e,t.firstChild.innerText}(e.text)));Ye.updateCues.call(e,i)})),e.embed.on("loaded",(()=>{if(e.embed.getPaused().then((t=>{ct.call(e,!t),t||ve.call(e,e.media,"playing")})),H(e.embed.element)&&e.supported.ui){e.embed.element.setAttribute("tabindex",-1)}})),e.embed.on("bufferstart",(()=>{ve.call(e,e.media,"waiting")})),e.embed.on("bufferend",(()=>{ve.call(e,e.media,"playing")})),e.embed.on("play",(()=>{ct.call(e,!0),ve.call(e,e.media,"playing")})),e.embed.on("pause",(()=>{ct.call(e,!1)})),e.embed.on("timeupdate",(t=>{e.media.seeking=!1,m=t.seconds,ve.call(e,e.media,"timeupdate")})),e.embed.on("progress",(t=>{e.media.buffered=t.percent,ve.call(e,e.media,"progress"),1===parseInt(t.percent,10)&&ve.call(e,e.media,"canplaythrough"),e.embed.getDuration().then((t=>{t!==e.media.duration&&(e.media.duration=t,ve.call(e,e.media,"durationchange"))}))})),e.embed.on("seeked",(()=>{e.media.seeking=!1,ve.call(e,e.media,"seeked")})),e.embed.on("ended",(()=>{e.media.paused=!0,ve.call(e,e.media,"ended")})),e.embed.on("error",(t=>{e.media.error=t,ve.call(e,e.media,"error")})),t.customControls&&setTimeout((()=>at.build.call(e)),0)}};function ut(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,ve.call(this,this.media,e?"play":"pause"))}function dt(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}const mt={setup(){if(le(this.elements.wrapper,this.config.classNames.embed,!0),L(window.YT)&&j(window.YT.Player))mt.ready.call(this);else{const e=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=()=>{j(e)&&e(),mt.ready.call(this)},rt(this.config.urls.youtube.sdk).catch((e=>{this.debug.warn("YouTube API failed to load",e)}))}},getTitle(e){Fe($e(this.config.urls.youtube.api,e)).then((e=>{if(L(e)){const{title:t,height:i,width:s}=e;this.config.title=t,at.setTitle.call(this),this.embed.ratio=Ie(s,i)}xe.call(this)})).catch((()=>{xe.call(this)}))},ready(){const e=this,t=e.config.youtube,i=e.media&&e.media.getAttribute("id");if(!W(i)&&i.startsWith("youtube-"))return;let s=e.media.getAttribute("src");W(s)&&(s=e.media.getAttribute(this.config.attributes.embed.id));const n=W(a=s)?null:a.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:a;var a;const l=Z("div",{id:`${e.provider}-${Math.floor(1e4*Math.random())}`,"data-poster":t.customControls?e.poster:void 0});if(e.media=se(l,e.media),t.customControls){const t=e=>`https://i.ytimg.com/vi/${n}/${e}default.jpg`;nt(t("maxres"),121).catch((()=>nt(t("sd"),121))).catch((()=>nt(t("hq")))).then((t=>at.setPoster.call(e,t.src))).then((t=>{t.includes("maxres")||(e.elements.poster.style.backgroundSize="cover")})).catch((()=>{}))}e.embed=new window.YT.Player(e.media,{videoId:n,host:dt(t),playerVars:X({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),events:{onError(t){if(!e.media.error){const i=t.data,s={2:"The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.",5:"The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.",100:"The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.",101:"The owner of the requested video does not allow it to be played in embedded players.",150:"The owner of the requested video does not allow it to be played in embedded players."}[i]||"An unknown error occured";e.media.error={code:i,message:s},ve.call(e,e.media,"error")}},onPlaybackRateChange(t){const i=t.target;e.media.playbackRate=i.getPlaybackRate(),ve.call(e,e.media,"ratechange")},onReady(i){if(j(e.media.play))return;const s=i.target;mt.getTitle.call(e,n),e.media.play=()=>{ut.call(e,!0),s.playVideo()},e.media.pause=()=>{ut.call(e,!1),s.pauseVideo()},e.media.stop=()=>{s.stopVideo()},e.media.duration=s.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:()=>Number(s.getCurrentTime()),set(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,ve.call(e,e.media,"seeking"),s.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:()=>s.getPlaybackRate(),set(e){s.setPlaybackRate(e)}});let{volume:a}=e.config;Object.defineProperty(e.media,"volume",{get:()=>a,set(t){a=t,s.setVolume(100*a),ve.call(e,e.media,"volumechange")}});let{muted:l}=e.config;Object.defineProperty(e.media,"muted",{get:()=>l,set(t){const i=O(t)?t:l;l=i,s[i?"mute":"unMute"](),s.setVolume(100*a),ve.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:()=>s.getVideoUrl()}),Object.defineProperty(e.media,"ended",{get:()=>e.currentTime===e.duration});const o=s.getAvailablePlaybackRates();e.options.speed=o.filter((t=>e.config.speed.options.includes(t))),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),ve.call(e,e.media,"timeupdate"),ve.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval((()=>{e.media.buffered=s.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&ve.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),ve.call(e,e.media,"canplaythrough"))}),200),t.customControls&&setTimeout((()=>at.build.call(e)),50)},onStateChange(i){const s=i.target;clearInterval(e.timers.playing);switch(e.media.seeking&&[1,2].includes(i.data)&&(e.media.seeking=!1,ve.call(e,e.media,"seeked")),i.data){case-1:ve.call(e,e.media,"timeupdate"),e.media.buffered=s.getVideoLoadedFraction(),ve.call(e,e.media,"progress");break;case 0:ut.call(e,!1),e.media.loop?(s.stopVideo(),s.playVideo()):ve.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(ut.call(e,!0),ve.call(e,e.media,"playing"),e.timers.playing=setInterval((()=>{ve.call(e,e.media,"timeupdate")}),50),e.media.duration!==s.getDuration()&&(e.media.duration=s.getDuration(),ve.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),ut.call(e,!1);break;case 3:ve.call(e,e.media,"waiting")}ve.call(e,e.elements.container,"statechange",!1,{code:i.data})}}})}},pt={setup(){this.media?(le(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),le(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&le(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=Z("div",{class:this.config.classNames.video}),J(this.media,this.elements.wrapper),this.elements.poster=Z("div",{class:this.config.classNames.poster}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?Le.setup.call(this):this.isYouTube?mt.setup.call(this):this.isVimeo&&ht.setup.call(this)):this.debug.warn("No media element found!")}};class gt{constructor(t){e(this,"load",(()=>{this.enabled&&(L(window.google)&&L(window.google.ima)?this.ready():rt(this.player.config.urls.googleIMA.sdk).then((()=>{this.ready()})).catch((()=>{this.trigger("error",new Error("Google IMA SDK failed to load"))})))})),e(this,"ready",(()=>{var e;this.enabled||((e=this).manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()),this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then((()=>{this.clearSafetyTimer("onAdsManagerLoaded()")})),this.listeners(),this.setupIMA()})),e(this,"setupIMA",(()=>{this.elements.container=Z("div",{class:this.player.config.classNames.ads}),this.player.elements.container.appendChild(this.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(this.player.config.ads.language),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container,this.player.media),this.loader=new google.ima.AdsLoader(this.elements.displayContainer),this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,(e=>this.onAdsManagerLoaded(e)),!1),this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(e=>this.onAdError(e)),!1),this.requestAds()})),e(this,"requestAds",(()=>{const{container:e}=this.player.elements;try{const t=new google.ima.AdsRequest;t.adTagUrl=this.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(t)}catch(e){this.onAdError(e)}})),e(this,"pollCountdown",((e=!1)=>{if(!e)return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");this.countdownTimer=setInterval((()=>{const e=Ue(Math.max(this.manager.getRemainingTime(),0)),t=`${He.get("advertisement",this.player.config)} - ${e}`;this.elements.container.setAttribute("data-badge-text",t)}),100)})),e(this,"onAdsManagerLoaded",(e=>{if(!this.enabled)return;const t=new google.ima.AdsRenderingSettings;t.restoreCustomPlaybackStateOnAdBreakComplete=!0,t.enablePreloading=!0,this.manager=e.getAdsManager(this.player,t),this.cuePoints=this.manager.getCuePoints(),this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(e=>this.onAdError(e))),Object.keys(google.ima.AdEvent.Type).forEach((e=>{this.manager.addEventListener(google.ima.AdEvent.Type[e],(e=>this.onAdEvent(e)))})),this.trigger("loaded")})),e(this,"addCuePoints",(()=>{W(this.cuePoints)||this.cuePoints.forEach((e=>{if(0!==e&&-1!==e&&e<this.player.duration){const t=this.player.elements.progress;if(H(t)){const i=100/this.player.duration*e,s=Z("span",{class:this.player.config.classNames.cues});s.style.left=`${i.toString()}%`,t.appendChild(s)}}}))})),e(this,"onAdEvent",(e=>{const{container:t}=this.player.elements,i=e.getAd(),s=e.getAdData();switch((e=>{ve.call(this.player,this.player.media,`ads${e.replace(/_/g,"").toLowerCase()}`)})(e.type),e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),this.pollCountdown(!0),i.isLinear()||(i.width=t.offsetWidth,i.height=t.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:this.manager.setVolume(this.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:this.player.ended?this.loadAds():this.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.LOG:s.adError&&this.player.debug.warn(`Non-fatal ad error: ${s.adError.getMessage()}`)}})),e(this,"onAdError",(e=>{this.cancel(),this.player.debug.warn("Ads error",e)})),e(this,"listeners",(()=>{const{container:e}=this.player.elements;let t;this.player.on("canplay",(()=>{this.addCuePoints()})),this.player.on("ended",(()=>{this.loader.contentComplete()})),this.player.on("timeupdate",(()=>{t=this.player.currentTime})),this.player.on("seeked",(()=>{const e=this.player.currentTime;W(this.cuePoints)||this.cuePoints.forEach(((i,s)=>{t<i&&i<e&&(this.manager.discardAdBreak(),this.cuePoints.splice(s,1))}))})),window.addEventListener("resize",(()=>{this.manager&&this.manager.resize(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL)}))})),e(this,"play",(()=>{const{container:e}=this.player.elements;this.managerPromise||this.resumeContent(),this.managerPromise.then((()=>{this.manager.setVolume(this.player.volume),this.elements.displayContainer.initialize();try{this.initialized||(this.manager.init(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL),this.manager.start()),this.initialized=!0}catch(e){this.onAdError(e)}})).catch((()=>{}))})),e(this,"resumeContent",(()=>{this.elements.container.style.zIndex="",this.playing=!1,ke(this.player.media.play())})),e(this,"pauseContent",(()=>{this.elements.container.style.zIndex=3,this.playing=!0,this.player.media.pause()})),e(this,"cancel",(()=>{this.initialized&&this.resumeContent(),this.trigger("error"),this.loadAds()})),e(this,"loadAds",(()=>{this.managerPromise.then((()=>{this.manager&&this.manager.destroy(),this.managerPromise=new Promise((e=>{this.on("loaded",e),this.player.debug.log(this.manager)})),this.initialized=!1,this.requestAds()})).catch((()=>{}))})),e(this,"trigger",((e,...t)=>{const i=this.events[e];D(i)&&i.forEach((e=>{j(e)&&e.apply(this,t)}))})),e(this,"on",((e,t)=>(D(this.events[e])||(this.events[e]=[]),this.events[e].push(t),this))),e(this,"startSafetyTimer",((e,t)=>{this.player.debug.log(`Safety timer invoked from: ${t}`),this.safetyTimer=setTimeout((()=>{this.cancel(),this.clearSafetyTimer("startSafetyTimer()")}),e)})),e(this,"clearSafetyTimer",(e=>{I(this.safetyTimer)||(this.player.debug.log(`Safety timer cleared from: ${e}`),clearTimeout(this.safetyTimer),this.safetyTimer=null)})),this.player=t,this.config=t.config.ads,this.playing=!1,this.initialized=!1,this.elements={container:null,displayContainer:null},this.manager=null,this.loader=null,this.cuePoints=null,this.events={},this.safetyTimer=null,this.countdownTimer=null,this.managerPromise=new Promise(((e,t)=>{this.on("loaded",e),this.on("error",t)})),this.load()}get enabled(){const{config:e}=this;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!W(e.publisherId)||U(e.tagUrl))}get tagUrl(){const{config:e}=this;if(U(e.tagUrl))return e.tagUrl;return`https://go.aniview.com/api/adserver6/vast/?${Ke({AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId})}`}}function ft(e=0,t=0,i=255){return Math.min(Math.max(e,t),i)}const bt=e=>{const t=[];return e.split(/\r\n\r\n|\n\n|\r\r/).forEach((e=>{const i={};e.split(/\r\n|\n|\r/).forEach((e=>{if($(i.startTime)){if(!W(e.trim())&&W(i.text)){const t=e.trim().split("#xywh=");[i.text]=t,t[1]&&([i.x,i.y,i.w,i.h]=t[1].split(","))}}else{const t=e.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);t&&(i.startTime=60*Number(t[1]||0)*60+60*Number(t[2])+Number(t[3])+Number(`0.${t[4]}`),i.endTime=60*Number(t[6]||0)*60+60*Number(t[7])+Number(t[8])+Number(`0.${t[9]}`))}})),i.text&&t.push(i)})),t},yt=(e,t)=>{const i={};return e>t.width/t.height?(i.width=t.width,i.height=1/e*t.width):(i.height=t.height,i.width=e*t.height),i};class vt{constructor(t){e(this,"load",(()=>{this.player.elements.display.seekTooltip&&(this.player.elements.display.seekTooltip.hidden=this.enabled),this.enabled&&this.getThumbnails().then((()=>{this.enabled&&(this.render(),this.determineContainerAutoSizing(),this.loaded=!0)}))})),e(this,"getThumbnails",(()=>new Promise((e=>{const{src:t}=this.player.config.previewThumbnails;if(W(t))throw new Error("Missing previewThumbnails.src config attribute");const i=()=>{this.thumbnails.sort(((e,t)=>e.height-t.height)),this.player.debug.log("Preview thumbnails",this.thumbnails),e()};if(j(t))t((e=>{this.thumbnails=e,i()}));else{const e=(_(t)?[t]:t).map((e=>this.getThumbnail(e)));Promise.all(e).then(i)}})))),e(this,"getThumbnail",(e=>new Promise((t=>{Fe(e).then((i=>{const s={frames:bt(i),height:null,urlPrefix:""};s.frames[0].text.startsWith("/")||s.frames[0].text.startsWith("http://")||s.frames[0].text.startsWith("https://")||(s.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));const n=new Image;n.onload=()=>{s.height=n.naturalHeight,s.width=n.naturalWidth,this.thumbnails.push(s),t()},n.src=s.urlPrefix+s.frames[0].text}))})))),e(this,"startMove",(e=>{if(this.loaded&&R(e)&&["touchmove","mousemove"].includes(e.type)&&this.player.media.duration){if("touchmove"===e.type)this.seekTime=this.player.media.duration*(this.player.elements.inputs.seek.value/100);else{var t,i;const s=this.player.elements.progress.getBoundingClientRect(),n=100/s.width*(e.pageX-s.left);this.seekTime=this.player.media.duration*(n/100),this.seekTime<0&&(this.seekTime=0),this.seekTime>this.player.media.duration-1&&(this.seekTime=this.player.media.duration-1),this.mousePosX=e.pageX,this.elements.thumb.time.innerText=Ue(this.seekTime);const a=null===(t=this.player.config.markers)||void 0===t||null===(i=t.points)||void 0===i?void 0:i.find((({time:e})=>e===Math.round(this.seekTime)));a&&this.elements.thumb.time.insertAdjacentHTML("afterbegin",`${a.label}<br>`)}this.showImageAtCurrentTime()}})),e(this,"endMove",(()=>{this.toggleThumbContainer(!1,!0)})),e(this,"startScrubbing",(e=>{(I(e.button)||!1===e.button||0===e.button)&&(this.mouseDown=!0,this.player.media.duration&&(this.toggleScrubbingContainer(!0),this.toggleThumbContainer(!1,!0),this.showImageAtCurrentTime()))})),e(this,"endScrubbing",(()=>{this.mouseDown=!1,Math.ceil(this.lastTime)===Math.ceil(this.player.media.currentTime)?this.toggleScrubbingContainer(!1):ye.call(this.player,this.player.media,"timeupdate",(()=>{this.mouseDown||this.toggleScrubbingContainer(!1)}))})),e(this,"listeners",(()=>{this.player.on("play",(()=>{this.toggleThumbContainer(!1,!0)})),this.player.on("seeked",(()=>{this.toggleThumbContainer(!1)})),this.player.on("timeupdate",(()=>{this.lastTime=this.player.media.currentTime}))})),e(this,"render",(()=>{this.elements.thumb.container=Z("div",{class:this.player.config.classNames.previewThumbnails.thumbContainer}),this.elements.thumb.imageContainer=Z("div",{class:this.player.config.classNames.previewThumbnails.imageContainer}),this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);const e=Z("div",{class:this.player.config.classNames.previewThumbnails.timeContainer});this.elements.thumb.time=Z("span",{},"00:00"),e.appendChild(this.elements.thumb.time),this.elements.thumb.imageContainer.appendChild(e),H(this.player.elements.progress)&&this.player.elements.progress.appendChild(this.elements.thumb.container),this.elements.scrubbing.container=Z("div",{class:this.player.config.classNames.previewThumbnails.scrubbingContainer}),this.player.elements.wrapper.appendChild(this.elements.scrubbing.container)})),e(this,"destroy",(()=>{this.elements.thumb.container&&this.elements.thumb.container.remove(),this.elements.scrubbing.container&&this.elements.scrubbing.container.remove()})),e(this,"showImageAtCurrentTime",(()=>{this.mouseDown?this.setScrubbingContainerSize():this.setThumbContainerSizeAndPos();const e=this.thumbnails[0].frames.findIndex((e=>this.seekTime>=e.startTime&&this.seekTime<=e.endTime)),t=e>=0;let i=0;this.mouseDown||this.toggleThumbContainer(t),t&&(this.thumbnails.forEach(((t,s)=>{this.loadedImages.includes(t.frames[e].text)&&(i=s)})),e!==this.showingThumb&&(this.showingThumb=e,this.loadImage(i)))})),e(this,"loadImage",((e=0)=>{const t=this.showingThumb,i=this.thumbnails[e],{urlPrefix:s}=i,n=i.frames[t],a=i.frames[t].text,l=s+a;if(this.currentImageElement&&this.currentImageElement.dataset.filename===a)this.showImage(this.currentImageElement,n,e,t,a,!1),this.currentImageElement.dataset.index=t,this.removeOldImages(this.currentImageElement);else{this.loadingImage&&this.usingSprites&&(this.loadingImage.onload=null);const i=new Image;i.src=l,i.dataset.index=t,i.dataset.filename=a,this.showingThumbFilename=a,this.player.debug.log(`Loading image: ${l}`),i.onload=()=>this.showImage(i,n,e,t,a,!0),this.loadingImage=i,this.removeOldImages(i)}})),e(this,"showImage",((e,t,i,s,n,a=!0)=>{this.player.debug.log(`Showing thumb: ${n}. num: ${s}. qual: ${i}. newimg: ${a}`),this.setImageSizeAndOffset(e,t),a&&(this.currentImageContainer.appendChild(e),this.currentImageElement=e,this.loadedImages.includes(n)||this.loadedImages.push(n)),this.preloadNearby(s,!0).then(this.preloadNearby(s,!1)).then(this.getHigherQuality(i,e,t,n))})),e(this,"removeOldImages",(e=>{Array.from(this.currentImageContainer.children).forEach((t=>{if("img"!==t.tagName.toLowerCase())return;const i=this.usingSprites?500:1e3;if(t.dataset.index!==e.dataset.index&&!t.dataset.deleting){t.dataset.deleting=!0;const{currentImageContainer:e}=this;setTimeout((()=>{e.removeChild(t),this.player.debug.log(`Removing thumb: ${t.dataset.filename}`)}),i)}}))})),e(this,"preloadNearby",((e,t=!0)=>new Promise((i=>{setTimeout((()=>{const s=this.thumbnails[0].frames[e].text;if(this.showingThumbFilename===s){let n;n=t?this.thumbnails[0].frames.slice(e):this.thumbnails[0].frames.slice(0,e).reverse();let a=!1;n.forEach((e=>{const t=e.text;if(t!==s&&!this.loadedImages.includes(t)){a=!0,this.player.debug.log(`Preloading thumb filename: ${t}`);const{urlPrefix:e}=this.thumbnails[0],s=e+t,n=new Image;n.src=s,n.onload=()=>{this.player.debug.log(`Preloaded thumb filename: ${t}`),this.loadedImages.includes(t)||this.loadedImages.push(t),i()}}})),a||i()}}),300)})))),e(this,"getHigherQuality",((e,t,i,s)=>{if(e<this.thumbnails.length-1){let n=t.naturalHeight;this.usingSprites&&(n=i.h),n<this.thumbContainerHeight&&setTimeout((()=>{this.showingThumbFilename===s&&(this.player.debug.log(`Showing higher quality thumb for: ${s}`),this.loadImage(e+1))}),300)}})),e(this,"toggleThumbContainer",((e=!1,t=!1)=>{const i=this.player.config.classNames.previewThumbnails.thumbContainerShown;this.elements.thumb.container.classList.toggle(i,e),!e&&t&&(this.showingThumb=null,this.showingThumbFilename=null)})),e(this,"toggleScrubbingContainer",((e=!1)=>{const t=this.player.config.classNames.previewThumbnails.scrubbingContainerShown;this.elements.scrubbing.container.classList.toggle(t,e),e||(this.showingThumb=null,this.showingThumbFilename=null)})),e(this,"determineContainerAutoSizing",(()=>{(this.elements.thumb.imageContainer.clientHeight>20||this.elements.thumb.imageContainer.clientWidth>20)&&(this.sizeSpecifiedInCSS=!0)})),e(this,"setThumbContainerSizeAndPos",(()=>{const{imageContainer:e}=this.elements.thumb;if(this.sizeSpecifiedInCSS){if(e.clientHeight>20&&e.clientWidth<20){const t=Math.floor(e.clientHeight*this.thumbAspectRatio);e.style.width=`${t}px`}else if(e.clientHeight<20&&e.clientWidth>20){const t=Math.floor(e.clientWidth/this.thumbAspectRatio);e.style.height=`${t}px`}}else{const t=Math.floor(this.thumbContainerHeight*this.thumbAspectRatio);e.style.height=`${this.thumbContainerHeight}px`,e.style.width=`${t}px`}this.setThumbContainerPos()})),e(this,"setThumbContainerPos",(()=>{const e=this.player.elements.progress.getBoundingClientRect(),t=this.player.elements.container.getBoundingClientRect(),{container:i}=this.elements.thumb,s=t.left-e.left+10,n=t.right-e.left-i.clientWidth-10,a=this.mousePosX-e.left-i.clientWidth/2,l=ft(a,s,n);i.style.left=`${l}px`,i.style.setProperty("--preview-arrow-offset",a-l+"px")})),e(this,"setScrubbingContainerSize",(()=>{const{width:e,height:t}=yt(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight});this.elements.scrubbing.container.style.width=`${e}px`,this.elements.scrubbing.container.style.height=`${t}px`})),e(this,"setImageSizeAndOffset",((e,t)=>{if(!this.usingSprites)return;const i=this.thumbContainerHeight/t.h;e.style.height=e.naturalHeight*i+"px",e.style.width=e.naturalWidth*i+"px",e.style.left=`-${t.x*i}px`,e.style.top=`-${t.y*i}px`})),this.player=t,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}get enabled(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}get currentImageContainer(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}get usingSprites(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}get thumbAspectRatio(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}get thumbContainerHeight(){if(this.mouseDown){const{height:e}=yt(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight});return e}return this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}get currentImageElement(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement}set currentImageElement(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}const wt={insertElements(e,t){_(t)?ee(e,this.media,{src:t}):D(t)&&t.forEach((t=>{ee(e,this.media,t)}))},change(e){Q(e,"sources.length")?(Le.cancelRequests.call(this),this.destroy.call(this,(()=>{this.options.quality=[],te(this.media),this.media=null,H(this.elements.container)&&this.elements.container.removeAttribute("class");const{sources:t,type:i}=e,[{provider:s=Ge.html5,src:n}]=t,a="html5"===s?i:"div",l="html5"===s?{}:{src:n};Object.assign(this,{provider:s,type:i,supported:me.check(i,s,this.config.playsinline),media:Z(a,l)}),this.elements.container.appendChild(this.media),O(e.autoplay)&&(this.config.autoplay=e.autoplay),this.isHTML5&&(this.config.crossorigin&&this.media.setAttribute("crossorigin",""),this.config.autoplay&&this.media.setAttribute("autoplay",""),W(e.poster)||(this.poster=e.poster),this.config.loop.active&&this.media.setAttribute("loop",""),this.config.muted&&this.media.setAttribute("muted",""),this.config.playsinline&&this.media.setAttribute("playsinline","")),at.addStyleHook.call(this),this.isHTML5&&wt.insertElements.call(this,"source",t),this.config.title=e.title,pt.setup.call(this),this.isHTML5&&Object.keys(e).includes("tracks")&&wt.insertElements.call(this,"track",e.tracks),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&at.build.call(this),this.isHTML5&&this.media.load(),W(e.previewThumbnails)||(Object.assign(this.config.previewThumbnails,e.previewThumbnails),this.previewThumbnails&&this.previewThumbnails.loaded&&(this.previewThumbnails.destroy(),this.previewThumbnails=null),this.config.previewThumbnails.enabled&&(this.previewThumbnails=new vt(this))),this.fullscreen.update()}),!0)):this.debug.warn("Invalid source format")}};class Tt{constructor(t,i){if(e(this,"play",(()=>j(this.media.play)?(this.ads&&this.ads.enabled&&this.ads.managerPromise.then((()=>this.ads.play())).catch((()=>ke(this.media.play()))),this.media.play()):null)),e(this,"pause",(()=>this.playing&&j(this.media.pause)?this.media.pause():null)),e(this,"togglePlay",(e=>(O(e)?e:!this.playing)?this.play():this.pause())),e(this,"stop",(()=>{this.isHTML5?(this.pause(),this.restart()):j(this.media.stop)&&this.media.stop()})),e(this,"restart",(()=>{this.currentTime=0})),e(this,"rewind",(e=>{this.currentTime-=$(e)?e:this.config.seekTime})),e(this,"forward",(e=>{this.currentTime+=$(e)?e:this.config.seekTime})),e(this,"increaseVolume",(e=>{const t=this.media.muted?0:this.volume;this.volume=t+($(e)?e:0)})),e(this,"decreaseVolume",(e=>{this.increaseVolume(-e)})),e(this,"airplay",(()=>{me.airplay&&this.media.webkitShowPlaybackTargetPicker()})),e(this,"toggleControls",(e=>{if(this.supported.ui&&!this.isAudio){const t=oe(this.elements.container,this.config.classNames.hideControls),i=void 0===e?void 0:!e,s=le(this.elements.container,this.config.classNames.hideControls,i);if(s&&D(this.config.controls)&&this.config.controls.includes("settings")&&!W(this.config.settings)&&We.toggleMenu.call(this,!1),s!==t){const e=s?"controlshidden":"controlsshown";ve.call(this,this.media,e)}return!s}return!1})),e(this,"on",((e,t)=>{fe.call(this,this.elements.container,e,t)})),e(this,"once",((e,t)=>{ye.call(this,this.elements.container,e,t)})),e(this,"off",((e,t)=>{be(this.elements.container,e,t)})),e(this,"destroy",((e,t=!1)=>{if(!this.ready)return;const i=()=>{document.body.style.overflow="",this.embed=null,t?(Object.keys(this.elements).length&&(te(this.elements.buttons.play),te(this.elements.captions),te(this.elements.controls),te(this.elements.wrapper),this.elements.buttons.play=null,this.elements.captions=null,this.elements.controls=null,this.elements.wrapper=null),j(e)&&e()):(we.call(this),Le.cancelRequests.call(this),se(this.elements.original,this.elements.container),ve.call(this,this.elements.original,"destroyed",!0),j(e)&&e.call(this.elements.original),this.ready=!1,setTimeout((()=>{this.elements=null,this.media=null}),200))};this.stop(),clearTimeout(this.timers.loading),clearTimeout(this.timers.controls),clearTimeout(this.timers.resized),this.isHTML5?(at.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&j(this.embed.destroy)&&this.embed.destroy(),i()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(i),setTimeout(i,200))})),e(this,"supports",(e=>me.mime.call(this,e))),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=me.touch,this.media=t,_(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||q(this.media)||D(this.media))&&(this.media=this.media[0]),this.config=X({},Qe,Tt.defaults,i||{},(()=>{try{return JSON.parse(this.media.getAttribute("data-plyr-config"))}catch(e){return{}}})()),this.elements={container:null,fullscreen:null,captions:null,buttons:{},display:{},progress:{},inputs:{},settings:{popup:null,menu:null,panels:{},buttons:{}}},this.captions={active:null,currentTrack:-1,meta:new WeakMap},this.fullscreen={active:!1},this.options={speed:[],quality:[]},this.debug=new it(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",me),I(this.media)||!H(this.media))return void this.debug.error("Setup failed: no suitable element passed");if(this.media.plyr)return void this.debug.warn("Target already setup");if(!this.config.enabled)return void this.debug.error("Setup failed: disabled by config");if(!me.check().api)return void this.debug.error("Setup failed: no support");const s=this.media.cloneNode(!0);s.autoplay=!1,this.elements.original=s;const n=this.media.tagName.toLowerCase();let a=null,l=null;switch(n){case"div":if(a=this.media.querySelector("iframe"),H(a)){if(l=ze(a.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?Ge.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?Ge.vimeo:null}(l.toString()),this.elements.container=this.media,this.media=a,this.elements.container.className="",l.search.length){const e=["1","true"];e.includes(l.searchParams.get("autoplay"))&&(this.config.autoplay=!0),e.includes(l.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=e.includes(l.searchParams.get("playsinline")),this.config.youtube.hl=l.searchParams.get("hl")):this.config.playsinline=!0}}else this.provider=this.media.getAttribute(this.config.attributes.embed.provider),this.media.removeAttribute(this.config.attributes.embed.provider);if(W(this.provider)||!Object.values(Ge).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=et;break;case"video":case"audio":this.type=n,this.provider=Ge.html5,this.media.hasAttribute("crossorigin")&&(this.config.crossorigin=!0),this.media.hasAttribute("autoplay")&&(this.config.autoplay=!0),(this.media.hasAttribute("playsinline")||this.media.hasAttribute("webkit-playsinline"))&&(this.config.playsinline=!0),this.media.hasAttribute("muted")&&(this.config.muted=!0),this.media.hasAttribute("loop")&&(this.config.loop.active=!0);break;default:return void this.debug.error("Setup failed: unsupported type")}this.supported=me.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new lt(this),this.storage=new Re(this),this.media.plyr=this,H(this.elements.container)||(this.elements.container=Z("div",{tabindex:0}),J(this.media,this.elements.container)),at.migrateStyles.call(this),at.addStyleHook.call(this),pt.setup.call(this),this.config.debug&&fe.call(this,this.elements.container,this.config.events.join(" "),(e=>{this.debug.log(`event: ${e.type}`)})),this.fullscreen=new st(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&at.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new gt(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",(()=>ke(this.play()))),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new vt(this))):this.debug.error("Setup failed: no support")}get isHTML5(){return this.provider===Ge.html5}get isEmbed(){return this.isYouTube||this.isVimeo}get isYouTube(){return this.provider===Ge.youtube}get isVimeo(){return this.provider===Ge.vimeo}get isVideo(){return this.type===et}get isAudio(){return this.type===Ze}get playing(){return Boolean(this.ready&&!this.paused&&!this.ended)}get paused(){return Boolean(this.media.paused)}get stopped(){return Boolean(this.paused&&0===this.currentTime)}get ended(){return Boolean(this.media.ended)}set currentTime(e){if(!this.duration)return;const t=$(e)&&e>0;this.media.currentTime=t?Math.min(e,this.duration):0,this.debug.log(`Seeking to ${this.currentTime} seconds`)}get currentTime(){return Number(this.media.currentTime)}get buffered(){const{buffered:e}=this.media;return $(e)?e:e&&e.length&&this.duration>0?e.end(0)/this.duration:0}get seeking(){return Boolean(this.media.seeking)}get duration(){const e=parseFloat(this.config.duration),t=(this.media||{}).duration,i=$(t)&&t!==1/0?t:0;return e||i}set volume(e){let t=e;_(t)&&(t=Number(t)),$(t)||(t=this.storage.get("volume")),$(t)||({volume:t}=this.config),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!W(e)&&this.muted&&t>0&&(this.muted=!1)}get volume(){return Number(this.media.volume)}set muted(e){let t=e;O(t)||(t=this.storage.get("muted")),O(t)||(t=this.config.muted),this.config.muted=t,this.media.muted=t}get muted(){return Boolean(this.media.muted)}get hasAudio(){return!this.isHTML5||(!!this.isAudio||(Boolean(this.media.mozHasAudio)||Boolean(this.media.webkitAudioDecodedByteCount)||Boolean(this.media.audioTracks&&this.media.audioTracks.length)))}set speed(e){let t=null;$(e)&&(t=e),$(t)||(t=this.storage.get("speed")),$(t)||(t=this.config.speed.selected);const{minimumSpeed:i,maximumSpeed:s}=this;t=ft(t,i,s),this.config.speed.selected=t,setTimeout((()=>{this.media&&(this.media.playbackRate=t)}),0)}get speed(){return Number(this.media.playbackRate)}get minimumSpeed(){return this.isYouTube?Math.min(...this.options.speed):this.isVimeo?.5:.0625}get maximumSpeed(){return this.isYouTube?Math.max(...this.options.speed):this.isVimeo?2:16}set quality(e){const t=this.config.quality,i=this.options.quality;if(!i.length)return;let s=[!W(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find($),n=!0;if(!i.includes(s)){const e=Ae(i,s);this.debug.warn(`Unsupported quality option: ${s}, using ${e} instead`),s=e,n=!1}t.selected=s,this.media.quality=s,n&&this.storage.set({quality:s})}get quality(){return this.media.quality}set loop(e){const t=O(e)?e:this.config.loop.active;this.config.loop.active=t,this.media.loop=t}get loop(){return Boolean(this.media.loop)}set source(e){wt.change.call(this,e)}get source(){return this.media.currentSrc}get download(){const{download:e}=this.config.urls;return U(e)?e:this.source}set download(e){U(e)&&(this.config.urls.download=e,We.setDownloadUrl.call(this))}set poster(e){this.isVideo?at.setPoster.call(this,e,!1).catch((()=>{})):this.debug.warn("Poster can only be set for video")}get poster(){return this.isVideo?this.media.getAttribute("poster")||this.media.getAttribute("data-poster"):null}get ratio(){if(!this.isVideo)return null;const e=Me(Ne.call(this));return D(e)?e.join(":"):e}set ratio(e){this.isVideo?_(e)&&Pe(e)?(this.config.ratio=Me(e),xe.call(this)):this.debug.error(`Invalid aspect ratio specified (${e})`):this.debug.warn("Aspect ratio can only be set for video")}set autoplay(e){this.config.autoplay=O(e)?e:this.config.autoplay}get autoplay(){return Boolean(this.config.autoplay)}toggleCaptions(e){Ye.toggle.call(this,e,!1)}set currentTrack(e){Ye.set.call(this,e,!1),Ye.setup.call(this)}get currentTrack(){const{toggled:e,currentTrack:t}=this.captions;return e?t:-1}set language(e){Ye.setLanguage.call(this,e,!1)}get language(){return(Ye.getCurrentTrack.call(this)||{}).language}set pip(e){if(!me.pip)return;const t=O(e)?e:!this.pip;j(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?Xe:Je),j(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}get pip(){return me.pip?W(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===Xe:null}setPreviewThumbnails(e){this.previewThumbnails&&this.previewThumbnails.loaded&&(this.previewThumbnails.destroy(),this.previewThumbnails=null),Object.assign(this.config.previewThumbnails,e),this.config.previewThumbnails.enabled&&(this.previewThumbnails=new vt(this))}static supported(e,t,i){return me.check(e,t,i)}static loadSprite(e,t){return Ve(e,t)}static setup(e,t={}){let i=null;return _(e)?i=Array.from(document.querySelectorAll(e)):q(e)?i=Array.from(e):D(e)&&(i=e.filter(H)),W(i)?null:i.map((e=>new Tt(e,t)))}}var kt;return Tt.defaults=(kt=Qe,JSON.parse(JSON.stringify(kt))),Tt}));
//# sourceMappingURL=plyr.min.js.map
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/compat get default export */
/******/ !function() {
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function() { return module['default']; } :
/******/ function() { return module; };
/******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter;
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/define property getters */
/******/ !function() {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = function(exports, definition) {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ }();
/******/
/******/ /* webpack/runtime/global */
/******/ !function() {
/******/ __webpack_require__.g = (function() {
/******/ if (typeof globalThis === 'object') return globalThis;
/******/ try {
/******/ return this || new Function('return this')();
/******/ } catch (e) {
/******/ if (typeof window === 'object') return window;
/******/ }
/******/ })();
/******/ }();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ !function() {
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
/******/ }();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ !function() {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ }();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
!function() {
"use strict";
/*!*********************************!*\
!*** ./public/assets/js/app.js ***!
\*********************************/
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var plyr__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! plyr */ "./node_modules/plyr/dist/plyr.min.js");
/* harmony import */ var plyr__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(plyr__WEBPACK_IMPORTED_MODULE_0__);
/* harmony import */ var circletype__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! circletype */ "./node_modules/circletype/dist/circletype.min.js");
/* harmony import */ var circletype__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(circletype__WEBPACK_IMPORTED_MODULE_1__);
// ----------------------------------------------------------------------------
// DATA
// ----------------------------------------------------------------------------
const root = document.documentElement; // HOME NAVIGATION DISPLAY //
const navEl = document.querySelector('.home__nav');
const navLinks = document.querySelectorAll('.home__nav-link');
const navImage = document.querySelector('.home__nav-image');
const circleTypes = []; // VIDEO PLAYERS //
const galleryVideos = document.querySelectorAll('.gallery__video');
let videoPlayers = []; // HEADER BAR ANIMATION //
const headerBar = document.querySelector('.header-bar');
const headerLogo = document.querySelector('.header-bar__logo');
let scrollOffset = 0; // NAVIGATION MENU ANIMATION //
const headerNavBtn = document.querySelector('.header-bar__nav-button');
const headerNavMenu = document.querySelector('.header-bar__nav-menu');
const headerNavMenuListEls = document.querySelectorAll('.header-bar__nav-menu li');
const headerNavOverlay = document.querySelector('.header-bar__nav-overlay');
const touchPosition = {
initialX: null,
initialY: null
}; // ----------------------------------------------------------------------------
// UTILS
// ----------------------------------------------------------------------------
// Convert rem to pixels by getting font-size CSS property
function convertRemToPixels(rem) {
let fontSize = parseFloat(window.getComputedStyle(document.body).getPropertyValue('font-size'));
return rem * fontSize;
} // ----------------------------------------------------------------------------
// LOGIC
// ----------------------------------------------------------------------------
// HOME NAVIGATION DISPLAY //
// Calculate navigation grid inner width
function calculateNavGridInnerWidth() {
if (root && navImage) {
let navGridGapProperty = window.getComputedStyle(root).getPropertyValue('--home-nav-gap');
let navGridGap = parseFloat(navGridGapProperty.slice(0, -3));
return navImage.getBoundingClientRect().width + convertRemToPixels(navGridGap) * 2;
}
} // Calculate navigation grid inner diagonal
function calculateNavGridInnerDiagonal() {
return calculateNavGridInnerWidth() * Math.sqrt(2);
} // Create new instance of CircleType for each navigation link, set radius and direction
function curveNavLinks() {
if (navLinks.length !== 0 && circleTypes) {
for (let i = 0; i < navLinks.length - 2; i++) {
circleTypes[i] = new (circletype__WEBPACK_IMPORTED_MODULE_1___default())(navLinks[i]);
circleTypes[i].radius(calculateNavGridInnerWidth() / 2);
}
for (let i = navLinks.length - 2; i < navLinks.length; i++) {
circleTypes[i] = new (circletype__WEBPACK_IMPORTED_MODULE_1___default())(navLinks[i]);
circleTypes[i].dir(-1);
circleTypes[i].radius(calculateNavGridInnerWidth() / 2);
}
}
} // Set --home-nav-item-translation CSS property
function setNavItemTranslationProperty() {
let navItemTranslation = (calculateNavGridInnerDiagonal() - calculateNavGridInnerWidth()) / 2;
if (root) {
root.style.setProperty('--home-nav-item-translation', navItemTranslation + 'px');
}
} // Set navigation grid display depending on number of links
function setNavGridDisplay() {
if (navEl && navLinks.length !== 0) {
if (navLinks.length === 2) {
navEl.classList.add('home__nav--2-items');
} else if (navLinks.length === 3) {
navEl.classList.add('home__nav--3-items');
} else if (navLinks.length === 4) {
navEl.classList.add('home__nav--4-items');
}
for (let i = 0; i < navLinks.length; i++) {
navLinks[i].classList.add('home__nav-link--visible');
}
}
} // Edit navigation links radius and translation on window resize event
function editNavLinksOnResize() {
window.addEventListener('resize', function (e) {
if (navLinks.length !== 0 && circleTypes) {
for (let i = 0; i < navLinks.length; i++) {
circleTypes[i].radius(calculateNavGridInnerWidth() / 2);
}
}
setNavItemTranslationProperty();
});
} // Add wave up animation to a single letter and remove it on animationend event
function waveNavLetterUp(navLetter) {
navLetter.classList.add('home__nav-letter--wave-up');
navLetter.addEventListener('animationend', function (e) {
navLetter.classList.remove('home__nav-letter--wave-up');
});
} // Add wave down animation to a single letter and remove it on animationend event
function waveNavLetterDown(navLetter) {
navLetter.classList.add('home__nav-letter--wave-down');
navLetter.addEventListener('animationend', function (e) {
navLetter.classList.remove('home__nav-letter--wave-down');
});
} // Add wave up animation to every letters of a single link with a slight delay
function waveNavLinkUp(navLink) {
let navLinkLetters = navLink.querySelectorAll('span');
let animationDelay = 0;
for (let i = 0; i < navLinkLetters.length; i++) {
setTimeout(waveNavLetterUp, animationDelay, navLinkLetters[i]);
animationDelay += 50;
}
} // Add wave down animation to every letters of a single link with a slight delay
function waveNavLinkDown(navLink) {
let navLinkLetters = navLink.querySelectorAll('span');
let animationDelay = 0;
for (let i = 0; i < navLinkLetters.length; i++) {
setTimeout(waveNavLetterDown, animationDelay, navLinkLetters[i]);
animationDelay += 50;
}
} // Add wave (up or down) animation to every letters of each link on mouseover event
function waveNavLinksOnHover() {
if (navLinks.length !== 0) {
for (let i = 0; i < navLinks.length - 2; i++) {
navLinks[i].addEventListener('mouseover', function (e) {
waveNavLinkUp(navLinks[i]);
});
}
for (let i = navLinks.length - 2; i < navLinks.length; i++) {
navLinks[i].addEventListener('mouseover', function (e) {
waveNavLinkDown(navLinks[i]);
});
}
}
} // VIDEO PLAYERS //
// Set up Plyr video players
function setUpVideoPlayers() {
if (galleryVideos.length !== 0) {
videoPlayers = plyr__WEBPACK_IMPORTED_MODULE_0___default().setup(galleryVideos, {
controls: ['play-large', 'play', 'progress', 'current-time', 'duration', 'mute', 'volume', 'fullscreen'],
i18n: {
play: 'Lire',
pause: 'Mettre sur pause',
seek: 'Parcourir la piste audio',
currentTime: 'Temps écoulé depuis le début de la piste audio',
duration: 'Durée de la piste audio',
volume: 'Ajuster le volume',
mute: 'Couper le son',
unmute: 'Activer le son',
enterFullscreen: 'Activer le mode plein écran',
exitFullscreen: 'Quitter le mode plein écran'
}
});
}
} // Toggle videos full screen mode on Plyr enterfullscreen and exitfullscreen media events
function toggleVideosFullScreen() {
if (videoPlayers.length !== 0) {
for (let i = 0; i < videoPlayers.length; i++) {
videoPlayers[i].on('enterfullscreen', function (e) {
galleryVideos[i].classList.add('gallery__video--full-screen');
});
videoPlayers[i].on('exitfullscreen', function (e) {
galleryVideos[i].classList.remove('gallery__video--full-screen');
});
}
}
} // HEADER BAR ANIMATION //
// Toggle header bar depending on scroll offset
function toggleHeaderBar() {
if (headerBar && headerLogo) {
let headerBarHeight = headerBar.getBoundingClientRect().height;
if (window.pageYOffset > headerBarHeight) {
// Scroll down past header bar height
headerBar.classList.add('header-bar--fixed');
headerLogo.classList.add('header-bar__logo--small');
} else if (window.pageYOffset <= 0) {
headerBar.classList.remove('header-bar--fixed');
headerLogo.classList.remove('header-bar__logo--small');
headerBar.classList.remove('header-bar--visible');
}
if (headerBar.classList.contains('header-bar--fixed')) {
if (scrollOffset < window.pageYOffset) {
// Scroll down
headerBar.classList.remove('header-bar--visible');
} else if (scrollOffset > window.pageYOffset) {
// Scroll up
headerBar.classList.add('header-bar--visible');
}
scrollOffset = window.pageYOffset;
}
}
} // NAVIGATION MENU ANIMATION //
// Toggle header navigation
function toggleHeaderNav() {
if (headerNavBtn && headerNavMenu) {
headerNavBtn.classList.toggle('header-bar__nav-button--custom-focus');
headerNavMenu.classList.toggle('header-bar__nav-menu--visible');
headerNavOverlay.classList.toggle('header-bar__nav-overlay--visible');
document.body.classList.toggle('body--hidden-overflow-y');
}
} // Open header navigation
function openHeaderNav() {
if (headerNavBtn && headerNavMenu) {
headerNavBtn.classList.add('header-bar__nav-button--custom-focus');
headerNavMenu.classList.add('header-bar__nav-menu--visible');
headerNavOverlay.classList.add('header-bar__nav-overlay--visible');
document.body.classList.add('body--hidden-overflow-y');
}
} // Close header navigation
function closeHeaderNav() {
if (headerNavBtn && headerNavMenu) {
headerNavBtn.classList.remove('header-bar__nav-button--custom-focus');
headerNavMenu.classList.remove('header-bar__nav-menu--visible');
headerNavOverlay.classList.remove('header-bar__nav-overlay--visible');
document.body.classList.remove('body--hidden-overflow-y');
}
} // Toggle header navigation on button click event
function toggleHeaderNavOnClick() {
headerNavBtn.addEventListener('click', toggleHeaderNav);
} // Close header navigation on document click event
function closeHeaderNavOnClick() {
document.addEventListener('click', function (e) {
if (headerNavBtn.classList.contains('header-bar__nav-button--custom-focus') && headerNavMenu.classList.contains('header-bar__nav-menu--visible') && !headerNavBtn.contains(e.target) && !headerNavMenu.contains(e.target)) {
closeHeaderNav(e);
if (e.cancelable) {
e.preventDefault();
}
}
});
} // Open header navigation on menu list focusin event
function openHeaderNavBeforeFocus() {
if (headerNavMenuListEls) {
for (let i = 0; i < headerNavMenuListEls.length; i++) {
headerNavMenuListEls[i].addEventListener('focusin', openHeaderNav);
}
}
} // Close header navigation on menu list focusout event
function closeHeaderNavAfterFocus() {
if (headerNavMenuListEls) {
for (let i = 0; i < headerNavMenuListEls.length; i++) {
headerNavMenuListEls[i].addEventListener('focusout', closeHeaderNav);
}
}
} // Close header navigation on touchstart and touchmove events (swipe right)
function closeHeaderNavOnSwipe() {
headerNavMenu.addEventListener('touchstart', function (e) {
if (headerNavBtn.classList.contains('header-bar__nav-button--custom-focus') && headerNavMenu.classList.contains('header-bar__nav-menu--visible') && touchPosition.initialX === null && touchPosition.initialY === null) {
touchPosition.initialX = event.touches[0].clientX;
touchPosition.initialY = event.touches[0].clientY;
}
}, {
passive: true
});
headerNavMenu.addEventListener('touchmove', function (e) {
if (headerNavBtn.classList.contains('header-bar__nav-button--custom-focus') && headerNavMenu.classList.contains('header-bar__nav-menu--visible') && touchPosition.initialX !== null && touchPosition.initialY !== null) {
touchPosition.currentX = event.touches[0].clientX;
touchPosition.currentY = event.touches[0].clientY;
touchPosition.diffX = touchPosition.initialX - touchPosition.currentX;
touchPosition.diffY = touchPosition.initialY - touchPosition.currentY;
if (Math.abs(touchPosition.diffX) > Math.abs(touchPosition.diffY)) {
if (touchPosition.diffX < 0) {
closeHeaderNav(e);
}
}
touchPosition.initialX = null;
touchPosition.initialY = null;
}
}, {
passive: true
});
} // ----------------------------------------------------------------------------
// PROGRAM
// ----------------------------------------------------------------------------
// Enable CSS :active pseudo-class in Safari Mobile
document.addEventListener("touchstart", function () {}, false); // HOME NAVIGATION DISPLAY //
window.addEventListener('load', function () {
curveNavLinks();
setNavItemTranslationProperty();
setNavGridDisplay();
editNavLinksOnResize();
waveNavLinksOnHover();
}); // VIDEO PLAYERS //
setUpVideoPlayers();
toggleVideosFullScreen(); // HEADER BAR ANIMATION //
document.addEventListener('scroll', function () {
toggleHeaderBar();
}); // NAVIGATION MENU ANIMATION //
toggleHeaderNavOnClick();
closeHeaderNavOnClick();
openHeaderNavBeforeFocus();
closeHeaderNavAfterFocus();
closeHeaderNavOnSwipe();
}();
/******/ })()
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QSxFQUVEO0FBQ0E7QUFDQTtBQUVBOzs7QUFDQXBHLFFBQVEsQ0FBQ2tELGdCQUFULENBQTBCLFlBQTFCLEVBQXdDLFlBQVcsQ0FBRSxDQUFyRCxFQUFzRCxLQUF0RCxHQUVBOztBQUVBMUIsTUFBTSxDQUFDMEIsZ0JBQVAsQ0FBd0IsTUFBeEIsRUFBZ0MsWUFBVztFQUMxQ2IsYUFBYTtFQUNiSyw2QkFBNkI7RUFDN0JJLGlCQUFpQjtFQUNqQkcsb0JBQW9CO0VBQ3BCYSxtQkFBbUI7QUFDbkIsQ0FORCxHQVFBOztBQUVBQyxpQkFBaUI7QUFDakJjLHNCQUFzQixJQUV0Qjs7QUFFQTdFLFFBQVEsQ0FBQ2tELGdCQUFULENBQTBCLFFBQTFCLEVBQW9DLFlBQVc7RUFDOUM2QixlQUFlO0FBQ2YsQ0FGRCxHQUlBOztBQUVBUyxzQkFBc0I7QUFDdEJDLHFCQUFxQjtBQUNyQkksd0JBQXdCO0FBQ3hCQyx3QkFBd0I7QUFDeEJDLHFCQUFxQixHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vbm9kZV9tb2R1bGVzL2NpcmNsZXR5cGUvZGlzdC9jaXJjbGV0eXBlLm1pbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcGx5ci9kaXN0L3BseXIubWluLmpzIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly8vLi9wdWJsaWMvYXNzZXRzL2pzL2FwcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGNpcmNsZXR5cGUgMi4zLjBcbiAqIEEgSmF2YVNjcmlwdCBsaWJyYXJ5IHRoYXQgbGV0cyB5b3UgY3VydmUgdHlwZSBvbiB0aGUgd2ViLlxuICogQ29weXJpZ2h0IMKpIDIwMTQtMjAxOCBQZXRlciBIcnlua293XG4gKiBMaWNlbnNlZCBNSVRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9wZXRlcmhyeS9DaXJjbGVUeXBlI3JlYWRtZVxuICovXG4hZnVuY3Rpb24odCxlKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSxlKTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLkNpcmNsZVR5cGU9ZSgpOnQuQ2lyY2xlVHlwZT1lKCl9KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHIpe2lmKG5bcl0pcmV0dXJuIG5bcl0uZXhwb3J0czt2YXIgaT1uW3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gdFtyXS5jYWxsKGkuZXhwb3J0cyxpLGkuZXhwb3J0cyxlKSxpLmw9ITAsaS5leHBvcnRzfXZhciBuPXt9O3JldHVybiBlLm09dCxlLmM9bixlLmQ9ZnVuY3Rpb24odCxuLHIpe2Uubyh0LG4pfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxlLm49ZnVuY3Rpb24odCl7dmFyIG49dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIGUuZChuLFwiYVwiLG4pLG59LGUubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sZS5wPVwiXCIsZShlLnM9MjkpfShbZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjQpKFwid2tzXCIpLGk9bigxMiksbz1uKDEpLlN5bWJvbCx1PVwiZnVuY3Rpb25cIj09dHlwZW9mIG87KHQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gclt0XXx8KHJbdF09dSYmb1t0XXx8KHU/bzppKShcIlN5bWJvbC5cIit0KSl9KS5zdG9yZT1yfSxmdW5jdGlvbih0LGUpe3ZhciBuPXQuZXhwb3J0cz1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGYmJnNlbGYuTWF0aD09TWF0aD9zZWxmOkZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcIm51bWJlclwiPT10eXBlb2YgX19nJiYoX19nPW4pfSxmdW5jdGlvbih0LGUpe3ZhciBuPXQuZXhwb3J0cz17dmVyc2lvbjpcIjIuNS42XCJ9O1wibnVtYmVyXCI9PXR5cGVvZiBfX2UmJihfX2U9bil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLGk9bigxMSk7dC5leHBvcnRzPW4oNik/ZnVuY3Rpb24odCxlLG4pe3JldHVybiByLmYodCxlLGkoMSxuKSl9OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFtlXT1uLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KSxpPW4oMzQpLG89bigzNSksdT1PYmplY3QuZGVmaW5lUHJvcGVydHk7ZS5mPW4oNik/T2JqZWN0LmRlZmluZVByb3BlcnR5OmZ1bmN0aW9uKHQsZSxuKXtpZihyKHQpLGU9byhlLCEwKSxyKG4pLGkpdHJ5e3JldHVybiB1KHQsZSxuKX1jYXRjaCh0KXt9aWYoXCJnZXRcImluIG58fFwic2V0XCJpbiBuKXRocm93IFR5cGVFcnJvcihcIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIVwiKTtyZXR1cm5cInZhbHVlXCJpbiBuJiYodFtlXT1uLnZhbHVlKSx0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTApO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighcih0KSl0aHJvdyBUeXBlRXJyb3IodCtcIiBpcyBub3QgYW4gb2JqZWN0IVwiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9IW4oMTcpKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSxcImFcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pfSxmdW5jdGlvbih0LGUpe3ZhciBuPXt9Lmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBuLmNhbGwodCxlKX19LGZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5jZWlsLHI9TWF0aC5mbG9vcjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGlzTmFOKHQ9K3QpPzA6KHQ+MD9yOm4pKHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT10KXRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIit0KTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0P251bGwhPT10OlwiZnVuY3Rpb25cIj09dHlwZW9mIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybntlbnVtZXJhYmxlOiEoMSZ0KSxjb25maWd1cmFibGU6ISgyJnQpLHdyaXRhYmxlOiEoNCZ0KSx2YWx1ZTplfX19LGZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVyblwiU3ltYm9sKFwiLmNvbmNhdCh2b2lkIDA9PT10P1wiXCI6dCxcIilfXCIsKCsrbityKS50b1N0cmluZygzNikpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e319LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI0KShcImtleXNcIiksaT1uKDEyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHJbdF18fChyW3RdPWkodCkpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ITF9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEpLGk9bigyKSxvPW4oMyksdT1uKDE5KSxjPW4oMjApLGY9ZnVuY3Rpb24odCxlLG4pe3ZhciBhLHMsbCxwLGg9dCZmLkYsZD10JmYuRyx2PXQmZi5TLHk9dCZmLlAsXz10JmYuQixtPWQ/cjp2P3JbZV18fChyW2VdPXt9KToocltlXXx8e30pLnByb3RvdHlwZSxnPWQ/aTppW2VdfHwoaVtlXT17fSkseD1nLnByb3RvdHlwZXx8KGcucHJvdG90eXBlPXt9KTtkJiYobj1lKTtmb3IoYSBpbiBuKXM9IWgmJm0mJnZvaWQgMCE9PW1bYV0sbD0ocz9tOm4pW2FdLHA9XyYmcz9jKGwscik6eSYmXCJmdW5jdGlvblwiPT10eXBlb2YgbD9jKEZ1bmN0aW9uLmNhbGwsbCk6bCxtJiZ1KG0sYSxsLHQmZi5VKSxnW2FdIT1sJiZvKGcsYSxwKSx5JiZ4W2FdIT1sJiYoeFthXT1sKX07ci5jb3JlPWksZi5GPTEsZi5HPTIsZi5TPTQsZi5QPTgsZi5CPTE2LGYuVz0zMixmLlU9NjQsZi5SPTEyOCx0LmV4cG9ydHM9Zn0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoKHQpe3JldHVybiEwfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEwKSxpPW4oMSkuZG9jdW1lbnQsbz1yKGkpJiZyKGkuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvP2kuY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEpLGk9bigzKSxvPW4oNyksdT1uKDEyKShcInNyY1wiKSxjPUZ1bmN0aW9uLnRvU3RyaW5nLGY9KFwiXCIrYykuc3BsaXQoXCJ0b1N0cmluZ1wiKTtuKDIpLmluc3BlY3RTb3VyY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGMuY2FsbCh0KX0sKHQuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixjKXt2YXIgYT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBuO2EmJihvKG4sXCJuYW1lXCIpfHxpKG4sXCJuYW1lXCIsZSkpLHRbZV0hPT1uJiYoYSYmKG8obix1KXx8aShuLHUsdFtlXT9cIlwiK3RbZV06Zi5qb2luKFN0cmluZyhlKSkpKSx0PT09cj90W2VdPW46Yz90W2VdP3RbZV09bjppKHQsZSxuKTooZGVsZXRlIHRbZV0saSh0LGUsbikpKX0pKEZ1bmN0aW9uLnByb3RvdHlwZSxcInRvU3RyaW5nXCIsZnVuY3Rpb24oKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzJiZ0aGlzW3VdfHxjLmNhbGwodGhpcyl9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7aWYocih0KSx2b2lkIDA9PT1lKXJldHVybiB0O3N3aXRjaChuKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0LmNhbGwoZSxuKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihuLHIpe3JldHVybiB0LmNhbGwoZSxuLHIpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKG4scixpKXtyZXR1cm4gdC5jYWxsKGUsbixyLGkpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDIpLGk9big5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIoaSh0KSl9fSxmdW5jdGlvbih0LGUpe3ZhciBuPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbi5jYWxsKHQpLnNsaWNlKDgsLTEpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOCksaT1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD9pKHIodCksOTAwNzE5OTI1NDc0MDk5MSk6MH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIpLGk9bigxKSxvPWlbXCJfX2NvcmUtanNfc2hhcmVkX19cIl18fChpW1wiX19jb3JlLWpzX3NoYXJlZF9fXCJdPXt9KTsodC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG9bdF18fChvW3RdPXZvaWQgMCE9PWU/ZTp7fSl9KShcInZlcnNpb25zXCIsW10pLnB1c2goe3ZlcnNpb246ci52ZXJzaW9uLG1vZGU6bigxNSk/XCJwdXJlXCI6XCJnbG9iYWxcIixjb3B5cmlnaHQ6XCLCqSAyMDE4IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpXCJ9KX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9XCJjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2ZcIi5zcGxpdChcIixcIil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLmYsaT1uKDcpLG89bigwKShcInRvU3RyaW5nVGFnXCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dCYmIWkodD1uP3Q6dC5wcm90b3R5cGUsbykmJnIodCxvLHtjb25maWd1cmFibGU6ITAsdmFsdWU6ZX0pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qocih0KSl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHI9TWF0aC5QSS8xODA7ZS5kZWZhdWx0PWZ1bmN0aW9uKHQpe3JldHVybiB0KnJ9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7bigzMCk7dmFyIHI9big1NCksaT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KHIpO3QuZXhwb3J0cz1pLmRlZmF1bHR9LGZ1bmN0aW9uKHQsZSxuKXtuKDMxKSxuKDQ3KSx0LmV4cG9ydHM9bigyKS5BcnJheS5mcm9tfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIHI9bigzMikoITApO24oMzMpKFN0cmluZyxcIlN0cmluZ1wiLGZ1bmN0aW9uKHQpe3RoaXMuX3Q9U3RyaW5nKHQpLHRoaXMuX2k9MH0sZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuX3Qsbj10aGlzLl9pO3JldHVybiBuPj1lLmxlbmd0aD97dmFsdWU6dm9pZCAwLGRvbmU6ITB9Oih0PXIoZSxuKSx0aGlzLl9pKz10Lmxlbmd0aCx7dmFsdWU6dCxkb25lOiExfSl9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOCksaT1uKDkpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgbyx1LGM9U3RyaW5nKGkoZSkpLGY9cihuKSxhPWMubGVuZ3RoO3JldHVybiBmPDB8fGY+PWE/dD9cIlwiOnZvaWQgMDoobz1jLmNoYXJDb2RlQXQoZiksbzw1NTI5Nnx8bz41NjMxOXx8ZisxPT09YXx8KHU9Yy5jaGFyQ29kZUF0KGYrMSkpPDU2MzIwfHx1PjU3MzQzP3Q/Yy5jaGFyQXQoZik6bzp0P2Muc2xpY2UoZixmKzIpOnUtNTYzMjArKG8tNTUyOTY8PDEwKSs2NTUzNil9fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMTUpLGk9bigxNiksbz1uKDE5KSx1PW4oMyksYz1uKDEzKSxmPW4oMzcpLGE9bigyNikscz1uKDQ2KSxsPW4oMCkoXCJpdGVyYXRvclwiKSxwPSEoW10ua2V5cyYmXCJuZXh0XCJpbltdLmtleXMoKSksaD1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sZCx2LHksXyl7ZihuLGUsZCk7dmFyIG0sZyx4LGI9ZnVuY3Rpb24odCl7aWYoIXAmJnQgaW4gTSlyZXR1cm4gTVt0XTtzd2l0Y2godCl7Y2FzZVwia2V5c1wiOmNhc2VcInZhbHVlc1wiOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyx0KX19LE89ZStcIiBJdGVyYXRvclwiLHc9XCJ2YWx1ZXNcIj09dixqPSExLE09dC5wcm90b3R5cGUsUz1NW2xdfHxNW1wiQEBpdGVyYXRvclwiXXx8diYmTVt2XSxQPVN8fGIodiksQT12P3c/YihcImVudHJpZXNcIik6UDp2b2lkIDAsVD1cIkFycmF5XCI9PWU/TS5lbnRyaWVzfHxTOlM7aWYoVCYmKHg9cyhULmNhbGwobmV3IHQpKSkhPT1PYmplY3QucHJvdG90eXBlJiZ4Lm5leHQmJihhKHgsTywhMCkscnx8XCJmdW5jdGlvblwiPT10eXBlb2YgeFtsXXx8dSh4LGwsaCkpLHcmJlMmJlwidmFsdWVzXCIhPT1TLm5hbWUmJihqPSEwLFA9ZnVuY3Rpb24oKXtyZXR1cm4gUy5jYWxsKHRoaXMpfSksciYmIV98fCFwJiYhaiYmTVtsXXx8dShNLGwsUCksY1tlXT1QLGNbT109aCx2KWlmKG09e3ZhbHVlczp3P1A6YihcInZhbHVlc1wiKSxrZXlzOnk/UDpiKFwia2V5c1wiKSxlbnRyaWVzOkF9LF8pZm9yKGcgaW4gbSlnIGluIE18fG8oTSxnLG1bZ10pO2Vsc2UgaShpLlAraS5GKihwfHxqKSxlLG0pO3JldHVybiBtfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz0hbig2KSYmIW4oMTcpKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuKDE4KShcImRpdlwiKSxcImFcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoIXIodCkpcmV0dXJuIHQ7dmFyIG4saTtpZihlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZihuPXQudG9TdHJpbmcpJiYhcihpPW4uY2FsbCh0KSkpcmV0dXJuIGk7aWYoXCJmdW5jdGlvblwiPT10eXBlb2Yobj10LnZhbHVlT2YpJiYhcihpPW4uY2FsbCh0KSkpcmV0dXJuIGk7aWYoIWUmJlwiZnVuY3Rpb25cIj09dHlwZW9mKG49dC50b1N0cmluZykmJiFyKGk9bi5jYWxsKHQpKSlyZXR1cm4gaTt0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIil9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcih0K1wiIGlzIG5vdCBhIGZ1bmN0aW9uIVwiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgcj1uKDM4KSxpPW4oMTEpLG89bigyNiksdT17fTtuKDMpKHUsbigwKShcIml0ZXJhdG9yXCIpLGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSx0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3QucHJvdG90eXBlPXIodSx7bmV4dDppKDEsbil9KSxvKHQsZStcIiBJdGVyYXRvclwiKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLGk9bigzOSksbz1uKDI1KSx1PW4oMTQpKFwiSUVfUFJPVE9cIiksYz1mdW5jdGlvbigpe30sZj1mdW5jdGlvbigpe3ZhciB0LGU9bigxOCkoXCJpZnJhbWVcIikscj1vLmxlbmd0aDtmb3IoZS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLG4oNDUpLmFwcGVuZENoaWxkKGUpLGUuc3JjPVwiamF2YXNjcmlwdDpcIix0PWUuY29udGVudFdpbmRvdy5kb2N1bWVudCx0Lm9wZW4oKSx0LndyaXRlKFwiPHNjcmlwdD5kb2N1bWVudC5GPU9iamVjdDxcXC9zY3JpcHQ+XCIpLHQuY2xvc2UoKSxmPXQuRjtyLS07KWRlbGV0ZSBmLnByb3RvdHlwZVtvW3JdXTtyZXR1cm4gZigpfTt0LmV4cG9ydHM9T2JqZWN0LmNyZWF0ZXx8ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gbnVsbCE9PXQ/KGMucHJvdG90eXBlPXIodCksbj1uZXcgYyxjLnByb3RvdHlwZT1udWxsLG5bdV09dCk6bj1mKCksdm9pZCAwPT09ZT9uOmkobixlKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQpLGk9big1KSxvPW4oNDApO3QuZXhwb3J0cz1uKDYpP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uKHQsZSl7aSh0KTtmb3IodmFyIG4sdT1vKGUpLGM9dS5sZW5ndGgsZj0wO2M+Zjspci5mKHQsbj11W2YrK10sZVtuXSk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MSksaT1uKDI1KTt0LmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiByKHQsaSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3KSxpPW4oMjEpLG89big0MykoITEpLHU9bigxNCkoXCJJRV9QUk9UT1wiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixjPWkodCksZj0wLGE9W107Zm9yKG4gaW4gYyluIT11JiZyKGMsbikmJmEucHVzaChuKTtmb3IoO2UubGVuZ3RoPmY7KXIoYyxuPWVbZisrXSkmJih+byhhLG4pfHxhLnB1c2gobikpO3JldHVybiBhfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjIpO3QuZXhwb3J0cz1PYmplY3QoXCJ6XCIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApP09iamVjdDpmdW5jdGlvbih0KXtyZXR1cm5cIlN0cmluZ1wiPT1yKHQpP3Quc3BsaXQoXCJcIik6T2JqZWN0KHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjEpLGk9bigyMyksbz1uKDQ0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbix1KXt2YXIgYyxmPXIoZSksYT1pKGYubGVuZ3RoKSxzPW8odSxhKTtpZih0JiZuIT1uKXtmb3IoO2E+czspaWYoKGM9ZltzKytdKSE9YylyZXR1cm4hMH1lbHNlIGZvcig7YT5zO3MrKylpZigodHx8cyBpbiBmKSYmZltzXT09PW4pcmV0dXJuIHR8fHN8fDA7cmV0dXJuIXQmJi0xfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDgpLGk9TWF0aC5tYXgsbz1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1yKHQpLHQ8MD9pKHQrZSwwKTpvKHQsZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKS5kb2N1bWVudDt0LmV4cG9ydHM9ciYmci5kb2N1bWVudEVsZW1lbnR9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDcpLGk9bigyNyksbz1uKDE0KShcIklFX1BST1RPXCIpLHU9T2JqZWN0LnByb3RvdHlwZTt0LmV4cG9ydHM9T2JqZWN0LmdldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0KXtyZXR1cm4gdD1pKHQpLHIodCxvKT90W29dOlwiZnVuY3Rpb25cIj09dHlwZW9mIHQuY29uc3RydWN0b3ImJnQgaW5zdGFuY2VvZiB0LmNvbnN0cnVjdG9yP3QuY29uc3RydWN0b3IucHJvdG90eXBlOnQgaW5zdGFuY2VvZiBPYmplY3Q/dTpudWxsfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oMjApLGk9bigxNiksbz1uKDI3KSx1PW4oNDgpLGM9big0OSksZj1uKDIzKSxhPW4oNTApLHM9big1MSk7aShpLlMraS5GKiFuKDUzKShmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSksXCJBcnJheVwiLHtmcm9tOmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxsLHA9byh0KSxoPVwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXM/dGhpczpBcnJheSxkPWFyZ3VtZW50cy5sZW5ndGgsdj1kPjE/YXJndW1lbnRzWzFdOnZvaWQgMCx5PXZvaWQgMCE9PXYsXz0wLG09cyhwKTtpZih5JiYodj1yKHYsZD4yP2FyZ3VtZW50c1syXTp2b2lkIDAsMikpLHZvaWQgMD09bXx8aD09QXJyYXkmJmMobSkpZm9yKGU9ZihwLmxlbmd0aCksbj1uZXcgaChlKTtlPl87XysrKWEobixfLHk/dihwW19dLF8pOnBbX10pO2Vsc2UgZm9yKGw9bS5jYWxsKHApLG49bmV3IGg7IShpPWwubmV4dCgpKS5kb25lO18rKylhKG4sXyx5P3UobCx2LFtpLnZhbHVlLF9dLCEwKTppLnZhbHVlKTtyZXR1cm4gbi5sZW5ndGg9XyxufX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4saSl7dHJ5e3JldHVybiBpP2UocihuKVswXSxuWzFdKTplKG4pfWNhdGNoKGUpe3ZhciBvPXQucmV0dXJuO3Rocm93IHZvaWQgMCE9PW8mJnIoby5jYWxsKHQpKSxlfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxpPW4oMCkoXCJpdGVyYXRvclwiKSxvPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJihyLkFycmF5PT09dHx8b1tpXT09PXQpfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciByPW4oNCksaT1uKDExKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2UgaW4gdD9yLmYodCxlLGkoMCxuKSk6dFtlXT1ufX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTIpLGk9bigwKShcIml0ZXJhdG9yXCIpLG89bigxMyk7dC5leHBvcnRzPW4oMikuZ2V0SXRlcmF0b3JNZXRob2Q9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT10KXJldHVybiB0W2ldfHx0W1wiQEBpdGVyYXRvclwiXXx8b1tyKHQpXX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIyKSxpPW4oMCkoXCJ0b1N0cmluZ1RhZ1wiKSxvPVwiQXJndW1lbnRzXCI9PXIoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKSx1PWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319O3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxuLGM7cmV0dXJuIHZvaWQgMD09PXQ/XCJVbmRlZmluZWRcIjpudWxsPT09dD9cIk51bGxcIjpcInN0cmluZ1wiPT10eXBlb2Yobj11KGU9T2JqZWN0KHQpLGkpKT9uOm8/cihlKTpcIk9iamVjdFwiPT0oYz1yKGUpKSYmXCJmdW5jdGlvblwiPT10eXBlb2YgZS5jYWxsZWU/XCJBcmd1bWVudHNcIjpjfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCkoXCJpdGVyYXRvclwiKSxpPSExO3RyeXt2YXIgbz1bN11bcl0oKTtvLnJldHVybj1mdW5jdGlvbigpe2k9ITB9LEFycmF5LmZyb20obyxmdW5jdGlvbigpe3Rocm93IDJ9KX1jYXRjaCh0KXt9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoIWUmJiFpKXJldHVybiExO3ZhciBuPSExO3RyeXt2YXIgbz1bN10sdT1vW3JdKCk7dS5uZXh0PWZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6bj0hMH19LG9bcl09ZnVuY3Rpb24oKXtyZXR1cm4gdX0sdChvKX1jYXRjaCh0KXt9cmV0dXJuIG59fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gaSh0LGUpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG89ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24oZSxuLHIpe3JldHVybiBuJiZ0KGUucHJvdG90eXBlLG4pLHImJnQoZSxyKSxlfX0oKSx1PW4oNTUpLGM9cih1KSxmPW4oNTYpLGE9cihmKSxzPW4oNTcpLGw9cihzKSxwPW4oNTgpLGg9cihwKSxkPW4oNTkpLHY9cihkKSx5PU1hdGguUEksXz1NYXRoLm1heCxtPU1hdGgubWluLGc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbil7aSh0aGlzLHQpLHRoaXMuZWxlbWVudD1lLHRoaXMub3JpZ2luYWxIVE1MPXRoaXMuZWxlbWVudC5pbm5lckhUTUw7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxvPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtyLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIixlLmlubmVyVGV4dCksci5zdHlsZS5wb3NpdGlvbj1cInJlbGF0aXZlXCIsdGhpcy5jb250YWluZXI9cix0aGlzLl9sZXR0ZXJzPSgwLGEuZGVmYXVsdCkoZSxuKSx0aGlzLl9sZXR0ZXJzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIG8uYXBwZW5kQ2hpbGQodCl9KSxyLmFwcGVuZENoaWxkKG8pLHRoaXMuZWxlbWVudC5pbm5lckhUTUw9XCJcIix0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQocik7dmFyIHU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50KSxmPXUuZm9udFNpemUscz11LmxpbmVIZWlnaHQ7dGhpcy5fZm9udFNpemU9cGFyc2VGbG9hdChmKSx0aGlzLl9saW5lSGVpZ2h0PXBhcnNlRmxvYXQocyl8fHRoaXMuX2ZvbnRTaXplLHRoaXMuX21ldHJpY3M9dGhpcy5fbGV0dGVycy5tYXAoYy5kZWZhdWx0KTt2YXIgbD10aGlzLl9tZXRyaWNzLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0K2Uud2lkdGh9LDApO3RoaXMuX21pblJhZGl1cz1sL3kvMit0aGlzLl9saW5lSGVpZ2h0LHRoaXMuX2Rpcj0xLHRoaXMuX2ZvcmNlV2lkdGg9ITEsdGhpcy5fZm9yY2VIZWlnaHQ9ITAsdGhpcy5fcmFkaXVzPXRoaXMuX21pblJhZGl1cyx0aGlzLl9pbnZhbGlkYXRlKCl9cmV0dXJuIG8odCxbe2tleTpcInJhZGl1c1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10Pyh0aGlzLl9yYWRpdXM9Xyh0aGlzLl9taW5SYWRpdXMsdCksdGhpcy5faW52YWxpZGF0ZSgpLHRoaXMpOnRoaXMuX3JhZGl1c319LHtrZXk6XCJkaXJcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dD8odGhpcy5fZGlyPXQsdGhpcy5faW52YWxpZGF0ZSgpLHRoaXMpOnRoaXMuX2Rpcn19LHtrZXk6XCJmb3JjZVdpZHRoXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQ/KHRoaXMuX2ZvcmNlV2lkdGg9dCx0aGlzLl9pbnZhbGlkYXRlKCksdGhpcyk6dGhpcy5fZm9yY2VXaWR0aH19LHtrZXk6XCJmb3JjZUhlaWdodFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10Pyh0aGlzLl9mb3JjZUhlaWdodD10LHRoaXMuX2ludmFsaWRhdGUoKSx0aGlzKTp0aGlzLl9mb3JjZUhlaWdodH19LHtrZXk6XCJyZWZyZXNoXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW52YWxpZGF0ZSgpfX0se2tleTpcImRlc3Ryb3lcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnQuaW5uZXJIVE1MPXRoaXMub3JpZ2luYWxIVE1MLHRoaXN9fSx7a2V5OlwiX2ludmFsaWRhdGVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JhZiksdGhpcy5fcmFmPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3QuX2xheW91dCgpfSksdGhpc319LHtrZXk6XCJfbGF5b3V0XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fcmFkaXVzLG49dGhpcy5fZGlyLHI9LTE9PT1uPy1lK3RoaXMuX2xpbmVIZWlnaHQ6ZSxpPVwiY2VudGVyIFwiK3IvdGhpcy5fZm9udFNpemUrXCJlbVwiLG89ZS10aGlzLl9saW5lSGVpZ2h0LHU9KDAsdi5kZWZhdWx0KSh0aGlzLl9tZXRyaWNzLG8pLGM9dS5yb3RhdGlvbnMsZj11Ls64O2lmKHRoaXMuX2xldHRlcnMuZm9yRWFjaChmdW5jdGlvbihlLHIpe3ZhciBvPWUuc3R5bGUsdT0oLS41KmYrY1tyXSkqbixhPS0uNSp0Ll9tZXRyaWNzW3JdLndpZHRoL3QuX2ZvbnRTaXplLHM9XCJ0cmFuc2xhdGVYKFwiK2ErXCJlbSkgcm90YXRlKFwiK3UrXCJkZWcpXCI7by5wb3NpdGlvbj1cImFic29sdXRlXCIsby5ib3R0b209LTE9PT1uPzA6XCJhdXRvXCIsby5sZWZ0PVwiNTAlXCIsby50cmFuc2Zvcm09cyxvLnRyYW5zZm9ybU9yaWdpbj1pLG8ud2Via2l0VHJhbnNmb3JtPXMsby53ZWJraXRUcmFuc2Zvcm1PcmlnaW49aX0pLHRoaXMuX2ZvcmNlSGVpZ2h0KXt2YXIgYT1mPjE4MD8oMCxsLmRlZmF1bHQpKGUsZik6KDAsbC5kZWZhdWx0KShvLGYpK3RoaXMuX2xpbmVIZWlnaHQ7dGhpcy5jb250YWluZXIuc3R5bGUuaGVpZ2h0PWEvdGhpcy5fZm9udFNpemUrXCJlbVwifWlmKHRoaXMuX2ZvcmNlV2lkdGgpe3ZhciBzPSgwLGguZGVmYXVsdCkoZSxtKDE4MCxmKSk7dGhpcy5jb250YWluZXIuc3R5bGUud2lkdGg9cy90aGlzLl9mb250U2l6ZStcImVtXCJ9cmV0dXJuIHRoaXN9fV0pLHR9KCk7ZS5kZWZhdWx0PWd9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm57aGVpZ2h0OmUuaGVpZ2h0LGxlZnQ6ZS5sZWZ0K3dpbmRvdy5wYWdlWE9mZnNldCx0b3A6ZS50b3Ard2luZG93LnBhZ2VZT2Zmc2V0LHdpZHRoOmUud2lkdGh9fX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHIodCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7Zm9yKHZhciBlPTAsbj1BcnJheSh0Lmxlbmd0aCk7ZTx0Lmxlbmd0aDtlKyspbltlXT10W2VdO3JldHVybiBufXJldHVybiBBcnJheS5mcm9tKHQpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD1mdW5jdGlvbih0LGUpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpLGk9dC5pbm5lclRleHQudHJpbSgpO3JldHVybihlP2UoaSk6W10uY29uY2F0KHIoaSkpKS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9bi5jbG9uZU5vZGUoKTtyZXR1cm4gZS5pbnNlcnRBZGphY2VudEhUTUwoXCJhZnRlcmJlZ2luXCIsXCIgXCI9PT10P1wiJm5ic3A7XCI6dCksZX0pfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciByPW4oMjgpLGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShyKTtlLmRlZmF1bHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCooMS1NYXRoLmNvcygoMCxpLmRlZmF1bHQpKGUvMikpKX19LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgcj1uKDI4KSxpPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0ocik7ZS5kZWZhdWx0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIDIqdCpNYXRoLnNpbigoMCxpLmRlZmF1bHQpKGUvMikpfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciByPW4oNjApLGk9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShyKTtlLmRlZmF1bHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5yZWR1Y2UoZnVuY3Rpb24odCxuKXt2YXIgcj1uLndpZHRoLG89KDAsaS5kZWZhdWx0KShyL2UpO3JldHVybntcIs64XCI6dC7OuCtvLHJvdGF0aW9uczp0LnJvdGF0aW9ucy5jb25jYXQoW3Quzrgrby8yXSl9fSx7XCLOuFwiOjAscm90YXRpb25zOltdfSl9fSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIHI9MTgwL01hdGguUEk7ZS5kZWZhdWx0PWZ1bmN0aW9uKHQpe3JldHVybiB0KnJ9fV0pfSk7IiwiXCJvYmplY3RcIj09dHlwZW9mIG5hdmlnYXRvciYmZnVuY3Rpb24oZSx0KXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShcIlBseXJcIix0KTooZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOmV8fHNlbGYpLlBseXI9dCgpfSh0aGlzLChmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGUoZSx0LGkpe3JldHVybiB0IGluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6aSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09aSxlfWZ1bmN0aW9uIHQoZSx0KXtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIHM9dFtpXTtzLmVudW1lcmFibGU9cy5lbnVtZXJhYmxlfHwhMSxzLmNvbmZpZ3VyYWJsZT0hMCxcInZhbHVlXCJpbiBzJiYocy53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscy5rZXkscyl9fWZ1bmN0aW9uIGkoZSx0LGkpe3JldHVybiB0IGluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6aSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09aSxlfWZ1bmN0aW9uIHMoZSx0KXt2YXIgaT1PYmplY3Qua2V5cyhlKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO3QmJihzPXMuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSkpLGkucHVzaC5hcHBseShpLHMpfXJldHVybiBpfWZ1bmN0aW9uIG4oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW3RdP2FyZ3VtZW50c1t0XTp7fTt0JTI/cyhPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKHQpe2koZSx0LG5bdF0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOnMoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KSl9KSl9cmV0dXJuIGV9dmFyIGE9e2FkZENTUzohMCx0aHVtYldpZHRoOjE1LHdhdGNoOiEwfTtmdW5jdGlvbiBsKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KSkuaW5jbHVkZXModGhpcyl9LmNhbGwoZSx0KX12YXIgbz1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT9lLmNvbnN0cnVjdG9yOm51bGx9LHI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4hIShlJiZ0JiZlIGluc3RhbmNlb2YgdCl9LGM9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV9LGg9ZnVuY3Rpb24oZSl7cmV0dXJuIG8oZSk9PT1PYmplY3R9LHU9ZnVuY3Rpb24oZSl7cmV0dXJuIG8oZSk9PT1TdHJpbmd9LGQ9ZnVuY3Rpb24oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl9LG09ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSxOb2RlTGlzdCl9LHA9dSxnPWQsZj1tLGI9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSxFbGVtZW50KX0seT1mdW5jdGlvbihlKXtyZXR1cm4gcihlLEV2ZW50KX0sdj1mdW5jdGlvbihlKXtyZXR1cm4gYyhlKXx8KHUoZSl8fGQoZSl8fG0oZSkpJiYhZS5sZW5ndGh8fGgoZSkmJiFPYmplY3Qua2V5cyhlKS5sZW5ndGh9O2Z1bmN0aW9uIHcoZSx0KXtpZigxPnQpe3ZhciBpPWZ1bmN0aW9uKGUpe3ZhciB0PVwiXCIuY29uY2F0KGUpLm1hdGNoKC8oPzpcXC4oXFxkKykpPyg/OltlRV0oWystXT9cXGQrKSk/JC8pO3JldHVybiB0P01hdGgubWF4KDAsKHRbMV0/dFsxXS5sZW5ndGg6MCktKHRbMl0/K3RbMl06MCkpOjB9KHQpO3JldHVybiBwYXJzZUZsb2F0KGUudG9GaXhlZChpKSl9cmV0dXJuIE1hdGgucm91bmQoZS90KSp0fXZhciBUPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LGkpeyhmdW5jdGlvbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9KSh0aGlzLGUpLGIodCk/dGhpcy5lbGVtZW50PXQ6cCh0KSYmKHRoaXMuZWxlbWVudD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpKSxiKHRoaXMuZWxlbWVudCkmJnYodGhpcy5lbGVtZW50LnJhbmdlVG91Y2gpJiYodGhpcy5jb25maWc9bih7fSxhLHt9LGkpLHRoaXMuaW5pdCgpKX1yZXR1cm4gZnVuY3Rpb24oZSxpLHMpe2kmJnQoZS5wcm90b3R5cGUsaSkscyYmdChlLHMpfShlLFt7a2V5OlwiaW5pdFwiLHZhbHVlOmZ1bmN0aW9uKCl7ZS5lbmFibGVkJiYodGhpcy5jb25maWcuYWRkQ1NTJiYodGhpcy5lbGVtZW50LnN0eWxlLnVzZXJTZWxlY3Q9XCJub25lXCIsdGhpcy5lbGVtZW50LnN0eWxlLndlYktpdFVzZXJTZWxlY3Q9XCJub25lXCIsdGhpcy5lbGVtZW50LnN0eWxlLnRvdWNoQWN0aW9uPVwibWFuaXB1bGF0aW9uXCIpLHRoaXMubGlzdGVuZXJzKCEwKSx0aGlzLmVsZW1lbnQucmFuZ2VUb3VjaD10aGlzKX19LHtrZXk6XCJkZXN0cm95XCIsdmFsdWU6ZnVuY3Rpb24oKXtlLmVuYWJsZWQmJih0aGlzLmNvbmZpZy5hZGRDU1MmJih0aGlzLmVsZW1lbnQuc3R5bGUudXNlclNlbGVjdD1cIlwiLHRoaXMuZWxlbWVudC5zdHlsZS53ZWJLaXRVc2VyU2VsZWN0PVwiXCIsdGhpcy5lbGVtZW50LnN0eWxlLnRvdWNoQWN0aW9uPVwiXCIpLHRoaXMubGlzdGVuZXJzKCExKSx0aGlzLmVsZW1lbnQucmFuZ2VUb3VjaD1udWxsKX19LHtrZXk6XCJsaXN0ZW5lcnNcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLGk9ZT9cImFkZEV2ZW50TGlzdGVuZXJcIjpcInJlbW92ZUV2ZW50TGlzdGVuZXJcIjtbXCJ0b3VjaHN0YXJ0XCIsXCJ0b3VjaG1vdmVcIixcInRvdWNoZW5kXCJdLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuZWxlbWVudFtpXShlLChmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXQoZSl9KSwhMSl9KSl9fSx7a2V5OlwiZ2V0XCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIWUuZW5hYmxlZHx8IXkodCkpcmV0dXJuIG51bGw7dmFyIGkscz10LnRhcmdldCxuPXQuY2hhbmdlZFRvdWNoZXNbMF0sYT1wYXJzZUZsb2F0KHMuZ2V0QXR0cmlidXRlKFwibWluXCIpKXx8MCxsPXBhcnNlRmxvYXQocy5nZXRBdHRyaWJ1dGUoXCJtYXhcIikpfHwxMDAsbz1wYXJzZUZsb2F0KHMuZ2V0QXR0cmlidXRlKFwic3RlcFwiKSl8fDEscj1zLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9MTAwL3Iud2lkdGgqKHRoaXMuY29uZmlnLnRodW1iV2lkdGgvMikvMTAwO3JldHVybiAwPihpPTEwMC9yLndpZHRoKihuLmNsaWVudFgtci5sZWZ0KSk/aT0wOjEwMDxpJiYoaT0xMDApLDUwPmk/aS09KDEwMC0yKmkpKmM6NTA8aSYmKGkrPTIqKGktNTApKmMpLGErdyhpLzEwMCoobC1hKSxvKX19LHtrZXk6XCJzZXRcIix2YWx1ZTpmdW5jdGlvbih0KXtlLmVuYWJsZWQmJnkodCkmJiF0LnRhcmdldC5kaXNhYmxlZCYmKHQucHJldmVudERlZmF1bHQoKSx0LnRhcmdldC52YWx1ZT10aGlzLmdldCh0KSxmdW5jdGlvbihlLHQpe2lmKGUmJnQpe3ZhciBpPW5ldyBFdmVudCh0LHtidWJibGVzOiEwfSk7ZS5kaXNwYXRjaEV2ZW50KGkpfX0odC50YXJnZXQsXCJ0b3VjaGVuZFwiPT09dC50eXBlP1wiY2hhbmdlXCI6XCJpbnB1dFwiKSl9fV0sW3trZXk6XCJzZXR1cFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBpPTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxzPW51bGw7aWYodih0KXx8cCh0KT9zPUFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChwKHQpP3Q6J2lucHV0W3R5cGU9XCJyYW5nZVwiXScpKTpiKHQpP3M9W3RdOmYodCk/cz1BcnJheS5mcm9tKHQpOmcodCkmJihzPXQuZmlsdGVyKGIpKSx2KHMpKXJldHVybiBudWxsO3ZhciBvPW4oe30sYSx7fSxpKTtpZihwKHQpJiZvLndhdGNoKXt2YXIgcj1uZXcgTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24oaSl7QXJyYXkuZnJvbShpKS5mb3JFYWNoKChmdW5jdGlvbihpKXtBcnJheS5mcm9tKGkuYWRkZWROb2RlcykuZm9yRWFjaCgoZnVuY3Rpb24oaSl7YihpKSYmbChpLHQpJiZuZXcgZShpLG8pfSkpfSkpfSkpO3Iub2JzZXJ2ZShkb2N1bWVudC5ib2R5LHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pfXJldHVybiBzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBlKHQsaSl9KSl9fSx7a2V5OlwiZW5hYmxlZFwiLGdldDpmdW5jdGlvbigpe3JldHVyblwib250b3VjaHN0YXJ0XCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR9fV0pLGV9KCk7Y29uc3Qgaz1lPT5udWxsIT1lP2UuY29uc3RydWN0b3I6bnVsbCxDPShlLHQpPT5Cb29sZWFuKGUmJnQmJmUgaW5zdGFuY2VvZiB0KSxBPWU9Pm51bGw9PWUsUz1lPT5rKGUpPT09T2JqZWN0LEU9ZT0+ayhlKT09PVN0cmluZyxQPWU9PmsoZSk9PT1GdW5jdGlvbixNPWU9PkFycmF5LmlzQXJyYXkoZSksTj1lPT5DKGUsTm9kZUxpc3QpLHg9ZT0+QShlKXx8KEUoZSl8fE0oZSl8fE4oZSkpJiYhZS5sZW5ndGh8fFMoZSkmJiFPYmplY3Qua2V5cyhlKS5sZW5ndGg7dmFyIEk9QSxMPVMsJD1lPT5rKGUpPT09TnVtYmVyJiYhTnVtYmVyLmlzTmFOKGUpLF89RSxPPWU9PmsoZSk9PT1Cb29sZWFuLGo9UCxEPU0scT1OLEg9ZT0+bnVsbCE9PWUmJlwib2JqZWN0XCI9PXR5cGVvZiBlJiYxPT09ZS5ub2RlVHlwZSYmXCJvYmplY3RcIj09dHlwZW9mIGUuc3R5bGUmJlwib2JqZWN0XCI9PXR5cGVvZiBlLm93bmVyRG9jdW1lbnQsUj1lPT5DKGUsRXZlbnQpLEY9ZT0+QyhlLEtleWJvYXJkRXZlbnQpLFY9ZT0+QyhlLFRleHRUcmFjayl8fCFBKGUpJiZFKGUua2luZCksQj1lPT5DKGUsUHJvbWlzZSkmJlAoZS50aGVuKSxVPWU9PntpZihDKGUsd2luZG93LlVSTCkpcmV0dXJuITA7aWYoIUUoZSkpcmV0dXJuITE7bGV0IHQ9ZTtlLnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpJiZlLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKXx8KHQ9YGh0dHA6Ly8ke2V9YCk7dHJ5e3JldHVybiF4KG5ldyBVUkwodCkuaG9zdG5hbWUpfWNhdGNoKGUpe3JldHVybiExfX0sVz14O2NvbnN0IHo9KCgpPT57Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSx0PXtXZWJraXRUcmFuc2l0aW9uOlwid2Via2l0VHJhbnNpdGlvbkVuZFwiLE1velRyYW5zaXRpb246XCJ0cmFuc2l0aW9uZW5kXCIsT1RyYW5zaXRpb246XCJvVHJhbnNpdGlvbkVuZCBvdHJhbnNpdGlvbmVuZFwiLHRyYW5zaXRpb246XCJ0cmFuc2l0aW9uZW5kXCJ9LGk9T2JqZWN0LmtleXModCkuZmluZCgodD0+dm9pZCAwIT09ZS5zdHlsZVt0XSkpO3JldHVybiEhXyhpKSYmdFtpXX0pKCk7ZnVuY3Rpb24gSyhlLHQpe3NldFRpbWVvdXQoKCgpPT57dHJ5e2UuaGlkZGVuPSEwLGUub2Zmc2V0SGVpZ2h0LGUuaGlkZGVuPSExfWNhdGNoKGUpe319KSx0KX1jb25zdCBZPXtpc0lFOkJvb2xlYW4od2luZG93LmRvY3VtZW50LmRvY3VtZW50TW9kZSksaXNFZGdlOndpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKFwiRWRnZVwiKSxpc1dlYmtpdDpcIldlYmtpdEFwcGVhcmFuY2VcImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSYmIS9FZGdlLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLGlzSVBob25lOi8oaVBob25lfGlQb2QpL2dpLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKSxpc0lvczpcIk1hY0ludGVsXCI9PT1uYXZpZ2F0b3IucGxhdGZvcm0mJm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cz4xfHwvKGlQYWR8aVBob25lfGlQb2QpL2dpLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKX07ZnVuY3Rpb24gUShlLHQpe3JldHVybiB0LnNwbGl0KFwiLlwiKS5yZWR1Y2UoKChlLHQpPT5lJiZlW3RdKSxlKX1mdW5jdGlvbiBYKGU9e30sLi4udCl7aWYoIXQubGVuZ3RoKXJldHVybiBlO2NvbnN0IGk9dC5zaGlmdCgpO3JldHVybiBMKGkpPyhPYmplY3Qua2V5cyhpKS5mb3JFYWNoKCh0PT57TChpW3RdKT8oT2JqZWN0LmtleXMoZSkuaW5jbHVkZXModCl8fE9iamVjdC5hc3NpZ24oZSx7W3RdOnt9fSksWChlW3RdLGlbdF0pKTpPYmplY3QuYXNzaWduKGUse1t0XTppW3RdfSl9KSksWChlLC4uLnQpKTplfWZ1bmN0aW9uIEooZSx0KXtjb25zdCBpPWUubGVuZ3RoP2U6W2VdO0FycmF5LmZyb20oaSkucmV2ZXJzZSgpLmZvckVhY2goKChlLGkpPT57Y29uc3Qgcz1pPjA/dC5jbG9uZU5vZGUoITApOnQsbj1lLnBhcmVudE5vZGUsYT1lLm5leHRTaWJsaW5nO3MuYXBwZW5kQ2hpbGQoZSksYT9uLmluc2VydEJlZm9yZShzLGEpOm4uYXBwZW5kQ2hpbGQocyl9KSl9ZnVuY3Rpb24gRyhlLHQpe0goZSkmJiFXKHQpJiZPYmplY3QuZW50cmllcyh0KS5maWx0ZXIoKChbLGVdKT0+IUkoZSkpKS5mb3JFYWNoKCgoW3QsaV0pPT5lLnNldEF0dHJpYnV0ZSh0LGkpKSl9ZnVuY3Rpb24gWihlLHQsaSl7Y29uc3Qgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiBMKHQpJiZHKHMsdCksXyhpKSYmKHMuaW5uZXJUZXh0PWkpLHN9ZnVuY3Rpb24gZWUoZSx0LGkscyl7SCh0KSYmdC5hcHBlbmRDaGlsZChaKGUsaSxzKSl9ZnVuY3Rpb24gdGUoZSl7cShlKXx8RChlKT9BcnJheS5mcm9tKGUpLmZvckVhY2godGUpOkgoZSkmJkgoZS5wYXJlbnROb2RlKSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpfWZ1bmN0aW9uIGllKGUpe2lmKCFIKGUpKXJldHVybjtsZXR7bGVuZ3RoOnR9PWUuY2hpbGROb2Rlcztmb3IoO3Q+MDspZS5yZW1vdmVDaGlsZChlLmxhc3RDaGlsZCksdC09MX1mdW5jdGlvbiBzZShlLHQpe3JldHVybiBIKHQpJiZIKHQucGFyZW50Tm9kZSkmJkgoZSk/KHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZSx0KSxlKTpudWxsfWZ1bmN0aW9uIG5lKGUsdCl7aWYoIV8oZSl8fFcoZSkpcmV0dXJue307Y29uc3QgaT17fSxzPVgoe30sdCk7cmV0dXJuIGUuc3BsaXQoXCIsXCIpLmZvckVhY2goKGU9Pntjb25zdCB0PWUudHJpbSgpLG49dC5yZXBsYWNlKFwiLlwiLFwiXCIpLGE9dC5yZXBsYWNlKC9bW1xcXV0vZyxcIlwiKS5zcGxpdChcIj1cIiksW2xdPWEsbz1hLmxlbmd0aD4xP2FbMV0ucmVwbGFjZSgvW1wiJ10vZyxcIlwiKTpcIlwiO3N3aXRjaCh0LmNoYXJBdCgwKSl7Y2FzZVwiLlwiOl8ocy5jbGFzcyk/aS5jbGFzcz1gJHtzLmNsYXNzfSAke259YDppLmNsYXNzPW47YnJlYWs7Y2FzZVwiI1wiOmkuaWQ9dC5yZXBsYWNlKFwiI1wiLFwiXCIpO2JyZWFrO2Nhc2VcIltcIjppW2xdPW99fSkpLFgocyxpKX1mdW5jdGlvbiBhZShlLHQpe2lmKCFIKGUpKXJldHVybjtsZXQgaT10O08oaSl8fChpPSFlLmhpZGRlbiksZS5oaWRkZW49aX1mdW5jdGlvbiBsZShlLHQsaSl7aWYocShlKSlyZXR1cm4gQXJyYXkuZnJvbShlKS5tYXAoKGU9PmxlKGUsdCxpKSkpO2lmKEgoZSkpe2xldCBzPVwidG9nZ2xlXCI7cmV0dXJuIHZvaWQgMCE9PWkmJihzPWk/XCJhZGRcIjpcInJlbW92ZVwiKSxlLmNsYXNzTGlzdFtzXSh0KSxlLmNsYXNzTGlzdC5jb250YWlucyh0KX1yZXR1cm4hMX1mdW5jdGlvbiBvZShlLHQpe3JldHVybiBIKGUpJiZlLmNsYXNzTGlzdC5jb250YWlucyh0KX1mdW5jdGlvbiByZShlLHQpe2NvbnN0e3Byb3RvdHlwZTppfT1FbGVtZW50O3JldHVybihpLm1hdGNoZXN8fGkud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxpLm1vek1hdGNoZXNTZWxlY3Rvcnx8aS5tc01hdGNoZXNTZWxlY3Rvcnx8ZnVuY3Rpb24oKXtyZXR1cm4gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpKS5pbmNsdWRlcyh0aGlzKX0pLmNhbGwoZSx0KX1mdW5jdGlvbiBjZShlKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbChlKX1mdW5jdGlvbiBoZShlKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5jb250YWluZXIucXVlcnlTZWxlY3RvcihlKX1mdW5jdGlvbiB1ZShlPW51bGwsdD0hMSl7SChlKSYmKGUuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSx0JiZsZShlLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMudGFiRm9jdXMpKX1jb25zdCBkZT17XCJhdWRpby9vZ2dcIjpcInZvcmJpc1wiLFwiYXVkaW8vd2F2XCI6XCIxXCIsXCJ2aWRlby93ZWJtXCI6XCJ2cDgsIHZvcmJpc1wiLFwidmlkZW8vbXA0XCI6XCJhdmMxLjQyRTAxRSwgbXA0YS40MC4yXCIsXCJ2aWRlby9vZ2dcIjpcInRoZW9yYVwifSxtZT17YXVkaW86XCJjYW5QbGF5VHlwZVwiaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImF1ZGlvXCIpLHZpZGVvOlwiY2FuUGxheVR5cGVcImluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ2aWRlb1wiKSxjaGVjayhlLHQsaSl7Y29uc3Qgcz1ZLmlzSVBob25lJiZpJiZtZS5wbGF5c2lubGluZSxuPW1lW2VdfHxcImh0bWw1XCIhPT10O3JldHVybnthcGk6bix1aTpuJiZtZS5yYW5nZUlucHV0JiYoXCJ2aWRlb1wiIT09ZXx8IVkuaXNJUGhvbmV8fHMpfX0scGlwOiEoWS5pc0lQaG9uZXx8IWooWihcInZpZGVvXCIpLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUpJiYoIWRvY3VtZW50LnBpY3R1cmVJblBpY3R1cmVFbmFibGVkfHxaKFwidmlkZW9cIikuZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUpKSxhaXJwbGF5Omood2luZG93LldlYktpdFBsYXliYWNrVGFyZ2V0QXZhaWxhYmlsaXR5RXZlbnQpLHBsYXlzaW5saW5lOlwicGxheXNJbmxpbmVcImluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ2aWRlb1wiKSxtaW1lKGUpe2lmKFcoZSkpcmV0dXJuITE7Y29uc3RbdF09ZS5zcGxpdChcIi9cIik7bGV0IGk9ZTtpZighdGhpcy5pc0hUTUw1fHx0IT09dGhpcy50eXBlKXJldHVybiExO09iamVjdC5rZXlzKGRlKS5pbmNsdWRlcyhpKSYmKGkrPWA7IGNvZGVjcz1cIiR7ZGVbZV19XCJgKTt0cnl7cmV0dXJuIEJvb2xlYW4oaSYmdGhpcy5tZWRpYS5jYW5QbGF5VHlwZShpKS5yZXBsYWNlKC9uby8sXCJcIikpfWNhdGNoKGUpe3JldHVybiExfX0sdGV4dFRyYWNrczpcInRleHRUcmFja3NcImluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ2aWRlb1wiKSxyYW5nZUlucHV0OigoKT0+e2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO3JldHVybiBlLnR5cGU9XCJyYW5nZVwiLFwicmFuZ2VcIj09PWUudHlwZX0pKCksdG91Y2g6XCJvbnRvdWNoc3RhcnRcImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCx0cmFuc2l0aW9uczohMSE9PXoscmVkdWNlZE1vdGlvbjpcIm1hdGNoTWVkaWFcImluIHdpbmRvdyYmd2luZG93Lm1hdGNoTWVkaWEoXCIocHJlZmVycy1yZWR1Y2VkLW1vdGlvbilcIikubWF0Y2hlc30scGU9KCgpPT57bGV0IGU9ITE7dHJ5e2NvbnN0IHQ9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LFwicGFzc2l2ZVwiLHtnZXQ6KCk9PihlPSEwLG51bGwpfSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsbnVsbCx0KSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRlc3RcIixudWxsLHQpfWNhdGNoKGUpe31yZXR1cm4gZX0pKCk7ZnVuY3Rpb24gZ2UoZSx0LGkscz0hMSxuPSEwLGE9ITEpe2lmKCFlfHwhKFwiYWRkRXZlbnRMaXN0ZW5lclwiaW4gZSl8fFcodCl8fCFqKGkpKXJldHVybjtjb25zdCBsPXQuc3BsaXQoXCIgXCIpO2xldCBvPWE7cGUmJihvPXtwYXNzaXZlOm4sY2FwdHVyZTphfSksbC5mb3JFYWNoKCh0PT57dGhpcyYmdGhpcy5ldmVudExpc3RlbmVycyYmcyYmdGhpcy5ldmVudExpc3RlbmVycy5wdXNoKHtlbGVtZW50OmUsdHlwZTp0LGNhbGxiYWNrOmksb3B0aW9uczpvfSksZVtzP1wiYWRkRXZlbnRMaXN0ZW5lclwiOlwicmVtb3ZlRXZlbnRMaXN0ZW5lclwiXSh0LGksbyl9KSl9ZnVuY3Rpb24gZmUoZSx0PVwiXCIsaSxzPSEwLG49ITEpe2dlLmNhbGwodGhpcyxlLHQsaSwhMCxzLG4pfWZ1bmN0aW9uIGJlKGUsdD1cIlwiLGkscz0hMCxuPSExKXtnZS5jYWxsKHRoaXMsZSx0LGksITEscyxuKX1mdW5jdGlvbiB5ZShlLHQ9XCJcIixpLHM9ITAsbj0hMSl7Y29uc3QgYT0oLi4ubCk9PntiZShlLHQsYSxzLG4pLGkuYXBwbHkodGhpcyxsKX07Z2UuY2FsbCh0aGlzLGUsdCxhLCEwLHMsbil9ZnVuY3Rpb24gdmUoZSx0PVwiXCIsaT0hMSxzPXt9KXtpZighSChlKXx8Vyh0KSlyZXR1cm47Y29uc3Qgbj1uZXcgQ3VzdG9tRXZlbnQodCx7YnViYmxlczppLGRldGFpbDp7Li4ucyxwbHlyOnRoaXN9fSk7ZS5kaXNwYXRjaEV2ZW50KG4pfWZ1bmN0aW9uIHdlKCl7dGhpcyYmdGhpcy5ldmVudExpc3RlbmVycyYmKHRoaXMuZXZlbnRMaXN0ZW5lcnMuZm9yRWFjaCgoZT0+e2NvbnN0e2VsZW1lbnQ6dCx0eXBlOmksY2FsbGJhY2s6cyxvcHRpb25zOm59PWU7dC5yZW1vdmVFdmVudExpc3RlbmVyKGkscyxuKX0pKSx0aGlzLmV2ZW50TGlzdGVuZXJzPVtdKX1mdW5jdGlvbiBUZSgpe3JldHVybiBuZXcgUHJvbWlzZSgoZT0+dGhpcy5yZWFkeT9zZXRUaW1lb3V0KGUsMCk6ZmUuY2FsbCh0aGlzLHRoaXMuZWxlbWVudHMuY29udGFpbmVyLFwicmVhZHlcIixlKSkpLnRoZW4oKCgpPT57fSkpfWZ1bmN0aW9uIGtlKGUpe0IoZSkmJmUudGhlbihudWxsLCgoKT0+e30pKX1mdW5jdGlvbiBDZShlKXtyZXR1cm4gRChlKT9lLmZpbHRlcigoKHQsaSk9PmUuaW5kZXhPZih0KT09PWkpKTplfWZ1bmN0aW9uIEFlKGUsdCl7cmV0dXJuIEQoZSkmJmUubGVuZ3RoP2UucmVkdWNlKCgoZSxpKT0+TWF0aC5hYnMoaS10KTxNYXRoLmFicyhlLXQpP2k6ZSkpOm51bGx9ZnVuY3Rpb24gU2UoZSl7cmV0dXJuISghd2luZG93fHwhd2luZG93LkNTUykmJndpbmRvdy5DU1Muc3VwcG9ydHMoZSl9Y29uc3QgRWU9W1sxLDFdLFs0LDNdLFszLDRdLFs1LDRdLFs0LDVdLFszLDJdLFsyLDNdLFsxNiwxMF0sWzEwLDE2XSxbMTYsOV0sWzksMTZdLFsyMSw5XSxbOSwyMV0sWzMyLDldLFs5LDMyXV0ucmVkdWNlKCgoZSxbdCxpXSk9Pih7Li4uZSxbdC9pXTpbdCxpXX0pKSx7fSk7ZnVuY3Rpb24gUGUoZSl7aWYoIShEKGUpfHxfKGUpJiZlLmluY2x1ZGVzKFwiOlwiKSkpcmV0dXJuITE7cmV0dXJuKEQoZSk/ZTplLnNwbGl0KFwiOlwiKSkubWFwKE51bWJlcikuZXZlcnkoJCl9ZnVuY3Rpb24gTWUoZSl7aWYoIUQoZSl8fCFlLmV2ZXJ5KCQpKXJldHVybiBudWxsO2NvbnN0W3QsaV09ZSxzPShlLHQpPT4wPT09dD9lOnModCxlJXQpLG49cyh0LGkpO3JldHVyblt0L24saS9uXX1mdW5jdGlvbiBOZShlKXtjb25zdCB0PWU9PlBlKGUpP2Uuc3BsaXQoXCI6XCIpLm1hcChOdW1iZXIpOm51bGw7bGV0IGk9dChlKTtpZihudWxsPT09aSYmKGk9dCh0aGlzLmNvbmZpZy5yYXRpbykpLG51bGw9PT1pJiYhVyh0aGlzLmVtYmVkKSYmRCh0aGlzLmVtYmVkLnJhdGlvKSYmKHtyYXRpbzppfT10aGlzLmVtYmVkKSxudWxsPT09aSYmdGhpcy5pc0hUTUw1KXtjb25zdHt2aWRlb1dpZHRoOmUsdmlkZW9IZWlnaHQ6dH09dGhpcy5tZWRpYTtpPVtlLHRdfXJldHVybiBNZShpKX1mdW5jdGlvbiB4ZShlKXtpZighdGhpcy5pc1ZpZGVvKXJldHVybnt9O2NvbnN0e3dyYXBwZXI6dH09dGhpcy5lbGVtZW50cyxpPU5lLmNhbGwodGhpcyxlKTtpZighRChpKSlyZXR1cm57fTtjb25zdFtzLG5dPU1lKGkpLGE9MTAwL3MqbjtpZihTZShgYXNwZWN0LXJhdGlvOiAke3N9LyR7bn1gKT90LnN0eWxlLmFzcGVjdFJhdGlvPWAke3N9LyR7bn1gOnQuc3R5bGUucGFkZGluZ0JvdHRvbT1gJHthfSVgLHRoaXMuaXNWaW1lbyYmIXRoaXMuY29uZmlnLnZpbWVvLnByZW1pdW0mJnRoaXMuc3VwcG9ydGVkLnVpKXtjb25zdCBlPTEwMC90aGlzLm1lZGlhLm9mZnNldFdpZHRoKnBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMubWVkaWEpLnBhZGRpbmdCb3R0b20sMTApLGk9KGUtYSkvKGUvNTApO3RoaXMuZnVsbHNjcmVlbi5hY3RpdmU/dC5zdHlsZS5wYWRkaW5nQm90dG9tPW51bGw6dGhpcy5tZWRpYS5zdHlsZS50cmFuc2Zvcm09YHRyYW5zbGF0ZVkoLSR7aX0lKWB9ZWxzZSB0aGlzLmlzSFRNTDUmJnQuY2xhc3NMaXN0LmFkZCh0aGlzLmNvbmZpZy5jbGFzc05hbWVzLnZpZGVvRml4ZWRSYXRpbyk7cmV0dXJue3BhZGRpbmc6YSxyYXRpbzppfX1mdW5jdGlvbiBJZShlLHQsaT0uMDUpe2NvbnN0IHM9ZS90LG49QWUoT2JqZWN0LmtleXMoRWUpLHMpO3JldHVybiBNYXRoLmFicyhuLXMpPD1pP0VlW25dOltlLHRdfWNvbnN0IExlPXtnZXRTb3VyY2VzKCl7aWYoIXRoaXMuaXNIVE1MNSlyZXR1cm5bXTtyZXR1cm4gQXJyYXkuZnJvbSh0aGlzLm1lZGlhLnF1ZXJ5U2VsZWN0b3JBbGwoXCJzb3VyY2VcIikpLmZpbHRlcigoZT0+e2NvbnN0IHQ9ZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpO3JldHVybiEhVyh0KXx8bWUubWltZS5jYWxsKHRoaXMsdCl9KSl9LGdldFF1YWxpdHlPcHRpb25zKCl7cmV0dXJuIHRoaXMuY29uZmlnLnF1YWxpdHkuZm9yY2VkP3RoaXMuY29uZmlnLnF1YWxpdHkub3B0aW9uczpMZS5nZXRTb3VyY2VzLmNhbGwodGhpcykubWFwKChlPT5OdW1iZXIoZS5nZXRBdHRyaWJ1dGUoXCJzaXplXCIpKSkpLmZpbHRlcihCb29sZWFuKX0sc2V0dXAoKXtpZighdGhpcy5pc0hUTUw1KXJldHVybjtjb25zdCBlPXRoaXM7ZS5vcHRpb25zLnNwZWVkPWUuY29uZmlnLnNwZWVkLm9wdGlvbnMsVyh0aGlzLmNvbmZpZy5yYXRpbyl8fHhlLmNhbGwoZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUubWVkaWEsXCJxdWFsaXR5XCIse2dldCgpe2NvbnN0IHQ9TGUuZ2V0U291cmNlcy5jYWxsKGUpLmZpbmQoKHQ9PnQuZ2V0QXR0cmlidXRlKFwic3JjXCIpPT09ZS5zb3VyY2UpKTtyZXR1cm4gdCYmTnVtYmVyKHQuZ2V0QXR0cmlidXRlKFwic2l6ZVwiKSl9LHNldCh0KXtpZihlLnF1YWxpdHkhPT10KXtpZihlLmNvbmZpZy5xdWFsaXR5LmZvcmNlZCYmaihlLmNvbmZpZy5xdWFsaXR5Lm9uQ2hhbmdlKSllLmNvbmZpZy5xdWFsaXR5Lm9uQ2hhbmdlKHQpO2Vsc2V7Y29uc3QgaT1MZS5nZXRTb3VyY2VzLmNhbGwoZSkuZmluZCgoZT0+TnVtYmVyKGUuZ2V0QXR0cmlidXRlKFwic2l6ZVwiKSk9PT10KSk7aWYoIWkpcmV0dXJuO2NvbnN0e2N1cnJlbnRUaW1lOnMscGF1c2VkOm4scHJlbG9hZDphLHJlYWR5U3RhdGU6bCxwbGF5YmFja1JhdGU6b309ZS5tZWRpYTtlLm1lZGlhLnNyYz1pLmdldEF0dHJpYnV0ZShcInNyY1wiKSwoXCJub25lXCIhPT1hfHxsKSYmKGUub25jZShcImxvYWRlZG1ldGFkYXRhXCIsKCgpPT57ZS5zcGVlZD1vLGUuY3VycmVudFRpbWU9cyxufHxrZShlLnBsYXkoKSl9KSksZS5tZWRpYS5sb2FkKCkpfXZlLmNhbGwoZSxlLm1lZGlhLFwicXVhbGl0eWNoYW5nZVwiLCExLHtxdWFsaXR5OnR9KX19fSl9LGNhbmNlbFJlcXVlc3RzKCl7dGhpcy5pc0hUTUw1JiYodGUoTGUuZ2V0U291cmNlcy5jYWxsKHRoaXMpKSx0aGlzLm1lZGlhLnNldEF0dHJpYnV0ZShcInNyY1wiLHRoaXMuY29uZmlnLmJsYW5rVmlkZW8pLHRoaXMubWVkaWEubG9hZCgpLHRoaXMuZGVidWcubG9nKFwiQ2FuY2VsbGVkIG5ldHdvcmsgcmVxdWVzdHNcIikpfX07ZnVuY3Rpb24gJGUoZSwuLi50KXtyZXR1cm4gVyhlKT9lOmUudG9TdHJpbmcoKS5yZXBsYWNlKC97KFxcZCspfS9nLCgoZSxpKT0+dFtpXS50b1N0cmluZygpKSl9Y29uc3QgX2U9KGU9XCJcIix0PVwiXCIsaT1cIlwiKT0+ZS5yZXBsYWNlKG5ldyBSZWdFeHAodC50b1N0cmluZygpLnJlcGxhY2UoLyhbLiorP149IToke30oKXxbXFxdL1xcXFxdKS9nLFwiXFxcXCQxXCIpLFwiZ1wiKSxpLnRvU3RyaW5nKCkpLE9lPShlPVwiXCIpPT5lLnRvU3RyaW5nKCkucmVwbGFjZSgvXFx3XFxTKi9nLChlPT5lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSkudG9Mb3dlckNhc2UoKSkpO2Z1bmN0aW9uIGplKGU9XCJcIil7bGV0IHQ9ZS50b1N0cmluZygpO3JldHVybiB0PWZ1bmN0aW9uKGU9XCJcIil7bGV0IHQ9ZS50b1N0cmluZygpO3JldHVybiB0PV9lKHQsXCItXCIsXCIgXCIpLHQ9X2UodCxcIl9cIixcIiBcIiksdD1PZSh0KSxfZSh0LFwiIFwiLFwiXCIpfSh0KSx0LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpK3Quc2xpY2UoMSl9ZnVuY3Rpb24gRGUoZSl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3JldHVybiB0LmFwcGVuZENoaWxkKGUpLHQuaW5uZXJIVE1MfWNvbnN0IHFlPXtwaXA6XCJQSVBcIixhaXJwbGF5OlwiQWlyUGxheVwiLGh0bWw1OlwiSFRNTDVcIix2aW1lbzpcIlZpbWVvXCIseW91dHViZTpcIllvdVR1YmVcIn0sSGU9e2dldChlPVwiXCIsdD17fSl7aWYoVyhlKXx8Vyh0KSlyZXR1cm5cIlwiO2xldCBpPVEodC5pMThuLGUpO2lmKFcoaSkpcmV0dXJuIE9iamVjdC5rZXlzKHFlKS5pbmNsdWRlcyhlKT9xZVtlXTpcIlwiO2NvbnN0IHM9e1wie3NlZWt0aW1lfVwiOnQuc2Vla1RpbWUsXCJ7dGl0bGV9XCI6dC50aXRsZX07cmV0dXJuIE9iamVjdC5lbnRyaWVzKHMpLmZvckVhY2goKChbZSx0XSk9PntpPV9lKGksZSx0KX0pKSxpfX07Y2xhc3MgUmV7Y29uc3RydWN0b3IodCl7ZSh0aGlzLFwiZ2V0XCIsKGU9PntpZighUmUuc3VwcG9ydGVkfHwhdGhpcy5lbmFibGVkKXJldHVybiBudWxsO2NvbnN0IHQ9d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMua2V5KTtpZihXKHQpKXJldHVybiBudWxsO2NvbnN0IGk9SlNPTi5wYXJzZSh0KTtyZXR1cm4gXyhlKSYmZS5sZW5ndGg/aVtlXTppfSkpLGUodGhpcyxcInNldFwiLChlPT57aWYoIVJlLnN1cHBvcnRlZHx8IXRoaXMuZW5hYmxlZClyZXR1cm47aWYoIUwoZSkpcmV0dXJuO2xldCB0PXRoaXMuZ2V0KCk7Vyh0KSYmKHQ9e30pLFgodCxlKTt0cnl7d2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMua2V5LEpTT04uc3RyaW5naWZ5KHQpKX1jYXRjaChlKXt9fSkpLHRoaXMuZW5hYmxlZD10LmNvbmZpZy5zdG9yYWdlLmVuYWJsZWQsdGhpcy5rZXk9dC5jb25maWcuc3RvcmFnZS5rZXl9c3RhdGljIGdldCBzdXBwb3J0ZWQoKXt0cnl7aWYoIShcImxvY2FsU3RvcmFnZVwiaW4gd2luZG93KSlyZXR1cm4hMTtjb25zdCBlPVwiX19fdGVzdFwiO3JldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oZSxlKSx3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oZSksITB9Y2F0Y2goZSl7cmV0dXJuITF9fX1mdW5jdGlvbiBGZShlLHQ9XCJ0ZXh0XCIpe3JldHVybiBuZXcgUHJvbWlzZSgoKGkscyk9Pnt0cnl7Y29uc3Qgcz1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoIShcIndpdGhDcmVkZW50aWFsc1wiaW4gcykpcmV0dXJuO3MuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwoKCk9PntpZihcInRleHRcIj09PXQpdHJ5e2koSlNPTi5wYXJzZShzLnJlc3BvbnNlVGV4dCkpfWNhdGNoKGUpe2kocy5yZXNwb25zZVRleHQpfWVsc2UgaShzLnJlc3BvbnNlKX0pKSxzLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCgoKT0+e3Rocm93IG5ldyBFcnJvcihzLnN0YXR1cyl9KSkscy5vcGVuKFwiR0VUXCIsZSwhMCkscy5yZXNwb25zZVR5cGU9dCxzLnNlbmQoKX1jYXRjaChlKXtzKGUpfX0pKX1mdW5jdGlvbiBWZShlLHQpe2lmKCFfKGUpKXJldHVybjtjb25zdCBpPV8odCk7bGV0IHM9ITE7Y29uc3Qgbj0oKT0+bnVsbCE9PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHQpLGE9KGUsdCk9PntlLmlubmVySFRNTD10LGkmJm4oKXx8ZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmJlZ2luXCIsZSl9O2lmKCFpfHwhbigpKXtjb25zdCBuPVJlLnN1cHBvcnRlZCxsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7aWYobC5zZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIixcIlwiKSxpJiZsLnNldEF0dHJpYnV0ZShcImlkXCIsdCksbil7Y29uc3QgZT13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oYGNhY2hlLSR7dH1gKTtpZihzPW51bGwhPT1lLHMpe2NvbnN0IHQ9SlNPTi5wYXJzZShlKTthKGwsdC5jb250ZW50KX19RmUoZSkudGhlbigoZT0+e2lmKCFXKGUpKXtpZihuKXRyeXt3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oYGNhY2hlLSR7dH1gLEpTT04uc3RyaW5naWZ5KHtjb250ZW50OmV9KSl9Y2F0Y2goZSl7fWEobCxlKX19KSkuY2F0Y2goKCgpPT57fSkpfX1jb25zdCBCZT1lPT5NYXRoLnRydW5jKGUvNjAvNjAlNjAsMTApO2Z1bmN0aW9uIFVlKGU9MCx0PSExLGk9ITEpe2lmKCEkKGUpKXJldHVybiBVZSh2b2lkIDAsdCxpKTtjb25zdCBzPWU9PmAwJHtlfWAuc2xpY2UoLTIpO2xldCBuPUJlKGUpO2NvbnN0IGE9KGw9ZSxNYXRoLnRydW5jKGwvNjAlNjAsMTApKTt2YXIgbDtjb25zdCBvPShlPT5NYXRoLnRydW5jKGUlNjAsMTApKShlKTtyZXR1cm4gbj10fHxuPjA/YCR7bn06YDpcIlwiLGAke2kmJmU+MD9cIi1cIjpcIlwifSR7bn0ke3MoYSl9OiR7cyhvKX1gfWNvbnN0IFdlPXtnZXRJY29uVXJsKCl7Y29uc3QgZT1uZXcgVVJMKHRoaXMuY29uZmlnLmljb25Vcmwsd2luZG93LmxvY2F0aW9uKSx0PXdpbmRvdy5sb2NhdGlvbi5ob3N0P3dpbmRvdy5sb2NhdGlvbi5ob3N0OndpbmRvdy50b3AubG9jYXRpb24uaG9zdCxpPWUuaG9zdCE9PXR8fFkuaXNJRSYmIXdpbmRvdy5zdmc0ZXZlcnlib2R5O3JldHVybnt1cmw6dGhpcy5jb25maWcuaWNvblVybCxjb3JzOml9fSxmaW5kRWxlbWVudHMoKXt0cnl7cmV0dXJuIHRoaXMuZWxlbWVudHMuY29udHJvbHM9aGUuY2FsbCh0aGlzLHRoaXMuY29uZmlnLnNlbGVjdG9ycy5jb250cm9scy53cmFwcGVyKSx0aGlzLmVsZW1lbnRzLmJ1dHRvbnM9e3BsYXk6Y2UuY2FsbCh0aGlzLHRoaXMuY29uZmlnLnNlbGVjdG9ycy5idXR0b25zLnBsYXkpLHBhdXNlOmhlLmNhbGwodGhpcyx0aGlzLmNvbmZpZy5zZWxlY3RvcnMuYnV0dG9ucy5wYXVzZSkscmVzdGFydDpoZS5jYWxsKHRoaXMsdGhpcy5jb25maWcuc2VsZWN0b3JzLmJ1dHRvbnMucmVzdGFydCkscmV3aW5kOmhlLmNhbGwodGhpcyx0aGlzLmNvbmZpZy5zZWxlY3RvcnMuYnV0dG9ucy5yZXdpbmQpLGZhc3RGb3J3YXJkOmhlLmNhbGwodGhpcyx0aGlzLmNvbmZpZy5zZWxlY3RvcnMuYnV0dG9ucy5mYXN0Rm9yd2FyZCksbXV0ZTpoZS5jYWxsKHRoaXMsdGhpcy5jb25maWcuc2VsZWN0b3JzLmJ1dHRvbnMubXV0ZSkscGlwOmhlLmNhbGwodGhpcyx0aGlzLmNvbmZpZy5zZWxlY3RvcnMuYnV0dG9ucy5waXApLGFpcnBsYXk6aGUuY2FsbCh0aGlzLHRoaXMuY29uZmlnLnNlbGVjdG9ycy5idXR0b25zLmFpcnBsYXkpLHNldHRpbmdzOmhlLmNhbGwodGhpcyx0aGlzLmNvbmZpZy5zZWxlY3RvcnMuYnV0dG9ucy5zZXR0aW5ncyksY2FwdGlvbnM6aGUuY2FsbCh0aGlzLHRoaXMuY29uZmlnLnNlbGVjdG9ycy5idXR0b25zLmNhcHRpb25zKSxmdWxsc2NyZWVuOmhlLmNhbGwodGhpcyx0aGlzLmNvbmZpZy5zZWxlY3RvcnMuYnV0dG9ucy5mdWxsc2NyZWVuKX0sdGhpcy5lbGVtZW50cy5wcm9ncmVzcz1oZS5jYWxsKHRoaXMsdGhpcy5jb25maWcuc2VsZWN0b3JzLnByb2dyZXNzKSx0aGlzLmVsZW1lbnRzLmlucHV0cz17c2VlazpoZS5jYWxsKHRoaXMsdGhpcy5jb25maWcuc2VsZWN0b3JzLmlucHV0cy5zZWVrKSx2b2x1bWU6aGUuY2FsbCh0aGlzLHRoaXMuY29uZmlnLnNlbGVjdG9ycy5pbnB1dHMudm9sdW1lKX0sdGhpcy5lbGVtZW50cy5kaXNwbGF5PXtidWZmZXI6aGUuY2FsbCh0aGlzLHRoaXMuY29uZmlnLnNlbGVjdG9ycy5kaXNwbGF5LmJ1ZmZlciksY3VycmVudFRpbWU6aGUuY2FsbCh0aGlzLHRoaXMuY29uZmlnLnNlbGVjdG9ycy5kaXNwbGF5LmN1cnJlbnRUaW1lKSxkdXJhdGlvbjpoZS5jYWxsKHRoaXMsdGhpcy5jb25maWcuc2VsZWN0b3JzLmRpc3BsYXkuZHVyYXRpb24pfSxIKHRoaXMuZWxlbWVudHMucHJvZ3Jlc3MpJiYodGhpcy5lbGVtZW50cy5kaXNwbGF5LnNlZWtUb29sdGlwPXRoaXMuZWxlbWVudHMucHJvZ3Jlc3MucXVlcnlTZWxlY3RvcihgLiR7dGhpcy5jb25maWcuY2xhc3NOYW1lcy50b29sdGlwfWApKSwhMH1jYXRjaChlKXtyZXR1cm4gdGhpcy5kZWJ1Zy53YXJuKFwiSXQgbG9va3MgbGlrZSB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCB5b3VyIGN1c3RvbSBjb250cm9scyBIVE1MXCIsZSksdGhpcy50b2dnbGVOYXRpdmVDb250cm9scyghMCksITF9fSxjcmVhdGVJY29uKGUsdCl7Y29uc3QgaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIscz1XZS5nZXRJY29uVXJsLmNhbGwodGhpcyksbj1gJHtzLmNvcnM/XCJcIjpzLnVybH0jJHt0aGlzLmNvbmZpZy5pY29uUHJlZml4fWAsYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoaSxcInN2Z1wiKTtHKGEsWCh0LHtcImFyaWEtaGlkZGVuXCI6XCJ0cnVlXCIsZm9jdXNhYmxlOlwiZmFsc2VcIn0pKTtjb25zdCBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhpLFwidXNlXCIpLG89YCR7bn0tJHtlfWA7cmV0dXJuXCJocmVmXCJpbiBsJiZsLnNldEF0dHJpYnV0ZU5TKFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFwiaHJlZlwiLG8pLGwuc2V0QXR0cmlidXRlTlMoXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsXCJ4bGluazpocmVmXCIsbyksYS5hcHBlbmRDaGlsZChsKSxhfSxjcmVhdGVMYWJlbChlLHQ9e30pe2NvbnN0IGk9SGUuZ2V0KGUsdGhpcy5jb25maWcpO3JldHVybiBaKFwic3BhblwiLHsuLi50LGNsYXNzOlt0LmNsYXNzLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMuaGlkZGVuXS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIil9LGkpfSxjcmVhdGVCYWRnZShlKXtpZihXKGUpKXJldHVybiBudWxsO2NvbnN0IHQ9WihcInNwYW5cIix7Y2xhc3M6dGhpcy5jb25maWcuY2xhc3NOYW1lcy5tZW51LnZhbHVlfSk7cmV0dXJuIHQuYXBwZW5kQ2hpbGQoWihcInNwYW5cIix7Y2xhc3M6dGhpcy5jb25maWcuY2xhc3NOYW1lcy5tZW51LmJhZGdlfSxlKSksdH0sY3JlYXRlQnV0dG9uKGUsdCl7Y29uc3QgaT1YKHt9LHQpO2xldCBzPWplKGUpO2NvbnN0IG49e2VsZW1lbnQ6XCJidXR0b25cIix0b2dnbGU6ITEsbGFiZWw6bnVsbCxpY29uOm51bGwsbGFiZWxQcmVzc2VkOm51bGwsaWNvblByZXNzZWQ6bnVsbH07c3dpdGNoKFtcImVsZW1lbnRcIixcImljb25cIixcImxhYmVsXCJdLmZvckVhY2goKGU9PntPYmplY3Qua2V5cyhpKS5pbmNsdWRlcyhlKSYmKG5bZV09aVtlXSxkZWxldGUgaVtlXSl9KSksXCJidXR0b25cIiE9PW4uZWxlbWVudHx8T2JqZWN0LmtleXMoaSkuaW5jbHVkZXMoXCJ0eXBlXCIpfHwoaS50eXBlPVwiYnV0dG9uXCIpLE9iamVjdC5rZXlzKGkpLmluY2x1ZGVzKFwiY2xhc3NcIik/aS5jbGFzcy5zcGxpdChcIiBcIikuc29tZSgoZT0+ZT09PXRoaXMuY29uZmlnLmNsYXNzTmFtZXMuY29udHJvbCkpfHxYKGkse2NsYXNzOmAke2kuY2xhc3N9ICR7dGhpcy5jb25maWcuY2xhc3NOYW1lcy5jb250cm9sfWB9KTppLmNsYXNzPXRoaXMuY29uZmlnLmNsYXNzTmFtZXMuY29udHJvbCxlKXtjYXNlXCJwbGF5XCI6bi50b2dnbGU9ITAsbi5sYWJlbD1cInBsYXlcIixuLmxhYmVsUHJlc3NlZD1cInBhdXNlXCIsbi5pY29uPVwicGxheVwiLG4uaWNvblByZXNzZWQ9XCJwYXVzZVwiO2JyZWFrO2Nhc2VcIm11dGVcIjpuLnRvZ2dsZT0hMCxuLmxhYmVsPVwibXV0ZVwiLG4ubGFiZWxQcmVzc2VkPVwidW5tdXRlXCIsbi5pY29uPVwidm9sdW1lXCIsbi5pY29uUHJlc3NlZD1cIm11dGVkXCI7YnJlYWs7Y2FzZVwiY2FwdGlvbnNcIjpuLnRvZ2dsZT0hMCxuLmxhYmVsPVwiZW5hYmxlQ2FwdGlvbnNcIixuLmxhYmVsUHJlc3NlZD1cImRpc2FibGVDYXB0aW9uc1wiLG4uaWNvbj1cImNhcHRpb25zLW9mZlwiLG4uaWNvblByZXNzZWQ9XCJjYXB0aW9ucy1vblwiO2JyZWFrO2Nhc2VcImZ1bGxzY3JlZW5cIjpuLnRvZ2dsZT0hMCxuLmxhYmVsPVwiZW50ZXJGdWxsc2NyZWVuXCIsbi5sYWJlbFByZXNzZWQ9XCJleGl0RnVsbHNjcmVlblwiLG4uaWNvbj1cImVudGVyLWZ1bGxzY3JlZW5cIixuLmljb25QcmVzc2VkPVwiZXhpdC1mdWxsc2NyZWVuXCI7YnJlYWs7Y2FzZVwicGxheS1sYXJnZVwiOmkuY2xhc3MrPWAgJHt0aGlzLmNvbmZpZy5jbGFzc05hbWVzLmNvbnRyb2x9LS1vdmVybGFpZGAscz1cInBsYXlcIixuLmxhYmVsPVwicGxheVwiLG4uaWNvbj1cInBsYXlcIjticmVhaztkZWZhdWx0Olcobi5sYWJlbCkmJihuLmxhYmVsPXMpLFcobi5pY29uKSYmKG4uaWNvbj1lKX1jb25zdCBhPVoobi5lbGVtZW50KTtyZXR1cm4gbi50b2dnbGU/KGEuYXBwZW5kQ2hpbGQoV2UuY3JlYXRlSWNvbi5jYWxsKHRoaXMsbi5pY29uUHJlc3NlZCx7Y2xhc3M6XCJpY29uLS1wcmVzc2VkXCJ9KSksYS5hcHBlbmRDaGlsZChXZS5jcmVhdGVJY29uLmNhbGwodGhpcyxuLmljb24se2NsYXNzOlwiaWNvbi0tbm90LXByZXNzZWRcIn0pKSxhLmFwcGVuZENoaWxkKFdlLmNyZWF0ZUxhYmVsLmNhbGwodGhpcyxuLmxhYmVsUHJlc3NlZCx7Y2xhc3M6XCJsYWJlbC0tcHJlc3NlZFwifSkpLGEuYXBwZW5kQ2hpbGQoV2UuY3JlYXRlTGFiZWwuY2FsbCh0aGlzLG4ubGFiZWwse2NsYXNzOlwibGFiZWwtLW5vdC1wcmVzc2VkXCJ9KSkpOihhLmFwcGVuZENoaWxkKFdlLmNyZWF0ZUljb24uY2FsbCh0aGlzLG4uaWNvbikpLGEuYXBwZW5kQ2hpbGQoV2UuY3JlYXRlTGFiZWwuY2FsbCh0aGlzLG4ubGFiZWwpKSksWChpLG5lKHRoaXMuY29uZmlnLnNlbGVjdG9ycy5idXR0b25zW3NdLGkpKSxHKGEsaSksXCJwbGF5XCI9PT1zPyhEKHRoaXMuZWxlbWVudHMuYnV0dG9uc1tzXSl8fCh0aGlzLmVsZW1lbnRzLmJ1dHRvbnNbc109W10pLHRoaXMuZWxlbWVudHMuYnV0dG9uc1tzXS5wdXNoKGEpKTp0aGlzLmVsZW1lbnRzLmJ1dHRvbnNbc109YSxhfSxjcmVhdGVSYW5nZShlLHQpe2NvbnN0IGk9WihcImlucHV0XCIsWChuZSh0aGlzLmNvbmZpZy5zZWxlY3RvcnMuaW5wdXRzW2VdKSx7dHlwZTpcInJhbmdlXCIsbWluOjAsbWF4OjEwMCxzdGVwOi4wMSx2YWx1ZTowLGF1dG9jb21wbGV0ZTpcIm9mZlwiLHJvbGU6XCJzbGlkZXJcIixcImFyaWEtbGFiZWxcIjpIZS5nZXQoZSx0aGlzLmNvbmZpZyksXCJhcmlhLXZhbHVlbWluXCI6MCxcImFyaWEtdmFsdWVtYXhcIjoxMDAsXCJhcmlhLXZhbHVlbm93XCI6MH0sdCkpO3JldHVybiB0aGlzLmVsZW1lbnRzLmlucHV0c1tlXT1pLFdlLnVwZGF0ZVJhbmdlRmlsbC5jYWxsKHRoaXMsaSksVC5zZXR1cChpKSxpfSxjcmVhdGVQcm9ncmVzcyhlLHQpe2NvbnN0IGk9WihcInByb2dyZXNzXCIsWChuZSh0aGlzLmNvbmZpZy5zZWxlY3RvcnMuZGlzcGxheVtlXSkse21pbjowLG1heDoxMDAsdmFsdWU6MCxyb2xlOlwicHJvZ3Jlc3NiYXJcIixcImFyaWEtaGlkZGVuXCI6ITB9LHQpKTtpZihcInZvbHVtZVwiIT09ZSl7aS5hcHBlbmRDaGlsZChaKFwic3BhblwiLG51bGwsXCIwXCIpKTtjb25zdCB0PXtwbGF5ZWQ6XCJwbGF5ZWRcIixidWZmZXI6XCJidWZmZXJlZFwifVtlXSxzPXQ/SGUuZ2V0KHQsdGhpcy5jb25maWcpOlwiXCI7aS5pbm5lclRleHQ9YCUgJHtzLnRvTG93ZXJDYXNlKCl9YH1yZXR1cm4gdGhpcy5lbGVtZW50cy5kaXNwbGF5W2VdPWksaX0sY3JlYXRlVGltZShlLHQpe2NvbnN0IGk9bmUodGhpcy5jb25maWcuc2VsZWN0b3JzLmRpc3BsYXlbZV0sdCkscz1aKFwiZGl2XCIsWChpLHtjbGFzczpgJHtpLmNsYXNzP2kuY2xhc3M6XCJcIn0gJHt0aGlzLmNvbmZpZy5jbGFzc05hbWVzLmRpc3BsYXkudGltZX0gYC50cmltKCksXCJhcmlhLWxhYmVsXCI6SGUuZ2V0KGUsdGhpcy5jb25maWcpfSksXCIwMDowMFwiKTtyZXR1cm4gdGhpcy5lbGVtZW50cy5kaXNwbGF5W2VdPXMsc30sYmluZE1lbnVJdGVtU2hvcnRjdXRzKGUsdCl7ZmUuY2FsbCh0aGlzLGUsXCJrZXlkb3duIGtleXVwXCIsKGk9PntpZighW1wiU3BhY2VcIixcIkFycm93VXBcIixcIkFycm93RG93blwiLFwiQXJyb3dSaWdodFwiXS5pbmNsdWRlcyhpLmtleSkpcmV0dXJuO2lmKGkucHJldmVudERlZmF1bHQoKSxpLnN0b3BQcm9wYWdhdGlvbigpLFwia2V5ZG93blwiPT09aS50eXBlKXJldHVybjtjb25zdCBzPXJlKGUsJ1tyb2xlPVwibWVudWl0ZW1yYWRpb1wiXScpO2lmKCFzJiZbXCJTcGFjZVwiLFwiQXJyb3dSaWdodFwiXS5pbmNsdWRlcyhpLmtleSkpV2Uuc2hvd01lbnVQYW5lbC5jYWxsKHRoaXMsdCwhMCk7ZWxzZXtsZXQgdDtcIlNwYWNlXCIhPT1pLmtleSYmKFwiQXJyb3dEb3duXCI9PT1pLmtleXx8cyYmXCJBcnJvd1JpZ2h0XCI9PT1pLmtleT8odD1lLm5leHRFbGVtZW50U2libGluZyxIKHQpfHwodD1lLnBhcmVudE5vZGUuZmlyc3RFbGVtZW50Q2hpbGQpKToodD1lLnByZXZpb3VzRWxlbWVudFNpYmxpbmcsSCh0KXx8KHQ9ZS5wYXJlbnROb2RlLmxhc3RFbGVtZW50Q2hpbGQpKSx1ZS5jYWxsKHRoaXMsdCwhMCkpfX0pLCExKSxmZS5jYWxsKHRoaXMsZSxcImtleXVwXCIsKGU9PntcIlJldHVyblwiPT09ZS5rZXkmJldlLmZvY3VzRmlyc3RNZW51SXRlbS5jYWxsKHRoaXMsbnVsbCwhMCl9KSl9LGNyZWF0ZU1lbnVJdGVtKHt2YWx1ZTplLGxpc3Q6dCx0eXBlOmksdGl0bGU6cyxiYWRnZTpuPW51bGwsY2hlY2tlZDphPSExfSl7Y29uc3QgbD1uZSh0aGlzLmNvbmZpZy5zZWxlY3RvcnMuaW5wdXRzW2ldKSxvPVooXCJidXR0b25cIixYKGwse3R5cGU6XCJidXR0b25cIixyb2xlOlwibWVudWl0ZW1yYWRpb1wiLGNsYXNzOmAke3RoaXMuY29uZmlnLmNsYXNzTmFtZXMuY29udHJvbH0gJHtsLmNsYXNzP2wuY2xhc3M6XCJcIn1gLnRyaW0oKSxcImFyaWEtY2hlY2tlZFwiOmEsdmFsdWU6ZX0pKSxyPVooXCJzcGFuXCIpO3IuaW5uZXJIVE1MPXMsSChuKSYmci5hcHBlbmRDaGlsZChuKSxvLmFwcGVuZENoaWxkKHIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLFwiY2hlY2tlZFwiLHtlbnVtZXJhYmxlOiEwLGdldDooKT0+XCJ0cnVlXCI9PT1vLmdldEF0dHJpYnV0ZShcImFyaWEtY2hlY2tlZFwiKSxzZXQoZSl7ZSYmQXJyYXkuZnJvbShvLnBhcmVudE5vZGUuY2hpbGRyZW4pLmZpbHRlcigoZT0+cmUoZSwnW3JvbGU9XCJtZW51aXRlbXJhZGlvXCJdJykpKS5mb3JFYWNoKChlPT5lLnNldEF0dHJpYnV0ZShcImFyaWEtY2hlY2tlZFwiLFwiZmFsc2VcIikpKSxvLnNldEF0dHJpYnV0ZShcImFyaWEtY2hlY2tlZFwiLGU/XCJ0cnVlXCI6XCJmYWxzZVwiKX19KSx0aGlzLmxpc3RlbmVycy5iaW5kKG8sXCJjbGljayBrZXl1cFwiLCh0PT57aWYoIUYodCl8fFwiU3BhY2VcIj09PXQua2V5KXtzd2l0Y2godC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCksby5jaGVja2VkPSEwLGkpe2Nhc2VcImxhbmd1YWdlXCI6dGhpcy5jdXJyZW50VHJhY2s9TnVtYmVyKGUpO2JyZWFrO2Nhc2VcInF1YWxpdHlcIjp0aGlzLnF1YWxpdHk9ZTticmVhaztjYXNlXCJzcGVlZFwiOnRoaXMuc3BlZWQ9cGFyc2VGbG9hdChlKX1XZS5zaG93TWVudVBhbmVsLmNhbGwodGhpcyxcImhvbWVcIixGKHQpKX19KSxpLCExKSxXZS5iaW5kTWVudUl0ZW1TaG9ydGN1dHMuY2FsbCh0aGlzLG8saSksdC5hcHBlbmRDaGlsZChvKX0sZm9ybWF0VGltZShlPTAsdD0hMSl7aWYoISQoZSkpcmV0dXJuIGU7cmV0dXJuIFVlKGUsQmUodGhpcy5kdXJhdGlvbik+MCx0KX0sdXBkYXRlVGltZURpc3BsYXkoZT1udWxsLHQ9MCxpPSExKXtIKGUpJiYkKHQpJiYoZS5pbm5lclRleHQ9V2UuZm9ybWF0VGltZSh0LGkpKX0sdXBkYXRlVm9sdW1lKCl7dGhpcy5zdXBwb3J0ZWQudWkmJihIKHRoaXMuZWxlbWVudHMuaW5wdXRzLnZvbHVtZSkmJldlLnNldFJhbmdlLmNhbGwodGhpcyx0aGlzLmVsZW1lbnRzLmlucHV0cy52b2x1bWUsdGhpcy5tdXRlZD8wOnRoaXMudm9sdW1lKSxIKHRoaXMuZWxlbWVudHMuYnV0dG9ucy5tdXRlKSYmKHRoaXMuZWxlbWVudHMuYnV0dG9ucy5tdXRlLnByZXNzZWQ9dGhpcy5tdXRlZHx8MD09PXRoaXMudm9sdW1lKSl9LHNldFJhbmdlKGUsdD0wKXtIKGUpJiYoZS52YWx1ZT10LFdlLnVwZGF0ZVJhbmdlRmlsbC5jYWxsKHRoaXMsZSkpfSx1cGRhdGVQcm9ncmVzcyhlKXtpZighdGhpcy5zdXBwb3J0ZWQudWl8fCFSKGUpKXJldHVybjtsZXQgdD0wO2NvbnN0IGk9KGUsdCk9Pntjb25zdCBpPSQodCk/dDowLHM9SChlKT9lOnRoaXMuZWxlbWVudHMuZGlzcGxheS5idWZmZXI7aWYoSChzKSl7cy52YWx1ZT1pO2NvbnN0IGU9cy5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNwYW5cIilbMF07SChlKSYmKGUuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU9aSl9fTtpZihlKXN3aXRjaChlLnR5cGUpe2Nhc2VcInRpbWV1cGRhdGVcIjpjYXNlXCJzZWVraW5nXCI6Y2FzZVwic2Vla2VkXCI6cz10aGlzLmN1cnJlbnRUaW1lLG49dGhpcy5kdXJhdGlvbix0PTA9PT1zfHwwPT09bnx8TnVtYmVyLmlzTmFOKHMpfHxOdW1iZXIuaXNOYU4obik/MDoocy9uKjEwMCkudG9GaXhlZCgyKSxcInRpbWV1cGRhdGVcIj09PWUudHlwZSYmV2Uuc2V0UmFuZ2UuY2FsbCh0aGlzLHRoaXMuZWxlbWVudHMuaW5wdXRzLnNlZWssdCk7YnJlYWs7Y2FzZVwicGxheWluZ1wiOmNhc2VcInByb2dyZXNzXCI6aSh0aGlzLmVsZW1lbnRzLmRpc3BsYXkuYnVmZmVyLDEwMCp0aGlzLmJ1ZmZlcmVkKX12YXIgcyxufSx1cGRhdGVSYW5nZUZpbGwoZSl7Y29uc3QgdD1SKGUpP2UudGFyZ2V0OmU7aWYoSCh0KSYmXCJyYW5nZVwiPT09dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKXtpZihyZSh0LHRoaXMuY29uZmlnLnNlbGVjdG9ycy5pbnB1dHMuc2Vlaykpe3Quc2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiLHRoaXMuY3VycmVudFRpbWUpO2NvbnN0IGU9V2UuZm9ybWF0VGltZSh0aGlzLmN1cnJlbnRUaW1lKSxpPVdlLmZvcm1hdFRpbWUodGhpcy5kdXJhdGlvbikscz1IZS5nZXQoXCJzZWVrTGFiZWxcIix0aGlzLmNvbmZpZyk7dC5zZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiLHMucmVwbGFjZShcIntjdXJyZW50VGltZX1cIixlKS5yZXBsYWNlKFwie2R1cmF0aW9ufVwiLGkpKX1lbHNlIGlmKHJlKHQsdGhpcy5jb25maWcuc2VsZWN0b3JzLmlucHV0cy52b2x1bWUpKXtjb25zdCBlPTEwMCp0LnZhbHVlO3Quc2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZW5vd1wiLGUpLHQuc2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIixgJHtlLnRvRml4ZWQoMSl9JWApfWVsc2UgdC5zZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIsdC52YWx1ZSk7WS5pc1dlYmtpdCYmdC5zdHlsZS5zZXRQcm9wZXJ0eShcIi0tdmFsdWVcIix0LnZhbHVlL3QubWF4KjEwMCtcIiVcIil9fSx1cGRhdGVTZWVrVG9vbHRpcChlKXt2YXIgdCxpO2lmKCF0aGlzLmNvbmZpZy50b29sdGlwcy5zZWVrfHwhSCh0aGlzLmVsZW1lbnRzLmlucHV0cy5zZWVrKXx8IUgodGhpcy5lbGVtZW50cy5kaXNwbGF5LnNlZWtUb29sdGlwKXx8MD09PXRoaXMuZHVyYXRpb24pcmV0dXJuO2NvbnN0IHM9dGhpcy5lbGVtZW50cy5kaXNwbGF5LnNlZWtUb29sdGlwLG49YCR7dGhpcy5jb25maWcuY2xhc3NOYW1lcy50b29sdGlwfS0tdmlzaWJsZWAsYT1lPT5sZShzLG4sZSk7aWYodGhpcy50b3VjaClyZXR1cm4gdm9pZCBhKCExKTtsZXQgbD0wO2NvbnN0IG89dGhpcy5lbGVtZW50cy5wcm9ncmVzcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihSKGUpKWw9MTAwL28ud2lkdGgqKGUucGFnZVgtby5sZWZ0KTtlbHNle2lmKCFvZShzLG4pKXJldHVybjtsPXBhcnNlRmxvYXQocy5zdHlsZS5sZWZ0LDEwKX1sPDA/bD0wOmw+MTAwJiYobD0xMDApO2NvbnN0IHI9dGhpcy5kdXJhdGlvbi8xMDAqbDtzLmlubmVyVGV4dD1XZS5mb3JtYXRUaW1lKHIpO2NvbnN0IGM9bnVsbD09PSh0PXRoaXMuY29uZmlnLm1hcmtlcnMpfHx2b2lkIDA9PT10fHxudWxsPT09KGk9dC5wb2ludHMpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLmZpbmQoKCh7dGltZTplfSk9PmU9PT1NYXRoLnJvdW5kKHIpKSk7YyYmcy5pbnNlcnRBZGphY2VudEhUTUwoXCJhZnRlcmJlZ2luXCIsYCR7Yy5sYWJlbH08YnI+YCkscy5zdHlsZS5sZWZ0PWAke2x9JWAsUihlKSYmW1wibW91c2VlbnRlclwiLFwibW91c2VsZWF2ZVwiXS5pbmNsdWRlcyhlLnR5cGUpJiZhKFwibW91c2VlbnRlclwiPT09ZS50eXBlKX0sdGltZVVwZGF0ZShlKXtjb25zdCB0PSFIKHRoaXMuZWxlbWVudHMuZGlzcGxheS5kdXJhdGlvbikmJnRoaXMuY29uZmlnLmludmVydFRpbWU7V2UudXBkYXRlVGltZURpc3BsYXkuY2FsbCh0aGlzLHRoaXMuZWxlbWVudHMuZGlzcGxheS5jdXJyZW50VGltZSx0P3RoaXMuZHVyYXRpb24tdGhpcy5jdXJyZW50VGltZTp0aGlzLmN1cnJlbnRUaW1lLHQpLGUmJlwidGltZXVwZGF0ZVwiPT09ZS50eXBlJiZ0aGlzLm1lZGlhLnNlZWtpbmd8fFdlLnVwZGF0ZVByb2dyZXNzLmNhbGwodGhpcyxlKX0sZHVyYXRpb25VcGRhdGUoKXtpZighdGhpcy5zdXBwb3J0ZWQudWl8fCF0aGlzLmNvbmZpZy5pbnZlcnRUaW1lJiZ0aGlzLmN1cnJlbnRUaW1lKXJldHVybjtpZih0aGlzLmR1cmF0aW9uPj0yKiozMilyZXR1cm4gYWUodGhpcy5lbGVtZW50cy5kaXNwbGF5LmN1cnJlbnRUaW1lLCEwKSx2b2lkIGFlKHRoaXMuZWxlbWVudHMucHJvZ3Jlc3MsITApO0godGhpcy5lbGVtZW50cy5pbnB1dHMuc2VlaykmJnRoaXMuZWxlbWVudHMuaW5wdXRzLnNlZWsuc2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZW1heFwiLHRoaXMuZHVyYXRpb24pO2NvbnN0IGU9SCh0aGlzLmVsZW1lbnRzLmRpc3BsYXkuZHVyYXRpb24pOyFlJiZ0aGlzLmNvbmZpZy5kaXNwbGF5RHVyYXRpb24mJnRoaXMucGF1c2VkJiZXZS51cGRhdGVUaW1lRGlzcGxheS5jYWxsKHRoaXMsdGhpcy5lbGVtZW50cy5kaXNwbGF5LmN1cnJlbnRUaW1lLHRoaXMuZHVyYXRpb24pLGUmJldlLnVwZGF0ZVRpbWVEaXNwbGF5LmNhbGwodGhpcyx0aGlzLmVsZW1lbnRzLmRpc3BsYXkuZHVyYXRpb24sdGhpcy5kdXJhdGlvbiksdGhpcy5jb25maWcubWFya2Vycy5lbmFibGVkJiZXZS5zZXRNYXJrZXJzLmNhbGwodGhpcyksV2UudXBkYXRlU2Vla1Rvb2x0aXAuY2FsbCh0aGlzKX0sdG9nZ2xlTWVudUJ1dHRvbihlLHQpe2FlKHRoaXMuZWxlbWVudHMuc2V0dGluZ3MuYnV0dG9uc1tlXSwhdCl9LHVwZGF0ZVNldHRpbmcoZSx0LGkpe2NvbnN0IHM9dGhpcy5lbGVtZW50cy5zZXR0aW5ncy5wYW5lbHNbZV07bGV0IG49bnVsbCxhPXQ7aWYoXCJjYXB0aW9uc1wiPT09ZSluPXRoaXMuY3VycmVudFRyYWNrO2Vsc2V7aWYobj1XKGkpP3RoaXNbZV06aSxXKG4pJiYobj10aGlzLmNvbmZpZ1tlXS5kZWZhdWx0KSwhVyh0aGlzLm9wdGlvbnNbZV0pJiYhdGhpcy5vcHRpb25zW2VdLmluY2x1ZGVzKG4pKXJldHVybiB2b2lkIHRoaXMuZGVidWcud2FybihgVW5zdXBwb3J0ZWQgdmFsdWUgb2YgJyR7bn0nIGZvciAke2V9YCk7aWYoIXRoaXMuY29uZmlnW2VdLm9wdGlvbnMuaW5jbHVkZXMobikpcmV0dXJuIHZvaWQgdGhpcy5kZWJ1Zy53YXJuKGBEaXNhYmxlZCB2YWx1ZSBvZiAnJHtufScgZm9yICR7ZX1gKX1pZihIKGEpfHwoYT1zJiZzLnF1ZXJ5U2VsZWN0b3IoJ1tyb2xlPVwibWVudVwiXScpKSwhSChhKSlyZXR1cm47dGhpcy5lbGVtZW50cy5zZXR0aW5ncy5idXR0b25zW2VdLnF1ZXJ5U2VsZWN0b3IoYC4ke3RoaXMuY29uZmlnLmNsYXNzTmFtZXMubWVudS52YWx1ZX1gKS5pbm5lckhUTUw9V2UuZ2V0TGFiZWwuY2FsbCh0aGlzLGUsbik7Y29uc3QgbD1hJiZhLnF1ZXJ5U2VsZWN0b3IoYFt2YWx1ZT1cIiR7bn1cIl1gKTtIKGwpJiYobC5jaGVja2VkPSEwKX0sZ2V0TGFiZWwoZSx0KXtzd2l0Y2goZSl7Y2FzZVwic3BlZWRcIjpyZXR1cm4gMT09PXQ/SGUuZ2V0KFwibm9ybWFsXCIsdGhpcy5jb25maWcpOmAke3R9JnRpbWVzO2A7Y2FzZVwicXVhbGl0eVwiOmlmKCQodCkpe2NvbnN0IGU9SGUuZ2V0KGBxdWFsaXR5TGFiZWwuJHt0fWAsdGhpcy5jb25maWcpO3JldHVybiBlLmxlbmd0aD9lOmAke3R9cGB9cmV0dXJuIE9lKHQpO2Nhc2VcImNhcHRpb25zXCI6cmV0dXJuIFllLmdldExhYmVsLmNhbGwodGhpcyk7ZGVmYXVsdDpyZXR1cm4gbnVsbH19LHNldFF1YWxpdHlNZW51KGUpe2lmKCFIKHRoaXMuZWxlbWVudHMuc2V0dGluZ3MucGFuZWxzLnF1YWxpdHkpKXJldHVybjtjb25zdCB0PVwicXVhbGl0eVwiLGk9dGhpcy5lbGVtZW50cy5zZXR0aW5ncy5wYW5lbHMucXVhbGl0eS5xdWVyeVNlbGVjdG9yKCdbcm9sZT1cIm1lbnVcIl0nKTtEKGUpJiYodGhpcy5vcHRpb25zLnF1YWxpdHk9Q2UoZSkuZmlsdGVyKChlPT50aGlzLmNvbmZpZy5xdWFsaXR5Lm9wdGlvbnMuaW5jbHVkZXMoZSkpKSk7Y29uc3Qgcz0hVyh0aGlzLm9wdGlvbnMucXVhbGl0eSkmJnRoaXMub3B0aW9ucy5xdWFsaXR5Lmxlbmd0aD4xO2lmKFdlLnRvZ2dsZU1lbnVCdXR0b24uY2FsbCh0aGlzLHQscyksaWUoaSksV2UuY2hlY2tNZW51LmNhbGwodGhpcyksIXMpcmV0dXJuO2NvbnN0IG49ZT0+e2NvbnN0IHQ9SGUuZ2V0KGBxdWFsaXR5QmFkZ2UuJHtlfWAsdGhpcy5jb25maWcpO3JldHVybiB0Lmxlbmd0aD9XZS5jcmVhdGVCYWRnZS5jYWxsKHRoaXMsdCk6bnVsbH07dGhpcy5vcHRpb25zLnF1YWxpdHkuc29ydCgoKGUsdCk9Pntjb25zdCBpPXRoaXMuY29uZmlnLnF1YWxpdHkub3B0aW9ucztyZXR1cm4gaS5pbmRleE9mKGUpPmkuaW5kZXhPZih0KT8xOi0xfSkpLmZvckVhY2goKGU9PntXZS5jcmVhdGVNZW51SXRlbS5jYWxsKHRoaXMse3ZhbHVlOmUsbGlzdDppLHR5cGU6dCx0aXRsZTpXZS5nZXRMYWJlbC5jYWxsKHRoaXMsXCJxdWFsaXR5XCIsZSksYmFkZ2U6bihlKX0pfSkpLFdlLnVwZGF0ZVNldHRpbmcuY2FsbCh0aGlzLHQsaSl9LHNldENhcHRpb25zTWVudSgpe2lmKCFIKHRoaXMuZWxlbWVudHMuc2V0dGluZ3MucGFuZWxzLmNhcHRpb25zKSlyZXR1cm47Y29uc3QgZT1cImNhcHRpb25zXCIsdD10aGlzLmVsZW1lbnRzLnNldHRpbmdzLnBhbmVscy5jYXB0aW9ucy5xdWVyeVNlbGVjdG9yKCdbcm9sZT1cIm1lbnVcIl0nKSxpPVllLmdldFRyYWNrcy5jYWxsKHRoaXMpLHM9Qm9vbGVhbihpLmxlbmd0aCk7aWYoV2UudG9nZ2xlTWVudUJ1dHRvbi5jYWxsKHRoaXMsZSxzKSxpZSh0KSxXZS5jaGVja01lbnUuY2FsbCh0aGlzKSwhcylyZXR1cm47Y29uc3Qgbj1pLm1hcCgoKGUsaSk9Pih7dmFsdWU6aSxjaGVja2VkOnRoaXMuY2FwdGlvbnMudG9nZ2xlZCYmdGhpcy5jdXJyZW50VHJhY2s9PT1pLHRpdGxlOlllLmdldExhYmVsLmNhbGwodGhpcyxlKSxiYWRnZTplLmxhbmd1YWdlJiZXZS5jcmVhdGVCYWRnZS5jYWxsKHRoaXMsZS5sYW5ndWFnZS50b1VwcGVyQ2FzZSgpKSxsaXN0OnQsdHlwZTpcImxhbmd1YWdlXCJ9KSkpO24udW5zaGlmdCh7dmFsdWU6LTEsY2hlY2tlZDohdGhpcy5jYXB0aW9ucy50b2dnbGVkLHRpdGxlOkhlLmdldChcImRpc2FibGVkXCIsdGhpcy5jb25maWcpLGxpc3Q6dCx0eXBlOlwibGFuZ3VhZ2VcIn0pLG4uZm9yRWFjaChXZS5jcmVhdGVNZW51SXRlbS5iaW5kKHRoaXMpKSxXZS51cGRhdGVTZXR0aW5nLmNhbGwodGhpcyxlLHQpfSxzZXRTcGVlZE1lbnUoKXtpZighSCh0aGlzLmVsZW1lbnRzLnNldHRpbmdzLnBhbmVscy5zcGVlZCkpcmV0dXJuO2NvbnN0IGU9XCJzcGVlZFwiLHQ9dGhpcy5lbGVtZW50cy5zZXR0aW5ncy5wYW5lbHMuc3BlZWQucXVlcnlTZWxlY3RvcignW3JvbGU9XCJtZW51XCJdJyk7dGhpcy5vcHRpb25zLnNwZWVkPXRoaXMub3B0aW9ucy5zcGVlZC5maWx0ZXIoKGU9PmU+PXRoaXMubWluaW11bVNwZWVkJiZlPD10aGlzLm1heGltdW1TcGVlZCkpO2NvbnN0IGk9IVcodGhpcy5vcHRpb25zLnNwZWVkKSYmdGhpcy5vcHRpb25zLnNwZWVkLmxlbmd0aD4xO1dlLnRvZ2dsZU1lbnVCdXR0b24uY2FsbCh0aGlzLGUsaSksaWUodCksV2UuY2hlY2tNZW51LmNhbGwodGhpcyksaSYmKHRoaXMub3B0aW9ucy5zcGVlZC5mb3JFYWNoKChpPT57V2UuY3JlYXRlTWVudUl0ZW0uY2FsbCh0aGlzLHt2YWx1ZTppLGxpc3Q6dCx0eXBlOmUsdGl0bGU6V2UuZ2V0TGFiZWwuY2FsbCh0aGlzLFwic3BlZWRcIixpKX0pfSkpLFdlLnVwZGF0ZVNldHRpbmcuY2FsbCh0aGlzLGUsdCkpfSxjaGVja01lbnUoKXtjb25zdHtidXR0b25zOmV9PXRoaXMuZWxlbWVudHMuc2V0dGluZ3MsdD0hVyhlKSYmT2JqZWN0LnZhbHVlcyhlKS5zb21lKChlPT4hZS5oaWRkZW4pKTthZSh0aGlzLmVsZW1lbnRzLnNldHRpbmdzLm1lbnUsIXQpfSxmb2N1c0ZpcnN0TWVudUl0ZW0oZSx0PSExKXtpZih0aGlzLmVsZW1lbnRzLnNldHRpbmdzLnBvcHVwLmhpZGRlbilyZXR1cm47bGV0IGk9ZTtIKGkpfHwoaT1PYmplY3QudmFsdWVzKHRoaXMuZWxlbWVudHMuc2V0dGluZ3MucGFuZWxzKS5maW5kKChlPT4hZS5oaWRkZW4pKSk7Y29uc3Qgcz1pLnF1ZXJ5U2VsZWN0b3IoJ1tyb2xlXj1cIm1lbnVpdGVtXCJdJyk7dWUuY2FsbCh0aGlzLHMsdCl9LHRvZ2dsZU1lbnUoZSl7Y29uc3R7cG9wdXA6dH09dGhpcy5lbGVtZW50cy5zZXR0aW5ncyxpPXRoaXMuZWxlbWVudHMuYnV0dG9ucy5zZXR0aW5ncztpZighSCh0KXx8IUgoaSkpcmV0dXJuO2NvbnN0e2hpZGRlbjpzfT10O2xldCBuPXM7aWYoTyhlKSluPWU7ZWxzZSBpZihGKGUpJiZcIkVzY2FwZVwiPT09ZS5rZXkpbj0hMTtlbHNlIGlmKFIoZSkpe2NvbnN0IHM9aihlLmNvbXBvc2VkUGF0aCk/ZS5jb21wb3NlZFBhdGgoKVswXTplLnRhcmdldCxhPXQuY29udGFpbnMocyk7aWYoYXx8IWEmJmUudGFyZ2V0IT09aSYmbilyZXR1cm59aS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIsbiksYWUodCwhbiksbGUodGhpcy5lbGVtZW50cy5jb250YWluZXIsdGhpcy5jb25maWcuY2xhc3NOYW1lcy5tZW51Lm9wZW4sbiksbiYmRihlKT9XZS5mb2N1c0ZpcnN0TWVudUl0ZW0uY2FsbCh0aGlzLG51bGwsITApOm58fHN8fHVlLmNhbGwodGhpcyxpLEYoZSkpfSxnZXRNZW51U2l6ZShlKXtjb25zdCB0PWUuY2xvbmVOb2RlKCEwKTt0LnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIix0LnN0eWxlLm9wYWNpdHk9MCx0LnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKSxlLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodCk7Y29uc3QgaT10LnNjcm9sbFdpZHRoLHM9dC5zY3JvbGxIZWlnaHQ7cmV0dXJuIHRlKHQpLHt3aWR0aDppLGhlaWdodDpzfX0sc2hvd01lbnVQYW5lbChlPVwiXCIsdD0hMSl7Y29uc3QgaT10aGlzLmVsZW1lbnRzLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAjcGx5ci1zZXR0aW5ncy0ke3RoaXMuaWR9LSR7ZX1gKTtpZighSChpKSlyZXR1cm47Y29uc3Qgcz1pLnBhcmVudE5vZGUsbj1BcnJheS5mcm9tKHMuY2hpbGRyZW4pLmZpbmQoKGU9PiFlLmhpZGRlbikpO2lmKG1lLnRyYW5zaXRpb25zJiYhbWUucmVkdWNlZE1vdGlvbil7cy5zdHlsZS53aWR0aD1gJHtuLnNjcm9sbFdpZHRofXB4YCxzLnN0eWxlLmhlaWdodD1gJHtuLnNjcm9sbEhlaWdodH1weGA7Y29uc3QgZT1XZS5nZXRNZW51U2l6ZS5jYWxsKHRoaXMsaSksdD1lPT57ZS50YXJnZXQ9PT1zJiZbXCJ3aWR0aFwiLFwiaGVpZ2h0XCJdLmluY2x1ZGVzKGUucHJvcGVydHlOYW1lKSYmKHMuc3R5bGUud2lkdGg9XCJcIixzLnN0eWxlLmhlaWdodD1cIlwiLGJlLmNhbGwodGhpcyxzLHosdCkpfTtmZS5jYWxsKHRoaXMscyx6LHQpLHMuc3R5bGUud2lkdGg9YCR7ZS53aWR0aH1weGAscy5zdHlsZS5oZWlnaHQ9YCR7ZS5oZWlnaHR9cHhgfWFlKG4sITApLGFlKGksITEpLFdlLmZvY3VzRmlyc3RNZW51SXRlbS5jYWxsKHRoaXMsaSx0KX0sc2V0RG93bmxvYWRVcmwoKXtjb25zdCBlPXRoaXMuZWxlbWVudHMuYnV0dG9ucy5kb3dubG9hZDtIKGUpJiZlLnNldEF0dHJpYnV0ZShcImhyZWZcIix0aGlzLmRvd25sb2FkKX0sY3JlYXRlKGUpe2NvbnN0e2JpbmRNZW51SXRlbVNob3J0Y3V0czp0LGNyZWF0ZUJ1dHRvbjppLGNyZWF0ZVByb2dyZXNzOnMsY3JlYXRlUmFuZ2U6bixjcmVhdGVUaW1lOmEsc2V0UXVhbGl0eU1lbnU6bCxzZXRTcGVlZE1lbnU6byxzaG93TWVudVBhbmVsOnJ9PVdlO3RoaXMuZWxlbWVudHMuY29udHJvbHM9bnVsbCxEKHRoaXMuY29uZmlnLmNvbnRyb2xzKSYmdGhpcy5jb25maWcuY29udHJvbHMuaW5jbHVkZXMoXCJwbGF5LWxhcmdlXCIpJiZ0aGlzLmVsZW1lbnRzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChpLmNhbGwodGhpcyxcInBsYXktbGFyZ2VcIikpO2NvbnN0IGM9WihcImRpdlwiLG5lKHRoaXMuY29uZmlnLnNlbGVjdG9ycy5jb250cm9scy53cmFwcGVyKSk7dGhpcy5lbGVtZW50cy5jb250cm9scz1jO2NvbnN0IGg9e2NsYXNzOlwicGx5cl9fY29udHJvbHNfX2l0ZW1cIn07cmV0dXJuIENlKEQodGhpcy5jb25maWcuY29udHJvbHMpP3RoaXMuY29uZmlnLmNvbnRyb2xzOltdKS5mb3JFYWNoKChsPT57aWYoXCJyZXN0YXJ0XCI9PT1sJiZjLmFwcGVuZENoaWxkKGkuY2FsbCh0aGlzLFwicmVzdGFydFwiLGgpKSxcInJld2luZFwiPT09bCYmYy5hcHBlbmRDaGlsZChpLmNhbGwodGhpcyxcInJld2luZFwiLGgpKSxcInBsYXlcIj09PWwmJmMuYXBwZW5kQ2hpbGQoaS5jYWxsKHRoaXMsXCJwbGF5XCIsaCkpLFwiZmFzdC1mb3J3YXJkXCI9PT1sJiZjLmFwcGVuZENoaWxkKGkuY2FsbCh0aGlzLFwiZmFzdC1mb3J3YXJkXCIsaCkpLFwicHJvZ3Jlc3NcIj09PWwpe2NvbnN0IHQ9WihcImRpdlwiLHtjbGFzczpgJHtoLmNsYXNzfSBwbHlyX19wcm9ncmVzc19fY29udGFpbmVyYH0pLGk9WihcImRpdlwiLG5lKHRoaXMuY29uZmlnLnNlbGVjdG9ycy5wcm9ncmVzcykpO2lmKGkuYXBwZW5kQ2hpbGQobi5jYWxsKHRoaXMsXCJzZWVrXCIse2lkOmBwbHlyLXNlZWstJHtlLmlkfWB9KSksaS5hcHBlbmRDaGlsZChzLmNhbGwodGhpcyxcImJ1ZmZlclwiKSksdGhpcy5jb25maWcudG9vbHRpcHMuc2Vlayl7Y29uc3QgZT1aKFwic3BhblwiLHtjbGFzczp0aGlzLmNvbmZpZy5jbGFzc05hbWVzLnRvb2x0aXB9LFwiMDA6MDBcIik7aS5hcHBlbmRDaGlsZChlKSx0aGlzLmVsZW1lbnRzLmRpc3BsYXkuc2Vla1Rvb2x0aXA9ZX10aGlzLmVsZW1lbnRzLnByb2dyZXNzPWksdC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnRzLnByb2dyZXNzKSxjLmFwcGVuZENoaWxkKHQpfWlmKFwiY3VycmVudC10aW1lXCI9PT1sJiZjLmFwcGVuZENoaWxkKGEuY2FsbCh0aGlzLFwiY3VycmVudFRpbWVcIixoKSksXCJkdXJhdGlvblwiPT09bCYmYy5hcHBlbmRDaGlsZChhLmNhbGwodGhpcyxcImR1cmF0aW9uXCIsaCkpLFwibXV0ZVwiPT09bHx8XCJ2b2x1bWVcIj09PWwpe2xldHt2b2x1bWU6dH09dGhpcy5lbGVtZW50cztpZihIKHQpJiZjLmNvbnRhaW5zKHQpfHwodD1aKFwiZGl2XCIsWCh7fSxoLHtjbGFzczpgJHtoLmNsYXNzfSBwbHlyX192b2x1bWVgLnRyaW0oKX0pKSx0aGlzLmVsZW1lbnRzLnZvbHVtZT10LGMuYXBwZW5kQ2hpbGQodCkpLFwibXV0ZVwiPT09bCYmdC5hcHBlbmRDaGlsZChpLmNhbGwodGhpcyxcIm11dGVcIikpLFwidm9sdW1lXCI9PT1sJiYhWS5pc0lvcyl7Y29uc3QgaT17bWF4OjEsc3RlcDouMDUsdmFsdWU6dGhpcy5jb25maWcudm9sdW1lfTt0LmFwcGVuZENoaWxkKG4uY2FsbCh0aGlzLFwidm9sdW1lXCIsWChpLHtpZDpgcGx5ci12b2x1bWUtJHtlLmlkfWB9KSkpfX1pZihcImNhcHRpb25zXCI9PT1sJiZjLmFwcGVuZENoaWxkKGkuY2FsbCh0aGlzLFwiY2FwdGlvbnNcIixoKSksXCJzZXR0aW5nc1wiPT09bCYmIVcodGhpcy5jb25maWcuc2V0dGluZ3MpKXtjb25zdCBzPVooXCJkaXZcIixYKHt9LGgse2NsYXNzOmAke2guY2xhc3N9IHBseXJfX21lbnVgLnRyaW0oKSxoaWRkZW46XCJcIn0pKTtzLmFwcGVuZENoaWxkKGkuY2FsbCh0aGlzLFwic2V0dGluZ3NcIix7XCJhcmlhLWhhc3BvcHVwXCI6ITAsXCJhcmlhLWNvbnRyb2xzXCI6YHBseXItc2V0dGluZ3MtJHtlLmlkfWAsXCJhcmlhLWV4cGFuZGVkXCI6ITF9KSk7Y29uc3Qgbj1aKFwiZGl2XCIse2NsYXNzOlwicGx5cl9fbWVudV9fY29udGFpbmVyXCIsaWQ6YHBseXItc2V0dGluZ3MtJHtlLmlkfWAsaGlkZGVuOlwiXCJ9KSxhPVooXCJkaXZcIiksbD1aKFwiZGl2XCIse2lkOmBwbHlyLXNldHRpbmdzLSR7ZS5pZH0taG9tZWB9KSxvPVooXCJkaXZcIix7cm9sZTpcIm1lbnVcIn0pO2wuYXBwZW5kQ2hpbGQobyksYS5hcHBlbmRDaGlsZChsKSx0aGlzLmVsZW1lbnRzLnNldHRpbmdzLnBhbmVscy5ob21lPWwsdGhpcy5jb25maWcuc2V0dGluZ3MuZm9yRWFjaCgoaT0+e2NvbnN0IHM9WihcImJ1dHRvblwiLFgobmUodGhpcy5jb25maWcuc2VsZWN0b3JzLmJ1dHRvbnMuc2V0dGluZ3MpLHt0eXBlOlwiYnV0dG9uXCIsY2xhc3M6YCR7dGhpcy5jb25maWcuY2xhc3NOYW1lcy5jb250cm9sfSAke3RoaXMuY29uZmlnLmNsYXNzTmFtZXMuY29udHJvbH0tLWZvcndhcmRgLHJvbGU6XCJtZW51aXRlbVwiLFwiYXJpYS1oYXNwb3B1cFwiOiEwLGhpZGRlbjpcIlwifSkpO3QuY2FsbCh0aGlzLHMsaSksZmUuY2FsbCh0aGlzLHMsXCJjbGlja1wiLCgoKT0+e3IuY2FsbCh0aGlzLGksITEpfSkpO2NvbnN0IG49WihcInNwYW5cIixudWxsLEhlLmdldChpLHRoaXMuY29uZmlnKSksbD1aKFwic3BhblwiLHtjbGFzczp0aGlzLmNvbmZpZy5jbGFzc05hbWVzLm1lbnUudmFsdWV9KTtsLmlubmVySFRNTD1lW2ldLG4uYXBwZW5kQ2hpbGQobCkscy5hcHBlbmRDaGlsZChuKSxvLmFwcGVuZENoaWxkKHMpO2NvbnN0IGM9WihcImRpdlwiLHtpZDpgcGx5ci1zZXR0aW5ncy0ke2UuaWR9LSR7aX1gLGhpZGRlbjpcIlwifSksaD1aKFwiYnV0dG9uXCIse3R5cGU6XCJidXR0b25cIixjbGFzczpgJHt0aGlzLmNvbmZpZy5jbGFzc05hbWVzLmNvbnRyb2x9ICR7dGhpcy5jb25maWcuY2xhc3NOYW1lcy5jb250cm9sfS0tYmFja2B9KTtoLmFwcGVuZENoaWxkKFooXCJzcGFuXCIse1wiYXJpYS1oaWRkZW5cIjohMH0sSGUuZ2V0KGksdGhpcy5jb25maWcpKSksaC5hcHBlbmRDaGlsZChaKFwic3BhblwiLHtjbGFzczp0aGlzLmNvbmZpZy5jbGFzc05hbWVzLmhpZGRlbn0sSGUuZ2V0KFwibWVudUJhY2tcIix0aGlzLmNvbmZpZykpKSxmZS5jYWxsKHRoaXMsYyxcImtleWRvd25cIiwoZT0+e1wiQXJyb3dMZWZ0XCI9PT1lLmtleSYmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpLHIuY2FsbCh0aGlzLFwiaG9tZVwiLCEwKSl9KSwhMSksZmUuY2FsbCh0aGlzLGgsXCJjbGlja1wiLCgoKT0+e3IuY2FsbCh0aGlzLFwiaG9tZVwiLCExKX0pKSxjLmFwcGVuZENoaWxkKGgpLGMuYXBwZW5kQ2hpbGQoWihcImRpdlwiLHtyb2xlOlwibWVudVwifSkpLGEuYXBwZW5kQ2hpbGQoYyksdGhpcy5lbGVtZW50cy5zZXR0aW5ncy5idXR0b25zW2ldPXMsdGhpcy5lbGVtZW50cy5zZXR0aW5ncy5wYW5lbHNbaV09Y30pKSxuLmFwcGVuZENoaWxkKGEpLHMuYXBwZW5kQ2hpbGQobiksYy5hcHBlbmRDaGlsZChzKSx0aGlzLmVsZW1lbnRzLnNldHRpbmdzLnBvcHVwPW4sdGhpcy5lbGVtZW50cy5zZXR0aW5ncy5tZW51PXN9aWYoXCJwaXBcIj09PWwmJm1lLnBpcCYmYy5hcHBlbmRDaGlsZChpLmNhbGwodGhpcyxcInBpcFwiLGgpKSxcImFpcnBsYXlcIj09PWwmJm1lLmFpcnBsYXkmJmMuYXBwZW5kQ2hpbGQoaS5jYWxsKHRoaXMsXCJhaXJwbGF5XCIsaCkpLFwiZG93bmxvYWRcIj09PWwpe2NvbnN0IGU9WCh7fSxoLHtlbGVtZW50OlwiYVwiLGhyZWY6dGhpcy5kb3dubG9hZCx0YXJnZXQ6XCJfYmxhbmtcIn0pO3RoaXMuaXNIVE1MNSYmKGUuZG93bmxvYWQ9XCJcIik7Y29uc3R7ZG93bmxvYWQ6dH09dGhpcy5jb25maWcudXJsczshVSh0KSYmdGhpcy5pc0VtYmVkJiZYKGUse2ljb246YGxvZ28tJHt0aGlzLnByb3ZpZGVyfWAsbGFiZWw6dGhpcy5wcm92aWRlcn0pLGMuYXBwZW5kQ2hpbGQoaS5jYWxsKHRoaXMsXCJkb3dubG9hZFwiLGUpKX1cImZ1bGxzY3JlZW5cIj09PWwmJmMuYXBwZW5kQ2hpbGQoaS5jYWxsKHRoaXMsXCJmdWxsc2NyZWVuXCIsaCkpfSkpLHRoaXMuaXNIVE1MNSYmbC5jYWxsKHRoaXMsTGUuZ2V0UXVhbGl0eU9wdGlvbnMuY2FsbCh0aGlzKSksby5jYWxsKHRoaXMpLGN9LGluamVjdCgpe2lmKHRoaXMuY29uZmlnLmxvYWRTcHJpdGUpe2NvbnN0IGU9V2UuZ2V0SWNvblVybC5jYWxsKHRoaXMpO2UuY29ycyYmVmUoZS51cmwsXCJzcHJpdGUtcGx5clwiKX10aGlzLmlkPU1hdGguZmxvb3IoMWU0Kk1hdGgucmFuZG9tKCkpO2xldCBlPW51bGw7dGhpcy5lbGVtZW50cy5jb250cm9scz1udWxsO2NvbnN0IHQ9e2lkOnRoaXMuaWQsc2Vla3RpbWU6dGhpcy5jb25maWcuc2Vla1RpbWUsdGl0bGU6dGhpcy5jb25maWcudGl0bGV9O2xldCBpPSEwO2oodGhpcy5jb25maWcuY29udHJvbHMpJiYodGhpcy5jb25maWcuY29udHJvbHM9dGhpcy5jb25maWcuY29udHJvbHMuY2FsbCh0aGlzLHQpKSx0aGlzLmNvbmZpZy5jb250cm9sc3x8KHRoaXMuY29uZmlnLmNvbnRyb2xzPVtdKSxIKHRoaXMuY29uZmlnLmNvbnRyb2xzKXx8Xyh0aGlzLmNvbmZpZy5jb250cm9scyk/ZT10aGlzLmNvbmZpZy5jb250cm9sczooZT1XZS5jcmVhdGUuY2FsbCh0aGlzLHtpZDp0aGlzLmlkLHNlZWt0aW1lOnRoaXMuY29uZmlnLnNlZWtUaW1lLHNwZWVkOnRoaXMuc3BlZWQscXVhbGl0eTp0aGlzLnF1YWxpdHksY2FwdGlvbnM6WWUuZ2V0TGFiZWwuY2FsbCh0aGlzKX0pLGk9ITEpO2xldCBzO2kmJl8odGhpcy5jb25maWcuY29udHJvbHMpJiYoZT0oZT0+e2xldCBpPWU7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKChbZSx0XSk9PntpPV9lKGksYHske2V9fWAsdCl9KSksaX0pKGUpKSxfKHRoaXMuY29uZmlnLnNlbGVjdG9ycy5jb250cm9scy5jb250YWluZXIpJiYocz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuY29uZmlnLnNlbGVjdG9ycy5jb250cm9scy5jb250YWluZXIpKSxIKHMpfHwocz10aGlzLmVsZW1lbnRzLmNvbnRhaW5lcik7aWYoc1tIKGUpP1wiaW5zZXJ0QWRqYWNlbnRFbGVtZW50XCI6XCJpbnNlcnRBZGphY2VudEhUTUxcIl0oXCJhZnRlcmJlZ2luXCIsZSksSCh0aGlzLmVsZW1lbnRzLmNvbnRyb2xzKXx8V2UuZmluZEVsZW1lbnRzLmNhbGwodGhpcyksIVcodGhpcy5lbGVtZW50cy5idXR0b25zKSl7Y29uc3QgZT1lPT57Y29uc3QgdD10aGlzLmNvbmZpZy5jbGFzc05hbWVzLmNvbnRyb2xQcmVzc2VkO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwicHJlc3NlZFwiLHtlbnVtZXJhYmxlOiEwLGdldDooKT0+b2UoZSx0KSxzZXQoaT0hMSl7bGUoZSx0LGkpfX0pfTtPYmplY3QudmFsdWVzKHRoaXMuZWxlbWVudHMuYnV0dG9ucykuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goKHQ9PntEKHQpfHxxKHQpP0FycmF5LmZyb20odCkuZmlsdGVyKEJvb2xlYW4pLmZvckVhY2goZSk6ZSh0KX0pKX1pZihZLmlzRWRnZSYmSyhzKSx0aGlzLmNvbmZpZy50b29sdGlwcy5jb250cm9scyl7Y29uc3R7Y2xhc3NOYW1lczplLHNlbGVjdG9yczp0fT10aGlzLmNvbmZpZyxpPWAke3QuY29udHJvbHMud3JhcHBlcn0gJHt0LmxhYmVsc30gLiR7ZS5oaWRkZW59YCxzPWNlLmNhbGwodGhpcyxpKTtBcnJheS5mcm9tKHMpLmZvckVhY2goKGU9PntsZShlLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMuaGlkZGVuLCExKSxsZShlLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMudG9vbHRpcCwhMCl9KSl9fSxzZXRNZWRpYU1ldGFkYXRhKCl7dHJ5e1wibWVkaWFTZXNzaW9uXCJpbiBuYXZpZ2F0b3ImJihuYXZpZ2F0b3IubWVkaWFTZXNzaW9uLm1ldGFkYXRhPW5ldyB3aW5kb3cuTWVkaWFNZXRhZGF0YSh7dGl0bGU6dGhpcy5jb25maWcubWVkaWFNZXRhZGF0YS50aXRsZSxhcnRpc3Q6dGhpcy5jb25maWcubWVkaWFNZXRhZGF0YS5hcnRpc3QsYWxidW06dGhpcy5jb25maWcubWVkaWFNZXRhZGF0YS5hbGJ1bSxhcnR3b3JrOnRoaXMuY29uZmlnLm1lZGlhTWV0YWRhdGEuYXJ0d29ya30pKX1jYXRjaChlKXt9fSxzZXRNYXJrZXJzKCl7dmFyIGUsdDtpZighdGhpcy5kdXJhdGlvbnx8dGhpcy5lbGVtZW50cy5tYXJrZXJzKXJldHVybjtjb25zdCBpPW51bGw9PT0oZT10aGlzLmNvbmZpZy5tYXJrZXJzKXx8dm9pZCAwPT09ZXx8bnVsbD09PSh0PWUucG9pbnRzKXx8dm9pZCAwPT09dD92b2lkIDA6dC5maWx0ZXIoKCh7dGltZTplfSk9PmU+MCYmZTx0aGlzLmR1cmF0aW9uKSk7aWYobnVsbD09aXx8IWkubGVuZ3RoKXJldHVybjtjb25zdCBzPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxuPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtsZXQgYT1udWxsO2NvbnN0IGw9YCR7dGhpcy5jb25maWcuY2xhc3NOYW1lcy50b29sdGlwfS0tdmlzaWJsZWAsbz1lPT5sZShhLGwsZSk7aS5mb3JFYWNoKChlPT57Y29uc3QgdD1aKFwic3BhblwiLHtjbGFzczp0aGlzLmNvbmZpZy5jbGFzc05hbWVzLm1hcmtlcn0sXCJcIiksaT1lLnRpbWUvdGhpcy5kdXJhdGlvbioxMDArXCIlXCI7YSYmKHQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwoKCk9PntlLmxhYmVsfHwoYS5zdHlsZS5sZWZ0PWksYS5pbm5lckhUTUw9ZS5sYWJlbCxvKCEwKSl9KSksdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCgoKT0+e28oITEpfSkpKSx0LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCgoKT0+e3RoaXMuY3VycmVudFRpbWU9ZS50aW1lfSkpLHQuc3R5bGUubGVmdD1pLG4uYXBwZW5kQ2hpbGQodCl9KSkscy5hcHBlbmRDaGlsZChuKSx0aGlzLmNvbmZpZy50b29sdGlwcy5zZWVrfHwoYT1aKFwic3BhblwiLHtjbGFzczp0aGlzLmNvbmZpZy5jbGFzc05hbWVzLnRvb2x0aXB9LFwiXCIpLHMuYXBwZW5kQ2hpbGQoYSkpLHRoaXMuZWxlbWVudHMubWFya2Vycz17cG9pbnRzOm4sdGlwOmF9LHRoaXMuZWxlbWVudHMucHJvZ3Jlc3MuYXBwZW5kQ2hpbGQocyl9fTtmdW5jdGlvbiB6ZShlLHQ9ITApe2xldCBpPWU7aWYodCl7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtlLmhyZWY9aSxpPWUuaHJlZn10cnl7cmV0dXJuIG5ldyBVUkwoaSl9Y2F0Y2goZSl7cmV0dXJuIG51bGx9fWZ1bmN0aW9uIEtlKGUpe2NvbnN0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtcztyZXR1cm4gTChlKSYmT2JqZWN0LmVudHJpZXMoZSkuZm9yRWFjaCgoKFtlLGldKT0+e3Quc2V0KGUsaSl9KSksdH1jb25zdCBZZT17c2V0dXAoKXtpZighdGhpcy5zdXBwb3J0ZWQudWkpcmV0dXJuO2lmKCF0aGlzLmlzVmlkZW98fHRoaXMuaXNZb3VUdWJlfHx0aGlzLmlzSFRNTDUmJiFtZS50ZXh0VHJhY2tzKXJldHVybiB2b2lkKEQodGhpcy5jb25maWcuY29udHJvbHMpJiZ0aGlzLmNvbmZpZy5jb250cm9scy5pbmNsdWRlcyhcInNldHRpbmdzXCIpJiZ0aGlzLmNvbmZpZy5zZXR0aW5ncy5pbmNsdWRlcyhcImNhcHRpb25zXCIpJiZXZS5zZXRDYXB0aW9uc01lbnUuY2FsbCh0aGlzKSk7dmFyIGUsdDtpZihIKHRoaXMuZWxlbWVudHMuY2FwdGlvbnMpfHwodGhpcy5lbGVtZW50cy5jYXB0aW9ucz1aKFwiZGl2XCIsbmUodGhpcy5jb25maWcuc2VsZWN0b3JzLmNhcHRpb25zKSksZT10aGlzLmVsZW1lbnRzLmNhcHRpb25zLHQ9dGhpcy5lbGVtZW50cy53cmFwcGVyLEgoZSkmJkgodCkmJnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0Lm5leHRTaWJsaW5nKSksWS5pc0lFJiZ3aW5kb3cuVVJMKXtjb25zdCBlPXRoaXMubWVkaWEucXVlcnlTZWxlY3RvckFsbChcInRyYWNrXCIpO0FycmF5LmZyb20oZSkuZm9yRWFjaCgoZT0+e2NvbnN0IHQ9ZS5nZXRBdHRyaWJ1dGUoXCJzcmNcIiksaT16ZSh0KTtudWxsIT09aSYmaS5ob3N0bmFtZSE9PXdpbmRvdy5sb2NhdGlvbi5ocmVmLmhvc3RuYW1lJiZbXCJodHRwOlwiLFwiaHR0cHM6XCJdLmluY2x1ZGVzKGkucHJvdG9jb2wpJiZGZSh0LFwiYmxvYlwiKS50aGVuKCh0PT57ZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIix3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCh0KSl9KSkuY2F0Y2goKCgpPT57dGUoZSl9KSl9KSl9Y29uc3QgaT1DZSgobmF2aWdhdG9yLmxhbmd1YWdlc3x8W25hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnVzZXJMYW5ndWFnZXx8XCJlblwiXSkubWFwKChlPT5lLnNwbGl0KFwiLVwiKVswXSkpKTtsZXQgcz0odGhpcy5zdG9yYWdlLmdldChcImxhbmd1YWdlXCIpfHx0aGlzLmNvbmZpZy5jYXB0aW9ucy5sYW5ndWFnZXx8XCJhdXRvXCIpLnRvTG93ZXJDYXNlKCk7XCJhdXRvXCI9PT1zJiYoW3NdPWkpO2xldCBuPXRoaXMuc3RvcmFnZS5nZXQoXCJjYXB0aW9uc1wiKTtpZihPKG4pfHwoe2FjdGl2ZTpufT10aGlzLmNvbmZpZy5jYXB0aW9ucyksT2JqZWN0LmFzc2lnbih0aGlzLmNhcHRpb25zLHt0b2dnbGVkOiExLGFjdGl2ZTpuLGxhbmd1YWdlOnMsbGFuZ3VhZ2VzOml9KSx0aGlzLmlzSFRNTDUpe2NvbnN0IGU9dGhpcy5jb25maWcuY2FwdGlvbnMudXBkYXRlP1wiYWRkdHJhY2sgcmVtb3ZldHJhY2tcIjpcInJlbW92ZXRyYWNrXCI7ZmUuY2FsbCh0aGlzLHRoaXMubWVkaWEudGV4dFRyYWNrcyxlLFllLnVwZGF0ZS5iaW5kKHRoaXMpKX1zZXRUaW1lb3V0KFllLnVwZGF0ZS5iaW5kKHRoaXMpLDApfSx1cGRhdGUoKXtjb25zdCBlPVllLmdldFRyYWNrcy5jYWxsKHRoaXMsITApLHthY3RpdmU6dCxsYW5ndWFnZTppLG1ldGE6cyxjdXJyZW50VHJhY2tOb2RlOm59PXRoaXMuY2FwdGlvbnMsYT1Cb29sZWFuKGUuZmluZCgoZT0+ZS5sYW5ndWFnZT09PWkpKSk7dGhpcy5pc0hUTUw1JiZ0aGlzLmlzVmlkZW8mJmUuZmlsdGVyKChlPT4hcy5nZXQoZSkpKS5mb3JFYWNoKChlPT57dGhpcy5kZWJ1Zy5sb2coXCJUcmFjayBhZGRlZFwiLGUpLHMuc2V0KGUse2RlZmF1bHQ6XCJzaG93aW5nXCI9PT1lLm1vZGV9KSxcInNob3dpbmdcIj09PWUubW9kZSYmKGUubW9kZT1cImhpZGRlblwiKSxmZS5jYWxsKHRoaXMsZSxcImN1ZWNoYW5nZVwiLCgoKT0+WWUudXBkYXRlQ3Vlcy5jYWxsKHRoaXMpKSl9KSksKGEmJnRoaXMubGFuZ3VhZ2UhPT1pfHwhZS5pbmNsdWRlcyhuKSkmJihZZS5zZXRMYW5ndWFnZS5jYWxsKHRoaXMsaSksWWUudG9nZ2xlLmNhbGwodGhpcyx0JiZhKSksdGhpcy5lbGVtZW50cyYmbGUodGhpcy5lbGVtZW50cy5jb250YWluZXIsdGhpcy5jb25maWcuY2xhc3NOYW1lcy5jYXB0aW9ucy5lbmFibGVkLCFXKGUpKSxEKHRoaXMuY29uZmlnLmNvbnRyb2xzKSYmdGhpcy5jb25maWcuY29udHJvbHMuaW5jbHVkZXMoXCJzZXR0aW5nc1wiKSYmdGhpcy5jb25maWcuc2V0dGluZ3MuaW5jbHVkZXMoXCJjYXB0aW9uc1wiKSYmV2Uuc2V0Q2FwdGlvbnNNZW51LmNhbGwodGhpcyl9LHRvZ2dsZShlLHQ9ITApe2lmKCF0aGlzLnN1cHBvcnRlZC51aSlyZXR1cm47Y29uc3R7dG9nZ2xlZDppfT10aGlzLmNhcHRpb25zLHM9dGhpcy5jb25maWcuY2xhc3NOYW1lcy5jYXB0aW9ucy5hY3RpdmUsbj1JKGUpPyFpOmU7aWYobiE9PWkpe2lmKHR8fCh0aGlzLmNhcHRpb25zLmFjdGl2ZT1uLHRoaXMuc3RvcmFnZS5zZXQoe2NhcHRpb25zOm59KSksIXRoaXMubGFuZ3VhZ2UmJm4mJiF0KXtjb25zdCBlPVllLmdldFRyYWNrcy5jYWxsKHRoaXMpLHQ9WWUuZmluZFRyYWNrLmNhbGwodGhpcyxbdGhpcy5jYXB0aW9ucy5sYW5ndWFnZSwuLi50aGlzLmNhcHRpb25zLmxhbmd1YWdlc10sITApO3JldHVybiB0aGlzLmNhcHRpb25zLmxhbmd1YWdlPXQubGFuZ3VhZ2Usdm9pZCBZZS5zZXQuY2FsbCh0aGlzLGUuaW5kZXhPZih0KSl9dGhpcy5lbGVtZW50cy5idXR0b25zLmNhcHRpb25zJiYodGhpcy5lbGVtZW50cy5idXR0b25zLmNhcHRpb25zLnByZXNzZWQ9biksbGUodGhpcy5lbGVtZW50cy5jb250YWluZXIscyxuKSx0aGlzLmNhcHRpb25zLnRvZ2dsZWQ9bixXZS51cGRhdGVTZXR0aW5nLmNhbGwodGhpcyxcImNhcHRpb25zXCIpLHZlLmNhbGwodGhpcyx0aGlzLm1lZGlhLG4/XCJjYXB0aW9uc2VuYWJsZWRcIjpcImNhcHRpb25zZGlzYWJsZWRcIil9c2V0VGltZW91dCgoKCk9PntuJiZ0aGlzLmNhcHRpb25zLnRvZ2dsZWQmJih0aGlzLmNhcHRpb25zLmN1cnJlbnRUcmFja05vZGUubW9kZT1cImhpZGRlblwiKX0pKX0sc2V0KGUsdD0hMCl7Y29uc3QgaT1ZZS5nZXRUcmFja3MuY2FsbCh0aGlzKTtpZigtMSE9PWUpaWYoJChlKSlpZihlIGluIGkpe2lmKHRoaXMuY2FwdGlvbnMuY3VycmVudFRyYWNrIT09ZSl7dGhpcy5jYXB0aW9ucy5jdXJyZW50VHJhY2s9ZTtjb25zdCBzPWlbZV0se2xhbmd1YWdlOm59PXN8fHt9O3RoaXMuY2FwdGlvbnMuY3VycmVudFRyYWNrTm9kZT1zLFdlLnVwZGF0ZVNldHRpbmcuY2FsbCh0aGlzLFwiY2FwdGlvbnNcIiksdHx8KHRoaXMuY2FwdGlvbnMubGFuZ3VhZ2U9bix0aGlzLnN0b3JhZ2Uuc2V0KHtsYW5ndWFnZTpufSkpLHRoaXMuaXNWaW1lbyYmdGhpcy5lbWJlZC5lbmFibGVUZXh0VHJhY2sobiksdmUuY2FsbCh0aGlzLHRoaXMubWVkaWEsXCJsYW5ndWFnZWNoYW5nZVwiKX1ZZS50b2dnbGUuY2FsbCh0aGlzLCEwLHQpLHRoaXMuaXNIVE1MNSYmdGhpcy5pc1ZpZGVvJiZZZS51cGRhdGVDdWVzLmNhbGwodGhpcyl9ZWxzZSB0aGlzLmRlYnVnLndhcm4oXCJUcmFjayBub3QgZm91bmRcIixlKTtlbHNlIHRoaXMuZGVidWcud2FybihcIkludmFsaWQgY2FwdGlvbiBhcmd1bWVudFwiLGUpO2Vsc2UgWWUudG9nZ2xlLmNhbGwodGhpcywhMSx0KX0sc2V0TGFuZ3VhZ2UoZSx0PSEwKXtpZighXyhlKSlyZXR1cm4gdm9pZCB0aGlzLmRlYnVnLndhcm4oXCJJbnZhbGlkIGxhbmd1YWdlIGFyZ3VtZW50XCIsZSk7Y29uc3QgaT1lLnRvTG93ZXJDYXNlKCk7dGhpcy5jYXB0aW9ucy5sYW5ndWFnZT1pO2NvbnN0IHM9WWUuZ2V0VHJhY2tzLmNhbGwodGhpcyksbj1ZZS5maW5kVHJhY2suY2FsbCh0aGlzLFtpXSk7WWUuc2V0LmNhbGwodGhpcyxzLmluZGV4T2YobiksdCl9LGdldFRyYWNrcyhlPSExKXtyZXR1cm4gQXJyYXkuZnJvbSgodGhpcy5tZWRpYXx8e30pLnRleHRUcmFja3N8fFtdKS5maWx0ZXIoKHQ9PiF0aGlzLmlzSFRNTDV8fGV8fHRoaXMuY2FwdGlvbnMubWV0YS5oYXModCkpKS5maWx0ZXIoKGU9PltcImNhcHRpb25zXCIsXCJzdWJ0aXRsZXNcIl0uaW5jbHVkZXMoZS5raW5kKSkpfSxmaW5kVHJhY2soZSx0PSExKXtjb25zdCBpPVllLmdldFRyYWNrcy5jYWxsKHRoaXMpLHM9ZT0+TnVtYmVyKCh0aGlzLmNhcHRpb25zLm1ldGEuZ2V0KGUpfHx7fSkuZGVmYXVsdCksbj1BcnJheS5mcm9tKGkpLnNvcnQoKChlLHQpPT5zKHQpLXMoZSkpKTtsZXQgYTtyZXR1cm4gZS5ldmVyeSgoZT0+KGE9bi5maW5kKCh0PT50Lmxhbmd1YWdlPT09ZSkpLCFhKSkpLGF8fCh0P25bMF06dm9pZCAwKX0sZ2V0Q3VycmVudFRyYWNrKCl7cmV0dXJuIFllLmdldFRyYWNrcy5jYWxsKHRoaXMpW3RoaXMuY3VycmVudFRyYWNrXX0sZ2V0TGFiZWwoZSl7bGV0IHQ9ZTtyZXR1cm4hVih0KSYmbWUudGV4dFRyYWNrcyYmdGhpcy5jYXB0aW9ucy50b2dnbGVkJiYodD1ZZS5nZXRDdXJyZW50VHJhY2suY2FsbCh0aGlzKSksVih0KT9XKHQubGFiZWwpP1codC5sYW5ndWFnZSk/SGUuZ2V0KFwiZW5hYmxlZFwiLHRoaXMuY29uZmlnKTplLmxhbmd1YWdlLnRvVXBwZXJDYXNlKCk6dC5sYWJlbDpIZS5nZXQoXCJkaXNhYmxlZFwiLHRoaXMuY29uZmlnKX0sdXBkYXRlQ3VlcyhlKXtpZighdGhpcy5zdXBwb3J0ZWQudWkpcmV0dXJuO2lmKCFIKHRoaXMuZWxlbWVudHMuY2FwdGlvbnMpKXJldHVybiB2b2lkIHRoaXMuZGVidWcud2FybihcIk5vIGNhcHRpb25zIGVsZW1lbnQgdG8gcmVuZGVyIHRvXCIpO2lmKCFJKGUpJiYhQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gdm9pZCB0aGlzLmRlYnVnLndhcm4oXCJ1cGRhdGVDdWVzOiBJbnZhbGlkIGlucHV0XCIsZSk7bGV0IHQ9ZTtpZighdCl7Y29uc3QgZT1ZZS5nZXRDdXJyZW50VHJhY2suY2FsbCh0aGlzKTt0PUFycmF5LmZyb20oKGV8fHt9KS5hY3RpdmVDdWVzfHxbXSkubWFwKChlPT5lLmdldEN1ZUFzSFRNTCgpKSkubWFwKERlKX1jb25zdCBpPXQubWFwKChlPT5lLnRyaW0oKSkpLmpvaW4oXCJcXG5cIik7aWYoaSE9PXRoaXMuZWxlbWVudHMuY2FwdGlvbnMuaW5uZXJIVE1MKXtpZSh0aGlzLmVsZW1lbnRzLmNhcHRpb25zKTtjb25zdCBlPVooXCJzcGFuXCIsbmUodGhpcy5jb25maWcuc2VsZWN0b3JzLmNhcHRpb24pKTtlLmlubmVySFRNTD1pLHRoaXMuZWxlbWVudHMuY2FwdGlvbnMuYXBwZW5kQ2hpbGQoZSksdmUuY2FsbCh0aGlzLHRoaXMubWVkaWEsXCJjdWVjaGFuZ2VcIil9fX0sUWU9e2VuYWJsZWQ6ITAsdGl0bGU6XCJcIixkZWJ1ZzohMSxhdXRvcGxheTohMSxhdXRvcGF1c2U6ITAscGxheXNpbmxpbmU6ITAsc2Vla1RpbWU6MTAsdm9sdW1lOjEsbXV0ZWQ6ITEsZHVyYXRpb246bnVsbCxkaXNwbGF5RHVyYXRpb246ITAsaW52ZXJ0VGltZTohMCx0b2dnbGVJbnZlcnQ6ITAscmF0aW86bnVsbCxjbGlja1RvUGxheTohMCxoaWRlQ29udHJvbHM6ITAscmVzZXRPbkVuZDohMSxkaXNhYmxlQ29udGV4dE1lbnU6ITAsbG9hZFNwcml0ZTohMCxpY29uUHJlZml4OlwicGx5clwiLGljb25Vcmw6XCJodHRwczovL2Nkbi5wbHlyLmlvLzMuNy4yL3BseXIuc3ZnXCIsYmxhbmtWaWRlbzpcImh0dHBzOi8vY2RuLnBseXIuaW8vc3RhdGljL2JsYW5rLm1wNFwiLHF1YWxpdHk6e2RlZmF1bHQ6NTc2LG9wdGlvbnM6WzQzMjAsMjg4MCwyMTYwLDE0NDAsMTA4MCw3MjAsNTc2LDQ4MCwzNjAsMjQwXSxmb3JjZWQ6ITEsb25DaGFuZ2U6bnVsbH0sbG9vcDp7YWN0aXZlOiExfSxzcGVlZDp7c2VsZWN0ZWQ6MSxvcHRpb25zOlsuNSwuNzUsMSwxLjI1LDEuNSwxLjc1LDIsNF19LGtleWJvYXJkOntmb2N1c2VkOiEwLGdsb2JhbDohMX0sdG9vbHRpcHM6e2NvbnRyb2xzOiExLHNlZWs6ITB9LGNhcHRpb25zOnthY3RpdmU6ITEsbGFuZ3VhZ2U6XCJhdXRvXCIsdXBkYXRlOiExfSxmdWxsc2NyZWVuOntlbmFibGVkOiEwLGZhbGxiYWNrOiEwLGlvc05hdGl2ZTohMX0sc3RvcmFnZTp7ZW5hYmxlZDohMCxrZXk6XCJwbHlyXCJ9LGNvbnRyb2xzOltcInBsYXktbGFyZ2VcIixcInBsYXlcIixcInByb2dyZXNzXCIsXCJjdXJyZW50LXRpbWVcIixcIm11dGVcIixcInZvbHVtZVwiLFwiY2FwdGlvbnNcIixcInNldHRpbmdzXCIsXCJwaXBcIixcImFpcnBsYXlcIixcImZ1bGxzY3JlZW5cIl0sc2V0dGluZ3M6W1wiY2FwdGlvbnNcIixcInF1YWxpdHlcIixcInNwZWVkXCJdLGkxOG46e3Jlc3RhcnQ6XCJSZXN0YXJ0XCIscmV3aW5kOlwiUmV3aW5kIHtzZWVrdGltZX1zXCIscGxheTpcIlBsYXlcIixwYXVzZTpcIlBhdXNlXCIsZmFzdEZvcndhcmQ6XCJGb3J3YXJkIHtzZWVrdGltZX1zXCIsc2VlazpcIlNlZWtcIixzZWVrTGFiZWw6XCJ7Y3VycmVudFRpbWV9IG9mIHtkdXJhdGlvbn1cIixwbGF5ZWQ6XCJQbGF5ZWRcIixidWZmZXJlZDpcIkJ1ZmZlcmVkXCIsY3VycmVudFRpbWU6XCJDdXJyZW50IHRpbWVcIixkdXJhdGlvbjpcIkR1cmF0aW9uXCIsdm9sdW1lOlwiVm9sdW1lXCIsbXV0ZTpcIk11dGVcIix1bm11dGU6XCJVbm11dGVcIixlbmFibGVDYXB0aW9uczpcIkVuYWJsZSBjYXB0aW9uc1wiLGRpc2FibGVDYXB0aW9uczpcIkRpc2FibGUgY2FwdGlvbnNcIixkb3dubG9hZDpcIkRvd25sb2FkXCIsZW50ZXJGdWxsc2NyZWVuOlwiRW50ZXIgZnVsbHNjcmVlblwiLGV4aXRGdWxsc2NyZWVuOlwiRXhpdCBmdWxsc2NyZWVuXCIsZnJhbWVUaXRsZTpcIlBsYXllciBmb3Ige3RpdGxlfVwiLGNhcHRpb25zOlwiQ2FwdGlvbnNcIixzZXR0aW5nczpcIlNldHRpbmdzXCIscGlwOlwiUElQXCIsbWVudUJhY2s6XCJHbyBiYWNrIHRvIHByZXZpb3VzIG1lbnVcIixzcGVlZDpcIlNwZWVkXCIsbm9ybWFsOlwiTm9ybWFsXCIscXVhbGl0eTpcIlF1YWxpdHlcIixsb29wOlwiTG9vcFwiLHN0YXJ0OlwiU3RhcnRcIixlbmQ6XCJFbmRcIixhbGw6XCJBbGxcIixyZXNldDpcIlJlc2V0XCIsZGlzYWJsZWQ6XCJEaXNhYmxlZFwiLGVuYWJsZWQ6XCJFbmFibGVkXCIsYWR2ZXJ0aXNlbWVudDpcIkFkXCIscXVhbGl0eUJhZGdlOnsyMTYwOlwiNEtcIiwxNDQwOlwiSERcIiwxMDgwOlwiSERcIiw3MjA6XCJIRFwiLDU3NjpcIlNEXCIsNDgwOlwiU0RcIn19LHVybHM6e2Rvd25sb2FkOm51bGwsdmltZW86e3NkazpcImh0dHBzOi8vcGxheWVyLnZpbWVvLmNvbS9hcGkvcGxheWVyLmpzXCIsaWZyYW1lOlwiaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvL3swfT97MX1cIixhcGk6XCJodHRwczovL3ZpbWVvLmNvbS9hcGkvb2VtYmVkLmpzb24/dXJsPXswfVwifSx5b3V0dWJlOntzZGs6XCJodHRwczovL3d3dy55b3V0dWJlLmNvbS9pZnJhbWVfYXBpXCIsYXBpOlwiaHR0cHM6Ly9ub2VtYmVkLmNvbS9lbWJlZD91cmw9aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj17MH1cIn0sZ29vZ2xlSU1BOntzZGs6XCJodHRwczovL2ltYXNkay5nb29nbGVhcGlzLmNvbS9qcy9zZGtsb2FkZXIvaW1hMy5qc1wifX0sbGlzdGVuZXJzOntzZWVrOm51bGwscGxheTpudWxsLHBhdXNlOm51bGwscmVzdGFydDpudWxsLHJld2luZDpudWxsLGZhc3RGb3J3YXJkOm51bGwsbXV0ZTpudWxsLHZvbHVtZTpudWxsLGNhcHRpb25zOm51bGwsZG93bmxvYWQ6bnVsbCxmdWxsc2NyZWVuOm51bGwscGlwOm51bGwsYWlycGxheTpudWxsLHNwZWVkOm51bGwscXVhbGl0eTpudWxsLGxvb3A6bnVsbCxsYW5ndWFnZTpudWxsfSxldmVudHM6W1wiZW5kZWRcIixcInByb2dyZXNzXCIsXCJzdGFsbGVkXCIsXCJwbGF5aW5nXCIsXCJ3YWl0aW5nXCIsXCJjYW5wbGF5XCIsXCJjYW5wbGF5dGhyb3VnaFwiLFwibG9hZHN0YXJ0XCIsXCJsb2FkZWRkYXRhXCIsXCJsb2FkZWRtZXRhZGF0YVwiLFwidGltZXVwZGF0ZVwiLFwidm9sdW1lY2hhbmdlXCIsXCJwbGF5XCIsXCJwYXVzZVwiLFwiZXJyb3JcIixcInNlZWtpbmdcIixcInNlZWtlZFwiLFwiZW1wdGllZFwiLFwicmF0ZWNoYW5nZVwiLFwiY3VlY2hhbmdlXCIsXCJkb3dubG9hZFwiLFwiZW50ZXJmdWxsc2NyZWVuXCIsXCJleGl0ZnVsbHNjcmVlblwiLFwiY2FwdGlvbnNlbmFibGVkXCIsXCJjYXB0aW9uc2Rpc2FibGVkXCIsXCJsYW5ndWFnZWNoYW5nZVwiLFwiY29udHJvbHNoaWRkZW5cIixcImNvbnRyb2xzc2hvd25cIixcInJlYWR5XCIsXCJzdGF0ZWNoYW5nZVwiLFwicXVhbGl0eWNoYW5nZVwiLFwiYWRzbG9hZGVkXCIsXCJhZHNjb250ZW50cGF1c2VcIixcImFkc2NvbnRlbnRyZXN1bWVcIixcImFkc3RhcnRlZFwiLFwiYWRzbWlkcG9pbnRcIixcImFkc2NvbXBsZXRlXCIsXCJhZHNhbGxjb21wbGV0ZVwiLFwiYWRzaW1wcmVzc2lvblwiLFwiYWRzY2xpY2tcIl0sc2VsZWN0b3JzOntlZGl0YWJsZTpcImlucHV0LCB0ZXh0YXJlYSwgc2VsZWN0LCBbY29udGVudGVkaXRhYmxlXVwiLGNvbnRhaW5lcjpcIi5wbHlyXCIsY29udHJvbHM6e2NvbnRhaW5lcjpudWxsLHdyYXBwZXI6XCIucGx5cl9fY29udHJvbHNcIn0sbGFiZWxzOlwiW2RhdGEtcGx5cl1cIixidXR0b25zOntwbGF5OidbZGF0YS1wbHlyPVwicGxheVwiXScscGF1c2U6J1tkYXRhLXBseXI9XCJwYXVzZVwiXScscmVzdGFydDonW2RhdGEtcGx5cj1cInJlc3RhcnRcIl0nLHJld2luZDonW2RhdGEtcGx5cj1cInJld2luZFwiXScsZmFzdEZvcndhcmQ6J1tkYXRhLXBseXI9XCJmYXN0LWZvcndhcmRcIl0nLG11dGU6J1tkYXRhLXBseXI9XCJtdXRlXCJdJyxjYXB0aW9uczonW2RhdGEtcGx5cj1cImNhcHRpb25zXCJdJyxkb3dubG9hZDonW2RhdGEtcGx5cj1cImRvd25sb2FkXCJdJyxmdWxsc2NyZWVuOidbZGF0YS1wbHlyPVwiZnVsbHNjcmVlblwiXScscGlwOidbZGF0YS1wbHlyPVwicGlwXCJdJyxhaXJwbGF5OidbZGF0YS1wbHlyPVwiYWlycGxheVwiXScsc2V0dGluZ3M6J1tkYXRhLXBseXI9XCJzZXR0aW5nc1wiXScsbG9vcDonW2RhdGEtcGx5cj1cImxvb3BcIl0nfSxpbnB1dHM6e3NlZWs6J1tkYXRhLXBseXI9XCJzZWVrXCJdJyx2b2x1bWU6J1tkYXRhLXBseXI9XCJ2b2x1bWVcIl0nLHNwZWVkOidbZGF0YS1wbHlyPVwic3BlZWRcIl0nLGxhbmd1YWdlOidbZGF0YS1wbHlyPVwibGFuZ3VhZ2VcIl0nLHF1YWxpdHk6J1tkYXRhLXBseXI9XCJxdWFsaXR5XCJdJ30sZGlzcGxheTp7Y3VycmVudFRpbWU6XCIucGx5cl9fdGltZS0tY3VycmVudFwiLGR1cmF0aW9uOlwiLnBseXJfX3RpbWUtLWR1cmF0aW9uXCIsYnVmZmVyOlwiLnBseXJfX3Byb2dyZXNzX19idWZmZXJcIixsb29wOlwiLnBseXJfX3Byb2dyZXNzX19sb29wXCIsdm9sdW1lOlwiLnBseXJfX3ZvbHVtZS0tZGlzcGxheVwifSxwcm9ncmVzczpcIi5wbHlyX19wcm9ncmVzc1wiLGNhcHRpb25zOlwiLnBseXJfX2NhcHRpb25zXCIsY2FwdGlvbjpcIi5wbHlyX19jYXB0aW9uXCJ9LGNsYXNzTmFtZXM6e3R5cGU6XCJwbHlyLS17MH1cIixwcm92aWRlcjpcInBseXItLXswfVwiLHZpZGVvOlwicGx5cl9fdmlkZW8td3JhcHBlclwiLGVtYmVkOlwicGx5cl9fdmlkZW8tZW1iZWRcIix2aWRlb0ZpeGVkUmF0aW86XCJwbHlyX192aWRlby13cmFwcGVyLS1maXhlZC1yYXRpb1wiLGVtYmVkQ29udGFpbmVyOlwicGx5cl9fdmlkZW8tZW1iZWRfX2NvbnRhaW5lclwiLHBvc3RlcjpcInBseXJfX3Bvc3RlclwiLHBvc3RlckVuYWJsZWQ6XCJwbHlyX19wb3N0ZXItZW5hYmxlZFwiLGFkczpcInBseXJfX2Fkc1wiLGNvbnRyb2w6XCJwbHlyX19jb250cm9sXCIsY29udHJvbFByZXNzZWQ6XCJwbHlyX19jb250cm9sLS1wcmVzc2VkXCIscGxheWluZzpcInBseXItLXBsYXlpbmdcIixwYXVzZWQ6XCJwbHlyLS1wYXVzZWRcIixzdG9wcGVkOlwicGx5ci0tc3RvcHBlZFwiLGxvYWRpbmc6XCJwbHlyLS1sb2FkaW5nXCIsaG92ZXI6XCJwbHlyLS1ob3ZlclwiLHRvb2x0aXA6XCJwbHlyX190b29sdGlwXCIsY3VlczpcInBseXJfX2N1ZXNcIixtYXJrZXI6XCJwbHlyX19wcm9ncmVzc19fbWFya2VyXCIsaGlkZGVuOlwicGx5cl9fc3Itb25seVwiLGhpZGVDb250cm9sczpcInBseXItLWhpZGUtY29udHJvbHNcIixpc0lvczpcInBseXItLWlzLWlvc1wiLGlzVG91Y2g6XCJwbHlyLS1pcy10b3VjaFwiLHVpU3VwcG9ydGVkOlwicGx5ci0tZnVsbC11aVwiLG5vVHJhbnNpdGlvbjpcInBseXItLW5vLXRyYW5zaXRpb25cIixkaXNwbGF5Ont0aW1lOlwicGx5cl9fdGltZVwifSxtZW51Ont2YWx1ZTpcInBseXJfX21lbnVfX3ZhbHVlXCIsYmFkZ2U6XCJwbHlyX19iYWRnZVwiLG9wZW46XCJwbHlyLS1tZW51LW9wZW5cIn0sY2FwdGlvbnM6e2VuYWJsZWQ6XCJwbHlyLS1jYXB0aW9ucy1lbmFibGVkXCIsYWN0aXZlOlwicGx5ci0tY2FwdGlvbnMtYWN0aXZlXCJ9LGZ1bGxzY3JlZW46e2VuYWJsZWQ6XCJwbHlyLS1mdWxsc2NyZWVuLWVuYWJsZWRcIixmYWxsYmFjazpcInBseXItLWZ1bGxzY3JlZW4tZmFsbGJhY2tcIn0scGlwOntzdXBwb3J0ZWQ6XCJwbHlyLS1waXAtc3VwcG9ydGVkXCIsYWN0aXZlOlwicGx5ci0tcGlwLWFjdGl2ZVwifSxhaXJwbGF5OntzdXBwb3J0ZWQ6XCJwbHlyLS1haXJwbGF5LXN1cHBvcnRlZFwiLGFjdGl2ZTpcInBseXItLWFpcnBsYXktYWN0aXZlXCJ9LHRhYkZvY3VzOlwicGx5cl9fdGFiLWZvY3VzXCIscHJldmlld1RodW1ibmFpbHM6e3RodW1iQ29udGFpbmVyOlwicGx5cl9fcHJldmlldy10aHVtYlwiLHRodW1iQ29udGFpbmVyU2hvd246XCJwbHlyX19wcmV2aWV3LXRodW1iLS1pcy1zaG93blwiLGltYWdlQ29udGFpbmVyOlwicGx5cl9fcHJldmlldy10aHVtYl9faW1hZ2UtY29udGFpbmVyXCIsdGltZUNvbnRhaW5lcjpcInBseXJfX3ByZXZpZXctdGh1bWJfX3RpbWUtY29udGFpbmVyXCIsc2NydWJiaW5nQ29udGFpbmVyOlwicGx5cl9fcHJldmlldy1zY3J1YmJpbmdcIixzY3J1YmJpbmdDb250YWluZXJTaG93bjpcInBseXJfX3ByZXZpZXctc2NydWJiaW5nLS1pcy1zaG93blwifX0sYXR0cmlidXRlczp7ZW1iZWQ6e3Byb3ZpZGVyOlwiZGF0YS1wbHlyLXByb3ZpZGVyXCIsaWQ6XCJkYXRhLXBseXItZW1iZWQtaWRcIixoYXNoOlwiZGF0YS1wbHlyLWVtYmVkLWhhc2hcIn19LGFkczp7ZW5hYmxlZDohMSxwdWJsaXNoZXJJZDpcIlwiLHRhZ1VybDpcIlwifSxwcmV2aWV3VGh1bWJuYWlsczp7ZW5hYmxlZDohMSxzcmM6XCJcIn0sdmltZW86e2J5bGluZTohMSxwb3J0cmFpdDohMSx0aXRsZTohMSxzcGVlZDohMCx0cmFuc3BhcmVudDohMSxjdXN0b21Db250cm9sczohMCxyZWZlcnJlclBvbGljeTpudWxsLHByZW1pdW06ITF9LHlvdXR1YmU6e3JlbDowLHNob3dpbmZvOjAsaXZfbG9hZF9wb2xpY3k6Myxtb2Rlc3RicmFuZGluZzoxLGN1c3RvbUNvbnRyb2xzOiEwLG5vQ29va2llOiExfSxtZWRpYU1ldGFkYXRhOnt0aXRsZTpcIlwiLGFydGlzdDpcIlwiLGFsYnVtOlwiXCIsYXJ0d29yazpbXX0sbWFya2Vyczp7ZW5hYmxlZDohMSxwb2ludHM6W119fSxYZT1cInBpY3R1cmUtaW4tcGljdHVyZVwiLEplPVwiaW5saW5lXCIsR2U9e2h0bWw1OlwiaHRtbDVcIix5b3V0dWJlOlwieW91dHViZVwiLHZpbWVvOlwidmltZW9cIn0sWmU9XCJhdWRpb1wiLGV0PVwidmlkZW9cIjtjb25zdCB0dD0oKT0+e307Y2xhc3MgaXR7Y29uc3RydWN0b3IoZT0hMSl7dGhpcy5lbmFibGVkPXdpbmRvdy5jb25zb2xlJiZlLHRoaXMuZW5hYmxlZCYmdGhpcy5sb2coXCJEZWJ1Z2dpbmcgZW5hYmxlZFwiKX1nZXQgbG9nKCl7cmV0dXJuIHRoaXMuZW5hYmxlZD9GdW5jdGlvbi5wcm90b3R5cGUuYmluZC5jYWxsKGNvbnNvbGUubG9nLGNvbnNvbGUpOnR0fWdldCB3YXJuKCl7cmV0dXJuIHRoaXMuZW5hYmxlZD9GdW5jdGlvbi5wcm90b3R5cGUuYmluZC5jYWxsKGNvbnNvbGUud2Fybixjb25zb2xlKTp0dH1nZXQgZXJyb3IoKXtyZXR1cm4gdGhpcy5lbmFibGVkP0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwoY29uc29sZS5lcnJvcixjb25zb2xlKTp0dH19Y2xhc3Mgc3R7Y29uc3RydWN0b3IodCl7ZSh0aGlzLFwib25DaGFuZ2VcIiwoKCk9PntpZighdGhpcy5lbmFibGVkKXJldHVybjtjb25zdCBlPXRoaXMucGxheWVyLmVsZW1lbnRzLmJ1dHRvbnMuZnVsbHNjcmVlbjtIKGUpJiYoZS5wcmVzc2VkPXRoaXMuYWN0aXZlKTtjb25zdCB0PXRoaXMudGFyZ2V0PT09dGhpcy5wbGF5ZXIubWVkaWE/dGhpcy50YXJnZXQ6dGhpcy5wbGF5ZXIuZWxlbWVudHMuY29udGFpbmVyO3ZlLmNhbGwodGhpcy5wbGF5ZXIsdCx0aGlzLmFjdGl2ZT9cImVudGVyZnVsbHNjcmVlblwiOlwiZXhpdGZ1bGxzY3JlZW5cIiwhMCl9KSksZSh0aGlzLFwidG9nZ2xlRmFsbGJhY2tcIiwoKGU9ITEpPT57aWYoZT90aGlzLnNjcm9sbFBvc2l0aW9uPXt4OndpbmRvdy5zY3JvbGxYfHwwLHk6d2luZG93LnNjcm9sbFl8fDB9OndpbmRvdy5zY3JvbGxUbyh0aGlzLnNjcm9sbFBvc2l0aW9uLngsdGhpcy5zY3JvbGxQb3NpdGlvbi55KSxkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93PWU/XCJoaWRkZW5cIjpcIlwiLGxlKHRoaXMudGFyZ2V0LHRoaXMucGxheWVyLmNvbmZpZy5jbGFzc05hbWVzLmZ1bGxzY3JlZW4uZmFsbGJhY2ssZSksWS5pc0lvcyl7bGV0IHQ9ZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJ2aWV3cG9ydFwiXScpO2NvbnN0IGk9XCJ2aWV3cG9ydC1maXQ9Y292ZXJcIjt0fHwodD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibWV0YVwiKSx0LnNldEF0dHJpYnV0ZShcIm5hbWVcIixcInZpZXdwb3J0XCIpKTtjb25zdCBzPV8odC5jb250ZW50KSYmdC5jb250ZW50LmluY2x1ZGVzKGkpO2U/KHRoaXMuY2xlYW51cFZpZXdwb3J0PSFzLHN8fCh0LmNvbnRlbnQrPWAsJHtpfWApKTp0aGlzLmNsZWFudXBWaWV3cG9ydCYmKHQuY29udGVudD10LmNvbnRlbnQuc3BsaXQoXCIsXCIpLmZpbHRlcigoZT0+ZS50cmltKCkhPT1pKSkuam9pbihcIixcIikpfXRoaXMub25DaGFuZ2UoKX0pKSxlKHRoaXMsXCJ0cmFwRm9jdXNcIiwoZT0+e2lmKFkuaXNJb3N8fCF0aGlzLmFjdGl2ZXx8XCJUYWJcIiE9PWUua2V5KXJldHVybjtjb25zdCB0PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsaT1jZS5jYWxsKHRoaXMucGxheWVyLFwiYVtocmVmXSwgYnV0dG9uOm5vdCg6ZGlzYWJsZWQpLCBpbnB1dDpub3QoOmRpc2FibGVkKSwgW3RhYmluZGV4XVwiKSxbc109aSxuPWlbaS5sZW5ndGgtMV07dCE9PW58fGUuc2hpZnRLZXk/dD09PXMmJmUuc2hpZnRLZXkmJihuLmZvY3VzKCksZS5wcmV2ZW50RGVmYXVsdCgpKToocy5mb2N1cygpLGUucHJldmVudERlZmF1bHQoKSl9KSksZSh0aGlzLFwidXBkYXRlXCIsKCgpPT57aWYodGhpcy5lbmFibGVkKXtsZXQgZTtlPXRoaXMuZm9yY2VGYWxsYmFjaz9cIkZhbGxiYWNrIChmb3JjZWQpXCI6c3QubmF0aXZlP1wiTmF0aXZlXCI6XCJGYWxsYmFja1wiLHRoaXMucGxheWVyLmRlYnVnLmxvZyhgJHtlfSBmdWxsc2NyZWVuIGVuYWJsZWRgKX1lbHNlIHRoaXMucGxheWVyLmRlYnVnLmxvZyhcIkZ1bGxzY3JlZW4gbm90IHN1cHBvcnRlZCBhbmQgZmFsbGJhY2sgZGlzYWJsZWRcIik7bGUodGhpcy5wbGF5ZXIuZWxlbWVudHMuY29udGFpbmVyLHRoaXMucGxheWVyLmNvbmZpZy5jbGFzc05hbWVzLmZ1bGxzY3JlZW4uZW5hYmxlZCx0aGlzLmVuYWJsZWQpfSkpLGUodGhpcyxcImVudGVyXCIsKCgpPT57dGhpcy5lbmFibGVkJiYoWS5pc0lvcyYmdGhpcy5wbGF5ZXIuY29uZmlnLmZ1bGxzY3JlZW4uaW9zTmF0aXZlP3RoaXMucGxheWVyLmlzVmltZW8/dGhpcy5wbGF5ZXIuZW1iZWQucmVxdWVzdEZ1bGxzY3JlZW4oKTp0aGlzLnRhcmdldC53ZWJraXRFbnRlckZ1bGxzY3JlZW4oKTohc3QubmF0aXZlfHx0aGlzLmZvcmNlRmFsbGJhY2s/dGhpcy50b2dnbGVGYWxsYmFjayghMCk6dGhpcy5wcmVmaXg/Vyh0aGlzLnByZWZpeCl8fHRoaXMudGFyZ2V0W2Ake3RoaXMucHJlZml4fVJlcXVlc3Qke3RoaXMucHJvcGVydHl9YF0oKTp0aGlzLnRhcmdldC5yZXF1ZXN0RnVsbHNjcmVlbih7bmF2aWdhdGlvblVJOlwiaGlkZVwifSkpfSkpLGUodGhpcyxcImV4aXRcIiwoKCk9PntpZih0aGlzLmVuYWJsZWQpaWYoWS5pc0lvcyYmdGhpcy5wbGF5ZXIuY29uZmlnLmZ1bGxzY3JlZW4uaW9zTmF0aXZlKXRoaXMudGFyZ2V0LndlYmtpdEV4aXRGdWxsc2NyZWVuKCksa2UodGhpcy5wbGF5ZXIucGxheSgpKTtlbHNlIGlmKCFzdC5uYXRpdmV8fHRoaXMuZm9yY2VGYWxsYmFjayl0aGlzLnRvZ2dsZUZhbGxiYWNrKCExKTtlbHNlIGlmKHRoaXMucHJlZml4KXtpZighVyh0aGlzLnByZWZpeCkpe2NvbnN0IGU9XCJtb3pcIj09PXRoaXMucHJlZml4P1wiQ2FuY2VsXCI6XCJFeGl0XCI7ZG9jdW1lbnRbYCR7dGhpcy5wcmVmaXh9JHtlfSR7dGhpcy5wcm9wZXJ0eX1gXSgpfX1lbHNlKGRvY3VtZW50LmNhbmNlbEZ1bGxTY3JlZW58fGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKS5jYWxsKGRvY3VtZW50KX0pKSxlKHRoaXMsXCJ0b2dnbGVcIiwoKCk9Pnt0aGlzLmFjdGl2ZT90aGlzLmV4aXQoKTp0aGlzLmVudGVyKCl9KSksdGhpcy5wbGF5ZXI9dCx0aGlzLnByZWZpeD1zdC5wcmVmaXgsdGhpcy5wcm9wZXJ0eT1zdC5wcm9wZXJ0eSx0aGlzLnNjcm9sbFBvc2l0aW9uPXt4OjAseTowfSx0aGlzLmZvcmNlRmFsbGJhY2s9XCJmb3JjZVwiPT09dC5jb25maWcuZnVsbHNjcmVlbi5mYWxsYmFjayx0aGlzLnBsYXllci5lbGVtZW50cy5mdWxsc2NyZWVuPXQuY29uZmlnLmZ1bGxzY3JlZW4uY29udGFpbmVyJiZmdW5jdGlvbihlLHQpe2NvbnN0e3Byb3RvdHlwZTppfT1FbGVtZW50O3JldHVybihpLmNsb3Nlc3R8fGZ1bmN0aW9uKCl7bGV0IGU9dGhpcztkb3tpZihyZS5tYXRjaGVzKGUsdCkpcmV0dXJuIGU7ZT1lLnBhcmVudEVsZW1lbnR8fGUucGFyZW50Tm9kZX13aGlsZShudWxsIT09ZSYmMT09PWUubm9kZVR5cGUpO3JldHVybiBudWxsfSkuY2FsbChlLHQpfSh0aGlzLnBsYXllci5lbGVtZW50cy5jb250YWluZXIsdC5jb25maWcuZnVsbHNjcmVlbi5jb250YWluZXIpLGZlLmNhbGwodGhpcy5wbGF5ZXIsZG9jdW1lbnQsXCJtc1wiPT09dGhpcy5wcmVmaXg/XCJNU0Z1bGxzY3JlZW5DaGFuZ2VcIjpgJHt0aGlzLnByZWZpeH1mdWxsc2NyZWVuY2hhbmdlYCwoKCk9Pnt0aGlzLm9uQ2hhbmdlKCl9KSksZmUuY2FsbCh0aGlzLnBsYXllcix0aGlzLnBsYXllci5lbGVtZW50cy5jb250YWluZXIsXCJkYmxjbGlja1wiLChlPT57SCh0aGlzLnBsYXllci5lbGVtZW50cy5jb250cm9scykmJnRoaXMucGxheWVyLmVsZW1lbnRzLmNvbnRyb2xzLmNvbnRhaW5zKGUudGFyZ2V0KXx8dGhpcy5wbGF5ZXIubGlzdGVuZXJzLnByb3h5KGUsdGhpcy50b2dnbGUsXCJmdWxsc2NyZWVuXCIpfSkpLGZlLmNhbGwodGhpcyx0aGlzLnBsYXllci5lbGVtZW50cy5jb250YWluZXIsXCJrZXlkb3duXCIsKGU9PnRoaXMudHJhcEZvY3VzKGUpKSksdGhpcy51cGRhdGUoKX1zdGF0aWMgZ2V0IG5hdGl2ZSgpe3JldHVybiEhKGRvY3VtZW50LmZ1bGxzY3JlZW5FbmFibGVkfHxkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRW5hYmxlZHx8ZG9jdW1lbnQubW96RnVsbFNjcmVlbkVuYWJsZWR8fGRvY3VtZW50Lm1zRnVsbHNjcmVlbkVuYWJsZWQpfWdldCB1c2luZ05hdGl2ZSgpe3JldHVybiBzdC5uYXRpdmUmJiF0aGlzLmZvcmNlRmFsbGJhY2t9c3RhdGljIGdldCBwcmVmaXgoKXtpZihqKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKSlyZXR1cm5cIlwiO2xldCBlPVwiXCI7cmV0dXJuW1wid2Via2l0XCIsXCJtb3pcIixcIm1zXCJdLnNvbWUoKHQ9PiEoIWooZG9jdW1lbnRbYCR7dH1FeGl0RnVsbHNjcmVlbmBdKSYmIWooZG9jdW1lbnRbYCR7dH1DYW5jZWxGdWxsU2NyZWVuYF0pKSYmKGU9dCwhMCkpKSxlfXN0YXRpYyBnZXQgcHJvcGVydHkoKXtyZXR1cm5cIm1velwiPT09dGhpcy5wcmVmaXg/XCJGdWxsU2NyZWVuXCI6XCJGdWxsc2NyZWVuXCJ9Z2V0IGVuYWJsZWQoKXtyZXR1cm4oc3QubmF0aXZlfHx0aGlzLnBsYXllci5jb25maWcuZnVsbHNjcmVlbi5mYWxsYmFjaykmJnRoaXMucGxheWVyLmNvbmZpZy5mdWxsc2NyZWVuLmVuYWJsZWQmJnRoaXMucGxheWVyLnN1cHBvcnRlZC51aSYmdGhpcy5wbGF5ZXIuaXNWaWRlb31nZXQgYWN0aXZlKCl7aWYoIXRoaXMuZW5hYmxlZClyZXR1cm4hMTtpZighc3QubmF0aXZlfHx0aGlzLmZvcmNlRmFsbGJhY2spcmV0dXJuIG9lKHRoaXMudGFyZ2V0LHRoaXMucGxheWVyLmNvbmZpZy5jbGFzc05hbWVzLmZ1bGxzY3JlZW4uZmFsbGJhY2spO2NvbnN0IGU9dGhpcy5wcmVmaXg/dGhpcy50YXJnZXQuZ2V0Um9vdE5vZGUoKVtgJHt0aGlzLnByZWZpeH0ke3RoaXMucHJvcGVydHl9RWxlbWVudGBdOnRoaXMudGFyZ2V0LmdldFJvb3ROb2RlKCkuZnVsbHNjcmVlbkVsZW1lbnQ7cmV0dXJuIGUmJmUuc2hhZG93Um9vdD9lPT09dGhpcy50YXJnZXQuZ2V0Um9vdE5vZGUoKS5ob3N0OmU9PT10aGlzLnRhcmdldH1nZXQgdGFyZ2V0KCl7cmV0dXJuIFkuaXNJb3MmJnRoaXMucGxheWVyLmNvbmZpZy5mdWxsc2NyZWVuLmlvc05hdGl2ZT90aGlzLnBsYXllci5tZWRpYTp0aGlzLnBsYXllci5lbGVtZW50cy5mdWxsc2NyZWVufHx0aGlzLnBsYXllci5lbGVtZW50cy5jb250YWluZXJ9fWZ1bmN0aW9uIG50KGUsdD0xKXtyZXR1cm4gbmV3IFByb21pc2UoKChpLHMpPT57Y29uc3Qgbj1uZXcgSW1hZ2UsYT0oKT0+e2RlbGV0ZSBuLm9ubG9hZCxkZWxldGUgbi5vbmVycm9yLChuLm5hdHVyYWxXaWR0aD49dD9pOnMpKG4pfTtPYmplY3QuYXNzaWduKG4se29ubG9hZDphLG9uZXJyb3I6YSxzcmM6ZX0pfSkpfWNvbnN0IGF0PXthZGRTdHlsZUhvb2soKXtsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5zZWxlY3RvcnMuY29udGFpbmVyLnJlcGxhY2UoXCIuXCIsXCJcIiksITApLGxlKHRoaXMuZWxlbWVudHMuY29udGFpbmVyLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMudWlTdXBwb3J0ZWQsdGhpcy5zdXBwb3J0ZWQudWkpfSx0b2dnbGVOYXRpdmVDb250cm9scyhlPSExKXtlJiZ0aGlzLmlzSFRNTDU/dGhpcy5tZWRpYS5zZXRBdHRyaWJ1dGUoXCJjb250cm9sc1wiLFwiXCIpOnRoaXMubWVkaWEucmVtb3ZlQXR0cmlidXRlKFwiY29udHJvbHNcIil9LGJ1aWxkKCl7aWYodGhpcy5saXN0ZW5lcnMubWVkaWEoKSwhdGhpcy5zdXBwb3J0ZWQudWkpcmV0dXJuIHRoaXMuZGVidWcud2FybihgQmFzaWMgc3VwcG9ydCBvbmx5IGZvciAke3RoaXMucHJvdmlkZXJ9ICR7dGhpcy50eXBlfWApLHZvaWQgYXQudG9nZ2xlTmF0aXZlQ29udHJvbHMuY2FsbCh0aGlzLCEwKTtIKHRoaXMuZWxlbWVudHMuY29udHJvbHMpfHwoV2UuaW5qZWN0LmNhbGwodGhpcyksdGhpcy5saXN0ZW5lcnMuY29udHJvbHMoKSksYXQudG9nZ2xlTmF0aXZlQ29udHJvbHMuY2FsbCh0aGlzKSx0aGlzLmlzSFRNTDUmJlllLnNldHVwLmNhbGwodGhpcyksdGhpcy52b2x1bWU9bnVsbCx0aGlzLm11dGVkPW51bGwsdGhpcy5sb29wPW51bGwsdGhpcy5xdWFsaXR5PW51bGwsdGhpcy5zcGVlZD1udWxsLFdlLnVwZGF0ZVZvbHVtZS5jYWxsKHRoaXMpLFdlLnRpbWVVcGRhdGUuY2FsbCh0aGlzKSxXZS5kdXJhdGlvblVwZGF0ZS5jYWxsKHRoaXMpLGF0LmNoZWNrUGxheWluZy5jYWxsKHRoaXMpLGxlKHRoaXMuZWxlbWVudHMuY29udGFpbmVyLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMucGlwLnN1cHBvcnRlZCxtZS5waXAmJnRoaXMuaXNIVE1MNSYmdGhpcy5pc1ZpZGVvKSxsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5jbGFzc05hbWVzLmFpcnBsYXkuc3VwcG9ydGVkLG1lLmFpcnBsYXkmJnRoaXMuaXNIVE1MNSksbGUodGhpcy5lbGVtZW50cy5jb250YWluZXIsdGhpcy5jb25maWcuY2xhc3NOYW1lcy5pc0lvcyxZLmlzSW9zKSxsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5jbGFzc05hbWVzLmlzVG91Y2gsdGhpcy50b3VjaCksdGhpcy5yZWFkeT0hMCxzZXRUaW1lb3V0KCgoKT0+e3ZlLmNhbGwodGhpcyx0aGlzLm1lZGlhLFwicmVhZHlcIil9KSwwKSxhdC5zZXRUaXRsZS5jYWxsKHRoaXMpLHRoaXMucG9zdGVyJiZhdC5zZXRQb3N0ZXIuY2FsbCh0aGlzLHRoaXMucG9zdGVyLCExKS5jYXRjaCgoKCk9Pnt9KSksdGhpcy5jb25maWcuZHVyYXRpb24mJldlLmR1cmF0aW9uVXBkYXRlLmNhbGwodGhpcyksdGhpcy5jb25maWcubWVkaWFNZXRhZGF0YSYmV2Uuc2V0TWVkaWFNZXRhZGF0YS5jYWxsKHRoaXMpfSxzZXRUaXRsZSgpe2xldCBlPUhlLmdldChcInBsYXlcIix0aGlzLmNvbmZpZyk7aWYoXyh0aGlzLmNvbmZpZy50aXRsZSkmJiFXKHRoaXMuY29uZmlnLnRpdGxlKSYmKGUrPWAsICR7dGhpcy5jb25maWcudGl0bGV9YCksQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnRzLmJ1dHRvbnMucGxheXx8W10pLmZvckVhY2goKHQ9Pnt0LnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIixlKX0pKSx0aGlzLmlzRW1iZWQpe2NvbnN0IGU9aGUuY2FsbCh0aGlzLFwiaWZyYW1lXCIpO2lmKCFIKGUpKXJldHVybjtjb25zdCB0PVcodGhpcy5jb25maWcudGl0bGUpP1widmlkZW9cIjp0aGlzLmNvbmZpZy50aXRsZSxpPUhlLmdldChcImZyYW1lVGl0bGVcIix0aGlzLmNvbmZpZyk7ZS5zZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiLGkucmVwbGFjZShcInt0aXRsZX1cIix0KSl9fSx0b2dnbGVQb3N0ZXIoZSl7bGUodGhpcy5lbGVtZW50cy5jb250YWluZXIsdGhpcy5jb25maWcuY2xhc3NOYW1lcy5wb3N0ZXJFbmFibGVkLGUpfSxzZXRQb3N0ZXIoZSx0PSEwKXtyZXR1cm4gdCYmdGhpcy5wb3N0ZXI/UHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiUG9zdGVyIGFscmVhZHkgc2V0XCIpKToodGhpcy5tZWRpYS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXBvc3RlclwiLGUpLHRoaXMuZWxlbWVudHMucG9zdGVyLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKSxUZS5jYWxsKHRoaXMpLnRoZW4oKCgpPT5udChlKSkpLmNhdGNoKCh0PT57dGhyb3cgZT09PXRoaXMucG9zdGVyJiZhdC50b2dnbGVQb3N0ZXIuY2FsbCh0aGlzLCExKSx0fSkpLnRoZW4oKCgpPT57aWYoZSE9PXRoaXMucG9zdGVyKXRocm93IG5ldyBFcnJvcihcInNldFBvc3RlciBjYW5jZWxsZWQgYnkgbGF0ZXIgY2FsbCB0byBzZXRQb3N0ZXJcIil9KSkudGhlbigoKCk9PihPYmplY3QuYXNzaWduKHRoaXMuZWxlbWVudHMucG9zdGVyLnN0eWxlLHtiYWNrZ3JvdW5kSW1hZ2U6YHVybCgnJHtlfScpYCxiYWNrZ3JvdW5kU2l6ZTpcIlwifSksYXQudG9nZ2xlUG9zdGVyLmNhbGwodGhpcywhMCksZSkpKSl9LGNoZWNrUGxheWluZyhlKXtsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5jbGFzc05hbWVzLnBsYXlpbmcsdGhpcy5wbGF5aW5nKSxsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5jbGFzc05hbWVzLnBhdXNlZCx0aGlzLnBhdXNlZCksbGUodGhpcy5lbGVtZW50cy5jb250YWluZXIsdGhpcy5jb25maWcuY2xhc3NOYW1lcy5zdG9wcGVkLHRoaXMuc3RvcHBlZCksQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnRzLmJ1dHRvbnMucGxheXx8W10pLmZvckVhY2goKGU9PntPYmplY3QuYXNzaWduKGUse3ByZXNzZWQ6dGhpcy5wbGF5aW5nfSksZS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsSGUuZ2V0KHRoaXMucGxheWluZz9cInBhdXNlXCI6XCJwbGF5XCIsdGhpcy5jb25maWcpKX0pKSxSKGUpJiZcInRpbWV1cGRhdGVcIj09PWUudHlwZXx8YXQudG9nZ2xlQ29udHJvbHMuY2FsbCh0aGlzKX0sY2hlY2tMb2FkaW5nKGUpe3RoaXMubG9hZGluZz1bXCJzdGFsbGVkXCIsXCJ3YWl0aW5nXCJdLmluY2x1ZGVzKGUudHlwZSksY2xlYXJUaW1lb3V0KHRoaXMudGltZXJzLmxvYWRpbmcpLHRoaXMudGltZXJzLmxvYWRpbmc9c2V0VGltZW91dCgoKCk9PntsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5jbGFzc05hbWVzLmxvYWRpbmcsdGhpcy5sb2FkaW5nKSxhdC50b2dnbGVDb250cm9scy5jYWxsKHRoaXMpfSksdGhpcy5sb2FkaW5nPzI1MDowKX0sdG9nZ2xlQ29udHJvbHMoZSl7Y29uc3R7Y29udHJvbHM6dH09dGhpcy5lbGVtZW50cztpZih0JiZ0aGlzLmNvbmZpZy5oaWRlQ29udHJvbHMpe2NvbnN0IGk9dGhpcy50b3VjaCYmdGhpcy5sYXN0U2Vla1RpbWUrMmUzPkRhdGUubm93KCk7dGhpcy50b2dnbGVDb250cm9scyhCb29sZWFuKGV8fHRoaXMubG9hZGluZ3x8dGhpcy5wYXVzZWR8fHQucHJlc3NlZHx8dC5ob3Zlcnx8aSkpfX0sbWlncmF0ZVN0eWxlcygpe09iamVjdC52YWx1ZXMoey4uLnRoaXMubWVkaWEuc3R5bGV9KS5maWx0ZXIoKGU9PiFXKGUpJiZfKGUpJiZlLnN0YXJ0c1dpdGgoXCItLXBseXJcIikpKS5mb3JFYWNoKChlPT57dGhpcy5lbGVtZW50cy5jb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoZSx0aGlzLm1lZGlhLnN0eWxlLmdldFByb3BlcnR5VmFsdWUoZSkpLHRoaXMubWVkaWEuc3R5bGUucmVtb3ZlUHJvcGVydHkoZSl9KSksVyh0aGlzLm1lZGlhLnN0eWxlKSYmdGhpcy5tZWRpYS5yZW1vdmVBdHRyaWJ1dGUoXCJzdHlsZVwiKX19O2NsYXNzIGx0e2NvbnN0cnVjdG9yKHQpe2UodGhpcyxcImZpcnN0VG91Y2hcIiwoKCk9Pntjb25zdHtwbGF5ZXI6ZX09dGhpcyx7ZWxlbWVudHM6dH09ZTtlLnRvdWNoPSEwLGxlKHQuY29udGFpbmVyLGUuY29uZmlnLmNsYXNzTmFtZXMuaXNUb3VjaCwhMCl9KSksZSh0aGlzLFwic2V0VGFiRm9jdXNcIiwoZT0+e2NvbnN0e3BsYXllcjp0fT10aGlzLHtlbGVtZW50czppfT10LHtrZXk6cyx0eXBlOm4sdGltZVN0YW1wOmF9PWU7aWYoY2xlYXJUaW1lb3V0KHRoaXMuZm9jdXNUaW1lciksXCJrZXlkb3duXCI9PT1uJiZcIlRhYlwiIT09cylyZXR1cm47XCJrZXlkb3duXCI9PT1uJiYodGhpcy5sYXN0S2V5RG93bj1hKTtjb25zdCBsPWEtdGhpcy5sYXN0S2V5RG93bjw9MjA7KFwiZm9jdXNcIiE9PW58fGwpJiYoKCgpPT57Y29uc3QgZT10LmNvbmZpZy5jbGFzc05hbWVzLnRhYkZvY3VzO2xlKGNlLmNhbGwodCxgLiR7ZX1gKSxlLCExKX0pKCksXCJmb2N1c291dFwiIT09biYmKHRoaXMuZm9jdXNUaW1lcj1zZXRUaW1lb3V0KCgoKT0+e2NvbnN0IGU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpLmNvbnRhaW5lci5jb250YWlucyhlKSYmbGUoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCx0LmNvbmZpZy5jbGFzc05hbWVzLnRhYkZvY3VzLCEwKX0pLDEwKSkpfSkpLGUodGhpcyxcImdsb2JhbFwiLCgoZT0hMCk9Pntjb25zdHtwbGF5ZXI6dH09dGhpczt0LmNvbmZpZy5rZXlib2FyZC5nbG9iYWwmJmdlLmNhbGwodCx3aW5kb3csXCJrZXlkb3duIGtleXVwXCIsdGhpcy5oYW5kbGVLZXksZSwhMSksZ2UuY2FsbCh0LGRvY3VtZW50LmJvZHksXCJjbGlja1wiLHRoaXMudG9nZ2xlTWVudSxlKSx5ZS5jYWxsKHQsZG9jdW1lbnQuYm9keSxcInRvdWNoc3RhcnRcIix0aGlzLmZpcnN0VG91Y2gpLGdlLmNhbGwodCxkb2N1bWVudC5ib2R5LFwia2V5ZG93biBmb2N1cyBibHVyIGZvY3Vzb3V0XCIsdGhpcy5zZXRUYWJGb2N1cyxlLCExLCEwKX0pKSxlKHRoaXMsXCJjb250YWluZXJcIiwoKCk9Pntjb25zdHtwbGF5ZXI6ZX09dGhpcyx7Y29uZmlnOnQsZWxlbWVudHM6aSx0aW1lcnM6c309ZTshdC5rZXlib2FyZC5nbG9iYWwmJnQua2V5Ym9hcmQuZm9jdXNlZCYmZmUuY2FsbChlLGkuY29udGFpbmVyLFwia2V5ZG93biBrZXl1cFwiLHRoaXMuaGFuZGxlS2V5LCExKSxmZS5jYWxsKGUsaS5jb250YWluZXIsXCJtb3VzZW1vdmUgbW91c2VsZWF2ZSB0b3VjaHN0YXJ0IHRvdWNobW92ZSBlbnRlcmZ1bGxzY3JlZW4gZXhpdGZ1bGxzY3JlZW5cIiwodD0+e2NvbnN0e2NvbnRyb2xzOm59PWk7biYmXCJlbnRlcmZ1bGxzY3JlZW5cIj09PXQudHlwZSYmKG4ucHJlc3NlZD0hMSxuLmhvdmVyPSExKTtsZXQgYT0wO1tcInRvdWNoc3RhcnRcIixcInRvdWNobW92ZVwiLFwibW91c2Vtb3ZlXCJdLmluY2x1ZGVzKHQudHlwZSkmJihhdC50b2dnbGVDb250cm9scy5jYWxsKGUsITApLGE9ZS50b3VjaD8zZTM6MmUzKSxjbGVhclRpbWVvdXQocy5jb250cm9scykscy5jb250cm9scz1zZXRUaW1lb3V0KCgoKT0+YXQudG9nZ2xlQ29udHJvbHMuY2FsbChlLCExKSksYSl9KSk7Y29uc3Qgbj0oKT0+e2lmKCFlLmlzVmltZW98fGUuY29uZmlnLnZpbWVvLnByZW1pdW0pcmV0dXJuO2NvbnN0IHQ9aS53cmFwcGVyLHthY3RpdmU6c309ZS5mdWxsc2NyZWVuLFtuLGFdPU5lLmNhbGwoZSksbD1TZShgYXNwZWN0LXJhdGlvOiAke259IC8gJHthfWApO2lmKCFzKXJldHVybiB2b2lkKGw/KHQuc3R5bGUud2lkdGg9bnVsbCx0LnN0eWxlLmhlaWdodD1udWxsKToodC5zdHlsZS5tYXhXaWR0aD1udWxsLHQuc3R5bGUubWFyZ2luPW51bGwpKTtjb25zdFtvLHJdPVtNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fDAsd2luZG93LmlubmVyV2lkdGh8fDApLE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHR8fDAsd2luZG93LmlubmVySGVpZ2h0fHwwKV0sYz1vL3I+bi9hO2w/KHQuc3R5bGUud2lkdGg9Yz9cImF1dG9cIjpcIjEwMCVcIix0LnN0eWxlLmhlaWdodD1jP1wiMTAwJVwiOlwiYXV0b1wiKToodC5zdHlsZS5tYXhXaWR0aD1jP3IvYSpuK1wicHhcIjpudWxsLHQuc3R5bGUubWFyZ2luPWM/XCIwIGF1dG9cIjpudWxsKX0sYT0oKT0+e2NsZWFyVGltZW91dChzLnJlc2l6ZWQpLHMucmVzaXplZD1zZXRUaW1lb3V0KG4sNTApfTtmZS5jYWxsKGUsaS5jb250YWluZXIsXCJlbnRlcmZ1bGxzY3JlZW4gZXhpdGZ1bGxzY3JlZW5cIiwodD0+e2NvbnN0e3RhcmdldDpzfT1lLmZ1bGxzY3JlZW47aWYocyE9PWkuY29udGFpbmVyKXJldHVybjtpZighZS5pc0VtYmVkJiZXKGUuY29uZmlnLnJhdGlvKSlyZXR1cm47bigpOyhcImVudGVyZnVsbHNjcmVlblwiPT09dC50eXBlP2ZlOmJlKS5jYWxsKGUsd2luZG93LFwicmVzaXplXCIsYSl9KSl9KSksZSh0aGlzLFwibWVkaWFcIiwoKCk9Pntjb25zdHtwbGF5ZXI6ZX09dGhpcyx7ZWxlbWVudHM6dH09ZTtpZihmZS5jYWxsKGUsZS5tZWRpYSxcInRpbWV1cGRhdGUgc2Vla2luZyBzZWVrZWRcIiwodD0+V2UudGltZVVwZGF0ZS5jYWxsKGUsdCkpKSxmZS5jYWxsKGUsZS5tZWRpYSxcImR1cmF0aW9uY2hhbmdlIGxvYWRlZGRhdGEgbG9hZGVkbWV0YWRhdGFcIiwodD0+V2UuZHVyYXRpb25VcGRhdGUuY2FsbChlLHQpKSksZmUuY2FsbChlLGUubWVkaWEsXCJlbmRlZFwiLCgoKT0+e2UuaXNIVE1MNSYmZS5pc1ZpZGVvJiZlLmNvbmZpZy5yZXNldE9uRW5kJiYoZS5yZXN0YXJ0KCksZS5wYXVzZSgpKX0pKSxmZS5jYWxsKGUsZS5tZWRpYSxcInByb2dyZXNzIHBsYXlpbmcgc2Vla2luZyBzZWVrZWRcIiwodD0+V2UudXBkYXRlUHJvZ3Jlc3MuY2FsbChlLHQpKSksZmUuY2FsbChlLGUubWVkaWEsXCJ2b2x1bWVjaGFuZ2VcIiwodD0+V2UudXBkYXRlVm9sdW1lLmNhbGwoZSx0KSkpLGZlLmNhbGwoZSxlLm1lZGlhLFwicGxheWluZyBwbGF5IHBhdXNlIGVuZGVkIGVtcHRpZWQgdGltZXVwZGF0ZVwiLCh0PT5hdC5jaGVja1BsYXlpbmcuY2FsbChlLHQpKSksZmUuY2FsbChlLGUubWVkaWEsXCJ3YWl0aW5nIGNhbnBsYXkgc2Vla2VkIHBsYXlpbmdcIiwodD0+YXQuY2hlY2tMb2FkaW5nLmNhbGwoZSx0KSkpLGUuc3VwcG9ydGVkLnVpJiZlLmNvbmZpZy5jbGlja1RvUGxheSYmIWUuaXNBdWRpbyl7Y29uc3QgaT1oZS5jYWxsKGUsYC4ke2UuY29uZmlnLmNsYXNzTmFtZXMudmlkZW99YCk7aWYoIUgoaSkpcmV0dXJuO2ZlLmNhbGwoZSx0LmNvbnRhaW5lcixcImNsaWNrXCIsKHM9PnsoW3QuY29udGFpbmVyLGldLmluY2x1ZGVzKHMudGFyZ2V0KXx8aS5jb250YWlucyhzLnRhcmdldCkpJiYoZS50b3VjaCYmZS5jb25maWcuaGlkZUNvbnRyb2xzfHwoZS5lbmRlZD8odGhpcy5wcm94eShzLGUucmVzdGFydCxcInJlc3RhcnRcIiksdGhpcy5wcm94eShzLCgoKT0+e2tlKGUucGxheSgpKX0pLFwicGxheVwiKSk6dGhpcy5wcm94eShzLCgoKT0+e2tlKGUudG9nZ2xlUGxheSgpKX0pLFwicGxheVwiKSkpfSkpfWUuc3VwcG9ydGVkLnVpJiZlLmNvbmZpZy5kaXNhYmxlQ29udGV4dE1lbnUmJmZlLmNhbGwoZSx0LndyYXBwZXIsXCJjb250ZXh0bWVudVwiLChlPT57ZS5wcmV2ZW50RGVmYXVsdCgpfSksITEpLGZlLmNhbGwoZSxlLm1lZGlhLFwidm9sdW1lY2hhbmdlXCIsKCgpPT57ZS5zdG9yYWdlLnNldCh7dm9sdW1lOmUudm9sdW1lLG11dGVkOmUubXV0ZWR9KX0pKSxmZS5jYWxsKGUsZS5tZWRpYSxcInJhdGVjaGFuZ2VcIiwoKCk9PntXZS51cGRhdGVTZXR0aW5nLmNhbGwoZSxcInNwZWVkXCIpLGUuc3RvcmFnZS5zZXQoe3NwZWVkOmUuc3BlZWR9KX0pKSxmZS5jYWxsKGUsZS5tZWRpYSxcInF1YWxpdHljaGFuZ2VcIiwodD0+e1dlLnVwZGF0ZVNldHRpbmcuY2FsbChlLFwicXVhbGl0eVwiLG51bGwsdC5kZXRhaWwucXVhbGl0eSl9KSksZmUuY2FsbChlLGUubWVkaWEsXCJyZWFkeSBxdWFsaXR5Y2hhbmdlXCIsKCgpPT57V2Uuc2V0RG93bmxvYWRVcmwuY2FsbChlKX0pKTtjb25zdCBpPWUuY29uZmlnLmV2ZW50cy5jb25jYXQoW1wia2V5dXBcIixcImtleWRvd25cIl0pLmpvaW4oXCIgXCIpO2ZlLmNhbGwoZSxlLm1lZGlhLGksKGk9PntsZXR7ZGV0YWlsOnM9e319PWk7XCJlcnJvclwiPT09aS50eXBlJiYocz1lLm1lZGlhLmVycm9yKSx2ZS5jYWxsKGUsdC5jb250YWluZXIsaS50eXBlLCEwLHMpfSkpfSkpLGUodGhpcyxcInByb3h5XCIsKChlLHQsaSk9Pntjb25zdHtwbGF5ZXI6c309dGhpcyxuPXMuY29uZmlnLmxpc3RlbmVyc1tpXTtsZXQgYT0hMDtqKG4pJiYoYT1uLmNhbGwocyxlKSksITEhPT1hJiZqKHQpJiZ0LmNhbGwocyxlKX0pKSxlKHRoaXMsXCJiaW5kXCIsKChlLHQsaSxzLG49ITApPT57Y29uc3R7cGxheWVyOmF9PXRoaXMsbD1hLmNvbmZpZy5saXN0ZW5lcnNbc10sbz1qKGwpO2ZlLmNhbGwoYSxlLHQsKGU9PnRoaXMucHJveHkoZSxpLHMpKSxuJiYhbyl9KSksZSh0aGlzLFwiY29udHJvbHNcIiwoKCk9Pntjb25zdHtwbGF5ZXI6ZX09dGhpcyx7ZWxlbWVudHM6dH09ZSxpPVkuaXNJRT9cImNoYW5nZVwiOlwiaW5wdXRcIjtpZih0LmJ1dHRvbnMucGxheSYmQXJyYXkuZnJvbSh0LmJ1dHRvbnMucGxheSkuZm9yRWFjaCgodD0+e3RoaXMuYmluZCh0LFwiY2xpY2tcIiwoKCk9PntrZShlLnRvZ2dsZVBsYXkoKSl9KSxcInBsYXlcIil9KSksdGhpcy5iaW5kKHQuYnV0dG9ucy5yZXN0YXJ0LFwiY2xpY2tcIixlLnJlc3RhcnQsXCJyZXN0YXJ0XCIpLHRoaXMuYmluZCh0LmJ1dHRvbnMucmV3aW5kLFwiY2xpY2tcIiwoKCk9PntlLmxhc3RTZWVrVGltZT1EYXRlLm5vdygpLGUucmV3aW5kKCl9KSxcInJld2luZFwiKSx0aGlzLmJpbmQodC5idXR0b25zLmZhc3RGb3J3YXJkLFwiY2xpY2tcIiwoKCk9PntlLmxhc3RTZWVrVGltZT1EYXRlLm5vdygpLGUuZm9yd2FyZCgpfSksXCJmYXN0Rm9yd2FyZFwiKSx0aGlzLmJpbmQodC5idXR0b25zLm11dGUsXCJjbGlja1wiLCgoKT0+e2UubXV0ZWQ9IWUubXV0ZWR9KSxcIm11dGVcIiksdGhpcy5iaW5kKHQuYnV0dG9ucy5jYXB0aW9ucyxcImNsaWNrXCIsKCgpPT5lLnRvZ2dsZUNhcHRpb25zKCkpKSx0aGlzLmJpbmQodC5idXR0b25zLmRvd25sb2FkLFwiY2xpY2tcIiwoKCk9Pnt2ZS5jYWxsKGUsZS5tZWRpYSxcImRvd25sb2FkXCIpfSksXCJkb3dubG9hZFwiKSx0aGlzLmJpbmQodC5idXR0b25zLmZ1bGxzY3JlZW4sXCJjbGlja1wiLCgoKT0+e2UuZnVsbHNjcmVlbi50b2dnbGUoKX0pLFwiZnVsbHNjcmVlblwiKSx0aGlzLmJpbmQodC5idXR0b25zLnBpcCxcImNsaWNrXCIsKCgpPT57ZS5waXA9XCJ0b2dnbGVcIn0pLFwicGlwXCIpLHRoaXMuYmluZCh0LmJ1dHRvbnMuYWlycGxheSxcImNsaWNrXCIsZS5haXJwbGF5LFwiYWlycGxheVwiKSx0aGlzLmJpbmQodC5idXR0b25zLnNldHRpbmdzLFwiY2xpY2tcIiwodD0+e3Quc3RvcFByb3BhZ2F0aW9uKCksdC5wcmV2ZW50RGVmYXVsdCgpLFdlLnRvZ2dsZU1lbnUuY2FsbChlLHQpfSksbnVsbCwhMSksdGhpcy5iaW5kKHQuYnV0dG9ucy5zZXR0aW5ncyxcImtleXVwXCIsKHQ9PntbXCJTcGFjZVwiLFwiRW50ZXJcIl0uaW5jbHVkZXModC5rZXkpJiYoXCJFbnRlclwiIT09dC5rZXk/KHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpLFdlLnRvZ2dsZU1lbnUuY2FsbChlLHQpKTpXZS5mb2N1c0ZpcnN0TWVudUl0ZW0uY2FsbChlLG51bGwsITApKX0pLG51bGwsITEpLHRoaXMuYmluZCh0LnNldHRpbmdzLm1lbnUsXCJrZXlkb3duXCIsKHQ9PntcIkVzY2FwZVwiPT09dC5rZXkmJldlLnRvZ2dsZU1lbnUuY2FsbChlLHQpfSkpLHRoaXMuYmluZCh0LmlucHV0cy5zZWVrLFwibW91c2Vkb3duIG1vdXNlbW92ZVwiLChlPT57Y29uc3QgaT10LnByb2dyZXNzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHM9MTAwL2kud2lkdGgqKGUucGFnZVgtaS5sZWZ0KTtlLmN1cnJlbnRUYXJnZXQuc2V0QXR0cmlidXRlKFwic2Vlay12YWx1ZVwiLHMpfSkpLHRoaXMuYmluZCh0LmlucHV0cy5zZWVrLFwibW91c2Vkb3duIG1vdXNldXAga2V5ZG93biBrZXl1cCB0b3VjaHN0YXJ0IHRvdWNoZW5kXCIsKHQ9Pntjb25zdCBpPXQuY3VycmVudFRhcmdldCxzPVwicGxheS1vbi1zZWVrZWRcIjtpZihGKHQpJiYhW1wiQXJyb3dMZWZ0XCIsXCJBcnJvd1JpZ2h0XCJdLmluY2x1ZGVzKHQua2V5KSlyZXR1cm47ZS5sYXN0U2Vla1RpbWU9RGF0ZS5ub3coKTtjb25zdCBuPWkuaGFzQXR0cmlidXRlKHMpLGE9W1wibW91c2V1cFwiLFwidG91Y2hlbmRcIixcImtleXVwXCJdLmluY2x1ZGVzKHQudHlwZSk7biYmYT8oaS5yZW1vdmVBdHRyaWJ1dGUocyksa2UoZS5wbGF5KCkpKTohYSYmZS5wbGF5aW5nJiYoaS5zZXRBdHRyaWJ1dGUocyxcIlwiKSxlLnBhdXNlKCkpfSkpLFkuaXNJb3Mpe2NvbnN0IHQ9Y2UuY2FsbChlLCdpbnB1dFt0eXBlPVwicmFuZ2VcIl0nKTtBcnJheS5mcm9tKHQpLmZvckVhY2goKGU9PnRoaXMuYmluZChlLGksKGU9PksoZS50YXJnZXQpKSkpKX10aGlzLmJpbmQodC5pbnB1dHMuc2VlayxpLCh0PT57Y29uc3QgaT10LmN1cnJlbnRUYXJnZXQ7bGV0IHM9aS5nZXRBdHRyaWJ1dGUoXCJzZWVrLXZhbHVlXCIpO1cocykmJihzPWkudmFsdWUpLGkucmVtb3ZlQXR0cmlidXRlKFwic2Vlay12YWx1ZVwiKSxlLmN1cnJlbnRUaW1lPXMvaS5tYXgqZS5kdXJhdGlvbn0pLFwic2Vla1wiKSx0aGlzLmJpbmQodC5wcm9ncmVzcyxcIm1vdXNlZW50ZXIgbW91c2VsZWF2ZSBtb3VzZW1vdmVcIiwodD0+V2UudXBkYXRlU2Vla1Rvb2x0aXAuY2FsbChlLHQpKSksdGhpcy5iaW5kKHQucHJvZ3Jlc3MsXCJtb3VzZW1vdmUgdG91Y2htb3ZlXCIsKHQ9Pntjb25zdHtwcmV2aWV3VGh1bWJuYWlsczppfT1lO2kmJmkubG9hZGVkJiZpLnN0YXJ0TW92ZSh0KX0pKSx0aGlzLmJpbmQodC5wcm9ncmVzcyxcIm1vdXNlbGVhdmUgdG91Y2hlbmQgY2xpY2tcIiwoKCk9Pntjb25zdHtwcmV2aWV3VGh1bWJuYWlsczp0fT1lO3QmJnQubG9hZGVkJiZ0LmVuZE1vdmUoITEsITApfSkpLHRoaXMuYmluZCh0LnByb2dyZXNzLFwibW91c2Vkb3duIHRvdWNoc3RhcnRcIiwodD0+e2NvbnN0e3ByZXZpZXdUaHVtYm5haWxzOml9PWU7aSYmaS5sb2FkZWQmJmkuc3RhcnRTY3J1YmJpbmcodCl9KSksdGhpcy5iaW5kKHQucHJvZ3Jlc3MsXCJtb3VzZXVwIHRvdWNoZW5kXCIsKHQ9Pntjb25zdHtwcmV2aWV3VGh1bWJuYWlsczppfT1lO2kmJmkubG9hZGVkJiZpLmVuZFNjcnViYmluZyh0KX0pKSxZLmlzV2Via2l0JiZBcnJheS5mcm9tKGNlLmNhbGwoZSwnaW5wdXRbdHlwZT1cInJhbmdlXCJdJykpLmZvckVhY2goKHQ9Pnt0aGlzLmJpbmQodCxcImlucHV0XCIsKHQ9PldlLnVwZGF0ZVJhbmdlRmlsbC5jYWxsKGUsdC50YXJnZXQpKSl9KSksZS5jb25maWcudG9nZ2xlSW52ZXJ0JiYhSCh0LmRpc3BsYXkuZHVyYXRpb24pJiZ0aGlzLmJpbmQodC5kaXNwbGF5LmN1cnJlbnRUaW1lLFwiY2xpY2tcIiwoKCk9PnswIT09ZS5jdXJyZW50VGltZSYmKGUuY29uZmlnLmludmVydFRpbWU9IWUuY29uZmlnLmludmVydFRpbWUsV2UudGltZVVwZGF0ZS5jYWxsKGUpKX0pKSx0aGlzLmJpbmQodC5pbnB1dHMudm9sdW1lLGksKHQ9PntlLnZvbHVtZT10LnRhcmdldC52YWx1ZX0pLFwidm9sdW1lXCIpLHRoaXMuYmluZCh0LmNvbnRyb2xzLFwibW91c2VlbnRlciBtb3VzZWxlYXZlXCIsKGk9Pnt0LmNvbnRyb2xzLmhvdmVyPSFlLnRvdWNoJiZcIm1vdXNlZW50ZXJcIj09PWkudHlwZX0pKSx0LmZ1bGxzY3JlZW4mJkFycmF5LmZyb20odC5mdWxsc2NyZWVuLmNoaWxkcmVuKS5maWx0ZXIoKGU9PiFlLmNvbnRhaW5zKHQuY29udGFpbmVyKSkpLmZvckVhY2goKGk9Pnt0aGlzLmJpbmQoaSxcIm1vdXNlZW50ZXIgbW91c2VsZWF2ZVwiLChpPT57dC5jb250cm9scyYmKHQuY29udHJvbHMuaG92ZXI9IWUudG91Y2gmJlwibW91c2VlbnRlclwiPT09aS50eXBlKX0pKX0pKSx0aGlzLmJpbmQodC5jb250cm9scyxcIm1vdXNlZG93biBtb3VzZXVwIHRvdWNoc3RhcnQgdG91Y2hlbmQgdG91Y2hjYW5jZWxcIiwoZT0+e3QuY29udHJvbHMucHJlc3NlZD1bXCJtb3VzZWRvd25cIixcInRvdWNoc3RhcnRcIl0uaW5jbHVkZXMoZS50eXBlKX0pKSx0aGlzLmJpbmQodC5jb250cm9scyxcImZvY3VzaW5cIiwoKCk9Pntjb25zdHtjb25maWc6aSx0aW1lcnM6c309ZTtsZSh0LmNvbnRyb2xzLGkuY2xhc3NOYW1lcy5ub1RyYW5zaXRpb24sITApLGF0LnRvZ2dsZUNvbnRyb2xzLmNhbGwoZSwhMCksc2V0VGltZW91dCgoKCk9PntsZSh0LmNvbnRyb2xzLGkuY2xhc3NOYW1lcy5ub1RyYW5zaXRpb24sITEpfSksMCk7Y29uc3Qgbj10aGlzLnRvdWNoPzNlMzo0ZTM7Y2xlYXJUaW1lb3V0KHMuY29udHJvbHMpLHMuY29udHJvbHM9c2V0VGltZW91dCgoKCk9PmF0LnRvZ2dsZUNvbnRyb2xzLmNhbGwoZSwhMSkpLG4pfSkpLHRoaXMuYmluZCh0LmlucHV0cy52b2x1bWUsXCJ3aGVlbFwiLCh0PT57Y29uc3QgaT10LndlYmtpdERpcmVjdGlvbkludmVydGVkRnJvbURldmljZSxbcyxuXT1bdC5kZWx0YVgsLXQuZGVsdGFZXS5tYXAoKGU9Pmk/LWU6ZSkpLGE9TWF0aC5zaWduKE1hdGguYWJzKHMpPk1hdGguYWJzKG4pP3M6bik7ZS5pbmNyZWFzZVZvbHVtZShhLzUwKTtjb25zdHt2b2x1bWU6bH09ZS5tZWRpYTsoMT09PWEmJmw8MXx8LTE9PT1hJiZsPjApJiZ0LnByZXZlbnREZWZhdWx0KCl9KSxcInZvbHVtZVwiLCExKX0pKSx0aGlzLnBsYXllcj10LHRoaXMubGFzdEtleT1udWxsLHRoaXMuZm9jdXNUaW1lcj1udWxsLHRoaXMubGFzdEtleURvd249bnVsbCx0aGlzLmhhbmRsZUtleT10aGlzLmhhbmRsZUtleS5iaW5kKHRoaXMpLHRoaXMudG9nZ2xlTWVudT10aGlzLnRvZ2dsZU1lbnUuYmluZCh0aGlzKSx0aGlzLnNldFRhYkZvY3VzPXRoaXMuc2V0VGFiRm9jdXMuYmluZCh0aGlzKSx0aGlzLmZpcnN0VG91Y2g9dGhpcy5maXJzdFRvdWNoLmJpbmQodGhpcyl9aGFuZGxlS2V5KGUpe2NvbnN0e3BsYXllcjp0fT10aGlzLHtlbGVtZW50czppfT10LHtrZXk6cyx0eXBlOm4sYWx0S2V5OmEsY3RybEtleTpsLG1ldGFLZXk6byxzaGlmdEtleTpyfT1lLGM9XCJrZXlkb3duXCI9PT1uLGg9YyYmcz09PXRoaXMubGFzdEtleTtpZihhfHxsfHxvfHxyKXJldHVybjtpZighcylyZXR1cm47aWYoYyl7Y29uc3Qgbj1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKEgobikpe2NvbnN0e2VkaXRhYmxlOnN9PXQuY29uZmlnLnNlbGVjdG9ycyx7c2VlazphfT1pLmlucHV0cztpZihuIT09YSYmcmUobixzKSlyZXR1cm47aWYoXCJTcGFjZVwiPT09ZS5rZXkmJnJlKG4sJ2J1dHRvbiwgW3JvbGVePVwibWVudWl0ZW1cIl0nKSlyZXR1cm59c3dpdGNoKFtcIlNwYWNlXCIsXCJBcnJvd0xlZnRcIixcIkFycm93VXBcIixcIkFycm93UmlnaHRcIixcIkFycm93RG93blwiLFwiMFwiLFwiMVwiLFwiMlwiLFwiM1wiLFwiNFwiLFwiNVwiLFwiNlwiLFwiN1wiLFwiOFwiLFwiOVwiLFwiY1wiLFwiZlwiLFwia1wiLFwibFwiLFwibVwiXS5pbmNsdWRlcyhzKSYmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpKSxzKXtjYXNlXCIwXCI6Y2FzZVwiMVwiOmNhc2VcIjJcIjpjYXNlXCIzXCI6Y2FzZVwiNFwiOmNhc2VcIjVcIjpjYXNlXCI2XCI6Y2FzZVwiN1wiOmNhc2VcIjhcIjpjYXNlXCI5XCI6aHx8KHU9cGFyc2VJbnQocywxMCksdC5jdXJyZW50VGltZT10LmR1cmF0aW9uLzEwKnUpO2JyZWFrO2Nhc2VcIlNwYWNlXCI6Y2FzZVwia1wiOmh8fGtlKHQudG9nZ2xlUGxheSgpKTticmVhaztjYXNlXCJBcnJvd1VwXCI6dC5pbmNyZWFzZVZvbHVtZSguMSk7YnJlYWs7Y2FzZVwiQXJyb3dEb3duXCI6dC5kZWNyZWFzZVZvbHVtZSguMSk7YnJlYWs7Y2FzZVwibVwiOmh8fCh0Lm11dGVkPSF0Lm11dGVkKTticmVhaztjYXNlXCJBcnJvd1JpZ2h0XCI6dC5mb3J3YXJkKCk7YnJlYWs7Y2FzZVwiQXJyb3dMZWZ0XCI6dC5yZXdpbmQoKTticmVhaztjYXNlXCJmXCI6dC5mdWxsc2NyZWVuLnRvZ2dsZSgpO2JyZWFrO2Nhc2VcImNcIjpofHx0LnRvZ2dsZUNhcHRpb25zKCk7YnJlYWs7Y2FzZVwibFwiOnQubG9vcD0hdC5sb29wfVwiRXNjYXBlXCI9PT1zJiYhdC5mdWxsc2NyZWVuLnVzaW5nTmF0aXZlJiZ0LmZ1bGxzY3JlZW4uYWN0aXZlJiZ0LmZ1bGxzY3JlZW4udG9nZ2xlKCksdGhpcy5sYXN0S2V5PXN9ZWxzZSB0aGlzLmxhc3RLZXk9bnVsbDt2YXIgdX10b2dnbGVNZW51KGUpe1dlLnRvZ2dsZU1lbnUuY2FsbCh0aGlzLnBsYXllcixlKX19XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczpcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93P3dpbmRvdzpcInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZiYmc2VsZjt2YXIgb3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSh0PXtleHBvcnRzOnt9fSx0LmV4cG9ydHMpLHQuZXhwb3J0c30oKGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dmFyIGU9ZnVuY3Rpb24oKXt9LHQ9e30saT17fSxzPXt9O2Z1bmN0aW9uIG4oZSx0KXtlPWUucHVzaD9lOltlXTt2YXIgbixhLGwsbz1bXSxyPWUubGVuZ3RoLGM9cjtmb3Iobj1mdW5jdGlvbihlLGkpe2kubGVuZ3RoJiZvLnB1c2goZSksLS1jfHx0KG8pfTtyLS07KWE9ZVtyXSwobD1pW2FdKT9uKGEsbCk6KHNbYV09c1thXXx8W10pLnB1c2gobil9ZnVuY3Rpb24gYShlLHQpe2lmKGUpe3ZhciBuPXNbZV07aWYoaVtlXT10LG4pZm9yKDtuLmxlbmd0aDspblswXShlLHQpLG4uc3BsaWNlKDAsMSl9fWZ1bmN0aW9uIGwodCxpKXt0LmNhbGwmJih0PXtzdWNjZXNzOnR9KSxpLmxlbmd0aD8odC5lcnJvcnx8ZSkoaSk6KHQuc3VjY2Vzc3x8ZSkodCl9ZnVuY3Rpb24gbyh0LGkscyxuKXt2YXIgYSxsLHI9ZG9jdW1lbnQsYz1zLmFzeW5jLGg9KHMubnVtUmV0cmllc3x8MCkrMSx1PXMuYmVmb3JlfHxlLGQ9dC5yZXBsYWNlKC9bXFw/fCNdLiokLyxcIlwiKSxtPXQucmVwbGFjZSgvXihjc3N8aW1nKSEvLFwiXCIpO249bnx8MCwvKF5jc3MhfFxcLmNzcyQpLy50ZXN0KGQpPygobD1yLmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpKS5yZWw9XCJzdHlsZXNoZWV0XCIsbC5ocmVmPW0sKGE9XCJoaWRlRm9jdXNcImluIGwpJiZsLnJlbExpc3QmJihhPTAsbC5yZWw9XCJwcmVsb2FkXCIsbC5hcz1cInN0eWxlXCIpKTovKF5pbWchfFxcLihwbmd8Z2lmfGpwZ3xzdmd8d2VicCkkKS8udGVzdChkKT8obD1yLmNyZWF0ZUVsZW1lbnQoXCJpbWdcIikpLnNyYz1tOigobD1yLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpLnNyYz10LGwuYXN5bmM9dm9pZCAwPT09Y3x8YyksbC5vbmxvYWQ9bC5vbmVycm9yPWwub25iZWZvcmVsb2FkPWZ1bmN0aW9uKGUpe3ZhciByPWUudHlwZVswXTtpZihhKXRyeXtsLnNoZWV0LmNzc1RleHQubGVuZ3RofHwocj1cImVcIil9Y2F0Y2goZSl7MTghPWUuY29kZSYmKHI9XCJlXCIpfWlmKFwiZVwiPT1yKXtpZigobis9MSk8aClyZXR1cm4gbyh0LGkscyxuKX1lbHNlIGlmKFwicHJlbG9hZFwiPT1sLnJlbCYmXCJzdHlsZVwiPT1sLmFzKXJldHVybiBsLnJlbD1cInN0eWxlc2hlZXRcIjtpKHQscixlLmRlZmF1bHRQcmV2ZW50ZWQpfSwhMSE9PXUodCxsKSYmci5oZWFkLmFwcGVuZENoaWxkKGwpfWZ1bmN0aW9uIHIoZSx0LGkpe3ZhciBzLG4sYT0oZT1lLnB1c2g/ZTpbZV0pLmxlbmd0aCxsPWEscj1bXTtmb3Iocz1mdW5jdGlvbihlLGkscyl7aWYoXCJlXCI9PWkmJnIucHVzaChlKSxcImJcIj09aSl7aWYoIXMpcmV0dXJuO3IucHVzaChlKX0tLWF8fHQocil9LG49MDtuPGw7bisrKW8oZVtuXSxzLGkpfWZ1bmN0aW9uIGMoZSxpLHMpe3ZhciBuLG87aWYoaSYmaS50cmltJiYobj1pKSxvPShuP3M6aSl8fHt9LG4pe2lmKG4gaW4gdCl0aHJvd1wiTG9hZEpTXCI7dFtuXT0hMH1mdW5jdGlvbiBjKHQsaSl7cihlLChmdW5jdGlvbihlKXtsKG8sZSksdCYmbCh7c3VjY2Vzczp0LGVycm9yOml9LGUpLGEobixlKX0pLG8pfWlmKG8ucmV0dXJuUHJvbWlzZSlyZXR1cm4gbmV3IFByb21pc2UoYyk7YygpfXJldHVybiBjLnJlYWR5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4oZSwoZnVuY3Rpb24oZSl7bCh0LGUpfSkpLGN9LGMuZG9uZT1mdW5jdGlvbihlKXthKGUsW10pfSxjLnJlc2V0PWZ1bmN0aW9uKCl7dD17fSxpPXt9LHM9e319LGMuaXNEZWZpbmVkPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluIHR9LGN9KCl9KSk7ZnVuY3Rpb24gcnQoZSl7cmV0dXJuIG5ldyBQcm9taXNlKCgodCxpKT0+e290KGUse3N1Y2Nlc3M6dCxlcnJvcjppfSl9KSl9ZnVuY3Rpb24gY3QoZSl7ZSYmIXRoaXMuZW1iZWQuaGFzUGxheWVkJiYodGhpcy5lbWJlZC5oYXNQbGF5ZWQ9ITApLHRoaXMubWVkaWEucGF1c2VkPT09ZSYmKHRoaXMubWVkaWEucGF1c2VkPSFlLHZlLmNhbGwodGhpcyx0aGlzLm1lZGlhLGU/XCJwbGF5XCI6XCJwYXVzZVwiKSl9Y29uc3QgaHQ9e3NldHVwKCl7Y29uc3QgZT10aGlzO2xlKGUuZWxlbWVudHMud3JhcHBlcixlLmNvbmZpZy5jbGFzc05hbWVzLmVtYmVkLCEwKSxlLm9wdGlvbnMuc3BlZWQ9ZS5jb25maWcuc3BlZWQub3B0aW9ucyx4ZS5jYWxsKGUpLEwod2luZG93LlZpbWVvKT9odC5yZWFkeS5jYWxsKGUpOnJ0KGUuY29uZmlnLnVybHMudmltZW8uc2RrKS50aGVuKCgoKT0+e2h0LnJlYWR5LmNhbGwoZSl9KSkuY2F0Y2goKHQ9PntlLmRlYnVnLndhcm4oXCJWaW1lbyBTREsgKHBsYXllci5qcykgZmFpbGVkIHRvIGxvYWRcIix0KX0pKX0scmVhZHkoKXtjb25zdCBlPXRoaXMsdD1lLmNvbmZpZy52aW1lbyx7cHJlbWl1bTppLHJlZmVycmVyUG9saWN5OnMsLi4ubn09dDtsZXQgYT1lLm1lZGlhLmdldEF0dHJpYnV0ZShcInNyY1wiKSxsPVwiXCI7VyhhKT8oYT1lLm1lZGlhLmdldEF0dHJpYnV0ZShlLmNvbmZpZy5hdHRyaWJ1dGVzLmVtYmVkLmlkKSxsPWUubWVkaWEuZ2V0QXR0cmlidXRlKGUuY29uZmlnLmF0dHJpYnV0ZXMuZW1iZWQuaGFzaCkpOmw9ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLm1hdGNoKC9eLioodmltZW8uY29tXFwvfHZpZGVvXFwvKShcXGQrKShcXD8uKiYqaD18XFwvKSsoW1xcZCxhLWZdKykvKTtyZXR1cm4gdCYmNT09PXQubGVuZ3RoP3RbNF06bnVsbH0oYSk7Y29uc3Qgbz1sP3toOmx9Ont9O2kmJk9iamVjdC5hc3NpZ24obix7Y29udHJvbHM6ITEsc2lkZWRvY2s6ITF9KTtjb25zdCByPUtlKHtsb29wOmUuY29uZmlnLmxvb3AuYWN0aXZlLGF1dG9wbGF5OmUuYXV0b3BsYXksbXV0ZWQ6ZS5tdXRlZCxnZXN0dXJlOlwibWVkaWFcIixwbGF5c2lubGluZTohdGhpcy5jb25maWcuZnVsbHNjcmVlbi5pb3NOYXRpdmUsLi4ubywuLi5ufSksYz1XKGg9YSk/bnVsbDokKE51bWJlcihoKSk/aDpoLm1hdGNoKC9eLioodmltZW8uY29tXFwvfHZpZGVvXFwvKShcXGQrKS4qLyk/UmVnRXhwLiQyOmg7dmFyIGg7Y29uc3QgdT1aKFwiaWZyYW1lXCIpLGQ9JGUoZS5jb25maWcudXJscy52aW1lby5pZnJhbWUsYyxyKTtpZih1LnNldEF0dHJpYnV0ZShcInNyY1wiLGQpLHUuc2V0QXR0cmlidXRlKFwiYWxsb3dmdWxsc2NyZWVuXCIsXCJcIiksdS5zZXRBdHRyaWJ1dGUoXCJhbGxvd1wiLFtcImF1dG9wbGF5XCIsXCJmdWxsc2NyZWVuXCIsXCJwaWN0dXJlLWluLXBpY3R1cmVcIixcImVuY3J5cHRlZC1tZWRpYVwiLFwiYWNjZWxlcm9tZXRlclwiLFwiZ3lyb3Njb3BlXCJdLmpvaW4oXCI7IFwiKSksVyhzKXx8dS5zZXRBdHRyaWJ1dGUoXCJyZWZlcnJlclBvbGljeVwiLHMpLGl8fCF0LmN1c3RvbUNvbnRyb2xzKXUuc2V0QXR0cmlidXRlKFwiZGF0YS1wb3N0ZXJcIixlLnBvc3RlciksZS5tZWRpYT1zZSh1LGUubWVkaWEpO2Vsc2V7Y29uc3QgdD1aKFwiZGl2XCIse2NsYXNzOmUuY29uZmlnLmNsYXNzTmFtZXMuZW1iZWRDb250YWluZXIsXCJkYXRhLXBvc3RlclwiOmUucG9zdGVyfSk7dC5hcHBlbmRDaGlsZCh1KSxlLm1lZGlhPXNlKHQsZS5tZWRpYSl9dC5jdXN0b21Db250cm9sc3x8RmUoJGUoZS5jb25maWcudXJscy52aW1lby5hcGksZCkpLnRoZW4oKHQ9PnshVyh0KSYmdC50aHVtYm5haWxfdXJsJiZhdC5zZXRQb3N0ZXIuY2FsbChlLHQudGh1bWJuYWlsX3VybCkuY2F0Y2goKCgpPT57fSkpfSkpLGUuZW1iZWQ9bmV3IHdpbmRvdy5WaW1lby5QbGF5ZXIodSx7YXV0b3BhdXNlOmUuY29uZmlnLmF1dG9wYXVzZSxtdXRlZDplLm11dGVkfSksZS5tZWRpYS5wYXVzZWQ9ITAsZS5tZWRpYS5jdXJyZW50VGltZT0wLGUuc3VwcG9ydGVkLnVpJiZlLmVtYmVkLmRpc2FibGVUZXh0VHJhY2soKSxlLm1lZGlhLnBsYXk9KCk9PihjdC5jYWxsKGUsITApLGUuZW1iZWQucGxheSgpKSxlLm1lZGlhLnBhdXNlPSgpPT4oY3QuY2FsbChlLCExKSxlLmVtYmVkLnBhdXNlKCkpLGUubWVkaWEuc3RvcD0oKT0+e2UucGF1c2UoKSxlLmN1cnJlbnRUaW1lPTB9O2xldHtjdXJyZW50VGltZTptfT1lLm1lZGlhO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLm1lZGlhLFwiY3VycmVudFRpbWVcIix7Z2V0OigpPT5tLHNldCh0KXtjb25zdHtlbWJlZDppLG1lZGlhOnMscGF1c2VkOm4sdm9sdW1lOmF9PWUsbD1uJiYhaS5oYXNQbGF5ZWQ7cy5zZWVraW5nPSEwLHZlLmNhbGwoZSxzLFwic2Vla2luZ1wiKSxQcm9taXNlLnJlc29sdmUobCYmaS5zZXRWb2x1bWUoMCkpLnRoZW4oKCgpPT5pLnNldEN1cnJlbnRUaW1lKHQpKSkudGhlbigoKCk9PmwmJmkucGF1c2UoKSkpLnRoZW4oKCgpPT5sJiZpLnNldFZvbHVtZShhKSkpLmNhdGNoKCgoKT0+e30pKX19KTtsZXQgcD1lLmNvbmZpZy5zcGVlZC5zZWxlY3RlZDtPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5tZWRpYSxcInBsYXliYWNrUmF0ZVwiLHtnZXQ6KCk9PnAsc2V0KHQpe2UuZW1iZWQuc2V0UGxheWJhY2tSYXRlKHQpLnRoZW4oKCgpPT57cD10LHZlLmNhbGwoZSxlLm1lZGlhLFwicmF0ZWNoYW5nZVwiKX0pKS5jYXRjaCgoKCk9PntlLm9wdGlvbnMuc3BlZWQ9WzFdfSkpfX0pO2xldHt2b2x1bWU6Z309ZS5jb25maWc7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUubWVkaWEsXCJ2b2x1bWVcIix7Z2V0OigpPT5nLHNldCh0KXtlLmVtYmVkLnNldFZvbHVtZSh0KS50aGVuKCgoKT0+e2c9dCx2ZS5jYWxsKGUsZS5tZWRpYSxcInZvbHVtZWNoYW5nZVwiKX0pKX19KTtsZXR7bXV0ZWQ6Zn09ZS5jb25maWc7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUubWVkaWEsXCJtdXRlZFwiLHtnZXQ6KCk9PmYsc2V0KHQpe2NvbnN0IGk9ISFPKHQpJiZ0O2UuZW1iZWQuc2V0Vm9sdW1lKGk/MDplLmNvbmZpZy52b2x1bWUpLnRoZW4oKCgpPT57Zj1pLHZlLmNhbGwoZSxlLm1lZGlhLFwidm9sdW1lY2hhbmdlXCIpfSkpfX0pO2xldCBiLHtsb29wOnl9PWUuY29uZmlnO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLm1lZGlhLFwibG9vcFwiLHtnZXQ6KCk9Pnksc2V0KHQpe2NvbnN0IGk9Tyh0KT90OmUuY29uZmlnLmxvb3AuYWN0aXZlO2UuZW1iZWQuc2V0TG9vcChpKS50aGVuKCgoKT0+e3k9aX0pKX19KSxlLmVtYmVkLmdldFZpZGVvVXJsKCkudGhlbigodD0+e2I9dCxXZS5zZXREb3dubG9hZFVybC5jYWxsKGUpfSkpLmNhdGNoKChlPT57dGhpcy5kZWJ1Zy53YXJuKGUpfSkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLm1lZGlhLFwiY3VycmVudFNyY1wiLHtnZXQ6KCk9PmJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5tZWRpYSxcImVuZGVkXCIse2dldDooKT0+ZS5jdXJyZW50VGltZT09PWUuZHVyYXRpb259KSxQcm9taXNlLmFsbChbZS5lbWJlZC5nZXRWaWRlb1dpZHRoKCksZS5lbWJlZC5nZXRWaWRlb0hlaWdodCgpXSkudGhlbigodD0+e2NvbnN0W2ksc109dDtlLmVtYmVkLnJhdGlvPUllKGkscykseGUuY2FsbCh0aGlzKX0pKSxlLmVtYmVkLnNldEF1dG9wYXVzZShlLmNvbmZpZy5hdXRvcGF1c2UpLnRoZW4oKHQ9PntlLmNvbmZpZy5hdXRvcGF1c2U9dH0pKSxlLmVtYmVkLmdldFZpZGVvVGl0bGUoKS50aGVuKCh0PT57ZS5jb25maWcudGl0bGU9dCxhdC5zZXRUaXRsZS5jYWxsKHRoaXMpfSkpLGUuZW1iZWQuZ2V0Q3VycmVudFRpbWUoKS50aGVuKCh0PT57bT10LHZlLmNhbGwoZSxlLm1lZGlhLFwidGltZXVwZGF0ZVwiKX0pKSxlLmVtYmVkLmdldER1cmF0aW9uKCkudGhlbigodD0+e2UubWVkaWEuZHVyYXRpb249dCx2ZS5jYWxsKGUsZS5tZWRpYSxcImR1cmF0aW9uY2hhbmdlXCIpfSkpLGUuZW1iZWQuZ2V0VGV4dFRyYWNrcygpLnRoZW4oKHQ9PntlLm1lZGlhLnRleHRUcmFja3M9dCxZZS5zZXR1cC5jYWxsKGUpfSkpLGUuZW1iZWQub24oXCJjdWVjaGFuZ2VcIiwoKHtjdWVzOnQ9W119KT0+e2NvbnN0IGk9dC5tYXAoKGU9PmZ1bmN0aW9uKGUpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtyZXR1cm4gdC5hcHBlbmRDaGlsZChpKSxpLmlubmVySFRNTD1lLHQuZmlyc3RDaGlsZC5pbm5lclRleHR9KGUudGV4dCkpKTtZZS51cGRhdGVDdWVzLmNhbGwoZSxpKX0pKSxlLmVtYmVkLm9uKFwibG9hZGVkXCIsKCgpPT57aWYoZS5lbWJlZC5nZXRQYXVzZWQoKS50aGVuKCh0PT57Y3QuY2FsbChlLCF0KSx0fHx2ZS5jYWxsKGUsZS5tZWRpYSxcInBsYXlpbmdcIil9KSksSChlLmVtYmVkLmVsZW1lbnQpJiZlLnN1cHBvcnRlZC51aSl7ZS5lbWJlZC5lbGVtZW50LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsLTEpfX0pKSxlLmVtYmVkLm9uKFwiYnVmZmVyc3RhcnRcIiwoKCk9Pnt2ZS5jYWxsKGUsZS5tZWRpYSxcIndhaXRpbmdcIil9KSksZS5lbWJlZC5vbihcImJ1ZmZlcmVuZFwiLCgoKT0+e3ZlLmNhbGwoZSxlLm1lZGlhLFwicGxheWluZ1wiKX0pKSxlLmVtYmVkLm9uKFwicGxheVwiLCgoKT0+e2N0LmNhbGwoZSwhMCksdmUuY2FsbChlLGUubWVkaWEsXCJwbGF5aW5nXCIpfSkpLGUuZW1iZWQub24oXCJwYXVzZVwiLCgoKT0+e2N0LmNhbGwoZSwhMSl9KSksZS5lbWJlZC5vbihcInRpbWV1cGRhdGVcIiwodD0+e2UubWVkaWEuc2Vla2luZz0hMSxtPXQuc2Vjb25kcyx2ZS5jYWxsKGUsZS5tZWRpYSxcInRpbWV1cGRhdGVcIil9KSksZS5lbWJlZC5vbihcInByb2dyZXNzXCIsKHQ9PntlLm1lZGlhLmJ1ZmZlcmVkPXQucGVyY2VudCx2ZS5jYWxsKGUsZS5tZWRpYSxcInByb2dyZXNzXCIpLDE9PT1wYXJzZUludCh0LnBlcmNlbnQsMTApJiZ2ZS5jYWxsKGUsZS5tZWRpYSxcImNhbnBsYXl0aHJvdWdoXCIpLGUuZW1iZWQuZ2V0RHVyYXRpb24oKS50aGVuKCh0PT57dCE9PWUubWVkaWEuZHVyYXRpb24mJihlLm1lZGlhLmR1cmF0aW9uPXQsdmUuY2FsbChlLGUubWVkaWEsXCJkdXJhdGlvbmNoYW5nZVwiKSl9KSl9KSksZS5lbWJlZC5vbihcInNlZWtlZFwiLCgoKT0+e2UubWVkaWEuc2Vla2luZz0hMSx2ZS5jYWxsKGUsZS5tZWRpYSxcInNlZWtlZFwiKX0pKSxlLmVtYmVkLm9uKFwiZW5kZWRcIiwoKCk9PntlLm1lZGlhLnBhdXNlZD0hMCx2ZS5jYWxsKGUsZS5tZWRpYSxcImVuZGVkXCIpfSkpLGUuZW1iZWQub24oXCJlcnJvclwiLCh0PT57ZS5tZWRpYS5lcnJvcj10LHZlLmNhbGwoZSxlLm1lZGlhLFwiZXJyb3JcIil9KSksdC5jdXN0b21Db250cm9scyYmc2V0VGltZW91dCgoKCk9PmF0LmJ1aWxkLmNhbGwoZSkpLDApfX07ZnVuY3Rpb24gdXQoZSl7ZSYmIXRoaXMuZW1iZWQuaGFzUGxheWVkJiYodGhpcy5lbWJlZC5oYXNQbGF5ZWQ9ITApLHRoaXMubWVkaWEucGF1c2VkPT09ZSYmKHRoaXMubWVkaWEucGF1c2VkPSFlLHZlLmNhbGwodGhpcyx0aGlzLm1lZGlhLGU/XCJwbGF5XCI6XCJwYXVzZVwiKSl9ZnVuY3Rpb24gZHQoZSl7cmV0dXJuIGUubm9Db29raWU/XCJodHRwczovL3d3dy55b3V0dWJlLW5vY29va2llLmNvbVwiOlwiaHR0cDpcIj09PXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbD9cImh0dHA6Ly93d3cueW91dHViZS5jb21cIjp2b2lkIDB9Y29uc3QgbXQ9e3NldHVwKCl7aWYobGUodGhpcy5lbGVtZW50cy53cmFwcGVyLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMuZW1iZWQsITApLEwod2luZG93LllUKSYmaih3aW5kb3cuWVQuUGxheWVyKSltdC5yZWFkeS5jYWxsKHRoaXMpO2Vsc2V7Y29uc3QgZT13aW5kb3cub25Zb3VUdWJlSWZyYW1lQVBJUmVhZHk7d2luZG93Lm9uWW91VHViZUlmcmFtZUFQSVJlYWR5PSgpPT57aihlKSYmZSgpLG10LnJlYWR5LmNhbGwodGhpcyl9LHJ0KHRoaXMuY29uZmlnLnVybHMueW91dHViZS5zZGspLmNhdGNoKChlPT57dGhpcy5kZWJ1Zy53YXJuKFwiWW91VHViZSBBUEkgZmFpbGVkIHRvIGxvYWRcIixlKX0pKX19LGdldFRpdGxlKGUpe0ZlKCRlKHRoaXMuY29uZmlnLnVybHMueW91dHViZS5hcGksZSkpLnRoZW4oKGU9PntpZihMKGUpKXtjb25zdHt0aXRsZTp0LGhlaWdodDppLHdpZHRoOnN9PWU7dGhpcy5jb25maWcudGl0bGU9dCxhdC5zZXRUaXRsZS5jYWxsKHRoaXMpLHRoaXMuZW1iZWQucmF0aW89SWUocyxpKX14ZS5jYWxsKHRoaXMpfSkpLmNhdGNoKCgoKT0+e3hlLmNhbGwodGhpcyl9KSl9LHJlYWR5KCl7Y29uc3QgZT10aGlzLHQ9ZS5jb25maWcueW91dHViZSxpPWUubWVkaWEmJmUubWVkaWEuZ2V0QXR0cmlidXRlKFwiaWRcIik7aWYoIVcoaSkmJmkuc3RhcnRzV2l0aChcInlvdXR1YmUtXCIpKXJldHVybjtsZXQgcz1lLm1lZGlhLmdldEF0dHJpYnV0ZShcInNyY1wiKTtXKHMpJiYocz1lLm1lZGlhLmdldEF0dHJpYnV0ZSh0aGlzLmNvbmZpZy5hdHRyaWJ1dGVzLmVtYmVkLmlkKSk7Y29uc3Qgbj1XKGE9cyk/bnVsbDphLm1hdGNoKC9eLiooeW91dHUuYmVcXC98dlxcL3x1XFwvXFx3XFwvfGVtYmVkXFwvfHdhdGNoXFw/dj18JnY9KShbXiMmP10qKS4qLyk/UmVnRXhwLiQyOmE7dmFyIGE7Y29uc3QgbD1aKFwiZGl2XCIse2lkOmAke2UucHJvdmlkZXJ9LSR7TWF0aC5mbG9vcigxZTQqTWF0aC5yYW5kb20oKSl9YCxcImRhdGEtcG9zdGVyXCI6dC5jdXN0b21Db250cm9scz9lLnBvc3Rlcjp2b2lkIDB9KTtpZihlLm1lZGlhPXNlKGwsZS5tZWRpYSksdC5jdXN0b21Db250cm9scyl7Y29uc3QgdD1lPT5gaHR0cHM6Ly9pLnl0aW1nLmNvbS92aS8ke259LyR7ZX1kZWZhdWx0LmpwZ2A7bnQodChcIm1heHJlc1wiKSwxMjEpLmNhdGNoKCgoKT0+bnQodChcInNkXCIpLDEyMSkpKS5jYXRjaCgoKCk9Pm50KHQoXCJocVwiKSkpKS50aGVuKCh0PT5hdC5zZXRQb3N0ZXIuY2FsbChlLHQuc3JjKSkpLnRoZW4oKHQ9Pnt0LmluY2x1ZGVzKFwibWF4cmVzXCIpfHwoZS5lbGVtZW50cy5wb3N0ZXIuc3R5bGUuYmFja2dyb3VuZFNpemU9XCJjb3ZlclwiKX0pKS5jYXRjaCgoKCk9Pnt9KSl9ZS5lbWJlZD1uZXcgd2luZG93LllULlBsYXllcihlLm1lZGlhLHt2aWRlb0lkOm4saG9zdDpkdCh0KSxwbGF5ZXJWYXJzOlgoe30se2F1dG9wbGF5OmUuY29uZmlnLmF1dG9wbGF5PzE6MCxobDplLmNvbmZpZy5obCxjb250cm9sczplLnN1cHBvcnRlZC51aSYmdC5jdXN0b21Db250cm9scz8wOjEsZGlzYWJsZWtiOjEscGxheXNpbmxpbmU6ZS5jb25maWcuZnVsbHNjcmVlbi5pb3NOYXRpdmU/MDoxLGNjX2xvYWRfcG9saWN5OmUuY2FwdGlvbnMuYWN0aXZlPzE6MCxjY19sYW5nX3ByZWY6ZS5jb25maWcuY2FwdGlvbnMubGFuZ3VhZ2Usd2lkZ2V0X3JlZmVycmVyOndpbmRvdz93aW5kb3cubG9jYXRpb24uaHJlZjpudWxsfSx0KSxldmVudHM6e29uRXJyb3IodCl7aWYoIWUubWVkaWEuZXJyb3Ipe2NvbnN0IGk9dC5kYXRhLHM9ezI6XCJUaGUgcmVxdWVzdCBjb250YWlucyBhbiBpbnZhbGlkIHBhcmFtZXRlciB2YWx1ZS4gRm9yIGV4YW1wbGUsIHRoaXMgZXJyb3Igb2NjdXJzIGlmIHlvdSBzcGVjaWZ5IGEgdmlkZW8gSUQgdGhhdCBkb2VzIG5vdCBoYXZlIDExIGNoYXJhY3RlcnMsIG9yIGlmIHRoZSB2aWRlbyBJRCBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMsIHN1Y2ggYXMgZXhjbGFtYXRpb24gcG9pbnRzIG9yIGFzdGVyaXNrcy5cIiw1OlwiVGhlIHJlcXVlc3RlZCBjb250ZW50IGNhbm5vdCBiZSBwbGF5ZWQgaW4gYW4gSFRNTDUgcGxheWVyIG9yIGFub3RoZXIgZXJyb3IgcmVsYXRlZCB0byB0aGUgSFRNTDUgcGxheWVyIGhhcyBvY2N1cnJlZC5cIiwxMDA6XCJUaGUgdmlkZW8gcmVxdWVzdGVkIHdhcyBub3QgZm91bmQuIFRoaXMgZXJyb3Igb2NjdXJzIHdoZW4gYSB2aWRlbyBoYXMgYmVlbiByZW1vdmVkIChmb3IgYW55IHJlYXNvbikgb3IgaGFzIGJlZW4gbWFya2VkIGFzIHByaXZhdGUuXCIsMTAxOlwiVGhlIG93bmVyIG9mIHRoZSByZXF1ZXN0ZWQgdmlkZW8gZG9lcyBub3QgYWxsb3cgaXQgdG8gYmUgcGxheWVkIGluIGVtYmVkZGVkIHBsYXllcnMuXCIsMTUwOlwiVGhlIG93bmVyIG9mIHRoZSByZXF1ZXN0ZWQgdmlkZW8gZG9lcyBub3QgYWxsb3cgaXQgdG8gYmUgcGxheWVkIGluIGVtYmVkZGVkIHBsYXllcnMuXCJ9W2ldfHxcIkFuIHVua25vd24gZXJyb3Igb2NjdXJlZFwiO2UubWVkaWEuZXJyb3I9e2NvZGU6aSxtZXNzYWdlOnN9LHZlLmNhbGwoZSxlLm1lZGlhLFwiZXJyb3JcIil9fSxvblBsYXliYWNrUmF0ZUNoYW5nZSh0KXtjb25zdCBpPXQudGFyZ2V0O2UubWVkaWEucGxheWJhY2tSYXRlPWkuZ2V0UGxheWJhY2tSYXRlKCksdmUuY2FsbChlLGUubWVkaWEsXCJyYXRlY2hhbmdlXCIpfSxvblJlYWR5KGkpe2lmKGooZS5tZWRpYS5wbGF5KSlyZXR1cm47Y29uc3Qgcz1pLnRhcmdldDttdC5nZXRUaXRsZS5jYWxsKGUsbiksZS5tZWRpYS5wbGF5PSgpPT57dXQuY2FsbChlLCEwKSxzLnBsYXlWaWRlbygpfSxlLm1lZGlhLnBhdXNlPSgpPT57dXQuY2FsbChlLCExKSxzLnBhdXNlVmlkZW8oKX0sZS5tZWRpYS5zdG9wPSgpPT57cy5zdG9wVmlkZW8oKX0sZS5tZWRpYS5kdXJhdGlvbj1zLmdldER1cmF0aW9uKCksZS5tZWRpYS5wYXVzZWQ9ITAsZS5tZWRpYS5jdXJyZW50VGltZT0wLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLm1lZGlhLFwiY3VycmVudFRpbWVcIix7Z2V0OigpPT5OdW1iZXIocy5nZXRDdXJyZW50VGltZSgpKSxzZXQodCl7ZS5wYXVzZWQmJiFlLmVtYmVkLmhhc1BsYXllZCYmZS5lbWJlZC5tdXRlKCksZS5tZWRpYS5zZWVraW5nPSEwLHZlLmNhbGwoZSxlLm1lZGlhLFwic2Vla2luZ1wiKSxzLnNlZWtUbyh0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5tZWRpYSxcInBsYXliYWNrUmF0ZVwiLHtnZXQ6KCk9PnMuZ2V0UGxheWJhY2tSYXRlKCksc2V0KGUpe3Muc2V0UGxheWJhY2tSYXRlKGUpfX0pO2xldHt2b2x1bWU6YX09ZS5jb25maWc7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUubWVkaWEsXCJ2b2x1bWVcIix7Z2V0OigpPT5hLHNldCh0KXthPXQscy5zZXRWb2x1bWUoMTAwKmEpLHZlLmNhbGwoZSxlLm1lZGlhLFwidm9sdW1lY2hhbmdlXCIpfX0pO2xldHttdXRlZDpsfT1lLmNvbmZpZztPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5tZWRpYSxcIm11dGVkXCIse2dldDooKT0+bCxzZXQodCl7Y29uc3QgaT1PKHQpP3Q6bDtsPWksc1tpP1wibXV0ZVwiOlwidW5NdXRlXCJdKCkscy5zZXRWb2x1bWUoMTAwKmEpLHZlLmNhbGwoZSxlLm1lZGlhLFwidm9sdW1lY2hhbmdlXCIpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLm1lZGlhLFwiY3VycmVudFNyY1wiLHtnZXQ6KCk9PnMuZ2V0VmlkZW9VcmwoKX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLm1lZGlhLFwiZW5kZWRcIix7Z2V0OigpPT5lLmN1cnJlbnRUaW1lPT09ZS5kdXJhdGlvbn0pO2NvbnN0IG89cy5nZXRBdmFpbGFibGVQbGF5YmFja1JhdGVzKCk7ZS5vcHRpb25zLnNwZWVkPW8uZmlsdGVyKCh0PT5lLmNvbmZpZy5zcGVlZC5vcHRpb25zLmluY2x1ZGVzKHQpKSksZS5zdXBwb3J0ZWQudWkmJnQuY3VzdG9tQ29udHJvbHMmJmUubWVkaWEuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwtMSksdmUuY2FsbChlLGUubWVkaWEsXCJ0aW1ldXBkYXRlXCIpLHZlLmNhbGwoZSxlLm1lZGlhLFwiZHVyYXRpb25jaGFuZ2VcIiksY2xlYXJJbnRlcnZhbChlLnRpbWVycy5idWZmZXJpbmcpLGUudGltZXJzLmJ1ZmZlcmluZz1zZXRJbnRlcnZhbCgoKCk9PntlLm1lZGlhLmJ1ZmZlcmVkPXMuZ2V0VmlkZW9Mb2FkZWRGcmFjdGlvbigpLChudWxsPT09ZS5tZWRpYS5sYXN0QnVmZmVyZWR8fGUubWVkaWEubGFzdEJ1ZmZlcmVkPGUubWVkaWEuYnVmZmVyZWQpJiZ2ZS5jYWxsKGUsZS5tZWRpYSxcInByb2dyZXNzXCIpLGUubWVkaWEubGFzdEJ1ZmZlcmVkPWUubWVkaWEuYnVmZmVyZWQsMT09PWUubWVkaWEuYnVmZmVyZWQmJihjbGVhckludGVydmFsKGUudGltZXJzLmJ1ZmZlcmluZyksdmUuY2FsbChlLGUubWVkaWEsXCJjYW5wbGF5dGhyb3VnaFwiKSl9KSwyMDApLHQuY3VzdG9tQ29udHJvbHMmJnNldFRpbWVvdXQoKCgpPT5hdC5idWlsZC5jYWxsKGUpKSw1MCl9LG9uU3RhdGVDaGFuZ2UoaSl7Y29uc3Qgcz1pLnRhcmdldDtjbGVhckludGVydmFsKGUudGltZXJzLnBsYXlpbmcpO3N3aXRjaChlLm1lZGlhLnNlZWtpbmcmJlsxLDJdLmluY2x1ZGVzKGkuZGF0YSkmJihlLm1lZGlhLnNlZWtpbmc9ITEsdmUuY2FsbChlLGUubWVkaWEsXCJzZWVrZWRcIikpLGkuZGF0YSl7Y2FzZS0xOnZlLmNhbGwoZSxlLm1lZGlhLFwidGltZXVwZGF0ZVwiKSxlLm1lZGlhLmJ1ZmZlcmVkPXMuZ2V0VmlkZW9Mb2FkZWRGcmFjdGlvbigpLHZlLmNhbGwoZSxlLm1lZGlhLFwicHJvZ3Jlc3NcIik7YnJlYWs7Y2FzZSAwOnV0LmNhbGwoZSwhMSksZS5tZWRpYS5sb29wPyhzLnN0b3BWaWRlbygpLHMucGxheVZpZGVvKCkpOnZlLmNhbGwoZSxlLm1lZGlhLFwiZW5kZWRcIik7YnJlYWs7Y2FzZSAxOnQuY3VzdG9tQ29udHJvbHMmJiFlLmNvbmZpZy5hdXRvcGxheSYmZS5tZWRpYS5wYXVzZWQmJiFlLmVtYmVkLmhhc1BsYXllZD9lLm1lZGlhLnBhdXNlKCk6KHV0LmNhbGwoZSwhMCksdmUuY2FsbChlLGUubWVkaWEsXCJwbGF5aW5nXCIpLGUudGltZXJzLnBsYXlpbmc9c2V0SW50ZXJ2YWwoKCgpPT57dmUuY2FsbChlLGUubWVkaWEsXCJ0aW1ldXBkYXRlXCIpfSksNTApLGUubWVkaWEuZHVyYXRpb24hPT1zLmdldER1cmF0aW9uKCkmJihlLm1lZGlhLmR1cmF0aW9uPXMuZ2V0RHVyYXRpb24oKSx2ZS5jYWxsKGUsZS5tZWRpYSxcImR1cmF0aW9uY2hhbmdlXCIpKSk7YnJlYWs7Y2FzZSAyOmUubXV0ZWR8fGUuZW1iZWQudW5NdXRlKCksdXQuY2FsbChlLCExKTticmVhaztjYXNlIDM6dmUuY2FsbChlLGUubWVkaWEsXCJ3YWl0aW5nXCIpfXZlLmNhbGwoZSxlLmVsZW1lbnRzLmNvbnRhaW5lcixcInN0YXRlY2hhbmdlXCIsITEse2NvZGU6aS5kYXRhfSl9fX0pfX0scHQ9e3NldHVwKCl7dGhpcy5tZWRpYT8obGUodGhpcy5lbGVtZW50cy5jb250YWluZXIsdGhpcy5jb25maWcuY2xhc3NOYW1lcy50eXBlLnJlcGxhY2UoXCJ7MH1cIix0aGlzLnR5cGUpLCEwKSxsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5jbGFzc05hbWVzLnByb3ZpZGVyLnJlcGxhY2UoXCJ7MH1cIix0aGlzLnByb3ZpZGVyKSwhMCksdGhpcy5pc0VtYmVkJiZsZSh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5jbGFzc05hbWVzLnR5cGUucmVwbGFjZShcInswfVwiLFwidmlkZW9cIiksITApLHRoaXMuaXNWaWRlbyYmKHRoaXMuZWxlbWVudHMud3JhcHBlcj1aKFwiZGl2XCIse2NsYXNzOnRoaXMuY29uZmlnLmNsYXNzTmFtZXMudmlkZW99KSxKKHRoaXMubWVkaWEsdGhpcy5lbGVtZW50cy53cmFwcGVyKSx0aGlzLmVsZW1lbnRzLnBvc3Rlcj1aKFwiZGl2XCIse2NsYXNzOnRoaXMuY29uZmlnLmNsYXNzTmFtZXMucG9zdGVyfSksdGhpcy5lbGVtZW50cy53cmFwcGVyLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMucG9zdGVyKSksdGhpcy5pc0hUTUw1P0xlLnNldHVwLmNhbGwodGhpcyk6dGhpcy5pc1lvdVR1YmU/bXQuc2V0dXAuY2FsbCh0aGlzKTp0aGlzLmlzVmltZW8mJmh0LnNldHVwLmNhbGwodGhpcykpOnRoaXMuZGVidWcud2FybihcIk5vIG1lZGlhIGVsZW1lbnQgZm91bmQhXCIpfX07Y2xhc3MgZ3R7Y29uc3RydWN0b3IodCl7ZSh0aGlzLFwibG9hZFwiLCgoKT0+e3RoaXMuZW5hYmxlZCYmKEwod2luZG93Lmdvb2dsZSkmJkwod2luZG93Lmdvb2dsZS5pbWEpP3RoaXMucmVhZHkoKTpydCh0aGlzLnBsYXllci5jb25maWcudXJscy5nb29nbGVJTUEuc2RrKS50aGVuKCgoKT0+e3RoaXMucmVhZHkoKX0pKS5jYXRjaCgoKCk9Pnt0aGlzLnRyaWdnZXIoXCJlcnJvclwiLG5ldyBFcnJvcihcIkdvb2dsZSBJTUEgU0RLIGZhaWxlZCB0byBsb2FkXCIpKX0pKSl9KSksZSh0aGlzLFwicmVhZHlcIiwoKCk9Pnt2YXIgZTt0aGlzLmVuYWJsZWR8fCgoZT10aGlzKS5tYW5hZ2VyJiZlLm1hbmFnZXIuZGVzdHJveSgpLGUuZWxlbWVudHMuZGlzcGxheUNvbnRhaW5lciYmZS5lbGVtZW50cy5kaXNwbGF5Q29udGFpbmVyLmRlc3Ryb3koKSxlLmVsZW1lbnRzLmNvbnRhaW5lci5yZW1vdmUoKSksdGhpcy5zdGFydFNhZmV0eVRpbWVyKDEyZTMsXCJyZWFkeSgpXCIpLHRoaXMubWFuYWdlclByb21pc2UudGhlbigoKCk9Pnt0aGlzLmNsZWFyU2FmZXR5VGltZXIoXCJvbkFkc01hbmFnZXJMb2FkZWQoKVwiKX0pKSx0aGlzLmxpc3RlbmVycygpLHRoaXMuc2V0dXBJTUEoKX0pKSxlKHRoaXMsXCJzZXR1cElNQVwiLCgoKT0+e3RoaXMuZWxlbWVudHMuY29udGFpbmVyPVooXCJkaXZcIix7Y2xhc3M6dGhpcy5wbGF5ZXIuY29uZmlnLmNsYXNzTmFtZXMuYWRzfSksdGhpcy5wbGF5ZXIuZWxlbWVudHMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMuY29udGFpbmVyKSxnb29nbGUuaW1hLnNldHRpbmdzLnNldFZwYWlkTW9kZShnb29nbGUuaW1hLkltYVNka1NldHRpbmdzLlZwYWlkTW9kZS5FTkFCTEVEKSxnb29nbGUuaW1hLnNldHRpbmdzLnNldExvY2FsZSh0aGlzLnBsYXllci5jb25maWcuYWRzLmxhbmd1YWdlKSxnb29nbGUuaW1hLnNldHRpbmdzLnNldERpc2FibGVDdXN0b21QbGF5YmFja0ZvcklPUzEwUGx1cyh0aGlzLnBsYXllci5jb25maWcucGxheXNpbmxpbmUpLHRoaXMuZWxlbWVudHMuZGlzcGxheUNvbnRhaW5lcj1uZXcgZ29vZ2xlLmltYS5BZERpc3BsYXlDb250YWluZXIodGhpcy5lbGVtZW50cy5jb250YWluZXIsdGhpcy5wbGF5ZXIubWVkaWEpLHRoaXMubG9hZGVyPW5ldyBnb29nbGUuaW1hLkFkc0xvYWRlcih0aGlzLmVsZW1lbnRzLmRpc3BsYXlDb250YWluZXIpLHRoaXMubG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQsKGU9PnRoaXMub25BZHNNYW5hZ2VyTG9hZGVkKGUpKSwhMSksdGhpcy5sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLChlPT50aGlzLm9uQWRFcnJvcihlKSksITEpLHRoaXMucmVxdWVzdEFkcygpfSkpLGUodGhpcyxcInJlcXVlc3RBZHNcIiwoKCk9Pntjb25zdHtjb250YWluZXI6ZX09dGhpcy5wbGF5ZXIuZWxlbWVudHM7dHJ5e2NvbnN0IHQ9bmV3IGdvb2dsZS5pbWEuQWRzUmVxdWVzdDt0LmFkVGFnVXJsPXRoaXMudGFnVXJsLHQubGluZWFyQWRTbG90V2lkdGg9ZS5vZmZzZXRXaWR0aCx0LmxpbmVhckFkU2xvdEhlaWdodD1lLm9mZnNldEhlaWdodCx0Lm5vbkxpbmVhckFkU2xvdFdpZHRoPWUub2Zmc2V0V2lkdGgsdC5ub25MaW5lYXJBZFNsb3RIZWlnaHQ9ZS5vZmZzZXRIZWlnaHQsdC5mb3JjZU5vbkxpbmVhckZ1bGxTbG90PSExLHQuc2V0QWRXaWxsUGxheU11dGVkKCF0aGlzLnBsYXllci5tdXRlZCksdGhpcy5sb2FkZXIucmVxdWVzdEFkcyh0KX1jYXRjaChlKXt0aGlzLm9uQWRFcnJvcihlKX19KSksZSh0aGlzLFwicG9sbENvdW50ZG93blwiLCgoZT0hMSk9PntpZighZSlyZXR1cm4gY2xlYXJJbnRlcnZhbCh0aGlzLmNvdW50ZG93blRpbWVyKSx2b2lkIHRoaXMuZWxlbWVudHMuY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtYmFkZ2UtdGV4dFwiKTt0aGlzLmNvdW50ZG93blRpbWVyPXNldEludGVydmFsKCgoKT0+e2NvbnN0IGU9VWUoTWF0aC5tYXgodGhpcy5tYW5hZ2VyLmdldFJlbWFpbmluZ1RpbWUoKSwwKSksdD1gJHtIZS5nZXQoXCJhZHZlcnRpc2VtZW50XCIsdGhpcy5wbGF5ZXIuY29uZmlnKX0gLSAke2V9YDt0aGlzLmVsZW1lbnRzLmNvbnRhaW5lci5zZXRBdHRyaWJ1dGUoXCJkYXRhLWJhZGdlLXRleHRcIix0KX0pLDEwMCl9KSksZSh0aGlzLFwib25BZHNNYW5hZ2VyTG9hZGVkXCIsKGU9PntpZighdGhpcy5lbmFibGVkKXJldHVybjtjb25zdCB0PW5ldyBnb29nbGUuaW1hLkFkc1JlbmRlcmluZ1NldHRpbmdzO3QucmVzdG9yZUN1c3RvbVBsYXliYWNrU3RhdGVPbkFkQnJlYWtDb21wbGV0ZT0hMCx0LmVuYWJsZVByZWxvYWRpbmc9ITAsdGhpcy5tYW5hZ2VyPWUuZ2V0QWRzTWFuYWdlcih0aGlzLnBsYXllcix0KSx0aGlzLmN1ZVBvaW50cz10aGlzLm1hbmFnZXIuZ2V0Q3VlUG9pbnRzKCksdGhpcy5tYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwoZT0+dGhpcy5vbkFkRXJyb3IoZSkpKSxPYmplY3Qua2V5cyhnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSkuZm9yRWFjaCgoZT0+e3RoaXMubWFuYWdlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFdmVudC5UeXBlW2VdLChlPT50aGlzLm9uQWRFdmVudChlKSkpfSkpLHRoaXMudHJpZ2dlcihcImxvYWRlZFwiKX0pKSxlKHRoaXMsXCJhZGRDdWVQb2ludHNcIiwoKCk9PntXKHRoaXMuY3VlUG9pbnRzKXx8dGhpcy5jdWVQb2ludHMuZm9yRWFjaCgoZT0+e2lmKDAhPT1lJiYtMSE9PWUmJmU8dGhpcy5wbGF5ZXIuZHVyYXRpb24pe2NvbnN0IHQ9dGhpcy5wbGF5ZXIuZWxlbWVudHMucHJvZ3Jlc3M7aWYoSCh0KSl7Y29uc3QgaT0xMDAvdGhpcy5wbGF5ZXIuZHVyYXRpb24qZSxzPVooXCJzcGFuXCIse2NsYXNzOnRoaXMucGxheWVyLmNvbmZpZy5jbGFzc05hbWVzLmN1ZXN9KTtzLnN0eWxlLmxlZnQ9YCR7aS50b1N0cmluZygpfSVgLHQuYXBwZW5kQ2hpbGQocyl9fX0pKX0pKSxlKHRoaXMsXCJvbkFkRXZlbnRcIiwoZT0+e2NvbnN0e2NvbnRhaW5lcjp0fT10aGlzLnBsYXllci5lbGVtZW50cyxpPWUuZ2V0QWQoKSxzPWUuZ2V0QWREYXRhKCk7c3dpdGNoKChlPT57dmUuY2FsbCh0aGlzLnBsYXllcix0aGlzLnBsYXllci5tZWRpYSxgYWRzJHtlLnJlcGxhY2UoL18vZyxcIlwiKS50b0xvd2VyQ2FzZSgpfWApfSkoZS50eXBlKSxlLnR5cGUpe2Nhc2UgZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9BREVEOnRoaXMudHJpZ2dlcihcImxvYWRlZFwiKSx0aGlzLnBvbGxDb3VudGRvd24oITApLGkuaXNMaW5lYXIoKXx8KGkud2lkdGg9dC5vZmZzZXRXaWR0aCxpLmhlaWdodD10Lm9mZnNldEhlaWdodCk7YnJlYWs7Y2FzZSBnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5TVEFSVEVEOnRoaXMubWFuYWdlci5zZXRWb2x1bWUodGhpcy5wbGF5ZXIudm9sdW1lKTticmVhaztjYXNlIGdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkFMTF9BRFNfQ09NUExFVEVEOnRoaXMucGxheWVyLmVuZGVkP3RoaXMubG9hZEFkcygpOnRoaXMubG9hZGVyLmNvbnRlbnRDb21wbGV0ZSgpO2JyZWFrO2Nhc2UgZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuQ09OVEVOVF9QQVVTRV9SRVFVRVNURUQ6dGhpcy5wYXVzZUNvbnRlbnQoKTticmVhaztjYXNlIGdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkNPTlRFTlRfUkVTVU1FX1JFUVVFU1RFRDp0aGlzLnBvbGxDb3VudGRvd24oKSx0aGlzLnJlc3VtZUNvbnRlbnQoKTticmVhaztjYXNlIGdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRzpzLmFkRXJyb3ImJnRoaXMucGxheWVyLmRlYnVnLndhcm4oYE5vbi1mYXRhbCBhZCBlcnJvcjogJHtzLmFkRXJyb3IuZ2V0TWVzc2FnZSgpfWApfX0pKSxlKHRoaXMsXCJvbkFkRXJyb3JcIiwoZT0+e3RoaXMuY2FuY2VsKCksdGhpcy5wbGF5ZXIuZGVidWcud2FybihcIkFkcyBlcnJvclwiLGUpfSkpLGUodGhpcyxcImxpc3RlbmVyc1wiLCgoKT0+e2NvbnN0e2NvbnRhaW5lcjplfT10aGlzLnBsYXllci5lbGVtZW50cztsZXQgdDt0aGlzLnBsYXllci5vbihcImNhbnBsYXlcIiwoKCk9Pnt0aGlzLmFkZEN1ZVBvaW50cygpfSkpLHRoaXMucGxheWVyLm9uKFwiZW5kZWRcIiwoKCk9Pnt0aGlzLmxvYWRlci5jb250ZW50Q29tcGxldGUoKX0pKSx0aGlzLnBsYXllci5vbihcInRpbWV1cGRhdGVcIiwoKCk9Pnt0PXRoaXMucGxheWVyLmN1cnJlbnRUaW1lfSkpLHRoaXMucGxheWVyLm9uKFwic2Vla2VkXCIsKCgpPT57Y29uc3QgZT10aGlzLnBsYXllci5jdXJyZW50VGltZTtXKHRoaXMuY3VlUG9pbnRzKXx8dGhpcy5jdWVQb2ludHMuZm9yRWFjaCgoKGkscyk9Pnt0PGkmJmk8ZSYmKHRoaXMubWFuYWdlci5kaXNjYXJkQWRCcmVhaygpLHRoaXMuY3VlUG9pbnRzLnNwbGljZShzLDEpKX0pKX0pKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCgoKT0+e3RoaXMubWFuYWdlciYmdGhpcy5tYW5hZ2VyLnJlc2l6ZShlLm9mZnNldFdpZHRoLGUub2Zmc2V0SGVpZ2h0LGdvb2dsZS5pbWEuVmlld01vZGUuTk9STUFMKX0pKX0pKSxlKHRoaXMsXCJwbGF5XCIsKCgpPT57Y29uc3R7Y29udGFpbmVyOmV9PXRoaXMucGxheWVyLmVsZW1lbnRzO3RoaXMubWFuYWdlclByb21pc2V8fHRoaXMucmVzdW1lQ29udGVudCgpLHRoaXMubWFuYWdlclByb21pc2UudGhlbigoKCk9Pnt0aGlzLm1hbmFnZXIuc2V0Vm9sdW1lKHRoaXMucGxheWVyLnZvbHVtZSksdGhpcy5lbGVtZW50cy5kaXNwbGF5Q29udGFpbmVyLmluaXRpYWxpemUoKTt0cnl7dGhpcy5pbml0aWFsaXplZHx8KHRoaXMubWFuYWdlci5pbml0KGUub2Zmc2V0V2lkdGgsZS5vZmZzZXRIZWlnaHQsZ29vZ2xlLmltYS5WaWV3TW9kZS5OT1JNQUwpLHRoaXMubWFuYWdlci5zdGFydCgpKSx0aGlzLmluaXRpYWxpemVkPSEwfWNhdGNoKGUpe3RoaXMub25BZEVycm9yKGUpfX0pKS5jYXRjaCgoKCk9Pnt9KSl9KSksZSh0aGlzLFwicmVzdW1lQ29udGVudFwiLCgoKT0+e3RoaXMuZWxlbWVudHMuY29udGFpbmVyLnN0eWxlLnpJbmRleD1cIlwiLHRoaXMucGxheWluZz0hMSxrZSh0aGlzLnBsYXllci5tZWRpYS5wbGF5KCkpfSkpLGUodGhpcyxcInBhdXNlQ29udGVudFwiLCgoKT0+e3RoaXMuZWxlbWVudHMuY29udGFpbmVyLnN0eWxlLnpJbmRleD0zLHRoaXMucGxheWluZz0hMCx0aGlzLnBsYXllci5tZWRpYS5wYXVzZSgpfSkpLGUodGhpcyxcImNhbmNlbFwiLCgoKT0+e3RoaXMuaW5pdGlhbGl6ZWQmJnRoaXMucmVzdW1lQ29udGVudCgpLHRoaXMudHJpZ2dlcihcImVycm9yXCIpLHRoaXMubG9hZEFkcygpfSkpLGUodGhpcyxcImxvYWRBZHNcIiwoKCk9Pnt0aGlzLm1hbmFnZXJQcm9taXNlLnRoZW4oKCgpPT57dGhpcy5tYW5hZ2VyJiZ0aGlzLm1hbmFnZXIuZGVzdHJveSgpLHRoaXMubWFuYWdlclByb21pc2U9bmV3IFByb21pc2UoKGU9Pnt0aGlzLm9uKFwibG9hZGVkXCIsZSksdGhpcy5wbGF5ZXIuZGVidWcubG9nKHRoaXMubWFuYWdlcil9KSksdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLnJlcXVlc3RBZHMoKX0pKS5jYXRjaCgoKCk9Pnt9KSl9KSksZSh0aGlzLFwidHJpZ2dlclwiLCgoZSwuLi50KT0+e2NvbnN0IGk9dGhpcy5ldmVudHNbZV07RChpKSYmaS5mb3JFYWNoKChlPT57aihlKSYmZS5hcHBseSh0aGlzLHQpfSkpfSkpLGUodGhpcyxcIm9uXCIsKChlLHQpPT4oRCh0aGlzLmV2ZW50c1tlXSl8fCh0aGlzLmV2ZW50c1tlXT1bXSksdGhpcy5ldmVudHNbZV0ucHVzaCh0KSx0aGlzKSkpLGUodGhpcyxcInN0YXJ0U2FmZXR5VGltZXJcIiwoKGUsdCk9Pnt0aGlzLnBsYXllci5kZWJ1Zy5sb2coYFNhZmV0eSB0aW1lciBpbnZva2VkIGZyb206ICR7dH1gKSx0aGlzLnNhZmV0eVRpbWVyPXNldFRpbWVvdXQoKCgpPT57dGhpcy5jYW5jZWwoKSx0aGlzLmNsZWFyU2FmZXR5VGltZXIoXCJzdGFydFNhZmV0eVRpbWVyKClcIil9KSxlKX0pKSxlKHRoaXMsXCJjbGVhclNhZmV0eVRpbWVyXCIsKGU9PntJKHRoaXMuc2FmZXR5VGltZXIpfHwodGhpcy5wbGF5ZXIuZGVidWcubG9nKGBTYWZldHkgdGltZXIgY2xlYXJlZCBmcm9tOiAke2V9YCksY2xlYXJUaW1lb3V0KHRoaXMuc2FmZXR5VGltZXIpLHRoaXMuc2FmZXR5VGltZXI9bnVsbCl9KSksdGhpcy5wbGF5ZXI9dCx0aGlzLmNvbmZpZz10LmNvbmZpZy5hZHMsdGhpcy5wbGF5aW5nPSExLHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5lbGVtZW50cz17Y29udGFpbmVyOm51bGwsZGlzcGxheUNvbnRhaW5lcjpudWxsfSx0aGlzLm1hbmFnZXI9bnVsbCx0aGlzLmxvYWRlcj1udWxsLHRoaXMuY3VlUG9pbnRzPW51bGwsdGhpcy5ldmVudHM9e30sdGhpcy5zYWZldHlUaW1lcj1udWxsLHRoaXMuY291bnRkb3duVGltZXI9bnVsbCx0aGlzLm1hbmFnZXJQcm9taXNlPW5ldyBQcm9taXNlKCgoZSx0KT0+e3RoaXMub24oXCJsb2FkZWRcIixlKSx0aGlzLm9uKFwiZXJyb3JcIix0KX0pKSx0aGlzLmxvYWQoKX1nZXQgZW5hYmxlZCgpe2NvbnN0e2NvbmZpZzplfT10aGlzO3JldHVybiB0aGlzLnBsYXllci5pc0hUTUw1JiZ0aGlzLnBsYXllci5pc1ZpZGVvJiZlLmVuYWJsZWQmJighVyhlLnB1Ymxpc2hlcklkKXx8VShlLnRhZ1VybCkpfWdldCB0YWdVcmwoKXtjb25zdHtjb25maWc6ZX09dGhpcztpZihVKGUudGFnVXJsKSlyZXR1cm4gZS50YWdVcmw7cmV0dXJuYGh0dHBzOi8vZ28uYW5pdmlldy5jb20vYXBpL2Fkc2VydmVyNi92YXN0Lz8ke0tlKHtBVl9QVUJMSVNIRVJJRDpcIjU4YzI1YmIwMDczZWY0NDhiMTA4N2FkNlwiLEFWX0NIQU5ORUxJRDpcIjVhMDQ1OGRjMjhhMDYxNDVlNDUxOWQyMVwiLEFWX1VSTDp3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsY2I6RGF0ZS5ub3coKSxBVl9XSURUSDo2NDAsQVZfSEVJR0hUOjQ4MCxBVl9DRElNMjplLnB1Ymxpc2hlcklkfSl9YH19ZnVuY3Rpb24gZnQoZT0wLHQ9MCxpPTI1NSl7cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGUsdCksaSl9Y29uc3QgYnQ9ZT0+e2NvbnN0IHQ9W107cmV0dXJuIGUuc3BsaXQoL1xcclxcblxcclxcbnxcXG5cXG58XFxyXFxyLykuZm9yRWFjaCgoZT0+e2NvbnN0IGk9e307ZS5zcGxpdCgvXFxyXFxufFxcbnxcXHIvKS5mb3JFYWNoKChlPT57aWYoJChpLnN0YXJ0VGltZSkpe2lmKCFXKGUudHJpbSgpKSYmVyhpLnRleHQpKXtjb25zdCB0PWUudHJpbSgpLnNwbGl0KFwiI3h5d2g9XCIpO1tpLnRleHRdPXQsdFsxXSYmKFtpLngsaS55LGkudyxpLmhdPXRbMV0uc3BsaXQoXCIsXCIpKX19ZWxzZXtjb25zdCB0PWUubWF0Y2goLyhbMC05XXsyfSk/Oj8oWzAtOV17Mn0pOihbMC05XXsyfSkuKFswLTldezIsM30pKCA/LS0+ID8pKFswLTldezJ9KT86PyhbMC05XXsyfSk6KFswLTldezJ9KS4oWzAtOV17MiwzfSkvKTt0JiYoaS5zdGFydFRpbWU9NjAqTnVtYmVyKHRbMV18fDApKjYwKzYwKk51bWJlcih0WzJdKStOdW1iZXIodFszXSkrTnVtYmVyKGAwLiR7dFs0XX1gKSxpLmVuZFRpbWU9NjAqTnVtYmVyKHRbNl18fDApKjYwKzYwKk51bWJlcih0WzddKStOdW1iZXIodFs4XSkrTnVtYmVyKGAwLiR7dFs5XX1gKSl9fSkpLGkudGV4dCYmdC5wdXNoKGkpfSkpLHR9LHl0PShlLHQpPT57Y29uc3QgaT17fTtyZXR1cm4gZT50LndpZHRoL3QuaGVpZ2h0PyhpLndpZHRoPXQud2lkdGgsaS5oZWlnaHQ9MS9lKnQud2lkdGgpOihpLmhlaWdodD10LmhlaWdodCxpLndpZHRoPWUqdC5oZWlnaHQpLGl9O2NsYXNzIHZ0e2NvbnN0cnVjdG9yKHQpe2UodGhpcyxcImxvYWRcIiwoKCk9Pnt0aGlzLnBsYXllci5lbGVtZW50cy5kaXNwbGF5LnNlZWtUb29sdGlwJiYodGhpcy5wbGF5ZXIuZWxlbWVudHMuZGlzcGxheS5zZWVrVG9vbHRpcC5oaWRkZW49dGhpcy5lbmFibGVkKSx0aGlzLmVuYWJsZWQmJnRoaXMuZ2V0VGh1bWJuYWlscygpLnRoZW4oKCgpPT57dGhpcy5lbmFibGVkJiYodGhpcy5yZW5kZXIoKSx0aGlzLmRldGVybWluZUNvbnRhaW5lckF1dG9TaXppbmcoKSx0aGlzLmxvYWRlZD0hMCl9KSl9KSksZSh0aGlzLFwiZ2V0VGh1bWJuYWlsc1wiLCgoKT0+bmV3IFByb21pc2UoKGU9Pntjb25zdHtzcmM6dH09dGhpcy5wbGF5ZXIuY29uZmlnLnByZXZpZXdUaHVtYm5haWxzO2lmKFcodCkpdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBwcmV2aWV3VGh1bWJuYWlscy5zcmMgY29uZmlnIGF0dHJpYnV0ZVwiKTtjb25zdCBpPSgpPT57dGhpcy50aHVtYm5haWxzLnNvcnQoKChlLHQpPT5lLmhlaWdodC10LmhlaWdodCkpLHRoaXMucGxheWVyLmRlYnVnLmxvZyhcIlByZXZpZXcgdGh1bWJuYWlsc1wiLHRoaXMudGh1bWJuYWlscyksZSgpfTtpZihqKHQpKXQoKGU9Pnt0aGlzLnRodW1ibmFpbHM9ZSxpKCl9KSk7ZWxzZXtjb25zdCBlPShfKHQpP1t0XTp0KS5tYXAoKGU9PnRoaXMuZ2V0VGh1bWJuYWlsKGUpKSk7UHJvbWlzZS5hbGwoZSkudGhlbihpKX19KSkpKSxlKHRoaXMsXCJnZXRUaHVtYm5haWxcIiwoZT0+bmV3IFByb21pc2UoKHQ9PntGZShlKS50aGVuKChpPT57Y29uc3Qgcz17ZnJhbWVzOmJ0KGkpLGhlaWdodDpudWxsLHVybFByZWZpeDpcIlwifTtzLmZyYW1lc1swXS50ZXh0LnN0YXJ0c1dpdGgoXCIvXCIpfHxzLmZyYW1lc1swXS50ZXh0LnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpfHxzLmZyYW1lc1swXS50ZXh0LnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKXx8KHMudXJsUHJlZml4PWUuc3Vic3RyaW5nKDAsZS5sYXN0SW5kZXhPZihcIi9cIikrMSkpO2NvbnN0IG49bmV3IEltYWdlO24ub25sb2FkPSgpPT57cy5oZWlnaHQ9bi5uYXR1cmFsSGVpZ2h0LHMud2lkdGg9bi5uYXR1cmFsV2lkdGgsdGhpcy50aHVtYm5haWxzLnB1c2gocyksdCgpfSxuLnNyYz1zLnVybFByZWZpeCtzLmZyYW1lc1swXS50ZXh0fSkpfSkpKSksZSh0aGlzLFwic3RhcnRNb3ZlXCIsKGU9PntpZih0aGlzLmxvYWRlZCYmUihlKSYmW1widG91Y2htb3ZlXCIsXCJtb3VzZW1vdmVcIl0uaW5jbHVkZXMoZS50eXBlKSYmdGhpcy5wbGF5ZXIubWVkaWEuZHVyYXRpb24pe2lmKFwidG91Y2htb3ZlXCI9PT1lLnR5cGUpdGhpcy5zZWVrVGltZT10aGlzLnBsYXllci5tZWRpYS5kdXJhdGlvbioodGhpcy5wbGF5ZXIuZWxlbWVudHMuaW5wdXRzLnNlZWsudmFsdWUvMTAwKTtlbHNle3ZhciB0LGk7Y29uc3Qgcz10aGlzLnBsYXllci5lbGVtZW50cy5wcm9ncmVzcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPTEwMC9zLndpZHRoKihlLnBhZ2VYLXMubGVmdCk7dGhpcy5zZWVrVGltZT10aGlzLnBsYXllci5tZWRpYS5kdXJhdGlvbioobi8xMDApLHRoaXMuc2Vla1RpbWU8MCYmKHRoaXMuc2Vla1RpbWU9MCksdGhpcy5zZWVrVGltZT50aGlzLnBsYXllci5tZWRpYS5kdXJhdGlvbi0xJiYodGhpcy5zZWVrVGltZT10aGlzLnBsYXllci5tZWRpYS5kdXJhdGlvbi0xKSx0aGlzLm1vdXNlUG9zWD1lLnBhZ2VYLHRoaXMuZWxlbWVudHMudGh1bWIudGltZS5pbm5lclRleHQ9VWUodGhpcy5zZWVrVGltZSk7Y29uc3QgYT1udWxsPT09KHQ9dGhpcy5wbGF5ZXIuY29uZmlnLm1hcmtlcnMpfHx2b2lkIDA9PT10fHxudWxsPT09KGk9dC5wb2ludHMpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLmZpbmQoKCh7dGltZTplfSk9PmU9PT1NYXRoLnJvdW5kKHRoaXMuc2Vla1RpbWUpKSk7YSYmdGhpcy5lbGVtZW50cy50aHVtYi50aW1lLmluc2VydEFkamFjZW50SFRNTChcImFmdGVyYmVnaW5cIixgJHthLmxhYmVsfTxicj5gKX10aGlzLnNob3dJbWFnZUF0Q3VycmVudFRpbWUoKX19KSksZSh0aGlzLFwiZW5kTW92ZVwiLCgoKT0+e3RoaXMudG9nZ2xlVGh1bWJDb250YWluZXIoITEsITApfSkpLGUodGhpcyxcInN0YXJ0U2NydWJiaW5nXCIsKGU9PnsoSShlLmJ1dHRvbil8fCExPT09ZS5idXR0b258fDA9PT1lLmJ1dHRvbikmJih0aGlzLm1vdXNlRG93bj0hMCx0aGlzLnBsYXllci5tZWRpYS5kdXJhdGlvbiYmKHRoaXMudG9nZ2xlU2NydWJiaW5nQ29udGFpbmVyKCEwKSx0aGlzLnRvZ2dsZVRodW1iQ29udGFpbmVyKCExLCEwKSx0aGlzLnNob3dJbWFnZUF0Q3VycmVudFRpbWUoKSkpfSkpLGUodGhpcyxcImVuZFNjcnViYmluZ1wiLCgoKT0+e3RoaXMubW91c2VEb3duPSExLE1hdGguY2VpbCh0aGlzLmxhc3RUaW1lKT09PU1hdGguY2VpbCh0aGlzLnBsYXllci5tZWRpYS5jdXJyZW50VGltZSk/dGhpcy50b2dnbGVTY3J1YmJpbmdDb250YWluZXIoITEpOnllLmNhbGwodGhpcy5wbGF5ZXIsdGhpcy5wbGF5ZXIubWVkaWEsXCJ0aW1ldXBkYXRlXCIsKCgpPT57dGhpcy5tb3VzZURvd258fHRoaXMudG9nZ2xlU2NydWJiaW5nQ29udGFpbmVyKCExKX0pKX0pKSxlKHRoaXMsXCJsaXN0ZW5lcnNcIiwoKCk9Pnt0aGlzLnBsYXllci5vbihcInBsYXlcIiwoKCk9Pnt0aGlzLnRvZ2dsZVRodW1iQ29udGFpbmVyKCExLCEwKX0pKSx0aGlzLnBsYXllci5vbihcInNlZWtlZFwiLCgoKT0+e3RoaXMudG9nZ2xlVGh1bWJDb250YWluZXIoITEpfSkpLHRoaXMucGxheWVyLm9uKFwidGltZXVwZGF0ZVwiLCgoKT0+e3RoaXMubGFzdFRpbWU9dGhpcy5wbGF5ZXIubWVkaWEuY3VycmVudFRpbWV9KSl9KSksZSh0aGlzLFwicmVuZGVyXCIsKCgpPT57dGhpcy5lbGVtZW50cy50aHVtYi5jb250YWluZXI9WihcImRpdlwiLHtjbGFzczp0aGlzLnBsYXllci5jb25maWcuY2xhc3NOYW1lcy5wcmV2aWV3VGh1bWJuYWlscy50aHVtYkNvbnRhaW5lcn0pLHRoaXMuZWxlbWVudHMudGh1bWIuaW1hZ2VDb250YWluZXI9WihcImRpdlwiLHtjbGFzczp0aGlzLnBsYXllci5jb25maWcuY2xhc3NOYW1lcy5wcmV2aWV3VGh1bWJuYWlscy5pbWFnZUNvbnRhaW5lcn0pLHRoaXMuZWxlbWVudHMudGh1bWIuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMudGh1bWIuaW1hZ2VDb250YWluZXIpO2NvbnN0IGU9WihcImRpdlwiLHtjbGFzczp0aGlzLnBsYXllci5jb25maWcuY2xhc3NOYW1lcy5wcmV2aWV3VGh1bWJuYWlscy50aW1lQ29udGFpbmVyfSk7dGhpcy5lbGVtZW50cy50aHVtYi50aW1lPVooXCJzcGFuXCIse30sXCIwMDowMFwiKSxlLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudHMudGh1bWIudGltZSksdGhpcy5lbGVtZW50cy50aHVtYi5pbWFnZUNvbnRhaW5lci5hcHBlbmRDaGlsZChlKSxIKHRoaXMucGxheWVyLmVsZW1lbnRzLnByb2dyZXNzKSYmdGhpcy5wbGF5ZXIuZWxlbWVudHMucHJvZ3Jlc3MuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy50aHVtYi5jb250YWluZXIpLHRoaXMuZWxlbWVudHMuc2NydWJiaW5nLmNvbnRhaW5lcj1aKFwiZGl2XCIse2NsYXNzOnRoaXMucGxheWVyLmNvbmZpZy5jbGFzc05hbWVzLnByZXZpZXdUaHVtYm5haWxzLnNjcnViYmluZ0NvbnRhaW5lcn0pLHRoaXMucGxheWVyLmVsZW1lbnRzLndyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50cy5zY3J1YmJpbmcuY29udGFpbmVyKX0pKSxlKHRoaXMsXCJkZXN0cm95XCIsKCgpPT57dGhpcy5lbGVtZW50cy50aHVtYi5jb250YWluZXImJnRoaXMuZWxlbWVudHMudGh1bWIuY29udGFpbmVyLnJlbW92ZSgpLHRoaXMuZWxlbWVudHMuc2NydWJiaW5nLmNvbnRhaW5lciYmdGhpcy5lbGVtZW50cy5zY3J1YmJpbmcuY29udGFpbmVyLnJlbW92ZSgpfSkpLGUodGhpcyxcInNob3dJbWFnZUF0Q3VycmVudFRpbWVcIiwoKCk9Pnt0aGlzLm1vdXNlRG93bj90aGlzLnNldFNjcnViYmluZ0NvbnRhaW5lclNpemUoKTp0aGlzLnNldFRodW1iQ29udGFpbmVyU2l6ZUFuZFBvcygpO2NvbnN0IGU9dGhpcy50aHVtYm5haWxzWzBdLmZyYW1lcy5maW5kSW5kZXgoKGU9PnRoaXMuc2Vla1RpbWU+PWUuc3RhcnRUaW1lJiZ0aGlzLnNlZWtUaW1lPD1lLmVuZFRpbWUpKSx0PWU+PTA7bGV0IGk9MDt0aGlzLm1vdXNlRG93bnx8dGhpcy50b2dnbGVUaHVtYkNvbnRhaW5lcih0KSx0JiYodGhpcy50aHVtYm5haWxzLmZvckVhY2goKCh0LHMpPT57dGhpcy5sb2FkZWRJbWFnZXMuaW5jbHVkZXModC5mcmFtZXNbZV0udGV4dCkmJihpPXMpfSkpLGUhPT10aGlzLnNob3dpbmdUaHVtYiYmKHRoaXMuc2hvd2luZ1RodW1iPWUsdGhpcy5sb2FkSW1hZ2UoaSkpKX0pKSxlKHRoaXMsXCJsb2FkSW1hZ2VcIiwoKGU9MCk9Pntjb25zdCB0PXRoaXMuc2hvd2luZ1RodW1iLGk9dGhpcy50aHVtYm5haWxzW2VdLHt1cmxQcmVmaXg6c309aSxuPWkuZnJhbWVzW3RdLGE9aS5mcmFtZXNbdF0udGV4dCxsPXMrYTtpZih0aGlzLmN1cnJlbnRJbWFnZUVsZW1lbnQmJnRoaXMuY3VycmVudEltYWdlRWxlbWVudC5kYXRhc2V0LmZpbGVuYW1lPT09YSl0aGlzLnNob3dJbWFnZSh0aGlzLmN1cnJlbnRJbWFnZUVsZW1lbnQsbixlLHQsYSwhMSksdGhpcy5jdXJyZW50SW1hZ2VFbGVtZW50LmRhdGFzZXQuaW5kZXg9dCx0aGlzLnJlbW92ZU9sZEltYWdlcyh0aGlzLmN1cnJlbnRJbWFnZUVsZW1lbnQpO2Vsc2V7dGhpcy5sb2FkaW5nSW1hZ2UmJnRoaXMudXNpbmdTcHJpdGVzJiYodGhpcy5sb2FkaW5nSW1hZ2Uub25sb2FkPW51bGwpO2NvbnN0IGk9bmV3IEltYWdlO2kuc3JjPWwsaS5kYXRhc2V0LmluZGV4PXQsaS5kYXRhc2V0LmZpbGVuYW1lPWEsdGhpcy5zaG93aW5nVGh1bWJGaWxlbmFtZT1hLHRoaXMucGxheWVyLmRlYnVnLmxvZyhgTG9hZGluZyBpbWFnZTogJHtsfWApLGkub25sb2FkPSgpPT50aGlzLnNob3dJbWFnZShpLG4sZSx0LGEsITApLHRoaXMubG9hZGluZ0ltYWdlPWksdGhpcy5yZW1vdmVPbGRJbWFnZXMoaSl9fSkpLGUodGhpcyxcInNob3dJbWFnZVwiLCgoZSx0LGkscyxuLGE9ITApPT57dGhpcy5wbGF5ZXIuZGVidWcubG9nKGBTaG93aW5nIHRodW1iOiAke259LiBudW06ICR7c30uIHF1YWw6ICR7aX0uIG5ld2ltZzogJHthfWApLHRoaXMuc2V0SW1hZ2VTaXplQW5kT2Zmc2V0KGUsdCksYSYmKHRoaXMuY3VycmVudEltYWdlQ29udGFpbmVyLmFwcGVuZENoaWxkKGUpLHRoaXMuY3VycmVudEltYWdlRWxlbWVudD1lLHRoaXMubG9hZGVkSW1hZ2VzLmluY2x1ZGVzKG4pfHx0aGlzLmxvYWRlZEltYWdlcy5wdXNoKG4pKSx0aGlzLnByZWxvYWROZWFyYnkocywhMCkudGhlbih0aGlzLnByZWxvYWROZWFyYnkocywhMSkpLnRoZW4odGhpcy5nZXRIaWdoZXJRdWFsaXR5KGksZSx0LG4pKX0pKSxlKHRoaXMsXCJyZW1vdmVPbGRJbWFnZXNcIiwoZT0+e0FycmF5LmZyb20odGhpcy5jdXJyZW50SW1hZ2VDb250YWluZXIuY2hpbGRyZW4pLmZvckVhY2goKHQ9PntpZihcImltZ1wiIT09dC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpcmV0dXJuO2NvbnN0IGk9dGhpcy51c2luZ1Nwcml0ZXM/NTAwOjFlMztpZih0LmRhdGFzZXQuaW5kZXghPT1lLmRhdGFzZXQuaW5kZXgmJiF0LmRhdGFzZXQuZGVsZXRpbmcpe3QuZGF0YXNldC5kZWxldGluZz0hMDtjb25zdHtjdXJyZW50SW1hZ2VDb250YWluZXI6ZX09dGhpcztzZXRUaW1lb3V0KCgoKT0+e2UucmVtb3ZlQ2hpbGQodCksdGhpcy5wbGF5ZXIuZGVidWcubG9nKGBSZW1vdmluZyB0aHVtYjogJHt0LmRhdGFzZXQuZmlsZW5hbWV9YCl9KSxpKX19KSl9KSksZSh0aGlzLFwicHJlbG9hZE5lYXJieVwiLCgoZSx0PSEwKT0+bmV3IFByb21pc2UoKGk9PntzZXRUaW1lb3V0KCgoKT0+e2NvbnN0IHM9dGhpcy50aHVtYm5haWxzWzBdLmZyYW1lc1tlXS50ZXh0O2lmKHRoaXMuc2hvd2luZ1RodW1iRmlsZW5hbWU9PT1zKXtsZXQgbjtuPXQ/dGhpcy50aHVtYm5haWxzWzBdLmZyYW1lcy5zbGljZShlKTp0aGlzLnRodW1ibmFpbHNbMF0uZnJhbWVzLnNsaWNlKDAsZSkucmV2ZXJzZSgpO2xldCBhPSExO24uZm9yRWFjaCgoZT0+e2NvbnN0IHQ9ZS50ZXh0O2lmKHQhPT1zJiYhdGhpcy5sb2FkZWRJbWFnZXMuaW5jbHVkZXModCkpe2E9ITAsdGhpcy5wbGF5ZXIuZGVidWcubG9nKGBQcmVsb2FkaW5nIHRodW1iIGZpbGVuYW1lOiAke3R9YCk7Y29uc3R7dXJsUHJlZml4OmV9PXRoaXMudGh1bWJuYWlsc1swXSxzPWUrdCxuPW5ldyBJbWFnZTtuLnNyYz1zLG4ub25sb2FkPSgpPT57dGhpcy5wbGF5ZXIuZGVidWcubG9nKGBQcmVsb2FkZWQgdGh1bWIgZmlsZW5hbWU6ICR7dH1gKSx0aGlzLmxvYWRlZEltYWdlcy5pbmNsdWRlcyh0KXx8dGhpcy5sb2FkZWRJbWFnZXMucHVzaCh0KSxpKCl9fX0pKSxhfHxpKCl9fSksMzAwKX0pKSkpLGUodGhpcyxcImdldEhpZ2hlclF1YWxpdHlcIiwoKGUsdCxpLHMpPT57aWYoZTx0aGlzLnRodW1ibmFpbHMubGVuZ3RoLTEpe2xldCBuPXQubmF0dXJhbEhlaWdodDt0aGlzLnVzaW5nU3ByaXRlcyYmKG49aS5oKSxuPHRoaXMudGh1bWJDb250YWluZXJIZWlnaHQmJnNldFRpbWVvdXQoKCgpPT57dGhpcy5zaG93aW5nVGh1bWJGaWxlbmFtZT09PXMmJih0aGlzLnBsYXllci5kZWJ1Zy5sb2coYFNob3dpbmcgaGlnaGVyIHF1YWxpdHkgdGh1bWIgZm9yOiAke3N9YCksdGhpcy5sb2FkSW1hZ2UoZSsxKSl9KSwzMDApfX0pKSxlKHRoaXMsXCJ0b2dnbGVUaHVtYkNvbnRhaW5lclwiLCgoZT0hMSx0PSExKT0+e2NvbnN0IGk9dGhpcy5wbGF5ZXIuY29uZmlnLmNsYXNzTmFtZXMucHJldmlld1RodW1ibmFpbHMudGh1bWJDb250YWluZXJTaG93bjt0aGlzLmVsZW1lbnRzLnRodW1iLmNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKGksZSksIWUmJnQmJih0aGlzLnNob3dpbmdUaHVtYj1udWxsLHRoaXMuc2hvd2luZ1RodW1iRmlsZW5hbWU9bnVsbCl9KSksZSh0aGlzLFwidG9nZ2xlU2NydWJiaW5nQ29udGFpbmVyXCIsKChlPSExKT0+e2NvbnN0IHQ9dGhpcy5wbGF5ZXIuY29uZmlnLmNsYXNzTmFtZXMucHJldmlld1RodW1ibmFpbHMuc2NydWJiaW5nQ29udGFpbmVyU2hvd247dGhpcy5lbGVtZW50cy5zY3J1YmJpbmcuY29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUodCxlKSxlfHwodGhpcy5zaG93aW5nVGh1bWI9bnVsbCx0aGlzLnNob3dpbmdUaHVtYkZpbGVuYW1lPW51bGwpfSkpLGUodGhpcyxcImRldGVybWluZUNvbnRhaW5lckF1dG9TaXppbmdcIiwoKCk9PnsodGhpcy5lbGVtZW50cy50aHVtYi5pbWFnZUNvbnRhaW5lci5jbGllbnRIZWlnaHQ+MjB8fHRoaXMuZWxlbWVudHMudGh1bWIuaW1hZ2VDb250YWluZXIuY2xpZW50V2lkdGg+MjApJiYodGhpcy5zaXplU3BlY2lmaWVkSW5DU1M9ITApfSkpLGUodGhpcyxcInNldFRodW1iQ29udGFpbmVyU2l6ZUFuZFBvc1wiLCgoKT0+e2NvbnN0e2ltYWdlQ29udGFpbmVyOmV9PXRoaXMuZWxlbWVudHMudGh1bWI7aWYodGhpcy5zaXplU3BlY2lmaWVkSW5DU1Mpe2lmKGUuY2xpZW50SGVpZ2h0PjIwJiZlLmNsaWVudFdpZHRoPDIwKXtjb25zdCB0PU1hdGguZmxvb3IoZS5jbGllbnRIZWlnaHQqdGhpcy50aHVtYkFzcGVjdFJhdGlvKTtlLnN0eWxlLndpZHRoPWAke3R9cHhgfWVsc2UgaWYoZS5jbGllbnRIZWlnaHQ8MjAmJmUuY2xpZW50V2lkdGg+MjApe2NvbnN0IHQ9TWF0aC5mbG9vcihlLmNsaWVudFdpZHRoL3RoaXMudGh1bWJBc3BlY3RSYXRpbyk7ZS5zdHlsZS5oZWlnaHQ9YCR7dH1weGB9fWVsc2V7Y29uc3QgdD1NYXRoLmZsb29yKHRoaXMudGh1bWJDb250YWluZXJIZWlnaHQqdGhpcy50aHVtYkFzcGVjdFJhdGlvKTtlLnN0eWxlLmhlaWdodD1gJHt0aGlzLnRodW1iQ29udGFpbmVySGVpZ2h0fXB4YCxlLnN0eWxlLndpZHRoPWAke3R9cHhgfXRoaXMuc2V0VGh1bWJDb250YWluZXJQb3MoKX0pKSxlKHRoaXMsXCJzZXRUaHVtYkNvbnRhaW5lclBvc1wiLCgoKT0+e2NvbnN0IGU9dGhpcy5wbGF5ZXIuZWxlbWVudHMucHJvZ3Jlc3MuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdD10aGlzLnBsYXllci5lbGVtZW50cy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse2NvbnRhaW5lcjppfT10aGlzLmVsZW1lbnRzLnRodW1iLHM9dC5sZWZ0LWUubGVmdCsxMCxuPXQucmlnaHQtZS5sZWZ0LWkuY2xpZW50V2lkdGgtMTAsYT10aGlzLm1vdXNlUG9zWC1lLmxlZnQtaS5jbGllbnRXaWR0aC8yLGw9ZnQoYSxzLG4pO2kuc3R5bGUubGVmdD1gJHtsfXB4YCxpLnN0eWxlLnNldFByb3BlcnR5KFwiLS1wcmV2aWV3LWFycm93LW9mZnNldFwiLGEtbCtcInB4XCIpfSkpLGUodGhpcyxcInNldFNjcnViYmluZ0NvbnRhaW5lclNpemVcIiwoKCk9Pntjb25zdHt3aWR0aDplLGhlaWdodDp0fT15dCh0aGlzLnRodW1iQXNwZWN0UmF0aW8se3dpZHRoOnRoaXMucGxheWVyLm1lZGlhLmNsaWVudFdpZHRoLGhlaWdodDp0aGlzLnBsYXllci5tZWRpYS5jbGllbnRIZWlnaHR9KTt0aGlzLmVsZW1lbnRzLnNjcnViYmluZy5jb250YWluZXIuc3R5bGUud2lkdGg9YCR7ZX1weGAsdGhpcy5lbGVtZW50cy5zY3J1YmJpbmcuY29udGFpbmVyLnN0eWxlLmhlaWdodD1gJHt0fXB4YH0pKSxlKHRoaXMsXCJzZXRJbWFnZVNpemVBbmRPZmZzZXRcIiwoKGUsdCk9PntpZighdGhpcy51c2luZ1Nwcml0ZXMpcmV0dXJuO2NvbnN0IGk9dGhpcy50aHVtYkNvbnRhaW5lckhlaWdodC90Lmg7ZS5zdHlsZS5oZWlnaHQ9ZS5uYXR1cmFsSGVpZ2h0KmkrXCJweFwiLGUuc3R5bGUud2lkdGg9ZS5uYXR1cmFsV2lkdGgqaStcInB4XCIsZS5zdHlsZS5sZWZ0PWAtJHt0LngqaX1weGAsZS5zdHlsZS50b3A9YC0ke3QueSppfXB4YH0pKSx0aGlzLnBsYXllcj10LHRoaXMudGh1bWJuYWlscz1bXSx0aGlzLmxvYWRlZD0hMSx0aGlzLmxhc3RNb3VzZU1vdmVUaW1lPURhdGUubm93KCksdGhpcy5tb3VzZURvd249ITEsdGhpcy5sb2FkZWRJbWFnZXM9W10sdGhpcy5lbGVtZW50cz17dGh1bWI6e30sc2NydWJiaW5nOnt9fSx0aGlzLmxvYWQoKX1nZXQgZW5hYmxlZCgpe3JldHVybiB0aGlzLnBsYXllci5pc0hUTUw1JiZ0aGlzLnBsYXllci5pc1ZpZGVvJiZ0aGlzLnBsYXllci5jb25maWcucHJldmlld1RodW1ibmFpbHMuZW5hYmxlZH1nZXQgY3VycmVudEltYWdlQ29udGFpbmVyKCl7cmV0dXJuIHRoaXMubW91c2VEb3duP3RoaXMuZWxlbWVudHMuc2NydWJiaW5nLmNvbnRhaW5lcjp0aGlzLmVsZW1lbnRzLnRodW1iLmltYWdlQ29udGFpbmVyfWdldCB1c2luZ1Nwcml0ZXMoKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy50aHVtYm5haWxzWzBdLmZyYW1lc1swXSkuaW5jbHVkZXMoXCJ3XCIpfWdldCB0aHVtYkFzcGVjdFJhdGlvKCl7cmV0dXJuIHRoaXMudXNpbmdTcHJpdGVzP3RoaXMudGh1bWJuYWlsc1swXS5mcmFtZXNbMF0udy90aGlzLnRodW1ibmFpbHNbMF0uZnJhbWVzWzBdLmg6dGhpcy50aHVtYm5haWxzWzBdLndpZHRoL3RoaXMudGh1bWJuYWlsc1swXS5oZWlnaHR9Z2V0IHRodW1iQ29udGFpbmVySGVpZ2h0KCl7aWYodGhpcy5tb3VzZURvd24pe2NvbnN0e2hlaWdodDplfT15dCh0aGlzLnRodW1iQXNwZWN0UmF0aW8se3dpZHRoOnRoaXMucGxheWVyLm1lZGlhLmNsaWVudFdpZHRoLGhlaWdodDp0aGlzLnBsYXllci5tZWRpYS5jbGllbnRIZWlnaHR9KTtyZXR1cm4gZX1yZXR1cm4gdGhpcy5zaXplU3BlY2lmaWVkSW5DU1M/dGhpcy5lbGVtZW50cy50aHVtYi5pbWFnZUNvbnRhaW5lci5jbGllbnRIZWlnaHQ6TWF0aC5mbG9vcih0aGlzLnBsYXllci5tZWRpYS5jbGllbnRXaWR0aC90aGlzLnRodW1iQXNwZWN0UmF0aW8vNCl9Z2V0IGN1cnJlbnRJbWFnZUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5tb3VzZURvd24/dGhpcy5jdXJyZW50U2NydWJiaW5nSW1hZ2VFbGVtZW50OnRoaXMuY3VycmVudFRodW1ibmFpbEltYWdlRWxlbWVudH1zZXQgY3VycmVudEltYWdlRWxlbWVudChlKXt0aGlzLm1vdXNlRG93bj90aGlzLmN1cnJlbnRTY3J1YmJpbmdJbWFnZUVsZW1lbnQ9ZTp0aGlzLmN1cnJlbnRUaHVtYm5haWxJbWFnZUVsZW1lbnQ9ZX19Y29uc3Qgd3Q9e2luc2VydEVsZW1lbnRzKGUsdCl7Xyh0KT9lZShlLHRoaXMubWVkaWEse3NyYzp0fSk6RCh0KSYmdC5mb3JFYWNoKCh0PT57ZWUoZSx0aGlzLm1lZGlhLHQpfSkpfSxjaGFuZ2UoZSl7UShlLFwic291cmNlcy5sZW5ndGhcIik/KExlLmNhbmNlbFJlcXVlc3RzLmNhbGwodGhpcyksdGhpcy5kZXN0cm95LmNhbGwodGhpcywoKCk9Pnt0aGlzLm9wdGlvbnMucXVhbGl0eT1bXSx0ZSh0aGlzLm1lZGlhKSx0aGlzLm1lZGlhPW51bGwsSCh0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcikmJnRoaXMuZWxlbWVudHMuY29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZShcImNsYXNzXCIpO2NvbnN0e3NvdXJjZXM6dCx0eXBlOml9PWUsW3twcm92aWRlcjpzPUdlLmh0bWw1LHNyYzpufV09dCxhPVwiaHRtbDVcIj09PXM/aTpcImRpdlwiLGw9XCJodG1sNVwiPT09cz97fTp7c3JjOm59O09iamVjdC5hc3NpZ24odGhpcyx7cHJvdmlkZXI6cyx0eXBlOmksc3VwcG9ydGVkOm1lLmNoZWNrKGkscyx0aGlzLmNvbmZpZy5wbGF5c2lubGluZSksbWVkaWE6WihhLGwpfSksdGhpcy5lbGVtZW50cy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5tZWRpYSksTyhlLmF1dG9wbGF5KSYmKHRoaXMuY29uZmlnLmF1dG9wbGF5PWUuYXV0b3BsYXkpLHRoaXMuaXNIVE1MNSYmKHRoaXMuY29uZmlnLmNyb3Nzb3JpZ2luJiZ0aGlzLm1lZGlhLnNldEF0dHJpYnV0ZShcImNyb3Nzb3JpZ2luXCIsXCJcIiksdGhpcy5jb25maWcuYXV0b3BsYXkmJnRoaXMubWVkaWEuc2V0QXR0cmlidXRlKFwiYXV0b3BsYXlcIixcIlwiKSxXKGUucG9zdGVyKXx8KHRoaXMucG9zdGVyPWUucG9zdGVyKSx0aGlzLmNvbmZpZy5sb29wLmFjdGl2ZSYmdGhpcy5tZWRpYS5zZXRBdHRyaWJ1dGUoXCJsb29wXCIsXCJcIiksdGhpcy5jb25maWcubXV0ZWQmJnRoaXMubWVkaWEuc2V0QXR0cmlidXRlKFwibXV0ZWRcIixcIlwiKSx0aGlzLmNvbmZpZy5wbGF5c2lubGluZSYmdGhpcy5tZWRpYS5zZXRBdHRyaWJ1dGUoXCJwbGF5c2lubGluZVwiLFwiXCIpKSxhdC5hZGRTdHlsZUhvb2suY2FsbCh0aGlzKSx0aGlzLmlzSFRNTDUmJnd0Lmluc2VydEVsZW1lbnRzLmNhbGwodGhpcyxcInNvdXJjZVwiLHQpLHRoaXMuY29uZmlnLnRpdGxlPWUudGl0bGUscHQuc2V0dXAuY2FsbCh0aGlzKSx0aGlzLmlzSFRNTDUmJk9iamVjdC5rZXlzKGUpLmluY2x1ZGVzKFwidHJhY2tzXCIpJiZ3dC5pbnNlcnRFbGVtZW50cy5jYWxsKHRoaXMsXCJ0cmFja1wiLGUudHJhY2tzKSwodGhpcy5pc0hUTUw1fHx0aGlzLmlzRW1iZWQmJiF0aGlzLnN1cHBvcnRlZC51aSkmJmF0LmJ1aWxkLmNhbGwodGhpcyksdGhpcy5pc0hUTUw1JiZ0aGlzLm1lZGlhLmxvYWQoKSxXKGUucHJldmlld1RodW1ibmFpbHMpfHwoT2JqZWN0LmFzc2lnbih0aGlzLmNvbmZpZy5wcmV2aWV3VGh1bWJuYWlscyxlLnByZXZpZXdUaHVtYm5haWxzKSx0aGlzLnByZXZpZXdUaHVtYm5haWxzJiZ0aGlzLnByZXZpZXdUaHVtYm5haWxzLmxvYWRlZCYmKHRoaXMucHJldmlld1RodW1ibmFpbHMuZGVzdHJveSgpLHRoaXMucHJldmlld1RodW1ibmFpbHM9bnVsbCksdGhpcy5jb25maWcucHJldmlld1RodW1ibmFpbHMuZW5hYmxlZCYmKHRoaXMucHJldmlld1RodW1ibmFpbHM9bmV3IHZ0KHRoaXMpKSksdGhpcy5mdWxsc2NyZWVuLnVwZGF0ZSgpfSksITApKTp0aGlzLmRlYnVnLndhcm4oXCJJbnZhbGlkIHNvdXJjZSBmb3JtYXRcIil9fTtjbGFzcyBUdHtjb25zdHJ1Y3Rvcih0LGkpe2lmKGUodGhpcyxcInBsYXlcIiwoKCk9PmoodGhpcy5tZWRpYS5wbGF5KT8odGhpcy5hZHMmJnRoaXMuYWRzLmVuYWJsZWQmJnRoaXMuYWRzLm1hbmFnZXJQcm9taXNlLnRoZW4oKCgpPT50aGlzLmFkcy5wbGF5KCkpKS5jYXRjaCgoKCk9PmtlKHRoaXMubWVkaWEucGxheSgpKSkpLHRoaXMubWVkaWEucGxheSgpKTpudWxsKSksZSh0aGlzLFwicGF1c2VcIiwoKCk9PnRoaXMucGxheWluZyYmaih0aGlzLm1lZGlhLnBhdXNlKT90aGlzLm1lZGlhLnBhdXNlKCk6bnVsbCkpLGUodGhpcyxcInRvZ2dsZVBsYXlcIiwoZT0+KE8oZSk/ZTohdGhpcy5wbGF5aW5nKT90aGlzLnBsYXkoKTp0aGlzLnBhdXNlKCkpKSxlKHRoaXMsXCJzdG9wXCIsKCgpPT57dGhpcy5pc0hUTUw1Pyh0aGlzLnBhdXNlKCksdGhpcy5yZXN0YXJ0KCkpOmoodGhpcy5tZWRpYS5zdG9wKSYmdGhpcy5tZWRpYS5zdG9wKCl9KSksZSh0aGlzLFwicmVzdGFydFwiLCgoKT0+e3RoaXMuY3VycmVudFRpbWU9MH0pKSxlKHRoaXMsXCJyZXdpbmRcIiwoZT0+e3RoaXMuY3VycmVudFRpbWUtPSQoZSk/ZTp0aGlzLmNvbmZpZy5zZWVrVGltZX0pKSxlKHRoaXMsXCJmb3J3YXJkXCIsKGU9Pnt0aGlzLmN1cnJlbnRUaW1lKz0kKGUpP2U6dGhpcy5jb25maWcuc2Vla1RpbWV9KSksZSh0aGlzLFwiaW5jcmVhc2VWb2x1bWVcIiwoZT0+e2NvbnN0IHQ9dGhpcy5tZWRpYS5tdXRlZD8wOnRoaXMudm9sdW1lO3RoaXMudm9sdW1lPXQrKCQoZSk/ZTowKX0pKSxlKHRoaXMsXCJkZWNyZWFzZVZvbHVtZVwiLChlPT57dGhpcy5pbmNyZWFzZVZvbHVtZSgtZSl9KSksZSh0aGlzLFwiYWlycGxheVwiLCgoKT0+e21lLmFpcnBsYXkmJnRoaXMubWVkaWEud2Via2l0U2hvd1BsYXliYWNrVGFyZ2V0UGlja2VyKCl9KSksZSh0aGlzLFwidG9nZ2xlQ29udHJvbHNcIiwoZT0+e2lmKHRoaXMuc3VwcG9ydGVkLnVpJiYhdGhpcy5pc0F1ZGlvKXtjb25zdCB0PW9lKHRoaXMuZWxlbWVudHMuY29udGFpbmVyLHRoaXMuY29uZmlnLmNsYXNzTmFtZXMuaGlkZUNvbnRyb2xzKSxpPXZvaWQgMD09PWU/dm9pZCAwOiFlLHM9bGUodGhpcy5lbGVtZW50cy5jb250YWluZXIsdGhpcy5jb25maWcuY2xhc3NOYW1lcy5oaWRlQ29udHJvbHMsaSk7aWYocyYmRCh0aGlzLmNvbmZpZy5jb250cm9scykmJnRoaXMuY29uZmlnLmNvbnRyb2xzLmluY2x1ZGVzKFwic2V0dGluZ3NcIikmJiFXKHRoaXMuY29uZmlnLnNldHRpbmdzKSYmV2UudG9nZ2xlTWVudS5jYWxsKHRoaXMsITEpLHMhPT10KXtjb25zdCBlPXM/XCJjb250cm9sc2hpZGRlblwiOlwiY29udHJvbHNzaG93blwiO3ZlLmNhbGwodGhpcyx0aGlzLm1lZGlhLGUpfXJldHVybiFzfXJldHVybiExfSkpLGUodGhpcyxcIm9uXCIsKChlLHQpPT57ZmUuY2FsbCh0aGlzLHRoaXMuZWxlbWVudHMuY29udGFpbmVyLGUsdCl9KSksZSh0aGlzLFwib25jZVwiLCgoZSx0KT0+e3llLmNhbGwodGhpcyx0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcixlLHQpfSkpLGUodGhpcyxcIm9mZlwiLCgoZSx0KT0+e2JlKHRoaXMuZWxlbWVudHMuY29udGFpbmVyLGUsdCl9KSksZSh0aGlzLFwiZGVzdHJveVwiLCgoZSx0PSExKT0+e2lmKCF0aGlzLnJlYWR5KXJldHVybjtjb25zdCBpPSgpPT57ZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdz1cIlwiLHRoaXMuZW1iZWQ9bnVsbCx0PyhPYmplY3Qua2V5cyh0aGlzLmVsZW1lbnRzKS5sZW5ndGgmJih0ZSh0aGlzLmVsZW1lbnRzLmJ1dHRvbnMucGxheSksdGUodGhpcy5lbGVtZW50cy5jYXB0aW9ucyksdGUodGhpcy5lbGVtZW50cy5jb250cm9scyksdGUodGhpcy5lbGVtZW50cy53cmFwcGVyKSx0aGlzLmVsZW1lbnRzLmJ1dHRvbnMucGxheT1udWxsLHRoaXMuZWxlbWVudHMuY2FwdGlvbnM9bnVsbCx0aGlzLmVsZW1lbnRzLmNvbnRyb2xzPW51bGwsdGhpcy5lbGVtZW50cy53cmFwcGVyPW51bGwpLGooZSkmJmUoKSk6KHdlLmNhbGwodGhpcyksTGUuY2FuY2VsUmVxdWVzdHMuY2FsbCh0aGlzKSxzZSh0aGlzLmVsZW1lbnRzLm9yaWdpbmFsLHRoaXMuZWxlbWVudHMuY29udGFpbmVyKSx2ZS5jYWxsKHRoaXMsdGhpcy5lbGVtZW50cy5vcmlnaW5hbCxcImRlc3Ryb3llZFwiLCEwKSxqKGUpJiZlLmNhbGwodGhpcy5lbGVtZW50cy5vcmlnaW5hbCksdGhpcy5yZWFkeT0hMSxzZXRUaW1lb3V0KCgoKT0+e3RoaXMuZWxlbWVudHM9bnVsbCx0aGlzLm1lZGlhPW51bGx9KSwyMDApKX07dGhpcy5zdG9wKCksY2xlYXJUaW1lb3V0KHRoaXMudGltZXJzLmxvYWRpbmcpLGNsZWFyVGltZW91dCh0aGlzLnRpbWVycy5jb250cm9scyksY2xlYXJUaW1lb3V0KHRoaXMudGltZXJzLnJlc2l6ZWQpLHRoaXMuaXNIVE1MNT8oYXQudG9nZ2xlTmF0aXZlQ29udHJvbHMuY2FsbCh0aGlzLCEwKSxpKCkpOnRoaXMuaXNZb3VUdWJlPyhjbGVhckludGVydmFsKHRoaXMudGltZXJzLmJ1ZmZlcmluZyksY2xlYXJJbnRlcnZhbCh0aGlzLnRpbWVycy5wbGF5aW5nKSxudWxsIT09dGhpcy5lbWJlZCYmaih0aGlzLmVtYmVkLmRlc3Ryb3kpJiZ0aGlzLmVtYmVkLmRlc3Ryb3koKSxpKCkpOnRoaXMuaXNWaW1lbyYmKG51bGwhPT10aGlzLmVtYmVkJiZ0aGlzLmVtYmVkLnVubG9hZCgpLnRoZW4oaSksc2V0VGltZW91dChpLDIwMCkpfSkpLGUodGhpcyxcInN1cHBvcnRzXCIsKGU9Pm1lLm1pbWUuY2FsbCh0aGlzLGUpKSksdGhpcy50aW1lcnM9e30sdGhpcy5yZWFkeT0hMSx0aGlzLmxvYWRpbmc9ITEsdGhpcy5mYWlsZWQ9ITEsdGhpcy50b3VjaD1tZS50b3VjaCx0aGlzLm1lZGlhPXQsXyh0aGlzLm1lZGlhKSYmKHRoaXMubWVkaWE9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLm1lZGlhKSksKHdpbmRvdy5qUXVlcnkmJnRoaXMubWVkaWEgaW5zdGFuY2VvZiBqUXVlcnl8fHEodGhpcy5tZWRpYSl8fEQodGhpcy5tZWRpYSkpJiYodGhpcy5tZWRpYT10aGlzLm1lZGlhWzBdKSx0aGlzLmNvbmZpZz1YKHt9LFFlLFR0LmRlZmF1bHRzLGl8fHt9LCgoKT0+e3RyeXtyZXR1cm4gSlNPTi5wYXJzZSh0aGlzLm1lZGlhLmdldEF0dHJpYnV0ZShcImRhdGEtcGx5ci1jb25maWdcIikpfWNhdGNoKGUpe3JldHVybnt9fX0pKCkpLHRoaXMuZWxlbWVudHM9e2NvbnRhaW5lcjpudWxsLGZ1bGxzY3JlZW46bnVsbCxjYXB0aW9uczpudWxsLGJ1dHRvbnM6e30sZGlzcGxheTp7fSxwcm9ncmVzczp7fSxpbnB1dHM6e30sc2V0dGluZ3M6e3BvcHVwOm51bGwsbWVudTpudWxsLHBhbmVsczp7fSxidXR0b25zOnt9fX0sdGhpcy5jYXB0aW9ucz17YWN0aXZlOm51bGwsY3VycmVudFRyYWNrOi0xLG1ldGE6bmV3IFdlYWtNYXB9LHRoaXMuZnVsbHNjcmVlbj17YWN0aXZlOiExfSx0aGlzLm9wdGlvbnM9e3NwZWVkOltdLHF1YWxpdHk6W119LHRoaXMuZGVidWc9bmV3IGl0KHRoaXMuY29uZmlnLmRlYnVnKSx0aGlzLmRlYnVnLmxvZyhcIkNvbmZpZ1wiLHRoaXMuY29uZmlnKSx0aGlzLmRlYnVnLmxvZyhcIlN1cHBvcnRcIixtZSksSSh0aGlzLm1lZGlhKXx8IUgodGhpcy5tZWRpYSkpcmV0dXJuIHZvaWQgdGhpcy5kZWJ1Zy5lcnJvcihcIlNldHVwIGZhaWxlZDogbm8gc3VpdGFibGUgZWxlbWVudCBwYXNzZWRcIik7aWYodGhpcy5tZWRpYS5wbHlyKXJldHVybiB2b2lkIHRoaXMuZGVidWcud2FybihcIlRhcmdldCBhbHJlYWR5IHNldHVwXCIpO2lmKCF0aGlzLmNvbmZpZy5lbmFibGVkKXJldHVybiB2b2lkIHRoaXMuZGVidWcuZXJyb3IoXCJTZXR1cCBmYWlsZWQ6IGRpc2FibGVkIGJ5IGNvbmZpZ1wiKTtpZighbWUuY2hlY2soKS5hcGkpcmV0dXJuIHZvaWQgdGhpcy5kZWJ1Zy5lcnJvcihcIlNldHVwIGZhaWxlZDogbm8gc3VwcG9ydFwiKTtjb25zdCBzPXRoaXMubWVkaWEuY2xvbmVOb2RlKCEwKTtzLmF1dG9wbGF5PSExLHRoaXMuZWxlbWVudHMub3JpZ2luYWw9cztjb25zdCBuPXRoaXMubWVkaWEudGFnTmFtZS50b0xvd2VyQ2FzZSgpO2xldCBhPW51bGwsbD1udWxsO3N3aXRjaChuKXtjYXNlXCJkaXZcIjppZihhPXRoaXMubWVkaWEucXVlcnlTZWxlY3RvcihcImlmcmFtZVwiKSxIKGEpKXtpZihsPXplKGEuZ2V0QXR0cmlidXRlKFwic3JjXCIpKSx0aGlzLnByb3ZpZGVyPWZ1bmN0aW9uKGUpe3JldHVybi9eKGh0dHBzPzpcXC9cXC8pPyh3d3dcXC4pPyh5b3V0dWJlXFwuY29tfHlvdXR1YmUtbm9jb29raWVcXC5jb218eW91dHVcXC4/YmUpXFwvLiskLy50ZXN0KGUpP0dlLnlvdXR1YmU6L15odHRwcz86XFwvXFwvcGxheWVyLnZpbWVvLmNvbVxcL3ZpZGVvXFwvXFxkezAsOX0oPz1cXGJ8XFwvKS8udGVzdChlKT9HZS52aW1lbzpudWxsfShsLnRvU3RyaW5nKCkpLHRoaXMuZWxlbWVudHMuY29udGFpbmVyPXRoaXMubWVkaWEsdGhpcy5tZWRpYT1hLHRoaXMuZWxlbWVudHMuY29udGFpbmVyLmNsYXNzTmFtZT1cIlwiLGwuc2VhcmNoLmxlbmd0aCl7Y29uc3QgZT1bXCIxXCIsXCJ0cnVlXCJdO2UuaW5jbHVkZXMobC5zZWFyY2hQYXJhbXMuZ2V0KFwiYXV0b3BsYXlcIikpJiYodGhpcy5jb25maWcuYXV0b3BsYXk9ITApLGUuaW5jbHVkZXMobC5zZWFyY2hQYXJhbXMuZ2V0KFwibG9vcFwiKSkmJih0aGlzLmNvbmZpZy5sb29wLmFjdGl2ZT0hMCksdGhpcy5pc1lvdVR1YmU/KHRoaXMuY29uZmlnLnBsYXlzaW5saW5lPWUuaW5jbHVkZXMobC5zZWFyY2hQYXJhbXMuZ2V0KFwicGxheXNpbmxpbmVcIikpLHRoaXMuY29uZmlnLnlvdXR1YmUuaGw9bC5zZWFyY2hQYXJhbXMuZ2V0KFwiaGxcIikpOnRoaXMuY29uZmlnLnBsYXlzaW5saW5lPSEwfX1lbHNlIHRoaXMucHJvdmlkZXI9dGhpcy5tZWRpYS5nZXRBdHRyaWJ1dGUodGhpcy5jb25maWcuYXR0cmlidXRlcy5lbWJlZC5wcm92aWRlciksdGhpcy5tZWRpYS5yZW1vdmVBdHRyaWJ1dGUodGhpcy5jb25maWcuYXR0cmlidXRlcy5lbWJlZC5wcm92aWRlcik7aWYoVyh0aGlzLnByb3ZpZGVyKXx8IU9iamVjdC52YWx1ZXMoR2UpLmluY2x1ZGVzKHRoaXMucHJvdmlkZXIpKXJldHVybiB2b2lkIHRoaXMuZGVidWcuZXJyb3IoXCJTZXR1cCBmYWlsZWQ6IEludmFsaWQgcHJvdmlkZXJcIik7dGhpcy50eXBlPWV0O2JyZWFrO2Nhc2VcInZpZGVvXCI6Y2FzZVwiYXVkaW9cIjp0aGlzLnR5cGU9bix0aGlzLnByb3ZpZGVyPUdlLmh0bWw1LHRoaXMubWVkaWEuaGFzQXR0cmlidXRlKFwiY3Jvc3NvcmlnaW5cIikmJih0aGlzLmNvbmZpZy5jcm9zc29yaWdpbj0hMCksdGhpcy5tZWRpYS5oYXNBdHRyaWJ1dGUoXCJhdXRvcGxheVwiKSYmKHRoaXMuY29uZmlnLmF1dG9wbGF5PSEwKSwodGhpcy5tZWRpYS5oYXNBdHRyaWJ1dGUoXCJwbGF5c2lubGluZVwiKXx8dGhpcy5tZWRpYS5oYXNBdHRyaWJ1dGUoXCJ3ZWJraXQtcGxheXNpbmxpbmVcIikpJiYodGhpcy5jb25maWcucGxheXNpbmxpbmU9ITApLHRoaXMubWVkaWEuaGFzQXR0cmlidXRlKFwibXV0ZWRcIikmJih0aGlzLmNvbmZpZy5tdXRlZD0hMCksdGhpcy5tZWRpYS5oYXNBdHRyaWJ1dGUoXCJsb29wXCIpJiYodGhpcy5jb25maWcubG9vcC5hY3RpdmU9ITApO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHZvaWQgdGhpcy5kZWJ1Zy5lcnJvcihcIlNldHVwIGZhaWxlZDogdW5zdXBwb3J0ZWQgdHlwZVwiKX10aGlzLnN1cHBvcnRlZD1tZS5jaGVjayh0aGlzLnR5cGUsdGhpcy5wcm92aWRlcix0aGlzLmNvbmZpZy5wbGF5c2lubGluZSksdGhpcy5zdXBwb3J0ZWQuYXBpPyh0aGlzLmV2ZW50TGlzdGVuZXJzPVtdLHRoaXMubGlzdGVuZXJzPW5ldyBsdCh0aGlzKSx0aGlzLnN0b3JhZ2U9bmV3IFJlKHRoaXMpLHRoaXMubWVkaWEucGx5cj10aGlzLEgodGhpcy5lbGVtZW50cy5jb250YWluZXIpfHwodGhpcy5lbGVtZW50cy5jb250YWluZXI9WihcImRpdlwiLHt0YWJpbmRleDowfSksSih0aGlzLm1lZGlhLHRoaXMuZWxlbWVudHMuY29udGFpbmVyKSksYXQubWlncmF0ZVN0eWxlcy5jYWxsKHRoaXMpLGF0LmFkZFN0eWxlSG9vay5jYWxsKHRoaXMpLHB0LnNldHVwLmNhbGwodGhpcyksdGhpcy5jb25maWcuZGVidWcmJmZlLmNhbGwodGhpcyx0aGlzLmVsZW1lbnRzLmNvbnRhaW5lcix0aGlzLmNvbmZpZy5ldmVudHMuam9pbihcIiBcIiksKGU9Pnt0aGlzLmRlYnVnLmxvZyhgZXZlbnQ6ICR7ZS50eXBlfWApfSkpLHRoaXMuZnVsbHNjcmVlbj1uZXcgc3QodGhpcyksKHRoaXMuaXNIVE1MNXx8dGhpcy5pc0VtYmVkJiYhdGhpcy5zdXBwb3J0ZWQudWkpJiZhdC5idWlsZC5jYWxsKHRoaXMpLHRoaXMubGlzdGVuZXJzLmNvbnRhaW5lcigpLHRoaXMubGlzdGVuZXJzLmdsb2JhbCgpLHRoaXMuY29uZmlnLmFkcy5lbmFibGVkJiYodGhpcy5hZHM9bmV3IGd0KHRoaXMpKSx0aGlzLmlzSFRNTDUmJnRoaXMuY29uZmlnLmF1dG9wbGF5JiZ0aGlzLm9uY2UoXCJjYW5wbGF5XCIsKCgpPT5rZSh0aGlzLnBsYXkoKSkpKSx0aGlzLmxhc3RTZWVrVGltZT0wLHRoaXMuY29uZmlnLnByZXZpZXdUaHVtYm5haWxzLmVuYWJsZWQmJih0aGlzLnByZXZpZXdUaHVtYm5haWxzPW5ldyB2dCh0aGlzKSkpOnRoaXMuZGVidWcuZXJyb3IoXCJTZXR1cCBmYWlsZWQ6IG5vIHN1cHBvcnRcIil9Z2V0IGlzSFRNTDUoKXtyZXR1cm4gdGhpcy5wcm92aWRlcj09PUdlLmh0bWw1fWdldCBpc0VtYmVkKCl7cmV0dXJuIHRoaXMuaXNZb3VUdWJlfHx0aGlzLmlzVmltZW99Z2V0IGlzWW91VHViZSgpe3JldHVybiB0aGlzLnByb3ZpZGVyPT09R2UueW91dHViZX1nZXQgaXNWaW1lbygpe3JldHVybiB0aGlzLnByb3ZpZGVyPT09R2UudmltZW99Z2V0IGlzVmlkZW8oKXtyZXR1cm4gdGhpcy50eXBlPT09ZXR9Z2V0IGlzQXVkaW8oKXtyZXR1cm4gdGhpcy50eXBlPT09WmV9Z2V0IHBsYXlpbmcoKXtyZXR1cm4gQm9vbGVhbih0aGlzLnJlYWR5JiYhdGhpcy5wYXVzZWQmJiF0aGlzLmVuZGVkKX1nZXQgcGF1c2VkKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5tZWRpYS5wYXVzZWQpfWdldCBzdG9wcGVkKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5wYXVzZWQmJjA9PT10aGlzLmN1cnJlbnRUaW1lKX1nZXQgZW5kZWQoKXtyZXR1cm4gQm9vbGVhbih0aGlzLm1lZGlhLmVuZGVkKX1zZXQgY3VycmVudFRpbWUoZSl7aWYoIXRoaXMuZHVyYXRpb24pcmV0dXJuO2NvbnN0IHQ9JChlKSYmZT4wO3RoaXMubWVkaWEuY3VycmVudFRpbWU9dD9NYXRoLm1pbihlLHRoaXMuZHVyYXRpb24pOjAsdGhpcy5kZWJ1Zy5sb2coYFNlZWtpbmcgdG8gJHt0aGlzLmN1cnJlbnRUaW1lfSBzZWNvbmRzYCl9Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIE51bWJlcih0aGlzLm1lZGlhLmN1cnJlbnRUaW1lKX1nZXQgYnVmZmVyZWQoKXtjb25zdHtidWZmZXJlZDplfT10aGlzLm1lZGlhO3JldHVybiAkKGUpP2U6ZSYmZS5sZW5ndGgmJnRoaXMuZHVyYXRpb24+MD9lLmVuZCgwKS90aGlzLmR1cmF0aW9uOjB9Z2V0IHNlZWtpbmcoKXtyZXR1cm4gQm9vbGVhbih0aGlzLm1lZGlhLnNlZWtpbmcpfWdldCBkdXJhdGlvbigpe2NvbnN0IGU9cGFyc2VGbG9hdCh0aGlzLmNvbmZpZy5kdXJhdGlvbiksdD0odGhpcy5tZWRpYXx8e30pLmR1cmF0aW9uLGk9JCh0KSYmdCE9PTEvMD90OjA7cmV0dXJuIGV8fGl9c2V0IHZvbHVtZShlKXtsZXQgdD1lO18odCkmJih0PU51bWJlcih0KSksJCh0KXx8KHQ9dGhpcy5zdG9yYWdlLmdldChcInZvbHVtZVwiKSksJCh0KXx8KHt2b2x1bWU6dH09dGhpcy5jb25maWcpLHQ+MSYmKHQ9MSksdDwwJiYodD0wKSx0aGlzLmNvbmZpZy52b2x1bWU9dCx0aGlzLm1lZGlhLnZvbHVtZT10LCFXKGUpJiZ0aGlzLm11dGVkJiZ0PjAmJih0aGlzLm11dGVkPSExKX1nZXQgdm9sdW1lKCl7cmV0dXJuIE51bWJlcih0aGlzLm1lZGlhLnZvbHVtZSl9c2V0IG11dGVkKGUpe2xldCB0PWU7Tyh0KXx8KHQ9dGhpcy5zdG9yYWdlLmdldChcIm11dGVkXCIpKSxPKHQpfHwodD10aGlzLmNvbmZpZy5tdXRlZCksdGhpcy5jb25maWcubXV0ZWQ9dCx0aGlzLm1lZGlhLm11dGVkPXR9Z2V0IG11dGVkKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5tZWRpYS5tdXRlZCl9Z2V0IGhhc0F1ZGlvKCl7cmV0dXJuIXRoaXMuaXNIVE1MNXx8KCEhdGhpcy5pc0F1ZGlvfHwoQm9vbGVhbih0aGlzLm1lZGlhLm1vekhhc0F1ZGlvKXx8Qm9vbGVhbih0aGlzLm1lZGlhLndlYmtpdEF1ZGlvRGVjb2RlZEJ5dGVDb3VudCl8fEJvb2xlYW4odGhpcy5tZWRpYS5hdWRpb1RyYWNrcyYmdGhpcy5tZWRpYS5hdWRpb1RyYWNrcy5sZW5ndGgpKSl9c2V0IHNwZWVkKGUpe2xldCB0PW51bGw7JChlKSYmKHQ9ZSksJCh0KXx8KHQ9dGhpcy5zdG9yYWdlLmdldChcInNwZWVkXCIpKSwkKHQpfHwodD10aGlzLmNvbmZpZy5zcGVlZC5zZWxlY3RlZCk7Y29uc3R7bWluaW11bVNwZWVkOmksbWF4aW11bVNwZWVkOnN9PXRoaXM7dD1mdCh0LGkscyksdGhpcy5jb25maWcuc3BlZWQuc2VsZWN0ZWQ9dCxzZXRUaW1lb3V0KCgoKT0+e3RoaXMubWVkaWEmJih0aGlzLm1lZGlhLnBsYXliYWNrUmF0ZT10KX0pLDApfWdldCBzcGVlZCgpe3JldHVybiBOdW1iZXIodGhpcy5tZWRpYS5wbGF5YmFja1JhdGUpfWdldCBtaW5pbXVtU3BlZWQoKXtyZXR1cm4gdGhpcy5pc1lvdVR1YmU/TWF0aC5taW4oLi4udGhpcy5vcHRpb25zLnNwZWVkKTp0aGlzLmlzVmltZW8/LjU6LjA2MjV9Z2V0IG1heGltdW1TcGVlZCgpe3JldHVybiB0aGlzLmlzWW91VHViZT9NYXRoLm1heCguLi50aGlzLm9wdGlvbnMuc3BlZWQpOnRoaXMuaXNWaW1lbz8yOjE2fXNldCBxdWFsaXR5KGUpe2NvbnN0IHQ9dGhpcy5jb25maWcucXVhbGl0eSxpPXRoaXMub3B0aW9ucy5xdWFsaXR5O2lmKCFpLmxlbmd0aClyZXR1cm47bGV0IHM9WyFXKGUpJiZOdW1iZXIoZSksdGhpcy5zdG9yYWdlLmdldChcInF1YWxpdHlcIiksdC5zZWxlY3RlZCx0LmRlZmF1bHRdLmZpbmQoJCksbj0hMDtpZighaS5pbmNsdWRlcyhzKSl7Y29uc3QgZT1BZShpLHMpO3RoaXMuZGVidWcud2FybihgVW5zdXBwb3J0ZWQgcXVhbGl0eSBvcHRpb246ICR7c30sIHVzaW5nICR7ZX0gaW5zdGVhZGApLHM9ZSxuPSExfXQuc2VsZWN0ZWQ9cyx0aGlzLm1lZGlhLnF1YWxpdHk9cyxuJiZ0aGlzLnN0b3JhZ2Uuc2V0KHtxdWFsaXR5OnN9KX1nZXQgcXVhbGl0eSgpe3JldHVybiB0aGlzLm1lZGlhLnF1YWxpdHl9c2V0IGxvb3AoZSl7Y29uc3QgdD1PKGUpP2U6dGhpcy5jb25maWcubG9vcC5hY3RpdmU7dGhpcy5jb25maWcubG9vcC5hY3RpdmU9dCx0aGlzLm1lZGlhLmxvb3A9dH1nZXQgbG9vcCgpe3JldHVybiBCb29sZWFuKHRoaXMubWVkaWEubG9vcCl9c2V0IHNvdXJjZShlKXt3dC5jaGFuZ2UuY2FsbCh0aGlzLGUpfWdldCBzb3VyY2UoKXtyZXR1cm4gdGhpcy5tZWRpYS5jdXJyZW50U3JjfWdldCBkb3dubG9hZCgpe2NvbnN0e2Rvd25sb2FkOmV9PXRoaXMuY29uZmlnLnVybHM7cmV0dXJuIFUoZSk/ZTp0aGlzLnNvdXJjZX1zZXQgZG93bmxvYWQoZSl7VShlKSYmKHRoaXMuY29uZmlnLnVybHMuZG93bmxvYWQ9ZSxXZS5zZXREb3dubG9hZFVybC5jYWxsKHRoaXMpKX1zZXQgcG9zdGVyKGUpe3RoaXMuaXNWaWRlbz9hdC5zZXRQb3N0ZXIuY2FsbCh0aGlzLGUsITEpLmNhdGNoKCgoKT0+e30pKTp0aGlzLmRlYnVnLndhcm4oXCJQb3N0ZXIgY2FuIG9ubHkgYmUgc2V0IGZvciB2aWRlb1wiKX1nZXQgcG9zdGVyKCl7cmV0dXJuIHRoaXMuaXNWaWRlbz90aGlzLm1lZGlhLmdldEF0dHJpYnV0ZShcInBvc3RlclwiKXx8dGhpcy5tZWRpYS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBvc3RlclwiKTpudWxsfWdldCByYXRpbygpe2lmKCF0aGlzLmlzVmlkZW8pcmV0dXJuIG51bGw7Y29uc3QgZT1NZShOZS5jYWxsKHRoaXMpKTtyZXR1cm4gRChlKT9lLmpvaW4oXCI6XCIpOmV9c2V0IHJhdGlvKGUpe3RoaXMuaXNWaWRlbz9fKGUpJiZQZShlKT8odGhpcy5jb25maWcucmF0aW89TWUoZSkseGUuY2FsbCh0aGlzKSk6dGhpcy5kZWJ1Zy5lcnJvcihgSW52YWxpZCBhc3BlY3QgcmF0aW8gc3BlY2lmaWVkICgke2V9KWApOnRoaXMuZGVidWcud2FybihcIkFzcGVjdCByYXRpbyBjYW4gb25seSBiZSBzZXQgZm9yIHZpZGVvXCIpfXNldCBhdXRvcGxheShlKXt0aGlzLmNvbmZpZy5hdXRvcGxheT1PKGUpP2U6dGhpcy5jb25maWcuYXV0b3BsYXl9Z2V0IGF1dG9wbGF5KCl7cmV0dXJuIEJvb2xlYW4odGhpcy5jb25maWcuYXV0b3BsYXkpfXRvZ2dsZUNhcHRpb25zKGUpe1llLnRvZ2dsZS5jYWxsKHRoaXMsZSwhMSl9c2V0IGN1cnJlbnRUcmFjayhlKXtZZS5zZXQuY2FsbCh0aGlzLGUsITEpLFllLnNldHVwLmNhbGwodGhpcyl9Z2V0IGN1cnJlbnRUcmFjaygpe2NvbnN0e3RvZ2dsZWQ6ZSxjdXJyZW50VHJhY2s6dH09dGhpcy5jYXB0aW9ucztyZXR1cm4gZT90Oi0xfXNldCBsYW5ndWFnZShlKXtZZS5zZXRMYW5ndWFnZS5jYWxsKHRoaXMsZSwhMSl9Z2V0IGxhbmd1YWdlKCl7cmV0dXJuKFllLmdldEN1cnJlbnRUcmFjay5jYWxsKHRoaXMpfHx7fSkubGFuZ3VhZ2V9c2V0IHBpcChlKXtpZighbWUucGlwKXJldHVybjtjb25zdCB0PU8oZSk/ZTohdGhpcy5waXA7aih0aGlzLm1lZGlhLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUpJiZ0aGlzLm1lZGlhLndlYmtpdFNldFByZXNlbnRhdGlvbk1vZGUodD9YZTpKZSksaih0aGlzLm1lZGlhLnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKSYmKCF0aGlzLnBpcCYmdD90aGlzLm1lZGlhLnJlcXVlc3RQaWN0dXJlSW5QaWN0dXJlKCk6dGhpcy5waXAmJiF0JiZkb2N1bWVudC5leGl0UGljdHVyZUluUGljdHVyZSgpKX1nZXQgcGlwKCl7cmV0dXJuIG1lLnBpcD9XKHRoaXMubWVkaWEud2Via2l0UHJlc2VudGF0aW9uTW9kZSk/dGhpcy5tZWRpYT09PWRvY3VtZW50LnBpY3R1cmVJblBpY3R1cmVFbGVtZW50OnRoaXMubWVkaWEud2Via2l0UHJlc2VudGF0aW9uTW9kZT09PVhlOm51bGx9c2V0UHJldmlld1RodW1ibmFpbHMoZSl7dGhpcy5wcmV2aWV3VGh1bWJuYWlscyYmdGhpcy5wcmV2aWV3VGh1bWJuYWlscy5sb2FkZWQmJih0aGlzLnByZXZpZXdUaHVtYm5haWxzLmRlc3Ryb3koKSx0aGlzLnByZXZpZXdUaHVtYm5haWxzPW51bGwpLE9iamVjdC5hc3NpZ24odGhpcy5jb25maWcucHJldmlld1RodW1ibmFpbHMsZSksdGhpcy5jb25maWcucHJldmlld1RodW1ibmFpbHMuZW5hYmxlZCYmKHRoaXMucHJldmlld1RodW1ibmFpbHM9bmV3IHZ0KHRoaXMpKX1zdGF0aWMgc3VwcG9ydGVkKGUsdCxpKXtyZXR1cm4gbWUuY2hlY2soZSx0LGkpfXN0YXRpYyBsb2FkU3ByaXRlKGUsdCl7cmV0dXJuIFZlKGUsdCl9c3RhdGljIHNldHVwKGUsdD17fSl7bGV0IGk9bnVsbDtyZXR1cm4gXyhlKT9pPUFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChlKSk6cShlKT9pPUFycmF5LmZyb20oZSk6RChlKSYmKGk9ZS5maWx0ZXIoSCkpLFcoaSk/bnVsbDppLm1hcCgoZT0+bmV3IFR0KGUsdCkpKX19dmFyIGt0O3JldHVybiBUdC5kZWZhdWx0cz0oa3Q9UWUsSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShrdCkpKSxUdH0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBseXIubWluLmpzLm1hcFxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG5cdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBtb2R1bGU7IH07XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBkZWZpbml0aW9uKSB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18uZyA9IChmdW5jdGlvbigpIHtcblx0aWYgKHR5cGVvZiBnbG9iYWxUaGlzID09PSAnb2JqZWN0JykgcmV0dXJuIGdsb2JhbFRoaXM7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHRoaXMgfHwgbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ29iamVjdCcpIHJldHVybiB3aW5kb3c7XG5cdH1cbn0pKCk7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqLCBwcm9wKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTsgfSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0IFBseXIgZnJvbSAncGx5cic7XG5pbXBvcnQgQ2lyY2xlVHlwZSBmcm9tICdjaXJjbGV0eXBlJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gREFUQVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4vLyBIT01FIE5BVklHQVRJT04gRElTUExBWSAvL1xuXG5jb25zdCBuYXZFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ob21lX19uYXYnKTtcbmNvbnN0IG5hdkxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhvbWVfX25hdi1saW5rJyk7XG5jb25zdCBuYXZJbWFnZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ob21lX19uYXYtaW1hZ2UnKTtcbmNvbnN0IGNpcmNsZVR5cGVzID0gW107XG5cbi8vIFZJREVPIFBMQVlFUlMgLy9cblxuY29uc3QgZ2FsbGVyeVZpZGVvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5nYWxsZXJ5X192aWRlbycpO1xubGV0IHZpZGVvUGxheWVycyA9IFtdO1xuXG4vLyBIRUFERVIgQkFSIEFOSU1BVElPTiAvL1xuXG5jb25zdCBoZWFkZXJCYXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyLWJhcicpO1xuY29uc3QgaGVhZGVyTG9nbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkZXItYmFyX19sb2dvJyk7XG5sZXQgc2Nyb2xsT2Zmc2V0ID0gMDtcblxuLy8gTkFWSUdBVElPTiBNRU5VIEFOSU1BVElPTiAvL1xuXG5jb25zdCBoZWFkZXJOYXZCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyLWJhcl9fbmF2LWJ1dHRvbicpO1xuY29uc3QgaGVhZGVyTmF2TWVudSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZWFkZXItYmFyX19uYXYtbWVudScpO1xuY29uc3QgaGVhZGVyTmF2TWVudUxpc3RFbHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGVhZGVyLWJhcl9fbmF2LW1lbnUgbGknKTtcbmNvbnN0IGhlYWRlck5hdk92ZXJsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVhZGVyLWJhcl9fbmF2LW92ZXJsYXknKTtcbmNvbnN0IHRvdWNoUG9zaXRpb24gPSB7XG5cdGluaXRpYWxYOiBudWxsLFxuXHRpbml0aWFsWTogbnVsbFxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVVRJTFNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gQ29udmVydCByZW0gdG8gcGl4ZWxzIGJ5IGdldHRpbmcgZm9udC1zaXplIENTUyBwcm9wZXJ0eVxuZnVuY3Rpb24gY29udmVydFJlbVRvUGl4ZWxzKHJlbSkge1xuXHRsZXQgZm9udFNpemUgPSBwYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLmdldFByb3BlcnR5VmFsdWUoJ2ZvbnQtc2l6ZScpKTtcblx0cmV0dXJuIHJlbSAqIGZvbnRTaXplO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBMT0dJQ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBIT01FIE5BVklHQVRJT04gRElTUExBWSAvL1xuXG4vLyBDYWxjdWxhdGUgbmF2aWdhdGlvbiBncmlkIGlubmVyIHdpZHRoXG5mdW5jdGlvbiBjYWxjdWxhdGVOYXZHcmlkSW5uZXJXaWR0aCgpIHtcblx0aWYgKHJvb3QgJiYgbmF2SW1hZ2UpIHtcblx0XHRsZXQgbmF2R3JpZEdhcFByb3BlcnR5ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocm9vdCkuZ2V0UHJvcGVydHlWYWx1ZSgnLS1ob21lLW5hdi1nYXAnKTtcblx0XHRsZXQgbmF2R3JpZEdhcCA9IHBhcnNlRmxvYXQobmF2R3JpZEdhcFByb3BlcnR5LnNsaWNlKDAsIC0zKSk7XG5cdFx0cmV0dXJuIG5hdkltYWdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICsgKGNvbnZlcnRSZW1Ub1BpeGVscyhuYXZHcmlkR2FwKSAqIDIpO1xuXHR9XG59XG5cbi8vIENhbGN1bGF0ZSBuYXZpZ2F0aW9uIGdyaWQgaW5uZXIgZGlhZ29uYWxcbmZ1bmN0aW9uIGNhbGN1bGF0ZU5hdkdyaWRJbm5lckRpYWdvbmFsKCkge1xuXHRyZXR1cm4gY2FsY3VsYXRlTmF2R3JpZElubmVyV2lkdGgoKSAqIE1hdGguc3FydCgyKTtcbn1cblxuLy8gQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBDaXJjbGVUeXBlIGZvciBlYWNoIG5hdmlnYXRpb24gbGluaywgc2V0IHJhZGl1cyBhbmQgZGlyZWN0aW9uXG5mdW5jdGlvbiBjdXJ2ZU5hdkxpbmtzKCkge1xuXHRpZiAobmF2TGlua3MubGVuZ3RoICE9PSAwICYmIGNpcmNsZVR5cGVzKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCAobmF2TGlua3MubGVuZ3RoIC0gMik7IGkrKykge1xuXHRcdFx0Y2lyY2xlVHlwZXNbaV0gPSBuZXcgQ2lyY2xlVHlwZShuYXZMaW5rc1tpXSk7XG5cdFx0XHRjaXJjbGVUeXBlc1tpXS5yYWRpdXMoY2FsY3VsYXRlTmF2R3JpZElubmVyV2lkdGgoKSAvIDIpO1xuXHRcdH1cblx0XHRmb3IgKGxldCBpID0gKG5hdkxpbmtzLmxlbmd0aCAtIDIpOyBpIDwgbmF2TGlua3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNpcmNsZVR5cGVzW2ldID0gbmV3IENpcmNsZVR5cGUobmF2TGlua3NbaV0pO1xuXHRcdFx0Y2lyY2xlVHlwZXNbaV0uZGlyKC0xKTtcblx0XHRcdGNpcmNsZVR5cGVzW2ldLnJhZGl1cyhjYWxjdWxhdGVOYXZHcmlkSW5uZXJXaWR0aCgpIC8gMik7XG5cdFx0fVxuXHR9XG59XG5cbi8vIFNldCAtLWhvbWUtbmF2LWl0ZW0tdHJhbnNsYXRpb24gQ1NTIHByb3BlcnR5XG5mdW5jdGlvbiBzZXROYXZJdGVtVHJhbnNsYXRpb25Qcm9wZXJ0eSgpIHtcblx0bGV0IG5hdkl0ZW1UcmFuc2xhdGlvbiA9IChjYWxjdWxhdGVOYXZHcmlkSW5uZXJEaWFnb25hbCgpIC0gY2FsY3VsYXRlTmF2R3JpZElubmVyV2lkdGgoKSkgLyAyO1xuXHRpZiAocm9vdCkge1xuXHRcdHJvb3Quc3R5bGUuc2V0UHJvcGVydHkoJy0taG9tZS1uYXYtaXRlbS10cmFuc2xhdGlvbicsIG5hdkl0ZW1UcmFuc2xhdGlvbiArICdweCcpO1xuXHR9XG59XG5cbi8vIFNldCBuYXZpZ2F0aW9uIGdyaWQgZGlzcGxheSBkZXBlbmRpbmcgb24gbnVtYmVyIG9mIGxpbmtzXG5mdW5jdGlvbiBzZXROYXZHcmlkRGlzcGxheSgpIHtcblx0aWYgKG5hdkVsICYmIG5hdkxpbmtzLmxlbmd0aCAhPT0gMCkge1xuXHRcdGlmIChuYXZMaW5rcy5sZW5ndGggPT09IDIpIHtcblx0XHRcdG5hdkVsLmNsYXNzTGlzdC5hZGQoJ2hvbWVfX25hdi0tMi1pdGVtcycpO1xuXHRcdH0gZWxzZSBpZiAobmF2TGlua3MubGVuZ3RoID09PSAzKSB7XG5cdFx0XHRuYXZFbC5jbGFzc0xpc3QuYWRkKCdob21lX19uYXYtLTMtaXRlbXMnKTtcblx0XHR9IGVsc2UgaWYgKG5hdkxpbmtzLmxlbmd0aCA9PT0gNCkge1xuXHRcdFx0bmF2RWwuY2xhc3NMaXN0LmFkZCgnaG9tZV9fbmF2LS00LWl0ZW1zJyk7XG5cdFx0fVxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbmF2TGlua3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdG5hdkxpbmtzW2ldLmNsYXNzTGlzdC5hZGQoJ2hvbWVfX25hdi1saW5rLS12aXNpYmxlJyk7XG5cdFx0fVxuXHR9XG59XG5cbi8vIEVkaXQgbmF2aWdhdGlvbiBsaW5rcyByYWRpdXMgYW5kIHRyYW5zbGF0aW9uIG9uIHdpbmRvdyByZXNpemUgZXZlbnRcbmZ1bmN0aW9uIGVkaXROYXZMaW5rc09uUmVzaXplKCkge1xuXHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgZnVuY3Rpb24oZSkge1xuXHRcdGlmIChuYXZMaW5rcy5sZW5ndGggIT09IDAgJiYgY2lyY2xlVHlwZXMpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbmF2TGlua3MubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y2lyY2xlVHlwZXNbaV0ucmFkaXVzKGNhbGN1bGF0ZU5hdkdyaWRJbm5lcldpZHRoKCkgLyAyKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0c2V0TmF2SXRlbVRyYW5zbGF0aW9uUHJvcGVydHkoKTtcblx0fSk7XG59XG5cbi8vIEFkZCB3YXZlIHVwIGFuaW1hdGlvbiB0byBhIHNpbmdsZSBsZXR0ZXIgYW5kIHJlbW92ZSBpdCBvbiBhbmltYXRpb25lbmQgZXZlbnRcbmZ1bmN0aW9uIHdhdmVOYXZMZXR0ZXJVcChuYXZMZXR0ZXIpIHtcblx0bmF2TGV0dGVyLmNsYXNzTGlzdC5hZGQoJ2hvbWVfX25hdi1sZXR0ZXItLXdhdmUtdXAnKTtcblx0bmF2TGV0dGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2FuaW1hdGlvbmVuZCcsIGZ1bmN0aW9uKGUpIHtcblx0XHRuYXZMZXR0ZXIuY2xhc3NMaXN0LnJlbW92ZSgnaG9tZV9fbmF2LWxldHRlci0td2F2ZS11cCcpO1xuXHR9KTtcbn1cblxuLy8gQWRkIHdhdmUgZG93biBhbmltYXRpb24gdG8gYSBzaW5nbGUgbGV0dGVyIGFuZCByZW1vdmUgaXQgb24gYW5pbWF0aW9uZW5kIGV2ZW50XG5mdW5jdGlvbiB3YXZlTmF2TGV0dGVyRG93bihuYXZMZXR0ZXIpIHtcblx0bmF2TGV0dGVyLmNsYXNzTGlzdC5hZGQoJ2hvbWVfX25hdi1sZXR0ZXItLXdhdmUtZG93bicpO1xuXHRuYXZMZXR0ZXIuYWRkRXZlbnRMaXN0ZW5lcignYW5pbWF0aW9uZW5kJywgZnVuY3Rpb24oZSkge1xuXHRcdG5hdkxldHRlci5jbGFzc0xpc3QucmVtb3ZlKCdob21lX19uYXYtbGV0dGVyLS13YXZlLWRvd24nKTtcblx0fSk7XG59XG5cbi8vIEFkZCB3YXZlIHVwIGFuaW1hdGlvbiB0byBldmVyeSBsZXR0ZXJzIG9mIGEgc2luZ2xlIGxpbmsgd2l0aCBhIHNsaWdodCBkZWxheVxuZnVuY3Rpb24gd2F2ZU5hdkxpbmtVcChuYXZMaW5rKSB7XG5cdGxldCBuYXZMaW5rTGV0dGVycyA9IG5hdkxpbmsucXVlcnlTZWxlY3RvckFsbCgnc3BhbicpO1xuXHRsZXQgYW5pbWF0aW9uRGVsYXkgPSAwO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IG5hdkxpbmtMZXR0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0c2V0VGltZW91dCh3YXZlTmF2TGV0dGVyVXAsIGFuaW1hdGlvbkRlbGF5LCBuYXZMaW5rTGV0dGVyc1tpXSk7XG5cdFx0YW5pbWF0aW9uRGVsYXkgKz0gNTA7XG5cdH1cbn1cblxuLy8gQWRkIHdhdmUgZG93biBhbmltYXRpb24gdG8gZXZlcnkgbGV0dGVycyBvZiBhIHNpbmdsZSBsaW5rIHdpdGggYSBzbGlnaHQgZGVsYXlcbmZ1bmN0aW9uIHdhdmVOYXZMaW5rRG93bihuYXZMaW5rKSB7XG5cdGxldCBuYXZMaW5rTGV0dGVycyA9IG5hdkxpbmsucXVlcnlTZWxlY3RvckFsbCgnc3BhbicpO1xuXHRsZXQgYW5pbWF0aW9uRGVsYXkgPSAwO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IG5hdkxpbmtMZXR0ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0c2V0VGltZW91dCh3YXZlTmF2TGV0dGVyRG93biwgYW5pbWF0aW9uRGVsYXksIG5hdkxpbmtMZXR0ZXJzW2ldKTtcblx0XHRhbmltYXRpb25EZWxheSArPSA1MDtcblx0fVxufVxuXG4vLyBBZGQgd2F2ZSAodXAgb3IgZG93bikgYW5pbWF0aW9uIHRvIGV2ZXJ5IGxldHRlcnMgb2YgZWFjaCBsaW5rIG9uIG1vdXNlb3ZlciBldmVudFxuZnVuY3Rpb24gd2F2ZU5hdkxpbmtzT25Ib3ZlcigpIHtcblx0aWYgKG5hdkxpbmtzLmxlbmd0aCAhPT0gMCkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgKG5hdkxpbmtzLmxlbmd0aCAtIDIpOyBpKyspIHtcblx0XHRcdG5hdkxpbmtzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0d2F2ZU5hdkxpbmtVcChuYXZMaW5rc1tpXSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Zm9yIChsZXQgaSA9IChuYXZMaW5rcy5sZW5ndGggLSAyKTsgaSA8IG5hdkxpbmtzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRuYXZMaW5rc1tpXS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLCBmdW5jdGlvbihlKSB7XG5cdFx0XHRcdHdhdmVOYXZMaW5rRG93bihuYXZMaW5rc1tpXSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn1cblxuLy8gVklERU8gUExBWUVSUyAvL1xuXG4vLyBTZXQgdXAgUGx5ciB2aWRlbyBwbGF5ZXJzXG5mdW5jdGlvbiBzZXRVcFZpZGVvUGxheWVycygpIHtcblx0aWYgKGdhbGxlcnlWaWRlb3MubGVuZ3RoICE9PSAwKSB7XG5cdFx0dmlkZW9QbGF5ZXJzID0gUGx5ci5zZXR1cChnYWxsZXJ5VmlkZW9zLCB7XG5cdFx0XHRjb250cm9sczogW1xuXHRcdFx0XHQncGxheS1sYXJnZScsXG5cdFx0XHRcdCdwbGF5Jyxcblx0XHRcdFx0J3Byb2dyZXNzJyxcblx0XHRcdFx0J2N1cnJlbnQtdGltZScsXG5cdFx0XHRcdCdkdXJhdGlvbicsXG5cdFx0XHRcdCdtdXRlJyxcblx0XHRcdFx0J3ZvbHVtZScsXG5cdFx0XHRcdCdmdWxsc2NyZWVuJ1xuXHRcdFx0XSxcblx0XHRcdGkxOG46IHtcblx0XHRcdFx0cGxheTogJ0xpcmUnLFxuXHRcdFx0XHRwYXVzZTogJ01ldHRyZSBzdXIgcGF1c2UnLFxuXHRcdFx0XHRzZWVrOiAnUGFyY291cmlyIGxhIHBpc3RlIGF1ZGlvJyxcblx0XHRcdFx0Y3VycmVudFRpbWU6ICdUZW1wcyDDqWNvdWzDqSBkZXB1aXMgbGUgZMOpYnV0IGRlIGxhIHBpc3RlIGF1ZGlvJyxcblx0XHRcdFx0ZHVyYXRpb246ICdEdXLDqWUgZGUgbGEgcGlzdGUgYXVkaW8nLFxuXHRcdFx0XHR2b2x1bWU6ICdBanVzdGVyIGxlIHZvbHVtZScsXG5cdFx0XHRcdG11dGU6ICdDb3VwZXIgbGUgc29uJyxcblx0XHRcdFx0dW5tdXRlOiAnQWN0aXZlciBsZSBzb24nLFxuXHRcdFx0XHRlbnRlckZ1bGxzY3JlZW46ICdBY3RpdmVyIGxlIG1vZGUgcGxlaW4gw6ljcmFuJyxcblx0XHRcdFx0ZXhpdEZ1bGxzY3JlZW46ICdRdWl0dGVyIGxlIG1vZGUgcGxlaW4gw6ljcmFuJ1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG59XG5cbi8vIFRvZ2dsZSB2aWRlb3MgZnVsbCBzY3JlZW4gbW9kZSBvbiBQbHlyIGVudGVyZnVsbHNjcmVlbiBhbmQgZXhpdGZ1bGxzY3JlZW4gbWVkaWEgZXZlbnRzXG5mdW5jdGlvbiB0b2dnbGVWaWRlb3NGdWxsU2NyZWVuKCkge1xuXHRpZiAodmlkZW9QbGF5ZXJzLmxlbmd0aCAhPT0gMCkge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmlkZW9QbGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2aWRlb1BsYXllcnNbaV0ub24oJ2VudGVyZnVsbHNjcmVlbicsIGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0Z2FsbGVyeVZpZGVvc1tpXS5jbGFzc0xpc3QuYWRkKCdnYWxsZXJ5X192aWRlby0tZnVsbC1zY3JlZW4nKTtcblx0XHRcdH0pO1xuXHRcdFx0dmlkZW9QbGF5ZXJzW2ldLm9uKCdleGl0ZnVsbHNjcmVlbicsIGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0Z2FsbGVyeVZpZGVvc1tpXS5jbGFzc0xpc3QucmVtb3ZlKCdnYWxsZXJ5X192aWRlby0tZnVsbC1zY3JlZW4nKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxufVxuXG4vLyBIRUFERVIgQkFSIEFOSU1BVElPTiAvL1xuXG4vLyBUb2dnbGUgaGVhZGVyIGJhciBkZXBlbmRpbmcgb24gc2Nyb2xsIG9mZnNldFxuZnVuY3Rpb24gdG9nZ2xlSGVhZGVyQmFyKCkge1xuXHRpZiAoaGVhZGVyQmFyICYmIGhlYWRlckxvZ28pIHtcblx0XHRsZXQgaGVhZGVyQmFySGVpZ2h0ID0gaGVhZGVyQmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblx0XHRpZiAod2luZG93LnBhZ2VZT2Zmc2V0ID4gaGVhZGVyQmFySGVpZ2h0KSB7IC8vIFNjcm9sbCBkb3duIHBhc3QgaGVhZGVyIGJhciBoZWlnaHRcblx0XHRcdGhlYWRlckJhci5jbGFzc0xpc3QuYWRkKCdoZWFkZXItYmFyLS1maXhlZCcpO1xuXHRcdFx0aGVhZGVyTG9nby5jbGFzc0xpc3QuYWRkKCdoZWFkZXItYmFyX19sb2dvLS1zbWFsbCcpO1xuXHRcdH0gZWxzZSBpZiAod2luZG93LnBhZ2VZT2Zmc2V0IDw9IDApIHtcblx0XHRcdGhlYWRlckJhci5jbGFzc0xpc3QucmVtb3ZlKCdoZWFkZXItYmFyLS1maXhlZCcpO1xuXHRcdFx0aGVhZGVyTG9nby5jbGFzc0xpc3QucmVtb3ZlKCdoZWFkZXItYmFyX19sb2dvLS1zbWFsbCcpO1xuXHRcdFx0aGVhZGVyQmFyLmNsYXNzTGlzdC5yZW1vdmUoJ2hlYWRlci1iYXItLXZpc2libGUnKTtcblx0XHR9XG5cdFx0aWYgKGhlYWRlckJhci5jbGFzc0xpc3QuY29udGFpbnMoJ2hlYWRlci1iYXItLWZpeGVkJykpIHtcblx0XHRcdGlmIChzY3JvbGxPZmZzZXQgPCB3aW5kb3cucGFnZVlPZmZzZXQpIHsgLy8gU2Nyb2xsIGRvd25cblx0XHRcdFx0aGVhZGVyQmFyLmNsYXNzTGlzdC5yZW1vdmUoJ2hlYWRlci1iYXItLXZpc2libGUnKTtcblx0XHRcdH0gZWxzZSBpZiAoc2Nyb2xsT2Zmc2V0ID4gd2luZG93LnBhZ2VZT2Zmc2V0KSB7IC8vIFNjcm9sbCB1cFxuXHRcdFx0XHRoZWFkZXJCYXIuY2xhc3NMaXN0LmFkZCgnaGVhZGVyLWJhci0tdmlzaWJsZScpO1xuXHRcdFx0fVxuXHRcdFx0c2Nyb2xsT2Zmc2V0ID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuXHRcdH1cblx0fVxufVxuXG4vLyBOQVZJR0FUSU9OIE1FTlUgQU5JTUFUSU9OIC8vXG5cbi8vIFRvZ2dsZSBoZWFkZXIgbmF2aWdhdGlvblxuZnVuY3Rpb24gdG9nZ2xlSGVhZGVyTmF2KCkge1xuXHRpZiAoaGVhZGVyTmF2QnRuICYmIGhlYWRlck5hdk1lbnUpIHtcblx0XHRoZWFkZXJOYXZCdG4uY2xhc3NMaXN0LnRvZ2dsZSgnaGVhZGVyLWJhcl9fbmF2LWJ1dHRvbi0tY3VzdG9tLWZvY3VzJyk7XG5cdFx0aGVhZGVyTmF2TWVudS5jbGFzc0xpc3QudG9nZ2xlKCdoZWFkZXItYmFyX19uYXYtbWVudS0tdmlzaWJsZScpO1xuXHRcdGhlYWRlck5hdk92ZXJsYXkuY2xhc3NMaXN0LnRvZ2dsZSgnaGVhZGVyLWJhcl9fbmF2LW92ZXJsYXktLXZpc2libGUnKTtcblx0XHRkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC50b2dnbGUoJ2JvZHktLWhpZGRlbi1vdmVyZmxvdy15Jyk7XG5cdH1cbn1cblxuLy8gT3BlbiBoZWFkZXIgbmF2aWdhdGlvblxuZnVuY3Rpb24gb3BlbkhlYWRlck5hdigpIHtcblx0aWYgKGhlYWRlck5hdkJ0biAmJiBoZWFkZXJOYXZNZW51KSB7XG5cdFx0aGVhZGVyTmF2QnRuLmNsYXNzTGlzdC5hZGQoJ2hlYWRlci1iYXJfX25hdi1idXR0b24tLWN1c3RvbS1mb2N1cycpO1xuXHRcdGhlYWRlck5hdk1lbnUuY2xhc3NMaXN0LmFkZCgnaGVhZGVyLWJhcl9fbmF2LW1lbnUtLXZpc2libGUnKTtcblx0XHRoZWFkZXJOYXZPdmVybGF5LmNsYXNzTGlzdC5hZGQoJ2hlYWRlci1iYXJfX25hdi1vdmVybGF5LS12aXNpYmxlJyk7XG5cdFx0ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdib2R5LS1oaWRkZW4tb3ZlcmZsb3cteScpO1xuXHR9XG59XG5cbi8vIENsb3NlIGhlYWRlciBuYXZpZ2F0aW9uXG5mdW5jdGlvbiBjbG9zZUhlYWRlck5hdigpIHtcblx0aWYgKGhlYWRlck5hdkJ0biAmJiBoZWFkZXJOYXZNZW51KSB7XG5cdFx0aGVhZGVyTmF2QnRuLmNsYXNzTGlzdC5yZW1vdmUoJ2hlYWRlci1iYXJfX25hdi1idXR0b24tLWN1c3RvbS1mb2N1cycpO1xuXHRcdGhlYWRlck5hdk1lbnUuY2xhc3NMaXN0LnJlbW92ZSgnaGVhZGVyLWJhcl9fbmF2LW1lbnUtLXZpc2libGUnKTtcblx0XHRoZWFkZXJOYXZPdmVybGF5LmNsYXNzTGlzdC5yZW1vdmUoJ2hlYWRlci1iYXJfX25hdi1vdmVybGF5LS12aXNpYmxlJyk7XG5cdFx0ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdib2R5LS1oaWRkZW4tb3ZlcmZsb3cteScpO1xuXHR9XG59XG5cbi8vIFRvZ2dsZSBoZWFkZXIgbmF2aWdhdGlvbiBvbiBidXR0b24gY2xpY2sgZXZlbnRcbmZ1bmN0aW9uIHRvZ2dsZUhlYWRlck5hdk9uQ2xpY2soKSB7XG5cdGhlYWRlck5hdkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRvZ2dsZUhlYWRlck5hdik7XG59XG5cbi8vIENsb3NlIGhlYWRlciBuYXZpZ2F0aW9uIG9uIGRvY3VtZW50IGNsaWNrIGV2ZW50XG5mdW5jdGlvbiBjbG9zZUhlYWRlck5hdk9uQ2xpY2soKSB7XG5cdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuXHRcdGlmIChoZWFkZXJOYXZCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdoZWFkZXItYmFyX19uYXYtYnV0dG9uLS1jdXN0b20tZm9jdXMnKSAmJiBoZWFkZXJOYXZNZW51LmNsYXNzTGlzdC5jb250YWlucygnaGVhZGVyLWJhcl9fbmF2LW1lbnUtLXZpc2libGUnKSAmJiAhaGVhZGVyTmF2QnRuLmNvbnRhaW5zKGUudGFyZ2V0KSAmJiAhaGVhZGVyTmF2TWVudS5jb250YWlucyhlLnRhcmdldCkpIHtcblx0XHRcdGNsb3NlSGVhZGVyTmF2KGUpO1xuXHRcdFx0aWYgKGUuY2FuY2VsYWJsZSkge1xuXHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gT3BlbiBoZWFkZXIgbmF2aWdhdGlvbiBvbiBtZW51IGxpc3QgZm9jdXNpbiBldmVudFxuZnVuY3Rpb24gb3BlbkhlYWRlck5hdkJlZm9yZUZvY3VzKCkge1xuXHRpZiAoaGVhZGVyTmF2TWVudUxpc3RFbHMpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlck5hdk1lbnVMaXN0RWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRoZWFkZXJOYXZNZW51TGlzdEVsc1tpXS5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgb3BlbkhlYWRlck5hdik7XG5cdFx0fVxuXHR9XG59XG5cbi8vIENsb3NlIGhlYWRlciBuYXZpZ2F0aW9uIG9uIG1lbnUgbGlzdCBmb2N1c291dCBldmVudFxuZnVuY3Rpb24gY2xvc2VIZWFkZXJOYXZBZnRlckZvY3VzKCkge1xuXHRpZiAoaGVhZGVyTmF2TWVudUxpc3RFbHMpIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGhlYWRlck5hdk1lbnVMaXN0RWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRoZWFkZXJOYXZNZW51TGlzdEVsc1tpXS5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIGNsb3NlSGVhZGVyTmF2KTtcblx0XHR9XG5cdH1cbn1cblxuLy8gQ2xvc2UgaGVhZGVyIG5hdmlnYXRpb24gb24gdG91Y2hzdGFydCBhbmQgdG91Y2htb3ZlIGV2ZW50cyAoc3dpcGUgcmlnaHQpXG5mdW5jdGlvbiBjbG9zZUhlYWRlck5hdk9uU3dpcGUoKSB7XG5cdGhlYWRlck5hdk1lbnUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGZ1bmN0aW9uKGUpIHtcblx0XHRpZiAoaGVhZGVyTmF2QnRuLmNsYXNzTGlzdC5jb250YWlucygnaGVhZGVyLWJhcl9fbmF2LWJ1dHRvbi0tY3VzdG9tLWZvY3VzJykgJiYgaGVhZGVyTmF2TWVudS5jbGFzc0xpc3QuY29udGFpbnMoJ2hlYWRlci1iYXJfX25hdi1tZW51LS12aXNpYmxlJykgJiYgdG91Y2hQb3NpdGlvbi5pbml0aWFsWCA9PT0gbnVsbCAmJiB0b3VjaFBvc2l0aW9uLmluaXRpYWxZID09PSBudWxsKSB7XG5cdFx0XHR0b3VjaFBvc2l0aW9uLmluaXRpYWxYID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRYO1xuXHRcdFx0dG91Y2hQb3NpdGlvbi5pbml0aWFsWSA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WTtcblx0XHR9XG5cdH0sIHtwYXNzaXZlOiB0cnVlfSk7XG5cdGhlYWRlck5hdk1lbnUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgZnVuY3Rpb24oZSkge1xuXHRcdGlmIChoZWFkZXJOYXZCdG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdoZWFkZXItYmFyX19uYXYtYnV0dG9uLS1jdXN0b20tZm9jdXMnKSAmJiBoZWFkZXJOYXZNZW51LmNsYXNzTGlzdC5jb250YWlucygnaGVhZGVyLWJhcl9fbmF2LW1lbnUtLXZpc2libGUnKSAmJiB0b3VjaFBvc2l0aW9uLmluaXRpYWxYICE9PSBudWxsICYmIHRvdWNoUG9zaXRpb24uaW5pdGlhbFkgIT09IG51bGwpIHtcblx0XHRcdHRvdWNoUG9zaXRpb24uY3VycmVudFggPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFg7XG5cdFx0XHR0b3VjaFBvc2l0aW9uLmN1cnJlbnRZID0gZXZlbnQudG91Y2hlc1swXS5jbGllbnRZO1xuXHRcdFx0dG91Y2hQb3NpdGlvbi5kaWZmWCA9IHRvdWNoUG9zaXRpb24uaW5pdGlhbFggLSB0b3VjaFBvc2l0aW9uLmN1cnJlbnRYO1xuXHRcdFx0dG91Y2hQb3NpdGlvbi5kaWZmWSA9IHRvdWNoUG9zaXRpb24uaW5pdGlhbFkgLSB0b3VjaFBvc2l0aW9uLmN1cnJlbnRZO1xuXHRcdFx0aWYgKE1hdGguYWJzKHRvdWNoUG9zaXRpb24uZGlmZlgpID4gTWF0aC5hYnModG91Y2hQb3NpdGlvbi5kaWZmWSkpIHtcblx0XHRcdFx0aWYgKHRvdWNoUG9zaXRpb24uZGlmZlggPCAwKSB7XG5cdFx0XHRcdFx0Y2xvc2VIZWFkZXJOYXYoZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRvdWNoUG9zaXRpb24uaW5pdGlhbFggPSBudWxsO1xuXHRcdFx0dG91Y2hQb3NpdGlvbi5pbml0aWFsWSA9IG51bGw7XG5cdFx0fVxuXHR9LCB7cGFzc2l2ZTogdHJ1ZX0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQUk9HUkFNXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIEVuYWJsZSBDU1MgOmFjdGl2ZSBwc2V1ZG8tY2xhc3MgaW4gU2FmYXJpIE1vYmlsZVxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgZnVuY3Rpb24oKSB7fSxmYWxzZSk7XG5cbi8vIEhPTUUgTkFWSUdBVElPTiBESVNQTEFZIC8vXG5cbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24oKSB7XG5cdGN1cnZlTmF2TGlua3MoKTtcblx0c2V0TmF2SXRlbVRyYW5zbGF0aW9uUHJvcGVydHkoKTtcblx0c2V0TmF2R3JpZERpc3BsYXkoKTtcblx0ZWRpdE5hdkxpbmtzT25SZXNpemUoKTtcblx0d2F2ZU5hdkxpbmtzT25Ib3ZlcigpO1xufSk7XG5cbi8vIFZJREVPIFBMQVlFUlMgLy9cblxuc2V0VXBWaWRlb1BsYXllcnMoKTtcbnRvZ2dsZVZpZGVvc0Z1bGxTY3JlZW4oKTtcblxuLy8gSEVBREVSIEJBUiBBTklNQVRJT04gLy9cblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZnVuY3Rpb24oKSB7XG5cdHRvZ2dsZUhlYWRlckJhcigpO1xufSk7XG5cbi8vIE5BVklHQVRJT04gTUVOVSBBTklNQVRJT04gLy9cblxudG9nZ2xlSGVhZGVyTmF2T25DbGljaygpO1xuY2xvc2VIZWFkZXJOYXZPbkNsaWNrKCk7XG5vcGVuSGVhZGVyTmF2QmVmb3JlRm9jdXMoKTtcbmNsb3NlSGVhZGVyTmF2QWZ0ZXJGb2N1cygpO1xuY2xvc2VIZWFkZXJOYXZPblN3aXBlKCk7XG4iXSwibmFtZXMiOlsiUGx5ciIsIkNpcmNsZVR5cGUiLCJyb290IiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJuYXZFbCIsInF1ZXJ5U2VsZWN0b3IiLCJuYXZMaW5rcyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJuYXZJbWFnZSIsImNpcmNsZVR5cGVzIiwiZ2FsbGVyeVZpZGVvcyIsInZpZGVvUGxheWVycyIsImhlYWRlckJhciIsImhlYWRlckxvZ28iLCJzY3JvbGxPZmZzZXQiLCJoZWFkZXJOYXZCdG4iLCJoZWFkZXJOYXZNZW51IiwiaGVhZGVyTmF2TWVudUxpc3RFbHMiLCJoZWFkZXJOYXZPdmVybGF5IiwidG91Y2hQb3NpdGlvbiIsImluaXRpYWxYIiwiaW5pdGlhbFkiLCJjb252ZXJ0UmVtVG9QaXhlbHMiLCJyZW0iLCJmb250U2l6ZSIsInBhcnNlRmxvYXQiLCJ3aW5kb3ciLCJnZXRDb21wdXRlZFN0eWxlIiwiYm9keSIsImdldFByb3BlcnR5VmFsdWUiLCJjYWxjdWxhdGVOYXZHcmlkSW5uZXJXaWR0aCIsIm5hdkdyaWRHYXBQcm9wZXJ0eSIsIm5hdkdyaWRHYXAiLCJzbGljZSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIndpZHRoIiwiY2FsY3VsYXRlTmF2R3JpZElubmVyRGlhZ29uYWwiLCJNYXRoIiwic3FydCIsImN1cnZlTmF2TGlua3MiLCJsZW5ndGgiLCJpIiwicmFkaXVzIiwiZGlyIiwic2V0TmF2SXRlbVRyYW5zbGF0aW9uUHJvcGVydHkiLCJuYXZJdGVtVHJhbnNsYXRpb24iLCJzdHlsZSIsInNldFByb3BlcnR5Iiwic2V0TmF2R3JpZERpc3BsYXkiLCJjbGFzc0xpc3QiLCJhZGQiLCJlZGl0TmF2TGlua3NPblJlc2l6ZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJlIiwid2F2ZU5hdkxldHRlclVwIiwibmF2TGV0dGVyIiwicmVtb3ZlIiwid2F2ZU5hdkxldHRlckRvd24iLCJ3YXZlTmF2TGlua1VwIiwibmF2TGluayIsIm5hdkxpbmtMZXR0ZXJzIiwiYW5pbWF0aW9uRGVsYXkiLCJzZXRUaW1lb3V0Iiwid2F2ZU5hdkxpbmtEb3duIiwid2F2ZU5hdkxpbmtzT25Ib3ZlciIsInNldFVwVmlkZW9QbGF5ZXJzIiwic2V0dXAiLCJjb250cm9scyIsImkxOG4iLCJwbGF5IiwicGF1c2UiLCJzZWVrIiwiY3VycmVudFRpbWUiLCJkdXJhdGlvbiIsInZvbHVtZSIsIm11dGUiLCJ1bm11dGUiLCJlbnRlckZ1bGxzY3JlZW4iLCJleGl0RnVsbHNjcmVlbiIsInRvZ2dsZVZpZGVvc0Z1bGxTY3JlZW4iLCJvbiIsInRvZ2dsZUhlYWRlckJhciIsImhlYWRlckJhckhlaWdodCIsImhlaWdodCIsInBhZ2VZT2Zmc2V0IiwiY29udGFpbnMiLCJ0b2dnbGVIZWFkZXJOYXYiLCJ0b2dnbGUiLCJvcGVuSGVhZGVyTmF2IiwiY2xvc2VIZWFkZXJOYXYiLCJ0b2dnbGVIZWFkZXJOYXZPbkNsaWNrIiwiY2xvc2VIZWFkZXJOYXZPbkNsaWNrIiwidGFyZ2V0IiwiY2FuY2VsYWJsZSIsInByZXZlbnREZWZhdWx0Iiwib3BlbkhlYWRlck5hdkJlZm9yZUZvY3VzIiwiY2xvc2VIZWFkZXJOYXZBZnRlckZvY3VzIiwiY2xvc2VIZWFkZXJOYXZPblN3aXBlIiwiZXZlbnQiLCJ0b3VjaGVzIiwiY2xpZW50WCIsImNsaWVudFkiLCJwYXNzaXZlIiwiY3VycmVudFgiLCJjdXJyZW50WSIsImRpZmZYIiwiZGlmZlkiLCJhYnMiXSwic291cmNlUm9vdCI6IiJ9