/* Minification failed. Returning unminified contents.
(7844,47-48): run-time error JS1014: Invalid character: `
(7844,67-68): run-time error JS5008: Illegal assignment: =
(7844,85-86): run-time error JS1014: Invalid character: `
(7845,43-44): run-time error JS1195: Expected expression: >
(7867,22-23): run-time error JS1195: Expected expression: )
(7881,34-35): run-time error JS1195: Expected expression: >
(7882,17-18): run-time error JS1010: Expected identifier: [
(7882,48-49): run-time error JS1007: Expected ']': ;
(7892,10-11): run-time error JS1195: Expected expression: ,
(7892,14-15): run-time error JS1195: Expected expression: )
 */
/**
 * Created by dko on 7/14/2017.
 */

/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:"jQuery"+("3.3.1"+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==c.call(e))&&(!(t=i(e))||"function"==typeof(n=f.call(t,"constructor")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),"function"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function C(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",I="\\["+M+"*("+R+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+R+"))|)"+M+"*\\]",W=":("+R+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+I+")*)|.*)\\)|)",$=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),F=new RegExp("^"+M+"*,"+M+"*"),_=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),z=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),X=new RegExp(W),U=new RegExp("^"+R+"$"),V={ID:new RegExp("^#("+R+")"),CLASS:new RegExp("^\\.("+R+")"),TAG:new RegExp("^("+R+"|[*])"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+W),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},G=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Q=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,K=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ee=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},te=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ne=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},re=function(){p()},ie=me(function(e){return!0===e.disabled&&("form"in e||"label"in e)},{dir:"parentNode",next:"legend"});try{L.apply(A=H.call(w.childNodes),w.childNodes),A[w.childNodes.length].nodeType}catch(e){L={apply:A.length?function(e,t){q.apply(e,H.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function oe(e,t,r,i){var o,s,l,c,f,h,v,m=t&&t.ownerDocument,T=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==T&&9!==T&&11!==T)return r;if(!i&&((t?t.ownerDocument||t:w)!==d&&p(t),t=t||d,g)){if(11!==T&&(f=J.exec(e)))if(o=f[1]){if(9===T){if(!(l=t.getElementById(o)))return r;if(l.id===o)return r.push(l),r}else if(m&&(l=m.getElementById(o))&&x(t,l)&&l.id===o)return r.push(l),r}else{if(f[2])return L.apply(r,t.getElementsByTagName(e)),r;if((o=f[3])&&n.getElementsByClassName&&t.getElementsByClassName)return L.apply(r,t.getElementsByClassName(o)),r}if(n.qsa&&!S[e+" "]&&(!y||!y.test(e))){if(1!==T)m=t,v=e;else if("object"!==t.nodeName.toLowerCase()){(c=t.getAttribute("id"))?c=c.replace(te,ne):t.setAttribute("id",c=b),s=(h=a(e)).length;while(s--)h[s]="#"+c+" "+ve(h[s]);v=h.join(","),m=K.test(e)&&ge(t.parentNode)||t}if(v)try{return L.apply(r,m.querySelectorAll(v)),r}catch(e){}finally{c===b&&t.removeAttribute("id")}}}return u(e.replace(B,"$1"),t,r,i)}function ae(){var e=[];function t(n,i){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=i}return t}function se(e){return e[b]=!0,e}function ue(e){var t=d.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function le(e,t){var n=e.split("|"),i=n.length;while(i--)r.attrHandle[n[i]]=t}function ce(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function fe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function pe(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function de(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function he(e){return se(function(t){return t=+t,se(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function ge(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}n=oe.support={},o=oe.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},p=oe.setDocument=function(e){var t,i,a=e?e.ownerDocument||e:w;return a!==d&&9===a.nodeType&&a.documentElement?(d=a,h=d.documentElement,g=!o(d),w!==d&&(i=d.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",re,!1):i.attachEvent&&i.attachEvent("onunload",re)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(d.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=Q.test(d.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=b,!d.getElementsByName||!d.getElementsByName(b).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(Z,ee);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&g){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&g)return t.getElementsByClassName(e)},v=[],y=[],(n.qsa=Q.test(d.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="<a id='"+b+"'></a><select id='"+b+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+P+")"),e.querySelectorAll("[id~="+b+"-]").length||y.push("~="),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+b+"+*").length||y.push(".#.+[+~]")}),ue(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=d.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(n.matchesSelector=Q.test(m=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=m.call(e,"*"),m.call(e,"[s!='']:x"),v.push("!=",W)}),y=y.length&&new RegExp(y.join("|")),v=v.length&&new RegExp(v.join("|")),t=Q.test(h.compareDocumentPosition),x=t||Q.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return f=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===d||e.ownerDocument===w&&x(w,e)?-1:t===d||t.ownerDocument===w&&x(w,t)?1:c?O(c,e)-O(c,t):0:4&r?-1:1)}:function(e,t){if(e===t)return f=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===d?-1:t===d?1:i?-1:o?1:c?O(c,e)-O(c,t):0;if(i===o)return ce(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?ce(a[r],s[r]):a[r]===w?-1:s[r]===w?1:0},d):d},oe.matches=function(e,t){return oe(e,null,null,t)},oe.matchesSelector=function(e,t){if((e.ownerDocument||e)!==d&&p(e),t=t.replace(z,"='$1']"),n.matchesSelector&&g&&!S[t+" "]&&(!v||!v.test(t))&&(!y||!y.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return oe(t,d,null,[e]).length>0},oe.contains=function(e,t){return(e.ownerDocument||e)!==d&&p(e),x(e,t)},oe.attr=function(e,t){(e.ownerDocument||e)!==d&&p(e);var i=r.attrHandle[t.toLowerCase()],o=i&&N.call(r.attrHandle,t.toLowerCase())?i(e,t,!g):void 0;return void 0!==o?o:n.attributes||!g?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null},oe.escape=function(e){return(e+"").replace(te,ne)},oe.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},oe.uniqueSort=function(e){var t,r=[],i=0,o=0;if(f=!n.detectDuplicates,c=!n.sortStable&&e.slice(0),e.sort(D),f){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return c=null,e},i=oe.getText=function(e){var t,n="",r=0,o=e.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=i(e)}else if(3===o||4===o)return e.nodeValue}else while(t=e[r++])n+=i(t);return n},(r=oe.selectors={cacheLength:50,createPseudo:se,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Z,ee),e[3]=(e[3]||e[4]||e[5]||"").replace(Z,ee),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||oe.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&oe.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return V.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=a(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Z,ee).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=E[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&E(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=oe.attr(r,e);return null==i?"!="===t:!t||(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace($," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",y=t.parentNode,v=s&&t.nodeName.toLowerCase(),m=!u&&!s,x=!1;if(y){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===v:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?y.firstChild:y.lastChild],a&&m){x=(d=(l=(c=(f=(p=y)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1])&&l[2],p=d&&y.childNodes[d];while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if(1===p.nodeType&&++x&&p===t){c[e]=[T,d,x];break}}else if(m&&(x=d=(l=(c=(f=(p=t)[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]||[])[0]===T&&l[1]),!1===x)while(p=++d&&p&&p[g]||(x=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===v:1===p.nodeType)&&++x&&(m&&((c=(f=p[b]||(p[b]={}))[p.uniqueID]||(f[p.uniqueID]={}))[e]=[T,x]),p===t))break;return(x-=i)===r||x%r==0&&x/r>=0}}},PSEUDO:function(e,t){var n,i=r.pseudos[e]||r.setFilters[e.toLowerCase()]||oe.error("unsupported pseudo: "+e);return i[b]?i(t):i.length>1?(n=[e,e,"",t],r.setFilters.hasOwnProperty(e.toLowerCase())?se(function(e,n){var r,o=i(e,t),a=o.length;while(a--)e[r=O(e,o[a])]=!(n[r]=o[a])}):function(e){return i(e,0,n)}):i}},pseudos:{not:se(function(e){var t=[],n=[],r=s(e.replace(B,"$1"));return r[b]?se(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:se(function(e){return function(t){return oe(e,t).length>0}}),contains:se(function(e){return e=e.replace(Z,ee),function(t){return(t.textContent||t.innerText||i(t)).indexOf(e)>-1}}),lang:se(function(e){return U.test(e||"")||oe.error("unsupported lang: "+e),e=e.replace(Z,ee).toLowerCase(),function(t){var n;do{if(n=g?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===h},focus:function(e){return e===d.activeElement&&(!d.hasFocus||d.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:de(!1),disabled:de(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!r.pseudos.empty(e)},header:function(e){return Y.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:he(function(){return[0]}),last:he(function(e,t){return[t-1]}),eq:he(function(e,t,n){return[n<0?n+t:n]}),even:he(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:he(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:he(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:he(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=r.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})r.pseudos[t]=fe(t);for(t in{submit:!0,reset:!0})r.pseudos[t]=pe(t);function ye(){}ye.prototype=r.filters=r.pseudos,r.setFilters=new ye,a=oe.tokenize=function(e,t){var n,i,o,a,s,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=r.preFilter;while(s){n&&!(i=F.exec(s))||(i&&(s=s.slice(i[0].length)||s),u.push(o=[])),n=!1,(i=_.exec(s))&&(n=i.shift(),o.push({value:n,type:i[0].replace(B," ")}),s=s.slice(n.length));for(a in r.filter)!(i=V[a].exec(s))||l[a]&&!(i=l[a](i))||(n=i.shift(),o.push({value:n,type:a,matches:i}),s=s.slice(n.length));if(!n)break}return t?s.length:s?oe.error(e):k(e,u).slice(0)};function ve(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function me(e,t,n){var r=t.dir,i=t.next,o=i||r,a=n&&"parentNode"===o,s=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||a)return e(t,n,i);return!1}:function(t,n,u){var l,c,f,p=[T,s];if(u){while(t=t[r])if((1===t.nodeType||a)&&e(t,n,u))return!0}else while(t=t[r])if(1===t.nodeType||a)if(f=t[b]||(t[b]={}),c=f[t.uniqueID]||(f[t.uniqueID]={}),i&&i===t.nodeName.toLowerCase())t=t[r]||t;else{if((l=c[o])&&l[0]===T&&l[1]===s)return p[2]=l[2];if(c[o]=p,p[2]=e(t,n,u))return!0}return!1}}function xe(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function be(e,t,n){for(var r=0,i=t.length;r<i;r++)oe(e,t[r],n);return n}function we(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Te(e,t,n,r,i,o){return r&&!r[b]&&(r=Te(r)),i&&!i[b]&&(i=Te(i,o)),se(function(o,a,s,u){var l,c,f,p=[],d=[],h=a.length,g=o||be(t||"*",s.nodeType?[s]:s,[]),y=!e||!o&&t?g:we(g,p,e,s,u),v=n?i||(o?e:h||r)?[]:a:y;if(n&&n(y,v,s,u),r){l=we(v,d),r(l,[],s,u),c=l.length;while(c--)(f=l[c])&&(v[d[c]]=!(y[d[c]]=f))}if(o){if(i||e){if(i){l=[],c=v.length;while(c--)(f=v[c])&&l.push(y[c]=f);i(null,v=[],l,u)}c=v.length;while(c--)(f=v[c])&&(l=i?O(o,f):p[c])>-1&&(o[l]=!(a[l]=f))}}else v=we(v===a?v.splice(h,v.length):v),i?i(null,a,v,u):L.apply(a,v)})}function Ce(e){for(var t,n,i,o=e.length,a=r.relative[e[0].type],s=a||r.relative[" "],u=a?1:0,c=me(function(e){return e===t},s,!0),f=me(function(e){return O(t,e)>-1},s,!0),p=[function(e,n,r){var i=!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):f(e,n,r));return t=null,i}];u<o;u++)if(n=r.relative[e[u].type])p=[me(xe(p),n)];else{if((n=r.filter[e[u].type].apply(null,e[u].matches))[b]){for(i=++u;i<o;i++)if(r.relative[e[i].type])break;return Te(u>1&&xe(p),u>1&&ve(e.slice(0,u-1).concat({value:" "===e[u-2].type?"*":""})).replace(B,"$1"),n,u<i&&Ce(e.slice(u,i)),i<o&&Ce(e=e.slice(i)),i<o&&ve(e))}p.push(n)}return xe(p)}function Ee(e,t){var n=t.length>0,i=e.length>0,o=function(o,a,s,u,c){var f,h,y,v=0,m="0",x=o&&[],b=[],w=l,C=o||i&&r.find.TAG("*",c),E=T+=null==w?1:Math.random()||.1,k=C.length;for(c&&(l=a===d||a||c);m!==k&&null!=(f=C[m]);m++){if(i&&f){h=0,a||f.ownerDocument===d||(p(f),s=!g);while(y=e[h++])if(y(f,a||d,s)){u.push(f);break}c&&(T=E)}n&&((f=!y&&f)&&v--,o&&x.push(f))}if(v+=m,n&&m!==v){h=0;while(y=t[h++])y(x,b,a,s);if(o){if(v>0)while(m--)x[m]||b[m]||(b[m]=j.call(u));b=we(b)}L.apply(u,b),c&&!o&&b.length>0&&v+t.length>1&&oe.uniqueSort(u)}return c&&(T=E,l=w),x};return n?se(o):o}return s=oe.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=a(e)),n=t.length;while(n--)(o=Ce(t[n]))[b]?r.push(o):i.push(o);(o=S(e,Ee(i,r))).selector=e}return o},u=oe.select=function(e,t,n,i){var o,u,l,c,f,p="function"==typeof e&&e,d=!i&&a(e=p.selector||e);if(n=n||[],1===d.length){if((u=d[0]=d[0].slice(0)).length>2&&"ID"===(l=u[0]).type&&9===t.nodeType&&g&&r.relative[u[1].type]){if(!(t=(r.find.ID(l.matches[0].replace(Z,ee),t)||[])[0]))return n;p&&(t=t.parentNode),e=e.slice(u.shift().value.length)}o=V.needsContext.test(e)?0:u.length;while(o--){if(l=u[o],r.relative[c=l.type])break;if((f=r.find[c])&&(i=f(l.matches[0].replace(Z,ee),K.test(u[0].type)&&ge(t.parentNode)||t))){if(u.splice(o,1),!(e=i.length&&ve(u)))return L.apply(n,i),n;break}}}return(p||s(e,d))(i,t,!g,n,!t||K.test(e)&&ge(t.parentNode)||t),n},n.sortStable=b.split("").sort(D).join("")===b,n.detectDuplicates=!!f,p(),n.sortDetached=ue(function(e){return 1&e.compareDocumentPosition(d.createElement("fieldset"))}),ue(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||le("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ue(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||le("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ue(function(e){return null==e.getAttribute("disabled")})||le(P,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),oe}(e);w.find=E,w.expr=E.selectors,w.expr[":"]=w.expr.pseudos,w.uniqueSort=w.unique=E.uniqueSort,w.text=E.getText,w.isXMLDoc=E.isXML,w.contains=E.contains,w.escapeSelector=E.escape;var k=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&w(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},D=w.expr.match.needsContext;function N(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var A=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,t,n){return g(t)?w.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?w.grep(e,function(e){return e===t!==n}):"string"!=typeof t?w.grep(e,function(e){return u.call(t,e)>-1!==n}):w.filter(t,e,n)}w.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?w.find.matchesSelector(r,e)?[r]:[]:w.find.matches(e,w.grep(t,function(e){return 1===e.nodeType}))},w.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(w(e).filter(function(){for(t=0;t<r;t++)if(w.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)w.find(e,i[t],n);return r>1?w.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&D.test(e)?w(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(w.fn.init=function(e,t,n){var i,o;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(i="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:L.exec(e))||!i[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(i[1]){if(t=t instanceof w?t[0]:t,w.merge(this,w.parseHTML(i[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(i[1])&&w.isPlainObject(t))for(i in t)g(this[i])?this[i](t[i]):this.attr(i,t[i]);return this}return(o=r.getElementById(i[2]))&&(this[0]=o,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):g(e)?void 0!==n.ready?n.ready(e):e(w):w.makeArray(e,this)}).prototype=w.fn,q=w(r);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};w.fn.extend({has:function(e){var t=w(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(w.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&w(e);if(!D.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?a.index(n)>-1:1===n.nodeType&&w.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?w.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?u.call(w(e),this[0]):u.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(w.uniqueSort(w.merge(this.get(),w(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}w.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return k(e,"parentNode")},parentsUntil:function(e,t,n){return k(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return k(e,"nextSibling")},prevAll:function(e){return k(e,"previousSibling")},nextUntil:function(e,t,n){return k(e,"nextSibling",n)},prevUntil:function(e,t,n){return k(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return N(e,"iframe")?e.contentDocument:(N(e,"template")&&(e=e.content||e),w.merge([],e.childNodes))}},function(e,t){w.fn[e]=function(n,r){var i=w.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=w.filter(r,i)),this.length>1&&(O[e]||w.uniqueSort(i),H.test(e)&&i.reverse()),this.pushStack(i)}});var M=/[^\x20\t\r\n\f]+/g;function R(e){var t={};return w.each(e.match(M)||[],function(e,n){t[n]=!0}),t}w.Callbacks=function(e){e="string"==typeof e?R(e):w.extend({},e);var t,n,r,i,o=[],a=[],s=-1,u=function(){for(i=i||e.once,r=t=!0;a.length;s=-1){n=a.shift();while(++s<o.length)!1===o[s].apply(n[0],n[1])&&e.stopOnFalse&&(s=o.length,n=!1)}e.memory||(n=!1),t=!1,i&&(o=n?[]:"")},l={add:function(){return o&&(n&&!t&&(s=o.length-1,a.push(n)),function t(n){w.each(n,function(n,r){g(r)?e.unique&&l.has(r)||o.push(r):r&&r.length&&"string"!==x(r)&&t(r)})}(arguments),n&&!t&&u()),this},remove:function(){return w.each(arguments,function(e,t){var n;while((n=w.inArray(t,o,n))>-1)o.splice(n,1),n<=s&&s--}),this},has:function(e){return e?w.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=a=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=a=[],n||t||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=[e,(n=n||[]).slice?n.slice():n],a.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l};function I(e){return e}function W(e){throw e}function $(e,t,n,r){var i;try{e&&g(i=e.promise)?i.call(e).done(t).fail(n):e&&g(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}w.extend({Deferred:function(t){var n=[["notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once memory"),w.Callbacks("once memory"),0,"resolved"],["reject","fail",w.Callbacks("once memory"),w.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},"catch":function(e){return i.then(null,e)},pipe:function(){var e=arguments;return w.Deferred(function(t){w.each(n,function(n,r){var i=g(e[r[4]])&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&g(e.promise)?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t<o)){if((e=r.apply(s,u))===n.promise())throw new TypeError("Thenable self-resolution");l=e&&("object"==typeof e||"function"==typeof e)&&e.then,g(l)?i?l.call(e,a(o,n,I,i),a(o,n,W,i)):(o++,l.call(e,a(o,n,I,i),a(o,n,W,i),a(o,n,I,n.notifyWith))):(r!==I&&(s=void 0,u=[e]),(i||n.resolveWith)(s,u))}},c=i?l:function(){try{l()}catch(e){w.Deferred.exceptionHook&&w.Deferred.exceptionHook(e,c.stackTrace),t+1>=o&&(r!==W&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(w.Deferred.getStackHook&&(c.stackTrace=w.Deferred.getStackHook()),e.setTimeout(c))}}return w.Deferred(function(e){n[0][3].add(a(0,e,g(i)?i:I,e.notifyWith)),n[1][3].add(a(0,e,g(t)?t:I)),n[2][3].add(a(0,e,g(r)?r:W))}).promise()},promise:function(e){return null!=e?w.extend(e,i):i}},o={};return w.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),i=o.call(arguments),a=w.Deferred(),s=function(e){return function(n){r[e]=this,i[e]=arguments.length>1?o.call(arguments):n,--t||a.resolveWith(r,i)}};if(t<=1&&($(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||g(i[n]&&i[n].then)))return a.then();while(n--)$(i[n],s(n),a.reject);return a.promise()}});var B=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;w.Deferred.exceptionHook=function(t,n){e.console&&e.console.warn&&t&&B.test(t.name)&&e.console.warn("jQuery.Deferred exception: "+t.message,t.stack,n)},w.readyException=function(t){e.setTimeout(function(){throw t})};var F=w.Deferred();w.fn.ready=function(e){return F.then(e)["catch"](function(e){w.readyException(e)}),this},w.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--w.readyWait:w.isReady)||(w.isReady=!0,!0!==e&&--w.readyWait>0||F.resolveWith(r,[w]))}}),w.ready.then=F.then;function _(){r.removeEventListener("DOMContentLoaded",_),e.removeEventListener("load",_),w.ready()}"complete"===r.readyState||"loading"!==r.readyState&&!r.documentElement.doScroll?e.setTimeout(w.ready):(r.addEventListener("DOMContentLoaded",_),e.addEventListener("load",_));var z=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===x(n)){i=!0;for(s in n)z(e,t,s,n[s],!0,o,a)}else if(void 0!==r&&(i=!0,g(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(w(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},X=/^-ms-/,U=/-([a-z])/g;function V(e,t){return t.toUpperCase()}function G(e){return e.replace(X,"ms-").replace(U,V)}var Y=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Q(){this.expando=w.expando+Q.uid++}Q.uid=1,Q.prototype={cache:function(e){var t=e[this.expando];return t||(t={},Y(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[G(t)]=n;else for(r in t)i[G(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][G(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(G):(t=G(t))in r?[t]:t.match(M)||[]).length;while(n--)delete r[t[n]]}(void 0===t||w.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!w.isEmptyObject(t)}};var J=new Q,K=new Q,Z=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,ee=/[A-Z]/g;function te(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?+e:Z.test(e)?JSON.parse(e):e)}function ne(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(ee,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n=te(n)}catch(e){}K.set(e,t,n)}else n=void 0;return n}w.extend({hasData:function(e){return K.hasData(e)||J.hasData(e)},data:function(e,t,n){return K.access(e,t,n)},removeData:function(e,t){K.remove(e,t)},_data:function(e,t,n){return J.access(e,t,n)},_removeData:function(e,t){J.remove(e,t)}}),w.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=K.get(o),1===o.nodeType&&!J.get(o,"hasDataAttrs"))){n=a.length;while(n--)a[n]&&0===(r=a[n].name).indexOf("data-")&&(r=G(r.slice(5)),ne(o,r,i[r]));J.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof e?this.each(function(){K.set(this,e)}):z(this,function(t){var n;if(o&&void 0===t){if(void 0!==(n=K.get(o,e)))return n;if(void 0!==(n=ne(o,e)))return n}else this.each(function(){K.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){K.remove(this,e)})}}),w.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=J.get(e,t),n&&(!r||Array.isArray(n)?r=J.access(e,t,w.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=w.queue(e,t),r=n.length,i=n.shift(),o=w._queueHooks(e,t),a=function(){w.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return J.get(e,n)||J.access(e,n,{empty:w.Callbacks("once memory").add(function(){J.remove(e,[t+"queue",n])})})}}),w.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length<n?w.queue(this[0],e):void 0===t?this:this.each(function(){var n=w.queue(this,e,t);w._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&w.dequeue(this,e)})},dequeue:function(e){return this.each(function(){w.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=w.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=J.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var re=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ie=new RegExp("^(?:([+-])=|)("+re+")([a-z%]*)$","i"),oe=["Top","Right","Bottom","Left"],ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&w.contains(e.ownerDocument,e)&&"none"===w.css(e,"display")},se=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i};function ue(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return w.css(e,t,"")},u=s(),l=n&&n[3]||(w.cssNumber[t]?"":"px"),c=(w.cssNumber[t]||"px"!==l&&+u)&&ie.exec(w.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)w.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,w.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var le={};function ce(e){var t,n=e.ownerDocument,r=e.nodeName,i=le[r];return i||(t=n.body.appendChild(n.createElement(r)),i=w.css(t,"display"),t.parentNode.removeChild(t),"none"===i&&(i="block"),le[r]=i,i)}function fe(e,t){for(var n,r,i=[],o=0,a=e.length;o<a;o++)(r=e[o]).style&&(n=r.style.display,t?("none"===n&&(i[o]=J.get(r,"display")||null,i[o]||(r.style.display="")),""===r.style.display&&ae(r)&&(i[o]=ce(r))):"none"!==n&&(i[o]="none",J.set(r,"display",n)));for(o=0;o<a;o++)null!=i[o]&&(e[o].style.display=i[o]);return e}w.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?w(this).show():w(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&N(e,t)?w.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n<r;n++)J.set(e[n],"globalEval",!t||J.get(t[n],"globalEval"))}var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===x(o))w.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+w.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;w.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&w.inArray(o,r)>-1)i&&i.push(o);else if(l=w.contains(o.ownerDocument,o),a=ye(f.appendChild(o),"script"),l&&ve(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}!function(){var e=r.createDocumentFragment().appendChild(r.createElement("div")),t=r.createElement("input");t.setAttribute("type","radio"),t.setAttribute("checked","checked"),t.setAttribute("name","t"),e.appendChild(t),h.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,e.innerHTML="<textarea>x</textarea>",h.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var be=r.documentElement,we=/^key/,Te=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ce=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function ke(){return!1}function Se(){try{return r.activeElement}catch(e){}}function De(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)De(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=ke;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return w().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=w.guid++)),e.each(function(){w.event.add(this,t,i,r,n)})}w.event={global:{},add:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.get(e);if(y){n.handler&&(n=(o=n).handler,i=o.selector),i&&w.find.matchesSelector(be,i),n.guid||(n.guid=w.guid++),(u=y.events)||(u=y.events={}),(a=y.handle)||(a=y.handle=function(t){return"undefined"!=typeof w&&w.event.triggered!==t.type?w.event.dispatch.apply(e,arguments):void 0}),l=(t=(t||"").match(M)||[""]).length;while(l--)d=g=(s=Ce.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=w.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=w.event.special[d]||{},c=w.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&w.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(e,r,h,a)||e.addEventListener&&e.addEventListener(d,a)),f.add&&(f.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),w.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,y=J.hasData(e)&&J.get(e);if(y&&(u=y.events)){l=(t=(t||"").match(M)||[""]).length;while(l--)if(s=Ce.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){f=w.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,y.handle)||w.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)w.event.remove(e,d+t[l],n,r,!0);w.isEmptyObject(u)&&J.remove(e,"handle events")}},dispatch:function(e){var t=w.event.fix(e),n,r,i,o,a,s,u=new Array(arguments.length),l=(J.get(this,"events")||{})[t.type]||[],c=w.event.special[t.type]||{};for(u[0]=t,n=1;n<arguments.length;n++)u[n]=arguments[n];if(t.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,t)){s=w.event.handlers.call(this,t,l),n=0;while((o=s[n++])&&!t.isPropagationStopped()){t.currentTarget=o.elem,r=0;while((a=o.handlers[r++])&&!t.isImmediatePropagationStopped())t.rnamespace&&!t.rnamespace.test(a.namespace)||(t.handleObj=a,t.data=a.data,void 0!==(i=((w.event.special[a.origType]||{}).handle||a.handler).apply(o.elem,u))&&!1===(t.result=i)&&(t.preventDefault(),t.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,t),t.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&e.button>=1))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?w(i,this).index(l)>-1:w.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(e,t){Object.defineProperty(w.Event.prototype,e,{enumerable:!0,configurable:!0,get:g(t)?function(){if(this.originalEvent)return t(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[e]},set:function(t){Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:t})}})},fix:function(e){return e[w.expando]?e:new w.Event(e)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==Se()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===Se()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&N(this,"input"))return this.click(),!1},_default:function(e){return N(e.target,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},w.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},w.Event=function(e,t){if(!(this instanceof w.Event))return new w.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ee:ke,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&w.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[w.expando]=!0},w.Event.prototype={constructor:w.Event,isDefaultPrevented:ke,isPropagationStopped:ke,isImmediatePropagationStopped:ke,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ee,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ee,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ee,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},w.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&we.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Te.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},w.event.addProp),w.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,t){w.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return i&&(i===r||w.contains(r,i))||(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),w.fn.extend({on:function(e,t,n,r){return De(this,e,t,n,r)},one:function(e,t,n,r){return De(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,w(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=ke),this.each(function(){w.event.remove(this,e,n,t)})}});var Ne=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,Ae=/<script|<style|<link/i,je=/checked\s*(?:[^=]|=\s*.checked.)/i,qe=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Le(e,t){return N(e,"table")&&N(11!==t.nodeType?t:t.firstChild,"tr")?w(e).children("tbody")[0]||e:e}function He(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Oe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Pe(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(J.hasData(e)&&(o=J.access(e),a=J.set(t,o),l=o.events)){delete a.handle,a.events={};for(i in l)for(n=0,r=l[i].length;n<r;n++)w.event.add(t,i,l[i][n])}K.hasData(e)&&(s=K.access(e),u=w.extend({},s),K.set(t,u))}}function Me(e,t){var n=t.nodeName.toLowerCase();"input"===n&&pe.test(e.type)?t.checked=e.checked:"input"!==n&&"textarea"!==n||(t.defaultValue=e.defaultValue)}function Re(e,t,n,r){t=a.apply([],t);var i,o,s,u,l,c,f=0,p=e.length,d=p-1,y=t[0],v=g(y);if(v||p>1&&"string"==typeof y&&!h.checkClone&&je.test(y))return e.each(function(i){var o=e.eq(i);v&&(t[0]=y.call(this,i,o.html())),Re(o,t,n,r)});if(p&&(i=xe(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(u=(s=w.map(ye(i,"script"),He)).length;f<p;f++)l=i,f!==d&&(l=w.clone(l,!0,!0),u&&w.merge(s,ye(l,"script"))),n.call(e[f],l,f);if(u)for(c=s[s.length-1].ownerDocument,w.map(s,Oe),f=0;f<u;f++)l=s[f],he.test(l.type||"")&&!J.access(l,"globalEval")&&w.contains(c,l)&&(l.src&&"module"!==(l.type||"").toLowerCase()?w._evalUrl&&w._evalUrl(l.src):m(l.textContent.replace(qe,""),c,l))}return e}function Ie(e,t,n){for(var r,i=t?w.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||w.cleanData(ye(r)),r.parentNode&&(n&&w.contains(r.ownerDocument,r)&&ve(ye(r,"script")),r.parentNode.removeChild(r));return e}w.extend({htmlPrefilter:function(e){return e.replace(Ne,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),u=w.contains(e.ownerDocument,e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||w.isXMLDoc(e)))for(a=ye(s),r=0,i=(o=ye(e)).length;r<i;r++)Me(o[r],a[r]);if(t)if(n)for(o=o||ye(e),a=a||ye(s),r=0,i=o.length;r<i;r++)Pe(o[r],a[r]);else Pe(e,s);return(a=ye(s,"script")).length>0&&ve(a,!u&&ye(e,"script")),s},cleanData:function(e){for(var t,n,r,i=w.event.special,o=0;void 0!==(n=e[o]);o++)if(Y(n)){if(t=n[J.expando]){if(t.events)for(r in t.events)i[r]?w.event.remove(n,r):w.removeEvent(n,r,t.handle);n[J.expando]=void 0}n[K.expando]&&(n[K.expando]=void 0)}}}),w.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return z(this,function(e){return void 0===e?w.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Re(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Re(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Re(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(w.cleanData(ye(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return w.clone(this,e,t)})},html:function(e){return z(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ae.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=w.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(w.cleanData(ye(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=[];return Re(this,arguments,function(t){var n=this.parentNode;w.inArray(this,e)<0&&(w.cleanData(ye(this)),n&&n.replaceChild(t,this))},e)}}),w.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){w.fn[e]=function(e){for(var n,r=[],i=w(e),o=i.length-1,a=0;a<=o;a++)n=a===o?this:this.clone(!0),w(i[a])[t](n),s.apply(r,n.get());return this.pushStack(r)}});var We=new RegExp("^("+re+")(?!px)[a-z%]+$","i"),$e=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},Be=new RegExp(oe.join("|"),"i");!function(){function t(){if(c){l.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",c.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",be.appendChild(l).appendChild(c);var t=e.getComputedStyle(c);i="1%"!==t.top,u=12===n(t.marginLeft),c.style.right="60%",s=36===n(t.right),o=36===n(t.width),c.style.position="absolute",a=36===c.offsetWidth||"absolute",be.removeChild(l),c=null}}function n(e){return Math.round(parseFloat(e))}var i,o,a,s,u,l=r.createElement("div"),c=r.createElement("div");c.style&&(c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",h.clearCloneStyle="content-box"===c.style.backgroundClip,w.extend(h,{boxSizingReliable:function(){return t(),o},pixelBoxStyles:function(){return t(),s},pixelPosition:function(){return t(),i},reliableMarginLeft:function(){return t(),u},scrollboxSize:function(){return t(),a}}))}();function Fe(e,t,n){var r,i,o,a,s=e.style;return(n=n||$e(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||w.contains(e.ownerDocument,e)||(a=w.style(e,t)),!h.pixelBoxStyles()&&We.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function _e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}var ze=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ue={position:"absolute",visibility:"hidden",display:"block"},Ve={letterSpacing:"0",fontWeight:"400"},Ge=["Webkit","Moz","ms"],Ye=r.createElement("div").style;function Qe(e){if(e in Ye)return e;var t=e[0].toUpperCase()+e.slice(1),n=Ge.length;while(n--)if((e=Ge[n]+t)in Ye)return e}function Je(e){var t=w.cssProps[e];return t||(t=w.cssProps[e]=Qe(e)||e),t}function Ke(e,t,n){var r=ie.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ze(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=w.css(e,n+oe[a],!0,i)),r?("content"===n&&(u-=w.css(e,"padding"+oe[a],!0,i)),"margin"!==n&&(u-=w.css(e,"border"+oe[a]+"Width",!0,i))):(u+=w.css(e,"padding"+oe[a],!0,i),"padding"!==n?u+=w.css(e,"border"+oe[a]+"Width",!0,i):s+=w.css(e,"border"+oe[a]+"Width",!0,i));return!r&&o>=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))),u}function et(e,t,n){var r=$e(e),i=Fe(e,t,r),o="border-box"===w.css(e,"boxSizing",!1,r),a=o;if(We.test(i)){if(!n)return i;i="auto"}return a=a&&(h.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===w.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Ze(e,t,n||(o?"border":"content"),a,r,i)+"px"}w.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Fe(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=G(t),u=Xe.test(t),l=e.style;if(u||(t=Je(s)),a=w.cssHooks[t]||w.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"==(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=ue(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(w.cssNumber[s]?"":"px")),h.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=G(t);return Xe.test(t)||(t=Je(s)),(a=w.cssHooks[t]||w.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Fe(e,t,r)),"normal"===i&&t in Ve&&(i=Ve[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),w.each(["height","width"],function(e,t){w.cssHooks[t]={get:function(e,n,r){if(n)return!ze.test(w.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?et(e,t,r):se(e,Ue,function(){return et(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===w.css(e,"boxSizing",!1,o),s=r&&Ze(e,t,r,a,o);return a&&h.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Ze(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=w.css(e,t)),Ke(e,n,s)}}}),w.cssHooks.marginLeft=_e(h.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Fe(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),w.each({margin:"",padding:"",border:"Width"},function(e,t){w.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(w.cssHooks[e+t].set=Ke)}),w.fn.extend({css:function(e,t){return z(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a<i;a++)o[t[a]]=w.css(e,t[a],!1,r);return o}return void 0!==n?w.style(e,t,n):w.css(e,t)},e,t,arguments.length>1)}});function tt(e,t,n,r,i){return new tt.prototype.init(e,t,n,r,i)}w.Tween=tt,tt.prototype={constructor:tt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||w.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(w.cssNumber[n]?"":"px")},cur:function(){var e=tt.propHooks[this.prop];return e&&e.get?e.get(this):tt.propHooks._default.get(this)},run:function(e){var t,n=tt.propHooks[this.prop];return this.options.duration?this.pos=t=w.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tt.propHooks._default.set(this),this}},tt.prototype.init.prototype=tt.prototype,tt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=w.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){w.fx.step[e.prop]?w.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[w.cssProps[e.prop]]&&!w.cssHooks[e.prop]?e.elem[e.prop]=e.now:w.style(e.elem,e.prop,e.now+e.unit)}}},tt.propHooks.scrollTop=tt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},w.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},w.fx=tt.prototype.init,w.fx.step={};var nt,rt,it=/^(?:toggle|show|hide)$/,ot=/queueHooks$/;function at(){rt&&(!1===r.hidden&&e.requestAnimationFrame?e.requestAnimationFrame(at):e.setTimeout(at,w.fx.interval),w.fx.tick())}function st(){return e.setTimeout(function(){nt=void 0}),nt=Date.now()}function ut(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(pt.tweeners[t]||[]).concat(pt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ct(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),y=J.get(e,"fxshow");n.queue||(null==(a=w._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,w.queue(e,"fx").length||a.empty.fire()})}));for(r in t)if(i=t[r],it.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!y||void 0===y[r])continue;g=!0}d[r]=y&&y[r]||w.style(e,r)}if((u=!w.isEmptyObject(t))||!w.isEmptyObject(d)){f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=y&&y.display)&&(l=J.get(e,"display")),"none"===(c=w.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=w.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===w.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1;for(r in d)u||(y?"hidden"in y&&(g=y.hidden):y=J.access(e,"fxshow",{display:l}),o&&(y.hidden=!g),g&&fe([e],!0),p.done(function(){g||fe([e]),J.remove(e,"fxshow");for(r in d)w.style(e,r,d[r])})),u=lt(g?y[r]:0,r,p),r in y||(y[r]=u.start,g&&(u.end=u.start,u.start=0))}}function ft(e,t){var n,r,i,o,a;for(n in e)if(r=G(n),i=t[r],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=w.cssHooks[r])&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function pt(e,t,n){var r,i,o=0,a=pt.prefilters.length,s=w.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=nt||st(),n=Math.max(0,l.startTime+l.duration-t),r=1-(n/l.duration||0),o=0,a=l.tweens.length;o<a;o++)l.tweens[o].run(r);return s.notifyWith(e,[l,r,n]),r<1&&a?n:(a||s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:w.extend({},t),opts:w.extend(!0,{specialEasing:{},easing:w.easing._default},n),originalProperties:t,originalOptions:n,startTime:nt||st(),duration:n.duration,tweens:[],createTween:function(t,n){var r=w.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;n<r;n++)l.tweens[n].run(1);return t?(s.notifyWith(e,[l,1,0]),s.resolveWith(e,[l,t])):s.rejectWith(e,[l,t]),this}}),c=l.props;for(ft(c,l.opts.specialEasing);o<a;o++)if(r=pt.prefilters[o].call(l,e,c,l.opts))return g(r.stop)&&(w._queueHooks(l.elem,l.opts.queue).stop=r.stop.bind(r)),r;return w.map(c,lt,l),g(l.opts.start)&&l.opts.start.call(e,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),w.fx.timer(w.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l}w.Animation=w.extend(pt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return ue(n.elem,e,ie.exec(t),n),n}]},tweener:function(e,t){g(e)?(t=e,e=["*"]):e=e.match(M);for(var n,r=0,i=e.length;r<i;r++)n=e[r],pt.tweeners[n]=pt.tweeners[n]||[],pt.tweeners[n].unshift(t)},prefilters:[ct],prefilter:function(e,t){t?pt.prefilters.unshift(e):pt.prefilters.push(e)}}),w.speed=function(e,t,n){var r=e&&"object"==typeof e?w.extend({},e):{complete:n||!n&&t||g(e)&&e,duration:e,easing:n&&t||t&&!g(t)&&t};return w.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in w.fx.speeds?r.duration=w.fx.speeds[r.duration]:r.duration=w.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){g(r.old)&&r.old.call(this),r.queue&&w.dequeue(this,r.queue)},r},w.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=w.isEmptyObject(e),o=w.speed(t,n,r),a=function(){var t=pt(this,w.extend({},e),o);(i||J.get(this,"finish"))&&t.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(e,t,n){var r=function(e){var t=e.stop;delete e.stop,t(n)};return"string"!=typeof e&&(n=t,t=e,e=void 0),t&&!1!==e&&this.queue(e||"fx",[]),this.each(function(){var t=!0,i=null!=e&&e+"queueHooks",o=w.timers,a=J.get(this);if(i)a[i]&&a[i].stop&&r(a[i]);else for(i in a)a[i]&&a[i].stop&&ot.test(i)&&r(a[i]);for(i=o.length;i--;)o[i].elem!==this||null!=e&&o[i].queue!==e||(o[i].anim.stop(n),t=!1,o.splice(i,1));!t&&n||w.dequeue(this,e)})},finish:function(e){return!1!==e&&(e=e||"fx"),this.each(function(){var t,n=J.get(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=w.timers,a=r?r.length:0;for(n.finish=!0,w.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;t<a;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),w.each(["toggle","show","hide"],function(e,t){var n=w.fn[t];w.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ut(t,!0),e,r,i)}}),w.each({slideDown:ut("show"),slideUp:ut("hide"),slideToggle:ut("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){w.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),w.timers=[],w.fx.tick=function(){var e,t=0,n=w.timers;for(nt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||w.fx.stop(),nt=void 0},w.fx.timer=function(e){w.timers.push(e),w.fx.start()},w.fx.interval=13,w.fx.start=function(){rt||(rt=!0,at())},w.fx.stop=function(){rt=null},w.fx.speeds={slow:600,fast:200,_default:400},w.fn.delay=function(t,n){return t=w.fx?w.fx.speeds[t]||t:t,n=n||"fx",this.queue(n,function(n,r){var i=e.setTimeout(n,t);r.stop=function(){e.clearTimeout(i)}})},function(){var e=r.createElement("input"),t=r.createElement("select").appendChild(r.createElement("option"));e.type="checkbox",h.checkOn=""!==e.value,h.optSelected=t.selected,(e=r.createElement("input")).value="t",e.type="radio",h.radioValue="t"===e.value}();var dt,ht=w.expr.attrHandle;w.fn.extend({attr:function(e,t){return z(this,w.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){w.removeAttr(this,e)})}}),w.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?w.prop(e,t,n):(1===o&&w.isXMLDoc(e)||(i=w.attrHooks[t.toLowerCase()]||(w.expr.match.bool.test(t)?dt:void 0)),void 0!==n?null===n?void w.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=w.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!h.radioValue&&"radio"===t&&N(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(M);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),dt={set:function(e,t,n){return!1===t?w.removeAttr(e,n):e.setAttribute(n,n),n}},w.each(w.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||w.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var gt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;w.fn.extend({prop:function(e,t){return z(this,w.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[w.propFix[e]||e]})}}),w.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&w.isXMLDoc(e)||(t=w.propFix[t]||t,i=w.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=w.find.attr(e,"tabindex");return t?parseInt(t,10):gt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),h.optSelected||(w.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),w.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){w.propFix[this.toLowerCase()]=this});function vt(e){return(e.match(M)||[]).join(" ")}function mt(e){return e.getAttribute&&e.getAttribute("class")||""}function xt(e){return Array.isArray(e)?e:"string"==typeof e?e.match(M)||[]:[]}w.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).addClass(e.call(this,t,mt(this)))});if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(g(e))return this.each(function(t){w(this).removeClass(e.call(this,t,mt(this)))});if(!arguments.length)return this.attr("class","");if((t=xt(e)).length)while(n=this[u++])if(i=mt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=t[a++])while(r.indexOf(" "+o+" ")>-1)r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):g(e)?this.each(function(n){w(this).toggleClass(e.call(this,n,mt(this),t),t)}):this.each(function(){var t,i,o,a;if(r){i=0,o=w(this),a=xt(e);while(t=a[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else void 0!==e&&"boolean"!==n||((t=mt(this))&&J.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":J.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&(" "+vt(mt(n))+" ").indexOf(t)>-1)return!0;return!1}});var bt=/\r/g;w.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=g(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,w(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=w.map(i,function(e){return null==e?"":e+""})),(t=w.valHooks[this.type]||w.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=w.valHooks[i.type]||w.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(bt,""):null==n?"":n}}}),w.extend({valHooks:{option:{get:function(e){var t=w.find.attr(e,"value");return null!=t?t:vt(w.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!N(n.parentNode,"optgroup"))){if(t=w(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=w.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=w.inArray(w.valHooks.option.get(r),o)>-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),w.each(["radio","checkbox"],function(){w.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=w.inArray(w(e).val(),t)>-1}},h.checkOn||(w.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),h.focusin="onfocusin"in e;var wt=/^(?:focusinfocus|focusoutblur)$/,Tt=function(e){e.stopPropagation()};w.extend(w.event,{trigger:function(t,n,i,o){var a,s,u,l,c,p,d,h,v=[i||r],m=f.call(t,"type")?t.type:t,x=f.call(t,"namespace")?t.namespace.split("."):[];if(s=h=u=i=i||r,3!==i.nodeType&&8!==i.nodeType&&!wt.test(m+w.event.triggered)&&(m.indexOf(".")>-1&&(m=(x=m.split(".")).shift(),x.sort()),c=m.indexOf(":")<0&&"on"+m,t=t[w.expando]?t:new w.Event(m,"object"==typeof t&&t),t.isTrigger=o?2:3,t.namespace=x.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+x.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=i),n=null==n?[t]:w.makeArray(n,[t]),d=w.event.special[m]||{},o||!d.trigger||!1!==d.trigger.apply(i,n))){if(!o&&!d.noBubble&&!y(i)){for(l=d.delegateType||m,wt.test(l+m)||(s=s.parentNode);s;s=s.parentNode)v.push(s),u=s;u===(i.ownerDocument||r)&&v.push(u.defaultView||u.parentWindow||e)}a=0;while((s=v[a++])&&!t.isPropagationStopped())h=s,t.type=a>1?l:d.bindType||m,(p=(J.get(s,"events")||{})[t.type]&&J.get(s,"handle"))&&p.apply(s,n),(p=c&&s[c])&&p.apply&&Y(s)&&(t.result=p.apply(s,n),!1===t.result&&t.preventDefault());return t.type=m,o||t.isDefaultPrevented()||d._default&&!1!==d._default.apply(v.pop(),n)||!Y(i)||c&&g(i[m])&&!y(i)&&((u=i[c])&&(i[c]=null),w.event.triggered=m,t.isPropagationStopped()&&h.addEventListener(m,Tt),i[m](),t.isPropagationStopped()&&h.removeEventListener(m,Tt),w.event.triggered=void 0,u&&(i[c]=u)),t.result}},simulate:function(e,t,n){var r=w.extend(new w.Event,n,{type:e,isSimulated:!0});w.event.trigger(r,null,t)}}),w.fn.extend({trigger:function(e,t){return this.each(function(){w.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return w.event.trigger(e,t,n,!0)}}),h.focusin||w.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){w.event.simulate(t,e.target,w.event.fix(e))};w.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=J.access(r,t);i||r.addEventListener(e,n,!0),J.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=J.access(r,t)-1;i?J.access(r,t,i):(r.removeEventListener(e,n,!0),J.remove(r,t))}}});var Ct=e.location,Et=Date.now(),kt=/\?/;w.parseXML=function(t){var n;if(!t||"string"!=typeof t)return null;try{n=(new e.DOMParser).parseFromString(t,"text/xml")}catch(e){n=void 0}return n&&!n.getElementsByTagName("parsererror").length||w.error("Invalid XML: "+t),n};var St=/\[\]$/,Dt=/\r?\n/g,Nt=/^(?:submit|button|image|reset|file)$/i,At=/^(?:input|select|textarea|keygen)/i;function jt(e,t,n,r){var i;if(Array.isArray(t))w.each(t,function(t,i){n||St.test(e)?r(e,i):jt(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==x(t))r(e,t);else for(i in t)jt(e+"["+i+"]",t[i],n,r)}w.param=function(e,t){var n,r=[],i=function(e,t){var n=g(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!w.isPlainObject(e))w.each(e,function(){i(this.name,this.value)});else for(n in e)jt(n,e[n],t,i);return r.join("&")},w.fn.extend({serialize:function(){return w.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=w.prop(this,"elements");return e?w.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!w(this).is(":disabled")&&At.test(this.nodeName)&&!Nt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=w(this).val();return null==n?null:Array.isArray(n)?w.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}});var qt=/%20/g,Lt=/#.*$/,Ht=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Pt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Mt=/^(?:GET|HEAD)$/,Rt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Bt=r.createElement("a");Bt.href=Ct.href;function Ft(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(M)||[];if(g(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function _t(e,t,n,r){var i={},o=e===Wt;function a(s){var u;return i[s]=!0,w.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function zt(e,t){var n,r,i=w.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&w.extend(!0,e,r),e}function Xt(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}function Ut(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}w.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ct.href,type:"GET",isLocal:Pt.test(Ct.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":w.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,w.ajaxSettings),t):zt(w.ajaxSettings,e)},ajaxPrefilter:Ft(It),ajaxTransport:Ft(Wt),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,p,d,h=w.ajaxSetup({},n),g=h.context||h,y=h.context&&(g.nodeType||g.jquery)?w(g):w.event,v=w.Deferred(),m=w.Callbacks("once memory"),x=h.statusCode||{},b={},T={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s){s={};while(t=Ot.exec(a))s[t[1].toLowerCase()]=t[2]}t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?a:null},setRequestHeader:function(e,t){return null==c&&(e=T[e.toLowerCase()]=T[e.toLowerCase()]||e,b[e]=t),this},overrideMimeType:function(e){return null==c&&(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return i&&i.abort(t),k(0,t),this}};if(v.promise(E),h.url=((t||h.url||Ct.href)+"").replace(Rt,Ct.protocol+"//"),h.type=n.method||n.type||h.method||h.type,h.dataTypes=(h.dataType||"*").toLowerCase().match(M)||[""],null==h.crossDomain){l=r.createElement("a");try{l.href=h.url,l.href=l.href,h.crossDomain=Bt.protocol+"//"+Bt.host!=l.protocol+"//"+l.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=w.param(h.data,h.traditional)),_t(It,h,n,E),c)return E;(f=w.event&&h.global)&&0==w.active++&&w.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Mt.test(h.type),o=h.url.replace(Lt,""),h.hasContent?h.data&&h.processData&&0===(h.contentType||"").indexOf("application/x-www-form-urlencoded")&&(h.data=h.data.replace(qt,"+")):(d=h.url.slice(o.length),h.data&&(h.processData||"string"==typeof h.data)&&(o+=(kt.test(o)?"&":"?")+h.data,delete h.data),!1===h.cache&&(o=o.replace(Ht,"$1"),d=(kt.test(o)?"&":"?")+"_="+Et+++d),h.url=o+d),h.ifModified&&(w.lastModified[o]&&E.setRequestHeader("If-Modified-Since",w.lastModified[o]),w.etag[o]&&E.setRequestHeader("If-None-Match",w.etag[o])),(h.data&&h.hasContent&&!1!==h.contentType||n.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+$t+"; q=0.01":""):h.accepts["*"]);for(p in h.headers)E.setRequestHeader(p,h.headers[p]);if(h.beforeSend&&(!1===h.beforeSend.call(g,E,h)||c))return E.abort();if(C="abort",m.add(h.complete),E.done(h.success),E.fail(h.error),i=_t(Wt,h,n,E)){if(E.readyState=1,f&&y.trigger("ajaxSend",[E,h]),c)return E;h.async&&h.timeout>0&&(u=e.setTimeout(function(){E.abort("timeout")},h.timeout));try{c=!1,i.send(b,k)}catch(e){if(c)throw e;k(-1,e)}}else k(-1,"No Transport");function k(t,n,r,s){var l,p,d,b,T,C=n;c||(c=!0,u&&e.clearTimeout(u),i=void 0,a=s||"",E.readyState=t>0?4:0,l=t>=200&&t<300||304===t,r&&(b=Xt(h,E,r)),b=Ut(h,b,E,l),l?(h.ifModified&&((T=E.getResponseHeader("Last-Modified"))&&(w.lastModified[o]=T),(T=E.getResponseHeader("etag"))&&(w.etag[o]=T)),204===t||"HEAD"===h.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,l=!(d=b.error))):(d=C,!t&&C||(C="error",t<0&&(t=0))),E.status=t,E.statusText=(n||C)+"",l?v.resolveWith(g,[p,C,E]):v.rejectWith(g,[E,C,d]),E.statusCode(x),x=void 0,f&&y.trigger(l?"ajaxSuccess":"ajaxError",[E,h,l?p:d]),m.fireWith(g,[E,C]),f&&(y.trigger("ajaxComplete",[E,h]),--w.active||w.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return w.get(e,t,n,"json")},getScript:function(e,t){return w.get(e,void 0,t,"script")}}),w.each(["get","post"],function(e,t){w[t]=function(e,n,r,i){return g(n)&&(i=i||r,r=n,n=void 0),w.ajax(w.extend({url:e,type:t,dataType:i,data:n,success:r},w.isPlainObject(e)&&e))}}),w._evalUrl=function(e){return w.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},w.fn.extend({wrapAll:function(e){var t;return this[0]&&(g(e)&&(e=e.call(this[0])),t=w(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return g(e)?this.each(function(t){w(this).wrapInner(e.call(this,t))}):this.each(function(){var t=w(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=g(e);return this.each(function(n){w(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){w(this).replaceWith(this.childNodes)}),this}}),w.expr.pseudos.hidden=function(e){return!w.expr.pseudos.visible(e)},w.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},w.ajaxSettings.xhr=function(){try{return new e.XMLHttpRequest}catch(e){}};var Vt={0:200,1223:204},Gt=w.ajaxSettings.xhr();h.cors=!!Gt&&"withCredentials"in Gt,h.ajax=Gt=!!Gt,w.ajaxTransport(function(t){var n,r;if(h.cors||Gt&&!t.crossDomain)return{send:function(i,o){var a,s=t.xhr();if(s.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(a in t.xhrFields)s[a]=t.xhrFields[a];t.mimeType&&s.overrideMimeType&&s.overrideMimeType(t.mimeType),t.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(a in i)s.setRequestHeader(a,i[a]);n=function(e){return function(){n&&(n=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Vt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=n(),r=s.onerror=s.ontimeout=n("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&e.setTimeout(function(){n&&r()})},n=n("abort");try{s.send(t.hasContent&&t.data||null)}catch(e){if(n)throw e}},abort:function(){n&&n()}}}),w.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),w.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return w.globalEval(e),e}}}),w.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),w.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(i,o){t=w("<script>").prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&o("error"===e.type?404:200,e.type)}),r.head.appendChild(t[0])},abort:function(){n&&n()}}}});var Yt=[],Qt=/(=)\?(?=&|$)|\?\?/;w.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Yt.pop()||w.expando+"_"+Et++;return this[e]=!0,e}}),w.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=!1!==t.jsonp&&(Qt.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Qt.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=g(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Qt,"$1"+i):!1!==t.jsonp&&(t.url+=(kt.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||w.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?w(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,Yt.push(i)),a&&g(o)&&o(a[0]),a=o=void 0}),"script"}),h.createHTMLDocument=function(){var e=r.implementation.createHTMLDocument("").body;return e.innerHTML="<form></form><form></form>",2===e.childNodes.length}(),w.parseHTML=function(e,t,n){if("string"!=typeof e)return[];"boolean"==typeof t&&(n=t,t=!1);var i,o,a;return t||(h.createHTMLDocument?((i=(t=r.implementation.createHTMLDocument("")).createElement("base")).href=r.location.href,t.head.appendChild(i)):t=r),o=A.exec(e),a=!n&&[],o?[t.createElement(o[1])]:(o=xe([e],t,a),a&&a.length&&w(a).remove(),w.merge([],o.childNodes))},w.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=vt(e.slice(s)),e=e.slice(0,s)),g(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&w.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?w("<div>").append(w.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},w.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){w.fn[t]=function(e){return this.on(t,e)}}),w.expr.pseudos.animated=function(e){return w.grep(w.timers,function(t){return e===t.elem}).length},w.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=w.css(e,"position"),f=w(e),p={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=w.css(e,"top"),u=w.css(e,"left"),(l=("absolute"===c||"fixed"===c)&&(o+u).indexOf("auto")>-1)?(a=(r=f.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),g(t)&&(t=t.call(e,n,w.extend({},s))),null!=t.top&&(p.top=t.top-s.top+a),null!=t.left&&(p.left=t.left-s.left+i),"using"in t?t.using.call(e,p):f.css(p)}},w.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){w.offset.setOffset(this,e,t)});var t,n,r=this[0];if(r)return r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===w.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===w.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=w(e).offset()).top+=w.css(e,"borderTopWidth",!0),i.left+=w.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-w.css(r,"marginTop",!0),left:t.left-i.left-w.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===w.css(e,"position"))e=e.offsetParent;return e||be})}}),w.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;w.fn[e]=function(r){return z(this,function(e,r,i){var o;if(y(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===i)return o?o[t]:e[r];o?o.scrollTo(n?o.pageXOffset:i,n?i:o.pageYOffset):e[r]=i},e,r,arguments.length)}}),w.each(["top","left"],function(e,t){w.cssHooks[t]=_e(h.pixelPosition,function(e,n){if(n)return n=Fe(e,t),We.test(n)?w(e).position()[t]+"px":n})}),w.each({Height:"height",Width:"width"},function(e,t){w.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){w.fn[r]=function(i,o){var a=arguments.length&&(n||"boolean"!=typeof i),s=n||(!0===i||!0===o?"margin":"border");return z(this,function(t,n,i){var o;return y(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===i?w.css(t,n,s):w.style(t,n,i,s)},t,a?i:void 0,a)}})}),w.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),w.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=N,w.isFunction=g,w.isWindow=y,w.camelCase=G,w.type=x,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return w});var Jt=e.jQuery,Kt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=Kt),t&&e.jQuery===w&&(e.jQuery=Jt),w},t||(e.jQuery=e.$=w),w});
/*! jQuery Validation Plugin - v1.19.0 - 11/28/2018
 * https://jqueryvalidation.org/
 * Copyright (c) 2018 Jörn Zaefferer; Licensed MIT */
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.submitButton=b.currentTarget,a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}}),a.extend(a.expr.pseudos||a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){var c=a(b).val();return null!==c&&!!a.trim(""+c)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=".  Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a]},defaultMessage:function(b,c){"string"==typeof c&&(c={method:c});var d=this.findDefined(this.customMessage(b.name,c.method),this.customDataMessage(b,c.method),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c.method],"<strong>Warning: No message defined for "+b.name+"</strong>"),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass).html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return a.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(d,e){b[d]=a.isFunction(e)&&"normalizer"!==d?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[\/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e<=d},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var b,c={};return a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)}),a});
/**!

 @license
 handlebars v4.0.12

Copyright (C) 2011-2017 by Yehuda Katz

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

*/
!function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define([],b):"object"==typeof exports?exports.Handlebars=b():a.Handlebars=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){"use strict";function d(){var a=r();return a.compile=function(b,c){return k.compile(b,c,a)},a.precompile=function(b,c){return k.precompile(b,c,a)},a.AST=i["default"],a.Compiler=k.Compiler,a.JavaScriptCompiler=m["default"],a.Parser=j.parser,a.parse=j.parse,a}var e=c(1)["default"];b.__esModule=!0;var f=c(2),g=e(f),h=c(35),i=e(h),j=c(36),k=c(41),l=c(42),m=e(l),n=c(39),o=e(n),p=c(34),q=e(p),r=g["default"].create,s=d();s.create=d,q["default"](s),s.Visitor=o["default"],s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b){"use strict";b["default"]=function(a){return a&&a.__esModule?a:{"default":a}},b.__esModule=!0},function(a,b,c){"use strict";function d(){var a=new h.HandlebarsEnvironment;return n.extend(a,h),a.SafeString=j["default"],a.Exception=l["default"],a.Utils=n,a.escapeExpression=n.escapeExpression,a.VM=p,a.template=function(b){return p.template(b,a)},a}var e=c(3)["default"],f=c(1)["default"];b.__esModule=!0;var g=c(4),h=e(g),i=c(21),j=f(i),k=c(6),l=f(k),m=c(5),n=e(m),o=c(22),p=e(o),q=c(34),r=f(q),s=d();s.create=d,r["default"](s),s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b){"use strict";b["default"]=function(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b},b.__esModule=!0},function(a,b,c){"use strict";function d(a,b,c){this.helpers=a||{},this.partials=b||{},this.decorators=c||{},i.registerDefaultHelpers(this),j.registerDefaultDecorators(this)}var e=c(1)["default"];b.__esModule=!0,b.HandlebarsEnvironment=d;var f=c(5),g=c(6),h=e(g),i=c(10),j=c(18),k=c(20),l=e(k),m="4.0.12";b.VERSION=m;var n=7;b.COMPILER_REVISION=n;var o={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0"};b.REVISION_CHANGES=o;var p="[object Object]";d.prototype={constructor:d,logger:l["default"],log:l["default"].log,registerHelper:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple helpers");f.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(f.toString.call(a)===p)f.extend(this.partials,a);else{if("undefined"==typeof b)throw new h["default"]('Attempting to register a partial called "'+a+'" as undefined');this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]},registerDecorator:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple decorators");f.extend(this.decorators,a)}else this.decorators[a]=b},unregisterDecorator:function(a){delete this.decorators[a]}};var q=l["default"].log;b.log=q,b.createFrame=f.createFrame,b.logger=l["default"]},function(a,b){"use strict";function c(a){return k[a]}function d(a){for(var b=1;b<arguments.length;b++)for(var c in arguments[b])Object.prototype.hasOwnProperty.call(arguments[b],c)&&(a[c]=arguments[b][c]);return a}function e(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return m.test(a)?a.replace(l,c):a}function g(a){return!a&&0!==a||!(!p(a)||0!==a.length)}function h(a){var b=d({},a);return b._parent=a,b}function i(a,b){return a.path=b,a}function j(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.createFrame=h,b.blockParams=i,b.appendContextPath=j;var k={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;","=":"&#x3D;"},l=/[&<>"'`=]/g,m=/[&<>"'`=]/,n=Object.prototype.toString;b.toString=n;var o=function(a){return"function"==typeof a};o(/x/)&&(b.isFunction=o=function(a){return"function"==typeof a&&"[object Function]"===n.call(a)}),b.isFunction=o;var p=Array.isArray||function(a){return!(!a||"object"!=typeof a)&&"[object Array]"===n.call(a)};b.isArray=p},function(a,b,c){"use strict";function d(a,b){var c=b&&b.loc,g=void 0,h=void 0;c&&(g=c.start.line,h=c.start.column,a+=" - "+g+":"+h);for(var i=Error.prototype.constructor.call(this,a),j=0;j<f.length;j++)this[f[j]]=i[f[j]];Error.captureStackTrace&&Error.captureStackTrace(this,d);try{c&&(this.lineNumber=g,e?Object.defineProperty(this,"column",{value:h,enumerable:!0}):this.column=h)}catch(k){}}var e=c(7)["default"];b.__esModule=!0;var f=["description","fileName","lineNumber","message","name","number","stack"];d.prototype=new Error,b["default"]=d,a.exports=b["default"]},function(a,b,c){a.exports={"default":c(8),__esModule:!0}},function(a,b,c){var d=c(9);a.exports=function(a,b,c){return d.setDesc(a,b,c)}},function(a,b){var c=Object;a.exports={create:c.create,getProto:c.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:c.getOwnPropertyDescriptor,setDesc:c.defineProperty,setDescs:c.defineProperties,getKeys:c.keys,getNames:c.getOwnPropertyNames,getSymbols:c.getOwnPropertySymbols,each:[].forEach}},function(a,b,c){"use strict";function d(a){g["default"](a),i["default"](a),k["default"](a),m["default"](a),o["default"](a),q["default"](a),s["default"](a)}var e=c(1)["default"];b.__esModule=!0,b.registerDefaultHelpers=d;var f=c(11),g=e(f),h=c(12),i=e(h),j=c(13),k=e(j),l=c(14),m=e(l),n=c(15),o=e(n),p=c(16),q=e(p),r=c(17),s=e(r)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("blockHelperMissing",function(b,c){var e=c.inverse,f=c.fn;if(b===!0)return f(this);if(b===!1||null==b)return e(this);if(d.isArray(b))return b.length>0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):e(this);if(c.data&&c.ids){var g=d.createFrame(c.data);g.contextPath=d.appendContextPath(c.data.contextPath,c.name),c={data:g}}return f(b,c)})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(1)["default"];b.__esModule=!0;var e=c(5),f=c(6),g=d(f);b["default"]=function(a){a.registerHelper("each",function(a,b){function c(b,c,f){j&&(j.key=b,j.index=c,j.first=0===c,j.last=!!f,k&&(j.contextPath=k+b)),i+=d(a[b],{data:j,blockParams:e.blockParams([a[b],b],[k+b,null])})}if(!b)throw new g["default"]("Must pass iterator to #each");var d=b.fn,f=b.inverse,h=0,i="",j=void 0,k=void 0;if(b.data&&b.ids&&(k=e.appendContextPath(b.data.contextPath,b.ids[0])+"."),e.isFunction(a)&&(a=a.call(this)),b.data&&(j=e.createFrame(b.data)),a&&"object"==typeof a)if(e.isArray(a))for(var l=a.length;h<l;h++)h in a&&c(h,h,h===a.length-1);else{var m=void 0;for(var n in a)a.hasOwnProperty(n)&&(void 0!==m&&c(m,h-1),m=n,h++);void 0!==m&&c(m,h-1,!0)}return 0===h&&(i=f(this)),i})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(1)["default"];b.__esModule=!0;var e=c(6),f=d(e);b["default"]=function(a){a.registerHelper("helperMissing",function(){if(1!==arguments.length)throw new f["default"]('Missing helper: "'+arguments[arguments.length-1].name+'"')})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("if",function(a,b){return d.isFunction(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||d.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("log",function(){for(var b=[void 0],c=arguments[arguments.length-1],d=0;d<arguments.length-1;d++)b.push(arguments[d]);var e=1;null!=c.hash.level?e=c.hash.level:c.data&&null!=c.data.level&&(e=c.data.level),b[0]=e,a.log.apply(a,b)})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("lookup",function(a,b){return a&&a[b]})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("with",function(a,b){d.isFunction(a)&&(a=a.call(this));var c=b.fn;if(d.isEmpty(a))return b.inverse(this);var e=b.data;return b.data&&b.ids&&(e=d.createFrame(b.data),e.contextPath=d.appendContextPath(b.data.contextPath,b.ids[0])),c(a,{data:e,blockParams:d.blockParams([a],[e&&e.contextPath])})})},a.exports=b["default"]},function(a,b,c){"use strict";function d(a){g["default"](a)}var e=c(1)["default"];b.__esModule=!0,b.registerDefaultDecorators=d;var f=c(19),g=e(f)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerDecorator("inline",function(a,b,c,e){var f=a;return b.partials||(b.partials={},f=function(e,f){var g=c.partials;c.partials=d.extend({},g,b.partials);var h=a(e,f);return c.partials=g,h}),b.partials[e.args[0]]=e.fn,f})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5),e={methodMap:["debug","info","warn","error"],level:"info",lookupLevel:function(a){if("string"==typeof a){var b=d.indexOf(e.methodMap,a.toLowerCase());a=b>=0?b:parseInt(a,10)}return a},log:function(a){if(a=e.lookupLevel(a),"undefined"!=typeof console&&e.lookupLevel(e.level)<=a){var b=e.methodMap[a];console[b]||(b="log");for(var c=arguments.length,d=Array(c>1?c-1:0),f=1;f<c;f++)d[f-1]=arguments[f];console[b].apply(console,d)}}};b["default"]=e,a.exports=b["default"]},function(a,b){"use strict";function c(a){this.string=a}b.__esModule=!0,c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=s.COMPILER_REVISION;if(b!==c){if(b<c){var d=s.REVISION_CHANGES[c],e=s.REVISION_CHANGES[b];throw new r["default"]("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new r["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){function c(c,d,e){e.hash&&(d=p.extend({},d,e.hash),e.ids&&(e.ids[0]=!0)),c=b.VM.resolvePartial.call(this,c,d,e);var f=b.VM.invokePartial.call(this,c,d,e);if(null==f&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),f=e.partials[e.name](d,e)),null!=f){if(e.indent){for(var g=f.split("\n"),h=0,i=g.length;h<i&&(g[h]||h+1!==i);h++)g[h]=e.indent+g[h];f=g.join("\n")}return f}throw new r["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){function c(b){return""+a.main(e,b,e.helpers,e.partials,g,i,h)}var f=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],g=f.data;d._setup(f),!f.partial&&a.useData&&(g=j(b,g));var h=void 0,i=a.useBlockParams?[]:void 0;return a.useDepths&&(h=f.depths?b!=f.depths[0]?[b].concat(f.depths):f.depths:[b]),(c=k(a.main,c,e,f.depths||[],g,i))(b,f)}if(!b)throw new r["default"]("No environment passed to template");if(!a||!a.main)throw new r["default"]("Unknown template object: "+typeof a);a.main.decorator=a.main_d,b.VM.checkRevision(a.compiler);var e={strict:function(a,b){if(!(b in a))throw new r["default"]('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;d<c;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:p.escapeExpression,invokePartial:c,fn:function(b){var c=a[b];return c.decorator=a[b+"_d"],c},programs:[],program:function(a,b,c,d,e){var g=this.programs[a],h=this.fn(a);return b||e||d||c?g=f(this,a,h,b,c,d,e):g||(g=this.programs[a]=f(this,a,h)),g},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=p.extend({},b,a)),c},nullContext:l({}),noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){c.partial?(e.helpers=c.helpers,e.partials=c.partials,e.decorators=c.decorators):(e.helpers=e.merge(c.helpers,b.helpers),a.usePartial&&(e.partials=e.merge(c.partials,b.partials)),(a.usePartial||a.useDecorators)&&(e.decorators=e.merge(c.decorators,b.decorators)))},d._child=function(b,c,d,g){if(a.useBlockParams&&!d)throw new r["default"]("must pass block params");if(a.useDepths&&!g)throw new r["default"]("must pass parent depths");return f(e,b,a[b],c,0,d,g)},d}function f(a,b,c,d,e,f,g){function h(b){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],h=g;return!g||b==g[0]||b===a.nullContext&&null===g[0]||(h=[b].concat(g)),c(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),h)}return h=k(c,h,a,g,d,f),h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function g(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a="@partial-block"===c.name?c.data["partial-block"]:c.partials[c.name],a}function h(a,b,c){var d=c.data&&c.data["partial-block"];c.partial=!0,c.ids&&(c.data.contextPath=c.ids[0]||c.data.contextPath);var e=void 0;if(c.fn&&c.fn!==i&&!function(){c.data=s.createFrame(c.data);var a=c.fn;e=c.data["partial-block"]=function(b){var c=arguments.length<=1||void 0===arguments[1]?{}:arguments[1];return c.data=s.createFrame(c.data),c.data["partial-block"]=d,a(b,c)},a.partials&&(c.partials=p.extend({},c.partials,a.partials))}(),void 0===a&&e&&(a=e),void 0===a)throw new r["default"]("The partial "+c.name+" could not be found");if(a instanceof Function)return a(b,c)}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?s.createFrame(b):{},b.root=a),b}function k(a,b,c,d,e,f){if(a.decorator){var g={};b=a.decorator(b,g,c,d&&d[0],e,f,d),p.extend(b,g)}return b}var l=c(23)["default"],m=c(3)["default"],n=c(1)["default"];b.__esModule=!0,b.checkRevision=d,b.template=e,b.wrapProgram=f,b.resolvePartial=g,b.invokePartial=h,b.noop=i;var o=c(5),p=m(o),q=c(6),r=n(q),s=c(4)},function(a,b,c){a.exports={"default":c(24),__esModule:!0}},function(a,b,c){c(25),a.exports=c(30).Object.seal},function(a,b,c){var d=c(26);c(27)("seal",function(a){return function(b){return a&&d(b)?a(b):b}})},function(a,b){a.exports=function(a){return"object"==typeof a?null!==a:"function"==typeof a}},function(a,b,c){var d=c(28),e=c(30),f=c(33);a.exports=function(a,b){var c=(e.Object||{})[a]||Object[a],g={};g[a]=b(c),d(d.S+d.F*f(function(){c(1)}),"Object",g)}},function(a,b,c){var d=c(29),e=c(30),f=c(31),g="prototype",h=function(a,b,c){var i,j,k,l=a&h.F,m=a&h.G,n=a&h.S,o=a&h.P,p=a&h.B,q=a&h.W,r=m?e:e[b]||(e[b]={}),s=m?d:n?d[b]:(d[b]||{})[g];m&&(c=b);for(i in c)j=!l&&s&&i in s,j&&i in r||(k=j?s[i]:c[i],r[i]=m&&"function"!=typeof s[i]?c[i]:p&&j?f(k,d):q&&s[i]==k?function(a){var b=function(b){return this instanceof a?new a(b):a(b)};return b[g]=a[g],b}(k):o&&"function"==typeof k?f(Function.call,k):k,o&&((r[g]||(r[g]={}))[i]=k))};h.F=1,h.G=2,h.S=4,h.P=8,h.B=16,h.W=32,a.exports=h},function(a,b){var c=a.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=c)},function(a,b){var c=a.exports={version:"1.2.6"};"number"==typeof __e&&(__e=c)},function(a,b,c){var d=c(32);a.exports=function(a,b,c){if(d(a),void 0===b)return a;switch(c){case 1:return function(c){return a.call(b,c)};case 2:return function(c,d){return a.call(b,c,d)};case 3:return function(c,d,e){return a.call(b,c,d,e)}}return function(){return a.apply(b,arguments)}}},function(a,b){a.exports=function(a){if("function"!=typeof a)throw TypeError(a+" is not a function!");return a}},function(a,b){a.exports=function(a){try{return!!a()}catch(b){return!0}}},function(a,b){(function(c){"use strict";b.__esModule=!0,b["default"]=function(a){var b="undefined"!=typeof c?c:window,d=b.Handlebars;a.noConflict=function(){return b.Handlebars===a&&(b.Handlebars=d),a}},a.exports=b["default"]}).call(b,function(){return this}())},function(a,b){"use strict";b.__esModule=!0;var c={helpers:{helperExpression:function(a){return"SubExpression"===a.type||("MustacheStatement"===a.type||"BlockStatement"===a.type)&&!!(a.params&&a.params.length||a.hash)},scopedId:function(a){return/^\.|this\b/.test(a.original)},simpleId:function(a){return 1===a.parts.length&&!c.helpers.scopedId(a)&&!a.depth}}};b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if("Program"===a.type)return a;h["default"].yy=n,n.locInfo=function(a){return new n.SourceLocation(b&&b.srcName,a)};var c=new j["default"](b);return c.accept(h["default"].parse(a))}var e=c(1)["default"],f=c(3)["default"];b.__esModule=!0,b.parse=d;var g=c(37),h=e(g),i=c(38),j=e(i),k=c(40),l=f(k),m=c(5);b.parser=h["default"];var n={};m.extend(n,l)},function(a,b){"use strict";b.__esModule=!0;var c=function(){function a(){this.yy={}}var b={trace:function(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,program_repetition0:6,statement:7,mustache:8,block:9,rawBlock:10,partial:11,partialBlock:12,content:13,COMMENT:14,CONTENT:15,openRawBlock:16,rawBlock_repetition_plus0:17,END_RAW_BLOCK:18,OPEN_RAW_BLOCK:19,helperName:20,openRawBlock_repetition0:21,openRawBlock_option0:22,CLOSE_RAW_BLOCK:23,openBlock:24,block_option0:25,closeBlock:26,openInverse:27,block_option1:28,OPEN_BLOCK:29,openBlock_repetition0:30,openBlock_option0:31,openBlock_option1:32,CLOSE:33,OPEN_INVERSE:34,openInverse_repetition0:35,openInverse_option0:36,openInverse_option1:37,openInverseChain:38,OPEN_INVERSE_CHAIN:39,openInverseChain_repetition0:40,openInverseChain_option0:41,openInverseChain_option1:42,inverseAndProgram:43,INVERSE:44,inverseChain:45,inverseChain_option0:46,OPEN_ENDBLOCK:47,OPEN:48,mustache_repetition0:49,mustache_option0:50,OPEN_UNESCAPED:51,mustache_repetition1:52,mustache_option1:53,CLOSE_UNESCAPED:54,OPEN_PARTIAL:55,partialName:56,partial_repetition0:57,partial_option0:58,openPartialBlock:59,OPEN_PARTIAL_BLOCK:60,openPartialBlock_repetition0:61,openPartialBlock_option0:62,param:63,sexpr:64,OPEN_SEXPR:65,sexpr_repetition0:66,sexpr_option0:67,CLOSE_SEXPR:68,hash:69,hash_repetition_plus0:70,hashSegment:71,ID:72,EQUALS:73,blockParams:74,OPEN_BLOCK_PARAMS:75,blockParams_repetition_plus0:76,CLOSE_BLOCK_PARAMS:77,path:78,dataName:79,STRING:80,NUMBER:81,BOOLEAN:82,UNDEFINED:83,NULL:84,DATA:85,pathSegments:86,SEP:87,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",14:"COMMENT",15:"CONTENT",18:"END_RAW_BLOCK",19:"OPEN_RAW_BLOCK",23:"CLOSE_RAW_BLOCK",29:"OPEN_BLOCK",33:"CLOSE",34:"OPEN_INVERSE",39:"OPEN_INVERSE_CHAIN",44:"INVERSE",47:"OPEN_ENDBLOCK",48:"OPEN",51:"OPEN_UNESCAPED",54:"CLOSE_UNESCAPED",55:"OPEN_PARTIAL",60:"OPEN_PARTIAL_BLOCK",65:"OPEN_SEXPR",68:"CLOSE_SEXPR",72:"ID",73:"EQUALS",75:"OPEN_BLOCK_PARAMS",77:"CLOSE_BLOCK_PARAMS",80:"STRING",81:"NUMBER",82:"BOOLEAN",83:"UNDEFINED",84:"NULL",85:"DATA",87:"SEP"},productions_:[0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[13,1],[10,3],[16,5],[9,4],[9,4],[24,6],[27,6],[38,6],[43,2],[45,3],[45,1],[26,3],[8,5],[8,5],[11,5],[12,3],[59,5],[63,1],[63,1],[64,5],[69,1],[71,3],[74,3],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[56,1],[56,1],[79,2],[78,1],[86,3],[86,1],[6,0],[6,2],[17,1],[17,2],[21,0],[21,2],[22,0],[22,1],[25,0],[25,1],[28,0],[28,1],[30,0],[30,2],[31,0],[31,1],[32,0],[32,1],[35,0],[35,2],[36,0],[36,1],[37,0],[37,1],[40,0],[40,2],[41,0],[41,1],[42,0],[42,1],[46,0],[46,1],[49,0],[49,2],[50,0],[50,1],[52,0],[52,2],[53,0],[53,1],[57,0],[57,2],[58,0],[58,1],[61,0],[61,2],[62,0],[62,1],[66,0],[66,2],[67,0],[67,1],[70,1],[70,2],[76,1],[76,2]],performAction:function(a,b,c,d,e,f,g){var h=f.length-1;switch(e){case 1:return f[h-1];case 2:this.$=d.prepareProgram(f[h]);break;case 3:this.$=f[h];break;case 4:this.$=f[h];break;case 5:this.$=f[h];break;case 6:this.$=f[h];break;case 7:this.$=f[h];break;case 8:this.$=f[h];break;case 9:this.$={type:"CommentStatement",value:d.stripComment(f[h]),strip:d.stripFlags(f[h],f[h]),loc:d.locInfo(this._$)};break;case 10:this.$={type:"ContentStatement",original:f[h],value:f[h],loc:d.locInfo(this._$)};break;case 11:this.$=d.prepareRawBlock(f[h-2],f[h-1],f[h],this._$);break;case 12:this.$={path:f[h-3],params:f[h-2],hash:f[h-1]};break;case 13:this.$=d.prepareBlock(f[h-3],f[h-2],f[h-1],f[h],!1,this._$);break;case 14:this.$=d.prepareBlock(f[h-3],f[h-2],f[h-1],f[h],!0,this._$);break;case 15:this.$={open:f[h-5],path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 16:this.$={path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 17:this.$={path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 18:this.$={strip:d.stripFlags(f[h-1],f[h-1]),program:f[h]};break;case 19:var i=d.prepareBlock(f[h-2],f[h-1],f[h],f[h],!1,this._$),j=d.prepareProgram([i],f[h-1].loc);j.chained=!0,this.$={strip:f[h-2].strip,program:j,chain:!0};break;case 20:this.$=f[h];break;case 21:this.$={path:f[h-1],strip:d.stripFlags(f[h-2],f[h])};break;case 22:this.$=d.prepareMustache(f[h-3],f[h-2],f[h-1],f[h-4],d.stripFlags(f[h-4],f[h]),this._$);break;case 23:this.$=d.prepareMustache(f[h-3],f[h-2],f[h-1],f[h-4],d.stripFlags(f[h-4],f[h]),this._$);break;case 24:this.$={type:"PartialStatement",name:f[h-3],params:f[h-2],hash:f[h-1],indent:"",strip:d.stripFlags(f[h-4],f[h]),loc:d.locInfo(this._$)};break;case 25:this.$=d.preparePartialBlock(f[h-2],f[h-1],f[h],this._$);break;case 26:this.$={path:f[h-3],params:f[h-2],hash:f[h-1],strip:d.stripFlags(f[h-4],f[h])};break;case 27:this.$=f[h];break;case 28:this.$=f[h];break;case 29:this.$={type:"SubExpression",path:f[h-3],params:f[h-2],hash:f[h-1],loc:d.locInfo(this._$)};break;case 30:this.$={type:"Hash",pairs:f[h],loc:d.locInfo(this._$)};break;case 31:this.$={type:"HashPair",key:d.id(f[h-2]),value:f[h],loc:d.locInfo(this._$)};break;case 32:this.$=d.id(f[h-1]);break;case 33:this.$=f[h];break;case 34:this.$=f[h];break;case 35:this.$={type:"StringLiteral",value:f[h],original:f[h],loc:d.locInfo(this._$)};break;case 36:this.$={type:"NumberLiteral",value:Number(f[h]),original:Number(f[h]),loc:d.locInfo(this._$)};break;case 37:this.$={type:"BooleanLiteral",value:"true"===f[h],original:"true"===f[h],loc:d.locInfo(this._$)};break;case 38:this.$={type:"UndefinedLiteral",original:void 0,value:void 0,loc:d.locInfo(this._$)};break;case 39:this.$={type:"NullLiteral",original:null,value:null,loc:d.locInfo(this._$)};break;case 40:this.$=f[h];break;case 41:this.$=f[h];break;case 42:this.$=d.preparePath(!0,f[h],this._$);break;case 43:this.$=d.preparePath(!1,f[h],this._$);break;case 44:f[h-2].push({part:d.id(f[h]),original:f[h],separator:f[h-1]}),this.$=f[h-2];break;case 45:this.$=[{part:d.id(f[h]),original:f[h]}];break;case 46:this.$=[];break;case 47:f[h-1].push(f[h]);break;case 48:this.$=[f[h]];break;case 49:f[h-1].push(f[h]);break;case 50:this.$=[];break;case 51:f[h-1].push(f[h]);break;case 58:this.$=[];break;case 59:f[h-1].push(f[h]);break;case 64:this.$=[];break;case 65:f[h-1].push(f[h]);break;case 70:this.$=[];break;case 71:f[h-1].push(f[h]);break;case 78:this.$=[];break;case 79:f[h-1].push(f[h]);break;case 82:this.$=[];break;case 83:f[h-1].push(f[h]);break;case 86:this.$=[];break;case 87:f[h-1].push(f[h]);break;case 90:this.$=[];break;case 91:f[h-1].push(f[h]);break;case 94:this.$=[];break;case 95:f[h-1].push(f[h]);break;case 98:this.$=[f[h]];break;case 99:f[h-1].push(f[h]);break;case 100:this.$=[f[h]];break;case 101:f[h-1].push(f[h])}},table:[{3:1,4:2,5:[2,46],6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:11,14:[1,12],15:[1,20],16:17,19:[1,23],24:15,27:16,29:[1,21],34:[1,22],39:[2,2],44:[2,2],47:[2,2],48:[1,13],51:[1,14],55:[1,18],59:19,60:[1,24]},{1:[2,1]},{5:[2,47],14:[2,47],15:[2,47],19:[2,47],29:[2,47],34:[2,47],39:[2,47],44:[2,47],47:[2,47],48:[2,47],51:[2,47],55:[2,47],60:[2,47]},{5:[2,3],14:[2,3],15:[2,3],19:[2,3],29:[2,3],34:[2,3],39:[2,3],44:[2,3],47:[2,3],48:[2,3],51:[2,3],55:[2,3],60:[2,3]},{5:[2,4],14:[2,4],15:[2,4],19:[2,4],29:[2,4],34:[2,4],39:[2,4],44:[2,4],47:[2,4],48:[2,4],51:[2,4],55:[2,4],60:[2,4]},{5:[2,5],14:[2,5],15:[2,5],19:[2,5],29:[2,5],34:[2,5],39:[2,5],44:[2,5],47:[2,5],48:[2,5],51:[2,5],55:[2,5],60:[2,5]},{5:[2,6],14:[2,6],15:[2,6],19:[2,6],29:[2,6],34:[2,6],39:[2,6],44:[2,6],47:[2,6],48:[2,6],51:[2,6],55:[2,6],60:[2,6]},{5:[2,7],14:[2,7],15:[2,7],19:[2,7],29:[2,7],34:[2,7],39:[2,7],44:[2,7],47:[2,7],48:[2,7],51:[2,7],55:[2,7],60:[2,7]},{5:[2,8],14:[2,8],15:[2,8],19:[2,8],29:[2,8],34:[2,8],39:[2,8],44:[2,8],47:[2,8],48:[2,8],51:[2,8],55:[2,8],60:[2,8]},{5:[2,9],14:[2,9],15:[2,9],19:[2,9],29:[2,9],34:[2,9],39:[2,9],44:[2,9],47:[2,9],48:[2,9],51:[2,9],55:[2,9],60:[2,9]},{20:25,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:36,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:37,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{4:38,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{13:40,15:[1,20],17:39},{20:42,56:41,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:45,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{5:[2,10],14:[2,10],15:[2,10],18:[2,10],19:[2,10],29:[2,10],34:[2,10],39:[2,10],44:[2,10],47:[2,10],48:[2,10],51:[2,10],55:[2,10],60:[2,10]},{20:46,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:47,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:48,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:42,56:49,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[2,78],49:50,65:[2,78],72:[2,78],80:[2,78],81:[2,78],82:[2,78],83:[2,78],84:[2,78],85:[2,78]},{23:[2,33],33:[2,33],54:[2,33],65:[2,33],68:[2,33],72:[2,33],75:[2,33],80:[2,33],81:[2,33],82:[2,33],83:[2,33],84:[2,33],85:[2,33]},{23:[2,34],33:[2,34],54:[2,34],65:[2,34],68:[2,34],72:[2,34],75:[2,34],80:[2,34],81:[2,34],82:[2,34],83:[2,34],84:[2,34],85:[2,34]},{23:[2,35],33:[2,35],54:[2,35],65:[2,35],68:[2,35],72:[2,35],75:[2,35],80:[2,35],81:[2,35],82:[2,35],83:[2,35],84:[2,35],85:[2,35]},{23:[2,36],33:[2,36],54:[2,36],65:[2,36],68:[2,36],72:[2,36],75:[2,36],80:[2,36],81:[2,36],82:[2,36],83:[2,36],84:[2,36],85:[2,36]},{23:[2,37],33:[2,37],54:[2,37],65:[2,37],68:[2,37],72:[2,37],75:[2,37],80:[2,37],81:[2,37],82:[2,37],83:[2,37],84:[2,37],85:[2,37]},{23:[2,38],33:[2,38],54:[2,38],65:[2,38],68:[2,38],72:[2,38],75:[2,38],80:[2,38],81:[2,38],82:[2,38],83:[2,38],84:[2,38],85:[2,38]},{23:[2,39],33:[2,39],54:[2,39],65:[2,39],68:[2,39],72:[2,39],75:[2,39],80:[2,39],81:[2,39],82:[2,39],83:[2,39],84:[2,39],85:[2,39]},{23:[2,43],33:[2,43],54:[2,43],65:[2,43],68:[2,43],72:[2,43],75:[2,43],80:[2,43],81:[2,43],82:[2,43],83:[2,43],84:[2,43],85:[2,43],87:[1,51]},{72:[1,35],86:52},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{52:53,54:[2,82],65:[2,82],72:[2,82],80:[2,82],81:[2,82],82:[2,82],83:[2,82],84:[2,82],85:[2,82]},{25:54,38:56,39:[1,58],43:57,44:[1,59],45:55,47:[2,54]},{28:60,43:61,44:[1,59],47:[2,56]},{13:63,15:[1,20],18:[1,62]},{15:[2,48],18:[2,48]},{33:[2,86],57:64,65:[2,86],72:[2,86],80:[2,86],81:[2,86],82:[2,86],83:[2,86],84:[2,86],85:[2,86]},{33:[2,40],65:[2,40],72:[2,40],80:[2,40],81:[2,40],82:[2,40],83:[2,40],84:[2,40],85:[2,40]},{33:[2,41],65:[2,41],72:[2,41],80:[2,41],81:[2,41],82:[2,41],83:[2,41],84:[2,41],85:[2,41]},{20:65,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:66,47:[1,67]},{30:68,33:[2,58],65:[2,58],72:[2,58],75:[2,58],80:[2,58],81:[2,58],82:[2,58],83:[2,58],84:[2,58],85:[2,58]},{33:[2,64],35:69,65:[2,64],72:[2,64],75:[2,64],80:[2,64],81:[2,64],82:[2,64],83:[2,64],84:[2,64],85:[2,64]},{21:70,23:[2,50],65:[2,50],72:[2,50],80:[2,50],81:[2,50],82:[2,50],83:[2,50],84:[2,50],85:[2,50]},{33:[2,90],61:71,65:[2,90],72:[2,90],80:[2,90],81:[2,90],82:[2,90],83:[2,90],84:[2,90],85:[2,90]},{20:75,33:[2,80],50:72,63:73,64:76,65:[1,44],69:74,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{72:[1,80]},{23:[2,42],33:[2,42],54:[2,42],65:[2,42],68:[2,42],72:[2,42],75:[2,42],80:[2,42],81:[2,42],82:[2,42],83:[2,42],84:[2,42],85:[2,42],87:[1,51]},{20:75,53:81,54:[2,84],63:82,64:76,65:[1,44],69:83,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:84,47:[1,67]},{47:[2,55]},{4:85,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{47:[2,20]},{20:86,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:87,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{26:88,47:[1,67]},{47:[2,57]},{5:[2,11],14:[2,11],15:[2,11],19:[2,11],29:[2,11],34:[2,11],39:[2,11],44:[2,11],47:[2,11],48:[2,11],51:[2,11],55:[2,11],60:[2,11]},{15:[2,49],18:[2,49]},{20:75,33:[2,88],58:89,63:90,64:76,65:[1,44],69:91,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{65:[2,94],66:92,68:[2,94],72:[2,94],80:[2,94],81:[2,94],82:[2,94],83:[2,94],84:[2,94],85:[2,94]},{5:[2,25],14:[2,25],15:[2,25],19:[2,25],29:[2,25],34:[2,25],39:[2,25],44:[2,25],47:[2,25],48:[2,25],51:[2,25],55:[2,25],60:[2,25]},{20:93,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,31:94,33:[2,60],63:95,64:76,65:[1,44],69:96,70:77,71:78,72:[1,79],75:[2,60],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,66],36:97,63:98,64:76,65:[1,44],69:99,70:77,71:78,72:[1,79],75:[2,66],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,22:100,23:[2,52],63:101,64:76,65:[1,44],69:102,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,92],62:103,63:104,64:76,65:[1,44],69:105,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,106]},{33:[2,79],65:[2,79],72:[2,79],80:[2,79],81:[2,79],82:[2,79],83:[2,79],84:[2,79],85:[2,79]},{33:[2,81]},{23:[2,27],33:[2,27],54:[2,27],65:[2,27],68:[2,27],72:[2,27],75:[2,27],80:[2,27],81:[2,27],82:[2,27],83:[2,27],84:[2,27],85:[2,27]},{23:[2,28],33:[2,28],54:[2,28],65:[2,28],68:[2,28],72:[2,28],75:[2,28],80:[2,28],81:[2,28],82:[2,28],83:[2,28],84:[2,28],85:[2,28]},{23:[2,30],33:[2,30],54:[2,30],68:[2,30],71:107,72:[1,108],75:[2,30]},{23:[2,98],33:[2,98],54:[2,98],68:[2,98],72:[2,98],75:[2,98]},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],73:[1,109],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{23:[2,44],33:[2,44],54:[2,44],65:[2,44],68:[2,44],72:[2,44],75:[2,44],80:[2,44],81:[2,44],82:[2,44],83:[2,44],84:[2,44],85:[2,44],87:[2,44]},{54:[1,110]},{54:[2,83],65:[2,83],72:[2,83],80:[2,83],81:[2,83],82:[2,83],83:[2,83],84:[2,83],85:[2,83]},{54:[2,85]},{5:[2,13],14:[2,13],15:[2,13],19:[2,13],29:[2,13],34:[2,13],39:[2,13],44:[2,13],47:[2,13],48:[2,13],51:[2,13],55:[2,13],60:[2,13]},{38:56,39:[1,58],43:57,44:[1,59],45:112,46:111,47:[2,76]},{33:[2,70],40:113,65:[2,70],72:[2,70],75:[2,70],80:[2,70],81:[2,70],82:[2,70],83:[2,70],84:[2,70],85:[2,70]},{47:[2,18]},{5:[2,14],14:[2,14],15:[2,14],19:[2,14],29:[2,14],34:[2,14],39:[2,14],44:[2,14],47:[2,14],48:[2,14],51:[2,14],55:[2,14],60:[2,14]},{33:[1,114]},{33:[2,87],65:[2,87],72:[2,87],80:[2,87],81:[2,87],82:[2,87],83:[2,87],84:[2,87],
85:[2,87]},{33:[2,89]},{20:75,63:116,64:76,65:[1,44],67:115,68:[2,96],69:117,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,118]},{32:119,33:[2,62],74:120,75:[1,121]},{33:[2,59],65:[2,59],72:[2,59],75:[2,59],80:[2,59],81:[2,59],82:[2,59],83:[2,59],84:[2,59],85:[2,59]},{33:[2,61],75:[2,61]},{33:[2,68],37:122,74:123,75:[1,121]},{33:[2,65],65:[2,65],72:[2,65],75:[2,65],80:[2,65],81:[2,65],82:[2,65],83:[2,65],84:[2,65],85:[2,65]},{33:[2,67],75:[2,67]},{23:[1,124]},{23:[2,51],65:[2,51],72:[2,51],80:[2,51],81:[2,51],82:[2,51],83:[2,51],84:[2,51],85:[2,51]},{23:[2,53]},{33:[1,125]},{33:[2,91],65:[2,91],72:[2,91],80:[2,91],81:[2,91],82:[2,91],83:[2,91],84:[2,91],85:[2,91]},{33:[2,93]},{5:[2,22],14:[2,22],15:[2,22],19:[2,22],29:[2,22],34:[2,22],39:[2,22],44:[2,22],47:[2,22],48:[2,22],51:[2,22],55:[2,22],60:[2,22]},{23:[2,99],33:[2,99],54:[2,99],68:[2,99],72:[2,99],75:[2,99]},{73:[1,109]},{20:75,63:126,64:76,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,23],14:[2,23],15:[2,23],19:[2,23],29:[2,23],34:[2,23],39:[2,23],44:[2,23],47:[2,23],48:[2,23],51:[2,23],55:[2,23],60:[2,23]},{47:[2,19]},{47:[2,77]},{20:75,33:[2,72],41:127,63:128,64:76,65:[1,44],69:129,70:77,71:78,72:[1,79],75:[2,72],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,24],14:[2,24],15:[2,24],19:[2,24],29:[2,24],34:[2,24],39:[2,24],44:[2,24],47:[2,24],48:[2,24],51:[2,24],55:[2,24],60:[2,24]},{68:[1,130]},{65:[2,95],68:[2,95],72:[2,95],80:[2,95],81:[2,95],82:[2,95],83:[2,95],84:[2,95],85:[2,95]},{68:[2,97]},{5:[2,21],14:[2,21],15:[2,21],19:[2,21],29:[2,21],34:[2,21],39:[2,21],44:[2,21],47:[2,21],48:[2,21],51:[2,21],55:[2,21],60:[2,21]},{33:[1,131]},{33:[2,63]},{72:[1,133],76:132},{33:[1,134]},{33:[2,69]},{15:[2,12]},{14:[2,26],15:[2,26],19:[2,26],29:[2,26],34:[2,26],47:[2,26],48:[2,26],51:[2,26],55:[2,26],60:[2,26]},{23:[2,31],33:[2,31],54:[2,31],68:[2,31],72:[2,31],75:[2,31]},{33:[2,74],42:135,74:136,75:[1,121]},{33:[2,71],65:[2,71],72:[2,71],75:[2,71],80:[2,71],81:[2,71],82:[2,71],83:[2,71],84:[2,71],85:[2,71]},{33:[2,73],75:[2,73]},{23:[2,29],33:[2,29],54:[2,29],65:[2,29],68:[2,29],72:[2,29],75:[2,29],80:[2,29],81:[2,29],82:[2,29],83:[2,29],84:[2,29],85:[2,29]},{14:[2,15],15:[2,15],19:[2,15],29:[2,15],34:[2,15],39:[2,15],44:[2,15],47:[2,15],48:[2,15],51:[2,15],55:[2,15],60:[2,15]},{72:[1,138],77:[1,137]},{72:[2,100],77:[2,100]},{14:[2,16],15:[2,16],19:[2,16],29:[2,16],34:[2,16],44:[2,16],47:[2,16],48:[2,16],51:[2,16],55:[2,16],60:[2,16]},{33:[1,139]},{33:[2,75]},{33:[2,32]},{72:[2,101],77:[2,101]},{14:[2,17],15:[2,17],19:[2,17],29:[2,17],34:[2,17],39:[2,17],44:[2,17],47:[2,17],48:[2,17],51:[2,17],55:[2,17],60:[2,17]}],defaultActions:{4:[2,1],55:[2,55],57:[2,20],61:[2,57],74:[2,81],83:[2,85],87:[2,18],91:[2,89],102:[2,53],105:[2,93],111:[2,19],112:[2,77],117:[2,97],120:[2,63],123:[2,69],124:[2,12],136:[2,75],137:[2,32]},parseError:function(a,b){throw new Error(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||1,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var l=this.lexer.yylloc;f.push(l);var m=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var n,o,p,q,r,s,t,u,v,w={};;){if(p=d[d.length-1],this.defaultActions[p]?q=this.defaultActions[p]:(null!==n&&"undefined"!=typeof n||(n=b()),q=g[p]&&g[p][n]),"undefined"==typeof q||!q.length||!q[0]){var x="";if(!k){v=[];for(s in g[p])this.terminals_[s]&&s>2&&v.push("'"+this.terminals_[s]+"'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+v.join(", ")+", got '"+(this.terminals_[n]||n)+"'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"'"+(this.terminals_[n]||n)+"'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},c=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\r\n?|\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;g<f.length&&(c=this._input.match(this.rules[f[g]]),!c||b&&!(c[0].length>b[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\r\n?|\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substr(a,b.yyleng-c)}switch(c){case 0:if("\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 15;break;case 1:return 15;case 2:return this.popState(),15;case 3:return this.begin("raw"),15;case 4:return this.popState(),"raw"===this.conditionStack[this.conditionStack.length-1]?15:(b.yytext=b.yytext.substr(5,b.yyleng-9),"END_RAW_BLOCK");case 5:return 15;case 6:return this.popState(),14;case 7:return 65;case 8:return 68;case 9:return 19;case 10:return this.popState(),this.begin("raw"),23;case 11:return 55;case 12:return 60;case 13:return 29;case 14:return 47;case 15:return this.popState(),44;case 16:return this.popState(),44;case 17:return 34;case 18:return 39;case 19:return 51;case 20:return 48;case 21:this.unput(b.yytext),this.popState(),this.begin("com");break;case 22:return this.popState(),14;case 23:return 48;case 24:return 73;case 25:return 72;case 26:return 72;case 27:return 87;case 28:break;case 29:return this.popState(),54;case 30:return this.popState(),33;case 31:return b.yytext=e(1,2).replace(/\\"/g,'"'),80;case 32:return b.yytext=e(1,2).replace(/\\'/g,"'"),80;case 33:return 85;case 34:return 82;case 35:return 82;case 36:return 83;case 37:return 84;case 38:return 81;case 39:return 75;case 40:return 77;case 41:return 72;case 42:return b.yytext=b.yytext.replace(/\\([\\\]])/g,"$1"),72;case 43:return"INVALID";case 44:return 5}},a.rules=[/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{(?=[^\/]))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{)))/,/^(?:[\s\S]*?--(~)?\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#>)/,/^(?:\{\{(~)?#\*?)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{(~)?!--)/,/^(?:\{\{(~)?![\s\S]*?\}\})/,/^(?:\{\{(~)?\*?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)|])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:undefined(?=([~}\s)])))/,/^(?:null(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:as\s+\|)/,/^(?:\|)/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/,/^(?:\[(\\\]|[^\]])*\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[6],inclusive:!1},raw:{rules:[3,4,5],inclusive:!1},INITIAL:{rules:[0,1,44],inclusive:!0}},a}();return b.lexer=c,a.prototype=b,b.Parser=a,new a}();b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(){var a=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.options=a}function e(a,b,c){void 0===b&&(b=a.length);var d=a[b-1],e=a[b-2];return d?"ContentStatement"===d.type?(e||!c?/\r?\n\s*?$/:/(^|\r?\n)\s*?$/).test(d.original):void 0:c}function f(a,b,c){void 0===b&&(b=-1);var d=a[b+1],e=a[b+2];return d?"ContentStatement"===d.type?(e||!c?/^\s*?\r?\n/:/^\s*?(\r?\n|$)/).test(d.original):void 0:c}function g(a,b,c){var d=a[null==b?0:b+1];if(d&&"ContentStatement"===d.type&&(c||!d.rightStripped)){var e=d.value;d.value=d.value.replace(c?/^\s+/:/^[ \t]*\r?\n?/,""),d.rightStripped=d.value!==e}}function h(a,b,c){var d=a[null==b?a.length-1:b-1];if(d&&"ContentStatement"===d.type&&(c||!d.leftStripped)){var e=d.value;return d.value=d.value.replace(c?/\s+$/:/[ \t]+$/,""),d.leftStripped=d.value!==e,d.leftStripped}}var i=c(1)["default"];b.__esModule=!0;var j=c(39),k=i(j);d.prototype=new k["default"],d.prototype.Program=function(a){var b=!this.options.ignoreStandalone,c=!this.isRootSeen;this.isRootSeen=!0;for(var d=a.body,i=0,j=d.length;i<j;i++){var k=d[i],l=this.accept(k);if(l){var m=e(d,i,c),n=f(d,i,c),o=l.openStandalone&&m,p=l.closeStandalone&&n,q=l.inlineStandalone&&m&&n;l.close&&g(d,i,!0),l.open&&h(d,i,!0),b&&q&&(g(d,i),h(d,i)&&"PartialStatement"===k.type&&(k.indent=/([ \t]+$)/.exec(d[i-1].original)[1])),b&&o&&(g((k.program||k.inverse).body),h(d,i)),b&&p&&(g(d,i),h((k.inverse||k.program).body))}}return a},d.prototype.BlockStatement=d.prototype.DecoratorBlock=d.prototype.PartialBlockStatement=function(a){this.accept(a.program),this.accept(a.inverse);var b=a.program||a.inverse,c=a.program&&a.inverse,d=c,i=c;if(c&&c.chained)for(d=c.body[0].program;i.chained;)i=i.body[i.body.length-1].program;var j={open:a.openStrip.open,close:a.closeStrip.close,openStandalone:f(b.body),closeStandalone:e((d||b).body)};if(a.openStrip.close&&g(b.body,null,!0),c){var k=a.inverseStrip;k.open&&h(b.body,null,!0),k.close&&g(d.body,null,!0),a.closeStrip.open&&h(i.body,null,!0),!this.options.ignoreStandalone&&e(b.body)&&f(d.body)&&(h(b.body),g(d.body))}else a.closeStrip.open&&h(b.body,null,!0);return j},d.prototype.Decorator=d.prototype.MustacheStatement=function(a){return a.strip},d.prototype.PartialStatement=d.prototype.CommentStatement=function(a){var b=a.strip||{};return{inlineStandalone:!0,open:b.open,close:b.close}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(){this.parents=[]}function e(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")}function f(a){e.call(this,a),this.acceptKey(a,"program"),this.acceptKey(a,"inverse")}function g(a){this.acceptRequired(a,"name"),this.acceptArray(a.params),this.acceptKey(a,"hash")}var h=c(1)["default"];b.__esModule=!0;var i=c(6),j=h(i);d.prototype={constructor:d,mutating:!1,acceptKey:function(a,b){var c=this.accept(a[b]);if(this.mutating){if(c&&!d.prototype[c.type])throw new j["default"]('Unexpected node type "'+c.type+'" found when accepting '+b+" on "+a.type);a[b]=c}},acceptRequired:function(a,b){if(this.acceptKey(a,b),!a[b])throw new j["default"](a.type+" requires "+b)},acceptArray:function(a){for(var b=0,c=a.length;b<c;b++)this.acceptKey(a,b),a[b]||(a.splice(b,1),b--,c--)},accept:function(a){if(a){if(!this[a.type])throw new j["default"]("Unknown type: "+a.type,a);this.current&&this.parents.unshift(this.current),this.current=a;var b=this[a.type](a);return this.current=this.parents.shift(),!this.mutating||b?b:b!==!1?a:void 0}},Program:function(a){this.acceptArray(a.body)},MustacheStatement:e,Decorator:e,BlockStatement:f,DecoratorBlock:f,PartialStatement:g,PartialBlockStatement:function(a){g.call(this,a),this.acceptKey(a,"program")},ContentStatement:function(){},CommentStatement:function(){},SubExpression:e,PathExpression:function(){},StringLiteral:function(){},NumberLiteral:function(){},BooleanLiteral:function(){},UndefinedLiteral:function(){},NullLiteral:function(){},Hash:function(a){this.acceptArray(a.pairs)},HashPair:function(a){this.acceptRequired(a,"value")}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if(b=b.path?b.path.original:b,a.path.original!==b){var c={loc:a.path.loc};throw new q["default"](a.path.original+" doesn't match "+b,c)}}function e(a,b){this.source=a,this.start={line:b.first_line,column:b.first_column},this.end={line:b.last_line,column:b.last_column}}function f(a){return/^\[.*\]$/.test(a)?a.substr(1,a.length-2):a}function g(a,b){return{open:"~"===a.charAt(2),close:"~"===b.charAt(b.length-3)}}function h(a){return a.replace(/^\{\{~?!-?-?/,"").replace(/-?-?~?\}\}$/,"")}function i(a,b,c){c=this.locInfo(c);for(var d=a?"@":"",e=[],f=0,g=0,h=b.length;g<h;g++){var i=b[g].part,j=b[g].original!==i;if(d+=(b[g].separator||"")+i,j||".."!==i&&"."!==i&&"this"!==i)e.push(i);else{if(e.length>0)throw new q["default"]("Invalid path: "+d,{loc:c});".."===i&&f++}}return{type:"PathExpression",data:a,depth:f,parts:e,original:d,loc:c}}function j(a,b,c,d,e,f){var g=d.charAt(3)||d.charAt(2),h="{"!==g&&"&"!==g,i=/\*/.test(d);return{type:i?"Decorator":"MustacheStatement",path:a,params:b,hash:c,escaped:h,strip:e,loc:this.locInfo(f)}}function k(a,b,c,e){d(a,c),e=this.locInfo(e);var f={type:"Program",body:b,strip:{},loc:e};return{type:"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:f,openStrip:{},inverseStrip:{},closeStrip:{},loc:e}}function l(a,b,c,e,f,g){e&&e.path&&d(a,e);var h=/\*/.test(a.open);b.blockParams=a.blockParams;var i=void 0,j=void 0;if(c){if(h)throw new q["default"]("Unexpected inverse block on decorator",c);c.chain&&(c.program.body[0].closeStrip=e.strip),j=c.strip,i=c.program}return f&&(f=i,i=b,b=f),{type:h?"DecoratorBlock":"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:b,inverse:i,openStrip:a.strip,inverseStrip:j,closeStrip:e&&e.strip,loc:this.locInfo(g)}}function m(a,b){if(!b&&a.length){var c=a[0].loc,d=a[a.length-1].loc;c&&d&&(b={source:c.source,start:{line:c.start.line,column:c.start.column},end:{line:d.end.line,column:d.end.column}})}return{type:"Program",body:a,strip:{},loc:b}}function n(a,b,c,e){return d(a,c),{type:"PartialBlockStatement",name:a.path,params:a.params,hash:a.hash,program:b,openStrip:a.strip,closeStrip:c&&c.strip,loc:this.locInfo(e)}}var o=c(1)["default"];b.__esModule=!0,b.SourceLocation=e,b.id=f,b.stripFlags=g,b.stripComment=h,b.preparePath=i,b.prepareMustache=j,b.prepareRawBlock=k,b.prepareBlock=l,b.prepareProgram=m,b.preparePartialBlock=n;var p=c(6),q=o(p)},function(a,b,c){"use strict";function d(){}function e(a,b,c){if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var d=c.parse(a,b),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function f(a,b,c){function d(){var d=c.parse(a,b),e=(new c.Compiler).compile(d,b),f=(new c.JavaScriptCompiler).compile(e,b,void 0,!0);return c.template(f)}function e(a,b){return f||(f=d()),f.call(this,a,b)}if(void 0===b&&(b={}),null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);b=l.extend({},b),"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var f=void 0;return e._setup=function(a){return f||(f=d()),f._setup(a)},e._child=function(a,b,c,e){return f||(f=d()),f._child(a,b,c,e)},e}function g(a,b){if(a===b)return!0;if(l.isArray(a)&&l.isArray(b)&&a.length===b.length){for(var c=0;c<a.length;c++)if(!g(a[c],b[c]))return!1;return!0}}function h(a){if(!a.path.parts){var b=a.path;a.path={type:"PathExpression",data:!1,depth:0,parts:[b.original+""],original:b.original+"",loc:b.loc}}}var i=c(1)["default"];b.__esModule=!0,b.Compiler=d,b.precompile=e,b.compile=f;var j=c(6),k=i(j),l=c(5),m=c(35),n=i(m),o=[].slice;d.prototype={compiler:d,equals:function(a){var b=this.opcodes.length;if(a.opcodes.length!==b)return!1;for(var c=0;c<b;c++){var d=this.opcodes[c],e=a.opcodes[c];if(d.opcode!==e.opcode||!g(d.args,e.args))return!1}b=this.children.length;for(var c=0;c<b;c++)if(!this.children[c].equals(a.children[c]))return!1;return!0},guid:0,compile:function(a,b){this.sourceNode=[],this.opcodes=[],this.children=[],this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds,b.blockParams=b.blockParams||[];var c=b.knownHelpers;if(b.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},c)for(var d in c)this.options.knownHelpers[d]=c[d];return this.accept(a)},compileProgram:function(a){var b=new this.compiler,c=b.compile(a,this.options),d=this.guid++;return this.usePartial=this.usePartial||c.usePartial,this.children[d]=c,this.useDepths=this.useDepths||c.useDepths,d},accept:function(a){if(!this[a.type])throw new k["default"]("Unknown type: "+a.type,a);this.sourceNode.unshift(a);var b=this[a.type](a);return this.sourceNode.shift(),b},Program:function(a){this.options.blockParams.unshift(a.blockParams);for(var b=a.body,c=b.length,d=0;d<c;d++)this.accept(b[d]);return this.options.blockParams.shift(),this.isSimple=1===c,this.blockParams=a.blockParams?a.blockParams.length:0,this},BlockStatement:function(a){h(a);var b=a.program,c=a.inverse;b=b&&this.compileProgram(b),c=c&&this.compileProgram(c);var d=this.classifySexpr(a);"helper"===d?this.helperSexpr(a,b,c):"simple"===d?(this.simpleSexpr(a),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("blockValue",a.path.original)):(this.ambiguousSexpr(a,b,c),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("ambiguousBlockValue")),this.opcode("append")},DecoratorBlock:function(a){var b=a.program&&this.compileProgram(a.program),c=this.setupFullMustacheParams(a,b,void 0),d=a.path;this.useDecorators=!0,this.opcode("registerDecorator",c.length,d.original)},PartialStatement:function(a){this.usePartial=!0;var b=a.program;b&&(b=this.compileProgram(a.program));var c=a.params;if(c.length>1)throw new k["default"]("Unsupported number of partial arguments: "+c.length,a);c.length||(this.options.explicitPartialContext?this.opcode("pushLiteral","undefined"):c.push({type:"PathExpression",parts:[],depth:0}));var d=a.name.original,e="SubExpression"===a.name.type;e&&this.accept(a.name),this.setupFullMustacheParams(a,b,void 0,!0);var f=a.indent||"";this.options.preventIndent&&f&&(this.opcode("appendContent",f),f=""),this.opcode("invokePartial",e,d,f),this.opcode("append")},PartialBlockStatement:function(a){this.PartialStatement(a)},MustacheStatement:function(a){this.SubExpression(a),a.escaped&&!this.options.noEscape?this.opcode("appendEscaped"):this.opcode("append")},Decorator:function(a){this.DecoratorBlock(a)},ContentStatement:function(a){a.value&&this.opcode("appendContent",a.value)},CommentStatement:function(){},SubExpression:function(a){h(a);var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ambiguousSexpr:function(a,b,c){var d=a.path,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),d.strict=!0,this.accept(d),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){var b=a.path;b.strict=!0,this.accept(b),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.path,f=e.parts[0];if(this.options.knownHelpers[f])this.opcode("invokeKnownHelper",d.length,f);else{if(this.options.knownHelpersOnly)throw new k["default"]("You specified knownHelpersOnly, but used the unknown helper "+f,a);e.strict=!0,e.falsy=!0,this.accept(e),this.opcode("invokeHelper",d.length,e.original,n["default"].helpers.simpleId(e))}},PathExpression:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0],c=n["default"].helpers.scopedId(a),d=!a.depth&&!c&&this.blockParamIndex(b);d?this.opcode("lookupBlockParam",d,a.parts):b?a.data?(this.options.data=!0,this.opcode("lookupData",a.depth,a.parts,a.strict)):this.opcode("lookupOnContext",a.parts,a.falsy,a.strict,c):this.opcode("pushContext")},StringLiteral:function(a){this.opcode("pushString",a.value)},NumberLiteral:function(a){this.opcode("pushLiteral",a.value)},BooleanLiteral:function(a){this.opcode("pushLiteral",a.value)},UndefinedLiteral:function(){this.opcode("pushLiteral","undefined")},NullLiteral:function(){this.opcode("pushLiteral","null")},Hash:function(a){var b=a.pairs,c=0,d=b.length;for(this.opcode("pushHash");c<d;c++)this.pushParam(b[c].value);for(;c--;)this.opcode("assignToHash",b[c].key);this.opcode("popHash")},opcode:function(a){this.opcodes.push({opcode:a,args:o.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(a){a&&(this.useDepths=!0)},classifySexpr:function(a){var b=n["default"].helpers.simpleId(a.path),c=b&&!!this.blockParamIndex(a.path.parts[0]),d=!c&&n["default"].helpers.helperExpression(a),e=!c&&(d||b);if(e&&!d){var f=a.path.parts[0],g=this.options;g.knownHelpers[f]?d=!0:g.knownHelpersOnly&&(e=!1)}return d?"helper":e?"ambiguous":"simple"},pushParams:function(a){for(var b=0,c=a.length;b<c;b++)this.pushParam(a[b])},pushParam:function(a){var b=null!=a.value?a.value:a.original||"";if(this.stringParams)b.replace&&(b=b.replace(/^(\.?\.\/)*/g,"").replace(/\//g,".")),a.depth&&this.addDepth(a.depth),this.opcode("getContext",a.depth||0),this.opcode("pushStringParam",b,a.type),"SubExpression"===a.type&&this.accept(a);else{if(this.trackIds){var c=void 0;if(!a.parts||n["default"].helpers.scopedId(a)||a.depth||(c=this.blockParamIndex(a.parts[0])),c){var d=a.parts.slice(1).join(".");this.opcode("pushId","BlockParam",c,d)}else b=a.original||b,b.replace&&(b=b.replace(/^this(?:\.|$)/,"").replace(/^\.\//,"").replace(/^\.$/,"")),this.opcode("pushId",a.type,b)}this.accept(a)}},setupFullMustacheParams:function(a,b,c,d){var e=a.params;return this.pushParams(e),this.opcode("pushProgram",b),this.opcode("pushProgram",c),a.hash?this.accept(a.hash):this.opcode("emptyHash",d),e},blockParamIndex:function(a){for(var b=0,c=this.options.blockParams.length;b<c;b++){var d=this.options.blockParams[b],e=d&&l.indexOf(d,a);if(d&&e>=0)return[b,e]}}}},function(a,b,c){"use strict";function d(a){this.value=a}function e(){}function f(a,b,c,d){var e=b.popStack(),f=0,g=c.length;for(a&&g--;f<g;f++)e=b.nameLookup(e,c[f],d);return a?[b.aliasable("container.strict"),"(",e,", ",b.quotedString(c[f]),")"]:e}var g=c(1)["default"];b.__esModule=!0;var h=c(4),i=c(6),j=g(i),k=c(5),l=c(43),m=g(l);e.prototype={nameLookup:function(a,b){return e.isValidJavaScriptVariableName(b)?[a,".",b]:[a,"[",JSON.stringify(b),"]"]},depthedLookup:function(a){return[this.aliasable("container.lookup"),'(depths, "',a,'")']},compilerInfo:function(){var a=h.COMPILER_REVISION,b=h.REVISION_CHANGES[a];return[a,b]},appendToBuffer:function(a,b,c){return k.isArray(a)||(a=[a]),a=this.source.wrap(a,b),this.environment.isSimple?["return ",a,";"]:c?["buffer += ",a,";"]:(a.appendToBuffer=!0,a)},initializeBuffer:function(){return this.quotedString("")},compile:function(a,b,c,d){this.environment=a,this.options=b,this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!d,this.name=this.environment.name,this.isChild=!!c,this.context=c||{decorators:[],programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.blockParams=[],this.compileChildren(a,b),this.useDepths=this.useDepths||a.useDepths||a.useDecorators||this.options.compat,this.useBlockParams=this.useBlockParams||a.useBlockParams;var e=a.opcodes,f=void 0,g=void 0,h=void 0,i=void 0;for(h=0,i=e.length;h<i;h++)f=e[h],this.source.currentLocation=f.loc,g=g||f.loc,this[f.opcode].apply(this,f.args);if(this.source.currentLocation=g,this.pushSource(""),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new j["default"]("Compile completed with content left on stack");this.decorators.isEmpty()?this.decorators=void 0:(this.useDecorators=!0,this.decorators.prepend("var decorators = container.decorators;\n"),this.decorators.push("return fn;"),d?this.decorators=Function.apply(this,["fn","props","container","depth0","data","blockParams","depths",this.decorators.merge()]):(this.decorators.prepend("function(fn, props, container, depth0, data, blockParams, depths) {\n"),this.decorators.push("}\n"),this.decorators=this.decorators.merge()));var k=this.createFunctionContext(d);if(this.isChild)return k;var l={compiler:this.compilerInfo(),main:k};this.decorators&&(l.main_d=this.decorators,l.useDecorators=!0);var m=this.context,n=m.programs,o=m.decorators;for(h=0,i=n.length;h<i;h++)n[h]&&(l[h]=n[h],o[h]&&(l[h+"_d"]=o[h],l.useDecorators=!0));return this.environment.usePartial&&(l.usePartial=!0),this.options.data&&(l.useData=!0),this.useDepths&&(l.useDepths=!0),this.useBlockParams&&(l.useBlockParams=!0),this.options.compat&&(l.compat=!0),d?l.compilerOptions=this.options:(l.compiler=JSON.stringify(l.compiler),this.source.currentLocation={start:{line:1,column:0}},l=this.objectLiteral(l),b.srcName?(l=l.toStringWithSourceMap({file:b.destName}),l.map=l.map&&l.map.toString()):l=l.toString()),l},preamble:function(){this.lastContext=0,this.source=new m["default"](this.options.srcName),this.decorators=new m["default"](this.options.srcName)},createFunctionContext:function(a){var b="",c=this.stackVars.concat(this.registers.list);c.length>0&&(b+=", "+c.join(", "));var d=0;for(var e in this.aliases){var f=this.aliases[e];this.aliases.hasOwnProperty(e)&&f.children&&f.referenceCount>1&&(b+=", alias"+ ++d+"="+e,f.children[0]="alias"+d)}var g=["container","depth0","helpers","partials","data"];(this.useBlockParams||this.useDepths)&&g.push("blockParams"),this.useDepths&&g.push("depths");var h=this.mergeSource(b);return a?(g.push(h),Function.apply(this,g)):this.source.wrap(["function(",g.join(","),") {\n  ",h,"}"])},mergeSource:function(a){var b=this.environment.isSimple,c=!this.forceBuffer,d=void 0,e=void 0,f=void 0,g=void 0;return this.source.each(function(a){a.appendToBuffer?(f?a.prepend("  + "):f=a,g=a):(f&&(e?f.prepend("buffer += "):d=!0,g.add(";"),f=g=void 0),e=!0,b||(c=!1))}),c?f?(f.prepend("return "),g.add(";")):e||this.source.push('return "";'):(a+=", buffer = "+(d?"":this.initializeBuffer()),f?(f.prepend("return buffer + "),g.add(";")):this.source.push("return buffer;")),a&&this.source.prepend("var "+a.substring(2)+(d?"":";\n")),this.source.merge()},blockValue:function(a){var b=this.aliasable("helpers.blockHelperMissing"),c=[this.contextName(0)];this.setupHelperArgs(a,0,c);var d=this.popStack();c.splice(1,0,d),this.push(this.source.functionCall(b,"call",c))},ambiguousBlockValue:function(){var a=this.aliasable("helpers.blockHelperMissing"),b=[this.contextName(0)];this.setupHelperArgs("",0,b,!0),this.flushInline();var c=this.topStack();b.splice(1,0,c),this.pushSource(["if (!",this.lastHelper,") { ",c," = ",this.source.functionCall(a,"call",b),"}"])},appendContent:function(a){this.pendingContent?a=this.pendingContent+a:this.pendingLocation=this.source.currentLocation,this.pendingContent=a},append:function(){if(this.isInline())this.replaceStack(function(a){return[" != null ? ",a,' : ""']}),this.pushSource(this.appendToBuffer(this.popStack()));else{var a=this.popStack();this.pushSource(["if (",a," != null) { ",this.appendToBuffer(a,void 0,!0)," }"]),this.environment.isSimple&&this.pushSource(["else { ",this.appendToBuffer("''",void 0,!0)," }"])}},appendEscaped:function(){this.pushSource(this.appendToBuffer([this.aliasable("container.escapeExpression"),"(",this.popStack(),")"]))},getContext:function(a){this.lastContext=a},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(a,b,c,d){var e=0;d||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(a[e++])),this.resolvePath("context",a,e,b,c)},lookupBlockParam:function(a,b){this.useBlockParams=!0,this.push(["blockParams[",a[0],"][",a[1],"]"]),this.resolvePath("context",b,1)},lookupData:function(a,b,c){a?this.pushStackLiteral("container.data(data, "+a+")"):this.pushStackLiteral("data"),this.resolvePath("data",b,0,!0,c)},resolvePath:function(a,b,c,d,e){var g=this;if(this.options.strict||this.options.assumeObjects)return void this.push(f(this.options.strict&&e,this,b,a));for(var h=b.length;c<h;c++)this.replaceStack(function(e){var f=g.nameLookup(e,b[c],a);
return d?[" && ",f]:[" != null ? ",f," : ",e]})},resolvePossibleLambda:function(){this.push([this.aliasable("container.lambda"),"(",this.popStack(),", ",this.contextName(0),")"])},pushStringParam:function(a,b){this.pushContext(),this.pushString(b),"SubExpression"!==b&&("string"==typeof a?this.pushString(a):this.pushStackLiteral(a))},emptyHash:function(a){this.trackIds&&this.push("{}"),this.stringParams&&(this.push("{}"),this.push("{}")),this.pushStackLiteral(a?"undefined":"{}")},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[],ids:[]}},popHash:function(){var a=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push(this.objectLiteral(a.ids)),this.stringParams&&(this.push(this.objectLiteral(a.contexts)),this.push(this.objectLiteral(a.types))),this.push(this.objectLiteral(a.values))},pushString:function(a){this.pushStackLiteral(this.quotedString(a))},pushLiteral:function(a){this.pushStackLiteral(a)},pushProgram:function(a){null!=a?this.pushStackLiteral(this.programExpression(a)):this.pushStackLiteral(null)},registerDecorator:function(a,b){var c=this.nameLookup("decorators",b,"decorator"),d=this.setupHelperArgs(b,a);this.decorators.push(["fn = ",this.decorators.functionCall(c,"",["fn","props","container",d])," || fn;"])},invokeHelper:function(a,b,c){var d=this.popStack(),e=this.setupHelper(a,b),f=c?[e.name," || "]:"",g=["("].concat(f,d);this.options.strict||g.push(" || ",this.aliasable("helpers.helperMissing")),g.push(")"),this.push(this.source.functionCall(g,"call",e.callParams))},invokeKnownHelper:function(a,b){var c=this.setupHelper(a,b);this.push(this.source.functionCall(c.name,"call",c.callParams))},invokeAmbiguous:function(a,b){this.useRegister("helper");var c=this.popStack();this.emptyHash();var d=this.setupHelper(0,a,b),e=this.lastHelper=this.nameLookup("helpers",a,"helper"),f=["(","(helper = ",e," || ",c,")"];this.options.strict||(f[0]="(helper = ",f.push(" != null ? helper : ",this.aliasable("helpers.helperMissing"))),this.push(["(",f,d.paramsInit?["),(",d.paramsInit]:[],"),","(typeof helper === ",this.aliasable('"function"')," ? ",this.source.functionCall("helper","call",d.callParams)," : helper))"])},invokePartial:function(a,b,c){var d=[],e=this.setupParams(b,1,d);a&&(b=this.popStack(),delete e.name),c&&(e.indent=JSON.stringify(c)),e.helpers="helpers",e.partials="partials",e.decorators="container.decorators",a?d.unshift(b):d.unshift(this.nameLookup("partials",b,"partial")),this.options.compat&&(e.depths="depths"),e=this.objectLiteral(e),d.push(e),this.push(this.source.functionCall("container.invokePartial","",d))},assignToHash:function(a){var b=this.popStack(),c=void 0,d=void 0,e=void 0;this.trackIds&&(e=this.popStack()),this.stringParams&&(d=this.popStack(),c=this.popStack());var f=this.hash;c&&(f.contexts[a]=c),d&&(f.types[a]=d),e&&(f.ids[a]=e),f.values[a]=b},pushId:function(a,b,c){"BlockParam"===a?this.pushStackLiteral("blockParams["+b[0]+"].path["+b[1]+"]"+(c?" + "+JSON.stringify("."+c):"")):"PathExpression"===a?this.pushString(b):"SubExpression"===a?this.pushStackLiteral("true"):this.pushStackLiteral("null")},compiler:e,compileChildren:function(a,b){for(var c=a.children,d=void 0,e=void 0,f=0,g=c.length;f<g;f++){d=c[f],e=new this.compiler;var h=this.matchExistingProgram(d);if(null==h){this.context.programs.push("");var i=this.context.programs.length;d.index=i,d.name="program"+i,this.context.programs[i]=e.compile(d,b,this.context,!this.precompile),this.context.decorators[i]=e.decorators,this.context.environments[i]=d,this.useDepths=this.useDepths||e.useDepths,this.useBlockParams=this.useBlockParams||e.useBlockParams,d.useDepths=this.useDepths,d.useBlockParams=this.useBlockParams}else d.index=h.index,d.name="program"+h.index,this.useDepths=this.useDepths||h.useDepths,this.useBlockParams=this.useBlockParams||h.useBlockParams}},matchExistingProgram:function(a){for(var b=0,c=this.context.environments.length;b<c;b++){var d=this.context.environments[b];if(d&&d.equals(a))return d}},programExpression:function(a){var b=this.environment.children[a],c=[b.index,"data",b.blockParams];return(this.useBlockParams||this.useDepths)&&c.push("blockParams"),this.useDepths&&c.push("depths"),"container.program("+c.join(", ")+")"},useRegister:function(a){this.registers[a]||(this.registers[a]=!0,this.registers.list.push(a))},push:function(a){return a instanceof d||(a=this.source.wrap(a)),this.inlineStack.push(a),a},pushStackLiteral:function(a){this.push(new d(a))},pushSource:function(a){this.pendingContent&&(this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent),this.pendingLocation)),this.pendingContent=void 0),a&&this.source.push(a)},replaceStack:function(a){var b=["("],c=void 0,e=void 0,f=void 0;if(!this.isInline())throw new j["default"]("replaceStack on non-inline");var g=this.popStack(!0);if(g instanceof d)c=[g.value],b=["(",c],f=!0;else{e=!0;var h=this.incrStack();b=["((",this.push(h)," = ",g,")"],c=this.topStack()}var i=a.call(this,c);f||this.popStack(),e&&this.stackSlot--,this.push(b.concat(i,")"))},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;this.inlineStack=[];for(var b=0,c=a.length;b<c;b++){var e=a[b];if(e instanceof d)this.compileStack.push(e);else{var f=this.incrStack();this.pushSource([f," = ",e,";"]),this.compileStack.push(f)}}},isInline:function(){return this.inlineStack.length},popStack:function(a){var b=this.isInline(),c=(b?this.inlineStack:this.compileStack).pop();if(!a&&c instanceof d)return c.value;if(!b){if(!this.stackSlot)throw new j["default"]("Invalid stack pop");this.stackSlot--}return c},topStack:function(){var a=this.isInline()?this.inlineStack:this.compileStack,b=a[a.length-1];return b instanceof d?b.value:b},contextName:function(a){return this.useDepths&&a?"depths["+a+"]":"depth"+a},quotedString:function(a){return this.source.quotedString(a)},objectLiteral:function(a){return this.source.objectLiteral(a)},aliasable:function(a){var b=this.aliases[a];return b?(b.referenceCount++,b):(b=this.aliases[a]=this.source.wrap(a),b.aliasable=!0,b.referenceCount=1,b)},setupHelper:function(a,b,c){var d=[],e=this.setupHelperArgs(b,a,d,c),f=this.nameLookup("helpers",b,"helper"),g=this.aliasable(this.contextName(0)+" != null ? "+this.contextName(0)+" : (container.nullContext || {})");return{params:d,paramsInit:e,name:f,callParams:[g].concat(d)}},setupParams:function(a,b,c){var d={},e=[],f=[],g=[],h=!c,i=void 0;h&&(c=[]),d.name=this.quotedString(a),d.hash=this.popStack(),this.trackIds&&(d.hashIds=this.popStack()),this.stringParams&&(d.hashTypes=this.popStack(),d.hashContexts=this.popStack());var j=this.popStack(),k=this.popStack();(k||j)&&(d.fn=k||"container.noop",d.inverse=j||"container.noop");for(var l=b;l--;)i=this.popStack(),c[l]=i,this.trackIds&&(g[l]=this.popStack()),this.stringParams&&(f[l]=this.popStack(),e[l]=this.popStack());return h&&(d.args=this.source.generateArray(c)),this.trackIds&&(d.ids=this.source.generateArray(g)),this.stringParams&&(d.types=this.source.generateArray(f),d.contexts=this.source.generateArray(e)),this.options.data&&(d.data="data"),this.useBlockParams&&(d.blockParams="blockParams"),d},setupHelperArgs:function(a,b,c,d){var e=this.setupParams(a,b,c);return e=this.objectLiteral(e),d?(this.useRegister("options"),c.push("options"),["options=",e]):c?(c.push(e),""):e}},function(){for(var a="break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield await null true false".split(" "),b=e.RESERVED_WORDS={},c=0,d=a.length;c<d;c++)b[a[c]]=!0}(),e.isValidJavaScriptVariableName=function(a){return!e.RESERVED_WORDS[a]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(a)},b["default"]=e,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b,c){if(f.isArray(a)){for(var d=[],e=0,g=a.length;e<g;e++)d.push(b.wrap(a[e],c));return d}return"boolean"==typeof a||"number"==typeof a?a+"":a}function e(a){this.srcFile=a,this.source=[]}b.__esModule=!0;var f=c(5),g=void 0;try{}catch(h){}g||(g=function(a,b,c,d){this.src="",d&&this.add(d)},g.prototype={add:function(a){f.isArray(a)&&(a=a.join("")),this.src+=a},prepend:function(a){f.isArray(a)&&(a=a.join("")),this.src=a+this.src},toStringWithSourceMap:function(){return{code:this.toString()}},toString:function(){return this.src}}),e.prototype={isEmpty:function(){return!this.source.length},prepend:function(a,b){this.source.unshift(this.wrap(a,b))},push:function(a,b){this.source.push(this.wrap(a,b))},merge:function(){var a=this.empty();return this.each(function(b){a.add(["  ",b,"\n"])}),a},each:function(a){for(var b=0,c=this.source.length;b<c;b++)a(this.source[b])},empty:function(){var a=this.currentLocation||{start:{}};return new g(a.start.line,a.start.column,this.srcFile)},wrap:function(a){var b=arguments.length<=1||void 0===arguments[1]?this.currentLocation||{start:{}}:arguments[1];return a instanceof g?a:(a=d(a,this,b),new g(b.start.line,b.start.column,this.srcFile,a))},functionCall:function(a,b,c){return c=this.generateList(c),this.wrap([a,b?"."+b+"(":"(",c,")"])},quotedString:function(a){return'"'+(a+"").replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"'},objectLiteral:function(a){var b=[];for(var c in a)if(a.hasOwnProperty(c)){var e=d(a[c],this);"undefined"!==e&&b.push([this.quotedString(c),":",e])}var f=this.generateList(b);return f.prepend("{"),f.add("}"),f},generateList:function(a){for(var b=this.empty(),c=0,e=a.length;c<e;c++)c&&b.add(","),b.add(d(a[c],this));return b},generateArray:function(a){var b=this.generateList(a);return b.prepend("["),b.add("]"),b}},b["default"]=e,a.exports=b["default"]}])});
/*!
 * Bootstrap v3.3.7 (http://getbootstrap.com)
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under the MIT license
 */

if (typeof jQuery === 'undefined') {
  throw new Error('Bootstrap\'s JavaScript requires jQuery')
}

+function ($) {
  'use strict';
  var version = $.fn.jquery.split(' ')[0].split('.')
  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
  }
}(jQuery);

/* ========================================================================
 * Bootstrap: transition.js v3.3.7
 * http://getbootstrap.com/javascript/#transitions
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
  // ============================================================

  function transitionEnd() {
    var el = document.createElement('bootstrap')

    var transEndEventNames = {
      WebkitTransition : 'webkitTransitionEnd',
      MozTransition    : 'transitionend',
      OTransition      : 'oTransitionEnd otransitionend',
      transition       : 'transitionend'
    }

    for (var name in transEndEventNames) {
      if (el.style[name] !== undefined) {
        return { end: transEndEventNames[name] }
      }
    }

    return false // explicit for ie8 (  ._.)
  }

  // http://blog.alexmaccaw.com/css-transitions
  $.fn.emulateTransitionEnd = function (duration) {
    var called = false
    var $el = this
    $(this).one('bsTransitionEnd', function () { called = true })
    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
    setTimeout(callback, duration)
    return this
  }

  $(function () {
    $.support.transition = transitionEnd()

    if (!$.support.transition) return

    $.event.special.bsTransitionEnd = {
      bindType: $.support.transition.end,
      delegateType: $.support.transition.end,
      handle: function (e) {
        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
      }
    }
  })

}(jQuery);

/* ========================================================================
 * Bootstrap: alert.js v3.3.7
 * http://getbootstrap.com/javascript/#alerts
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // ALERT CLASS DEFINITION
  // ======================

  var dismiss = '[data-dismiss="alert"]'
  var Alert   = function (el) {
    $(el).on('click', dismiss, this.close)
  }

  Alert.VERSION = '3.3.7'

  Alert.TRANSITION_DURATION = 150

  Alert.prototype.close = function (e) {
    var $this    = $(this)
    var selector = $this.attr('data-target')

    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }

    var $parent = $(selector === '#' ? [] : selector)

    if (e) e.preventDefault()

    if (!$parent.length) {
      $parent = $this.closest('.alert')
    }

    $parent.trigger(e = $.Event('close.bs.alert'))

    if (e.isDefaultPrevented()) return

    $parent.removeClass('in')

    function removeElement() {
      // detach from parent, fire event then clean up data
      $parent.detach().trigger('closed.bs.alert').remove()
    }

    $.support.transition && $parent.hasClass('fade') ?
      $parent
        .one('bsTransitionEnd', removeElement)
        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
      removeElement()
  }


  // ALERT PLUGIN DEFINITION
  // =======================

  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.alert')

      if (!data) $this.data('bs.alert', (data = new Alert(this)))
      if (typeof option == 'string') data[option].call($this)
    })
  }

  var old = $.fn.alert

  $.fn.alert             = Plugin
  $.fn.alert.Constructor = Alert


  // ALERT NO CONFLICT
  // =================

  $.fn.alert.noConflict = function () {
    $.fn.alert = old
    return this
  }


  // ALERT DATA-API
  // ==============

  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)

}(jQuery);

/* ========================================================================
 * Bootstrap: button.js v3.3.7
 * http://getbootstrap.com/javascript/#buttons
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // BUTTON PUBLIC CLASS DEFINITION
  // ==============================

  var Button = function (element, options) {
    this.$element  = $(element)
    this.options   = $.extend({}, Button.DEFAULTS, options)
    this.isLoading = false
  }

  Button.VERSION  = '3.3.7'

  Button.DEFAULTS = {
    loadingText: 'loading...'
  }

  Button.prototype.setState = function (state) {
    var d    = 'disabled'
    var $el  = this.$element
    var val  = $el.is('input') ? 'val' : 'html'
    var data = $el.data()

    state += 'Text'

    if (data.resetText == null) $el.data('resetText', $el[val]())

    // push to event loop to allow forms to submit
    setTimeout($.proxy(function () {
      $el[val](data[state] == null ? this.options[state] : data[state])

      if (state == 'loadingText') {
        this.isLoading = true
        $el.addClass(d).attr(d, d).prop(d, true)
      } else if (this.isLoading) {
        this.isLoading = false
        $el.removeClass(d).removeAttr(d).prop(d, false)
      }
    }, this), 0)
  }

  Button.prototype.toggle = function () {
    var changed = true
    var $parent = this.$element.closest('[data-toggle="buttons"]')

    if ($parent.length) {
      var $input = this.$element.find('input')
      if ($input.prop('type') == 'radio') {
        if ($input.prop('checked')) changed = false
        $parent.find('.active').removeClass('active')
        this.$element.addClass('active')
      } else if ($input.prop('type') == 'checkbox') {
        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
        this.$element.toggleClass('active')
      }
      $input.prop('checked', this.$element.hasClass('active'))
      if (changed) $input.trigger('change')
    } else {
      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
      this.$element.toggleClass('active')
    }
  }


  // BUTTON PLUGIN DEFINITION
  // ========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.button')
      var options = typeof option == 'object' && option

      if (!data) $this.data('bs.button', (data = new Button(this, options)))

      if (option == 'toggle') data.toggle()
      else if (option) data.setState(option)
    })
  }

  var old = $.fn.button

  $.fn.button             = Plugin
  $.fn.button.Constructor = Button


  // BUTTON NO CONFLICT
  // ==================

  $.fn.button.noConflict = function () {
    $.fn.button = old
    return this
  }


  // BUTTON DATA-API
  // ===============

  $(document)
    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
      var $btn = $(e.target).closest('.btn')
      Plugin.call($btn, 'toggle')
      if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
        // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
        e.preventDefault()
        // The target component still receive the focus
        if ($btn.is('input,button')) $btn.trigger('focus')
        else $btn.find('input:visible,button:visible').first().trigger('focus')
      }
    })
    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
    })

}(jQuery);

/* ========================================================================
 * Bootstrap: carousel.js v3.3.7
 * http://getbootstrap.com/javascript/#carousel
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // CAROUSEL CLASS DEFINITION
  // =========================

  var Carousel = function (element, options) {
    this.$element    = $(element)
    this.$indicators = this.$element.find('.carousel-indicators')
    this.options     = options
    this.paused      = null
    this.sliding     = null
    this.interval    = null
    this.$active     = null
    this.$items      = null

    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))

    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
  }

  Carousel.VERSION  = '3.3.7'

  Carousel.TRANSITION_DURATION = 600

  Carousel.DEFAULTS = {
    interval: 5000,
    pause: 'hover',
    wrap: true,
    keyboard: true
  }

  Carousel.prototype.keydown = function (e) {
    if (/input|textarea/i.test(e.target.tagName)) return
    switch (e.which) {
      case 37: this.prev(); break
      case 39: this.next(); break
      default: return
    }

    e.preventDefault()
  }

  Carousel.prototype.cycle = function (e) {
    e || (this.paused = false)

    this.interval && clearInterval(this.interval)

    this.options.interval
      && !this.paused
      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))

    return this
  }

  Carousel.prototype.getItemIndex = function (item) {
    this.$items = item.parent().children('.item')
    return this.$items.index(item || this.$active)
  }

  Carousel.prototype.getItemForDirection = function (direction, active) {
    var activeIndex = this.getItemIndex(active)
    var willWrap = (direction == 'prev' && activeIndex === 0)
                || (direction == 'next' && activeIndex == (this.$items.length - 1))
    if (willWrap && !this.options.wrap) return active
    var delta = direction == 'prev' ? -1 : 1
    var itemIndex = (activeIndex + delta) % this.$items.length
    return this.$items.eq(itemIndex)
  }

  Carousel.prototype.to = function (pos) {
    var that        = this
    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))

    if (pos > (this.$items.length - 1) || pos < 0) return

    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
    if (activeIndex == pos) return this.pause().cycle()

    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
  }

  Carousel.prototype.pause = function (e) {
    e || (this.paused = true)

    if (this.$element.find('.next, .prev').length && $.support.transition) {
      this.$element.trigger($.support.transition.end)
      this.cycle(true)
    }

    this.interval = clearInterval(this.interval)

    return this
  }

  Carousel.prototype.next = function () {
    if (this.sliding) return
    return this.slide('next')
  }

  Carousel.prototype.prev = function () {
    if (this.sliding) return
    return this.slide('prev')
  }

  Carousel.prototype.slide = function (type, next) {
    var $active   = this.$element.find('.item.active')
    var $next     = next || this.getItemForDirection(type, $active)
    var isCycling = this.interval
    var direction = type == 'next' ? 'left' : 'right'
    var that      = this

    if ($next.hasClass('active')) return (this.sliding = false)

    var relatedTarget = $next[0]
    var slideEvent = $.Event('slide.bs.carousel', {
      relatedTarget: relatedTarget,
      direction: direction
    })
    this.$element.trigger(slideEvent)
    if (slideEvent.isDefaultPrevented()) return

    this.sliding = true

    isCycling && this.pause()

    if (this.$indicators.length) {
      this.$indicators.find('.active').removeClass('active')
      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
      $nextIndicator && $nextIndicator.addClass('active')
    }

    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
    if ($.support.transition && this.$element.hasClass('slide')) {
      $next.addClass(type)
      $next[0].offsetWidth // force reflow
      $active.addClass(direction)
      $next.addClass(direction)
      $active
        .one('bsTransitionEnd', function () {
          $next.removeClass([type, direction].join(' ')).addClass('active')
          $active.removeClass(['active', direction].join(' '))
          that.sliding = false
          setTimeout(function () {
            that.$element.trigger(slidEvent)
          }, 0)
        })
        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
    } else {
      $active.removeClass('active')
      $next.addClass('active')
      this.sliding = false
      this.$element.trigger(slidEvent)
    }

    isCycling && this.cycle()

    return this
  }


  // CAROUSEL PLUGIN DEFINITION
  // ==========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.carousel')
      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
      var action  = typeof option == 'string' ? option : options.slide

      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
      if (typeof option == 'number') data.to(option)
      else if (action) data[action]()
      else if (options.interval) data.pause().cycle()
    })
  }

  var old = $.fn.carousel

  $.fn.carousel             = Plugin
  $.fn.carousel.Constructor = Carousel


  // CAROUSEL NO CONFLICT
  // ====================

  $.fn.carousel.noConflict = function () {
    $.fn.carousel = old
    return this
  }


  // CAROUSEL DATA-API
  // =================

  var clickHandler = function (e) {
    var href
    var $this   = $(this)
    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
    if (!$target.hasClass('carousel')) return
    var options = $.extend({}, $target.data(), $this.data())
    var slideIndex = $this.attr('data-slide-to')
    if (slideIndex) options.interval = false

    Plugin.call($target, options)

    if (slideIndex) {
      $target.data('bs.carousel').to(slideIndex)
    }

    e.preventDefault()
  }

  $(document)
    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)

  $(window).on('load', function () {
    $('[data-ride="carousel"]').each(function () {
      var $carousel = $(this)
      Plugin.call($carousel, $carousel.data())
    })
  })

}(jQuery);

/* ========================================================================
 * Bootstrap: collapse.js v3.3.7
 * http://getbootstrap.com/javascript/#collapse
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */

/* jshint latedef: false */

+function ($) {
  'use strict';

  // COLLAPSE PUBLIC CLASS DEFINITION
  // ================================

  var Collapse = function (element, options) {
    this.$element      = $(element)
    this.options       = $.extend({}, Collapse.DEFAULTS, options)
    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
    this.transitioning = null

    if (this.options.parent) {
      this.$parent = this.getParent()
    } else {
      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
    }

    if (this.options.toggle) this.toggle()
  }

  Collapse.VERSION  = '3.3.7'

  Collapse.TRANSITION_DURATION = 350

  Collapse.DEFAULTS = {
    toggle: true
  }

  Collapse.prototype.dimension = function () {
    var hasWidth = this.$element.hasClass('width')
    return hasWidth ? 'width' : 'height'
  }

  Collapse.prototype.show = function () {
    if (this.transitioning || this.$element.hasClass('in')) return

    var activesData
    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')

    if (actives && actives.length) {
      activesData = actives.data('bs.collapse')
      if (activesData && activesData.transitioning) return
    }

    var startEvent = $.Event('show.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return

    if (actives && actives.length) {
      Plugin.call(actives, 'hide')
      activesData || actives.data('bs.collapse', null)
    }

    var dimension = this.dimension()

    this.$element
      .removeClass('collapse')
      .addClass('collapsing')[dimension](0)
      .attr('aria-expanded', true)

    this.$trigger
      .removeClass('collapsed')
      .attr('aria-expanded', true)

    this.transitioning = 1

    var complete = function () {
      this.$element
        .removeClass('collapsing')
        .addClass('collapse in')[dimension]('')
      this.transitioning = 0
      this.$element
        .trigger('shown.bs.collapse')
    }

    if (!$.support.transition) return complete.call(this)

    var scrollSize = $.camelCase(['scroll', dimension].join('-'))

    this.$element
      .one('bsTransitionEnd', $.proxy(complete, this))
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
  }

  Collapse.prototype.hide = function () {
    if (this.transitioning || !this.$element.hasClass('in')) return

    var startEvent = $.Event('hide.bs.collapse')
    this.$element.trigger(startEvent)
    if (startEvent.isDefaultPrevented()) return

    var dimension = this.dimension()

    this.$element[dimension](this.$element[dimension]())[0].offsetHeight

    this.$element
      .addClass('collapsing')
      .removeClass('collapse in')
      .attr('aria-expanded', false)

    this.$trigger
      .addClass('collapsed')
      .attr('aria-expanded', false)

    this.transitioning = 1

    var complete = function () {
      this.transitioning = 0
      this.$element
        .removeClass('collapsing')
        .addClass('collapse')
        .trigger('hidden.bs.collapse')
    }

    if (!$.support.transition) return complete.call(this)

    this.$element
      [dimension](0)
      .one('bsTransitionEnd', $.proxy(complete, this))
      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
  }

  Collapse.prototype.toggle = function () {
    this[this.$element.hasClass('in') ? 'hide' : 'show']()
  }

  Collapse.prototype.getParent = function () {
    return $(this.options.parent)
      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
      .each($.proxy(function (i, element) {
        var $element = $(element)
        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
      }, this))
      .end()
  }

  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
    var isOpen = $element.hasClass('in')

    $element.attr('aria-expanded', isOpen)
    $trigger
      .toggleClass('collapsed', !isOpen)
      .attr('aria-expanded', isOpen)
  }

  function getTargetFromTrigger($trigger) {
    var href
    var target = $trigger.attr('data-target')
      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7

    return $(target)
  }


  // COLLAPSE PLUGIN DEFINITION
  // ==========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.collapse')
      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)

      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.collapse

  $.fn.collapse             = Plugin
  $.fn.collapse.Constructor = Collapse


  // COLLAPSE NO CONFLICT
  // ====================

  $.fn.collapse.noConflict = function () {
    $.fn.collapse = old
    return this
  }


  // COLLAPSE DATA-API
  // =================

  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
    var $this   = $(this)

    if (!$this.attr('data-target')) e.preventDefault()

    var $target = getTargetFromTrigger($this)
    var data    = $target.data('bs.collapse')
    var option  = data ? 'toggle' : $this.data()

    Plugin.call($target, option)
  })

}(jQuery);

/* ========================================================================
 * Bootstrap: dropdown.js v3.3.7
 * http://getbootstrap.com/javascript/#dropdowns
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // DROPDOWN CLASS DEFINITION
  // =========================

  var backdrop = '.dropdown-backdrop'
  var toggle   = '[data-toggle="dropdown"]'
  var Dropdown = function (element) {
    $(element).on('click.bs.dropdown', this.toggle)
  }

  Dropdown.VERSION = '3.3.7'

  function getParent($this) {
    var selector = $this.attr('data-target')

    if (!selector) {
      selector = $this.attr('href')
      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }

    var $parent = selector && $(selector)

    return $parent && $parent.length ? $parent : $this.parent()
  }

  function clearMenus(e) {
    if (e && e.which === 3) return
    $(backdrop).remove()
    $(toggle).each(function () {
      var $this         = $(this)
      var $parent       = getParent($this)
      var relatedTarget = { relatedTarget: this }

      if (!$parent.hasClass('open')) return

      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return

      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))

      if (e.isDefaultPrevented()) return

      $this.attr('aria-expanded', 'false')
      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
    })
  }

  Dropdown.prototype.toggle = function (e) {
    var $this = $(this)

    if ($this.is('.disabled, :disabled')) return

    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')

    clearMenus()

    if (!isActive) {
      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
        // if mobile we use a backdrop because click events don't delegate
        $(document.createElement('div'))
          .addClass('dropdown-backdrop')
          .insertAfter($(this))
          .on('click', clearMenus)
      }

      var relatedTarget = { relatedTarget: this }
      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))

      if (e.isDefaultPrevented()) return

      $this
        .trigger('focus')
        .attr('aria-expanded', 'true')

      $parent
        .toggleClass('open')
        .trigger($.Event('shown.bs.dropdown', relatedTarget))
    }

    return false
  }

  Dropdown.prototype.keydown = function (e) {
    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return

    var $this = $(this)

    e.preventDefault()
    e.stopPropagation()

    if ($this.is('.disabled, :disabled')) return

    var $parent  = getParent($this)
    var isActive = $parent.hasClass('open')

    if (!isActive && e.which != 27 || isActive && e.which == 27) {
      if (e.which == 27) $parent.find(toggle).trigger('focus')
      return $this.trigger('click')
    }

    var desc = ' li:not(.disabled):visible a'
    var $items = $parent.find('.dropdown-menu' + desc)

    if (!$items.length) return

    var index = $items.index(e.target)

    if (e.which == 38 && index > 0)                 index--         // up
    if (e.which == 40 && index < $items.length - 1) index++         // down
    if (!~index)                                    index = 0

    $items.eq(index).trigger('focus')
  }


  // DROPDOWN PLUGIN DEFINITION
  // ==========================

  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.dropdown')

      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
      if (typeof option == 'string') data[option].call($this)
    })
  }

  var old = $.fn.dropdown

  $.fn.dropdown             = Plugin
  $.fn.dropdown.Constructor = Dropdown


  // DROPDOWN NO CONFLICT
  // ====================

  $.fn.dropdown.noConflict = function () {
    $.fn.dropdown = old
    return this
  }


  // APPLY TO STANDARD DROPDOWN ELEMENTS
  // ===================================

  $(document)
    .on('click.bs.dropdown.data-api', clearMenus)
    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)

}(jQuery);

/* ========================================================================
 * Bootstrap: modal.js v3.3.7
 * http://getbootstrap.com/javascript/#modals
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // MODAL CLASS DEFINITION
  // ======================

  var Modal = function (element, options) {
    this.options             = options
    this.$body               = $(document.body)
    this.$element            = $(element)
    this.$dialog             = this.$element.find('.modal-dialog')
    this.$backdrop           = null
    this.isShown             = null
    this.originalBodyPad     = null
    this.scrollbarWidth      = 0
    this.ignoreBackdropClick = false

    if (this.options.remote) {
      this.$element
        .find('.modal-content')
        .load(this.options.remote, $.proxy(function () {
          this.$element.trigger('loaded.bs.modal')
        }, this))
    }
  }

  Modal.VERSION  = '3.3.7'

  Modal.TRANSITION_DURATION = 300
  Modal.BACKDROP_TRANSITION_DURATION = 150

  Modal.DEFAULTS = {
    backdrop: true,
    keyboard: true,
    show: true
  }

  Modal.prototype.toggle = function (_relatedTarget) {
    return this.isShown ? this.hide() : this.show(_relatedTarget)
  }

  Modal.prototype.show = function (_relatedTarget) {
    var that = this
    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })

    this.$element.trigger(e)

    if (this.isShown || e.isDefaultPrevented()) return

    this.isShown = true

    this.checkScrollbar()
    this.setScrollbar()
    this.$body.addClass('modal-open')

    this.escape()
    this.resize()

    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))

    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
      })
    })

    this.backdrop(function () {
      var transition = $.support.transition && that.$element.hasClass('fade')

      if (!that.$element.parent().length) {
        that.$element.appendTo(that.$body) // don't move modals dom position
      }

      that.$element
        .show()
        .scrollTop(0)

      that.adjustDialog()

      if (transition) {
        that.$element[0].offsetWidth // force reflow
      }

      that.$element.addClass('in')

      that.enforceFocus()

      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })

      transition ?
        that.$dialog // wait for modal to slide in
          .one('bsTransitionEnd', function () {
            that.$element.trigger('focus').trigger(e)
          })
          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
        that.$element.trigger('focus').trigger(e)
    })
  }

  Modal.prototype.hide = function (e) {
    if (e) e.preventDefault()

    e = $.Event('hide.bs.modal')

    this.$element.trigger(e)

    if (!this.isShown || e.isDefaultPrevented()) return

    this.isShown = false

    this.escape()
    this.resize()

    $(document).off('focusin.bs.modal')

    this.$element
      .removeClass('in')
      .off('click.dismiss.bs.modal')
      .off('mouseup.dismiss.bs.modal')

    this.$dialog.off('mousedown.dismiss.bs.modal')

    $.support.transition && this.$element.hasClass('fade') ?
      this.$element
        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
      this.hideModal()
  }

  Modal.prototype.enforceFocus = function () {
    $(document)
      .off('focusin.bs.modal') // guard against infinite focus loop
      .on('focusin.bs.modal', $.proxy(function (e) {
        if (document !== e.target &&
            this.$element[0] !== e.target &&
            !this.$element.has(e.target).length) {
          this.$element.trigger('focus')
        }
      }, this))
  }

  Modal.prototype.escape = function () {
    if (this.isShown && this.options.keyboard) {
      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
        e.which == 27 && this.hide()
      }, this))
    } else if (!this.isShown) {
      this.$element.off('keydown.dismiss.bs.modal')
    }
  }

  Modal.prototype.resize = function () {
    if (this.isShown) {
      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
    } else {
      $(window).off('resize.bs.modal')
    }
  }

  Modal.prototype.hideModal = function () {
    var that = this
    this.$element.hide()
    this.backdrop(function () {
      that.$body.removeClass('modal-open')
      that.resetAdjustments()
      that.resetScrollbar()
      that.$element.trigger('hidden.bs.modal')
    })
  }

  Modal.prototype.removeBackdrop = function () {
    this.$backdrop && this.$backdrop.remove()
    this.$backdrop = null
  }

  Modal.prototype.backdrop = function (callback) {
    var that = this
    var animate = this.$element.hasClass('fade') ? 'fade' : ''

    if (this.isShown && this.options.backdrop) {
      var doAnimate = $.support.transition && animate

      this.$backdrop = $(document.createElement('div'))
        .addClass('modal-backdrop ' + animate)
        .appendTo(this.$body)

      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
        if (this.ignoreBackdropClick) {
          this.ignoreBackdropClick = false
          return
        }
        if (e.target !== e.currentTarget) return
        this.options.backdrop == 'static'
          ? this.$element[0].focus()
          : this.hide()
      }, this))

      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow

      this.$backdrop.addClass('in')

      if (!callback) return

      doAnimate ?
        this.$backdrop
          .one('bsTransitionEnd', callback)
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
        callback()

    } else if (!this.isShown && this.$backdrop) {
      this.$backdrop.removeClass('in')

      var callbackRemove = function () {
        that.removeBackdrop()
        callback && callback()
      }
      $.support.transition && this.$element.hasClass('fade') ?
        this.$backdrop
          .one('bsTransitionEnd', callbackRemove)
          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
        callbackRemove()

    } else if (callback) {
      callback()
    }
  }

  // these following methods are used to handle overflowing modals

  Modal.prototype.handleUpdate = function () {
    this.adjustDialog()
  }

  Modal.prototype.adjustDialog = function () {
    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight

    this.$element.css({
      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
    })
  }

  Modal.prototype.resetAdjustments = function () {
    this.$element.css({
      paddingLeft: '',
      paddingRight: ''
    })
  }

  Modal.prototype.checkScrollbar = function () {
    var fullWindowWidth = window.innerWidth
    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
      var documentElementRect = document.documentElement.getBoundingClientRect()
      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
    }
    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
    this.scrollbarWidth = this.measureScrollbar()
  }

  Modal.prototype.setScrollbar = function () {
    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
    this.originalBodyPad = document.body.style.paddingRight || ''
    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
  }

  Modal.prototype.resetScrollbar = function () {
    this.$body.css('padding-right', this.originalBodyPad)
  }

  Modal.prototype.measureScrollbar = function () { // thx walsh
    var scrollDiv = document.createElement('div')
    scrollDiv.className = 'modal-scrollbar-measure'
    this.$body.append(scrollDiv)
    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
    this.$body[0].removeChild(scrollDiv)
    return scrollbarWidth
  }


  // MODAL PLUGIN DEFINITION
  // =======================

  function Plugin(option, _relatedTarget) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.modal')
      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)

      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
      if (typeof option == 'string') data[option](_relatedTarget)
      else if (options.show) data.show(_relatedTarget)
    })
  }

  var old = $.fn.modal

  $.fn.modal             = Plugin
  $.fn.modal.Constructor = Modal


  // MODAL NO CONFLICT
  // =================

  $.fn.modal.noConflict = function () {
    $.fn.modal = old
    return this
  }


  // MODAL DATA-API
  // ==============

  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
    var $this   = $(this)
    var href    = $this.attr('href')
    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())

    if ($this.is('a')) e.preventDefault()

    $target.one('show.bs.modal', function (showEvent) {
      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
      $target.one('hidden.bs.modal', function () {
        $this.is(':visible') && $this.trigger('focus')
      })
    })
    Plugin.call($target, option, this)
  })

}(jQuery);

/* ========================================================================
 * Bootstrap: tooltip.js v3.3.7
 * http://getbootstrap.com/javascript/#tooltip
 * Inspired by the original jQuery.tipsy by Jason Frame
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // TOOLTIP PUBLIC CLASS DEFINITION
  // ===============================

  var Tooltip = function (element, options) {
    this.type       = null
    this.options    = null
    this.enabled    = null
    this.timeout    = null
    this.hoverState = null
    this.$element   = null
    this.inState    = null

    this.init('tooltip', element, options)
  }

  Tooltip.VERSION  = '3.3.7'

  Tooltip.TRANSITION_DURATION = 150

  Tooltip.DEFAULTS = {
    animation: true,
    placement: 'top',
    selector: false,
    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
    trigger: 'hover focus',
    title: '',
    delay: 0,
    html: false,
    container: false,
    viewport: {
      selector: 'body',
      padding: 0
    }
  }

  Tooltip.prototype.init = function (type, element, options) {
    this.enabled   = true
    this.type      = type
    this.$element  = $(element)
    this.options   = this.getOptions(options)
    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
    this.inState   = { click: false, hover: false, focus: false }

    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
    }

    var triggers = this.options.trigger.split(' ')

    for (var i = triggers.length; i--;) {
      var trigger = triggers[i]

      if (trigger == 'click') {
        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
      } else if (trigger != 'manual') {
        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'

        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
      }
    }

    this.options.selector ?
      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
      this.fixTitle()
  }

  Tooltip.prototype.getDefaults = function () {
    return Tooltip.DEFAULTS
  }

  Tooltip.prototype.getOptions = function (options) {
    options = $.extend({}, this.getDefaults(), this.$element.data(), options)

    if (options.delay && typeof options.delay == 'number') {
      options.delay = {
        show: options.delay,
        hide: options.delay
      }
    }

    return options
  }

  Tooltip.prototype.getDelegateOptions = function () {
    var options  = {}
    var defaults = this.getDefaults()

    this._options && $.each(this._options, function (key, value) {
      if (defaults[key] != value) options[key] = value
    })

    return options
  }

  Tooltip.prototype.enter = function (obj) {
    var self = obj instanceof this.constructor ?
      obj : $(obj.currentTarget).data('bs.' + this.type)

    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
    }

    if (obj instanceof $.Event) {
      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
    }

    if (self.tip().hasClass('in') || self.hoverState == 'in') {
      self.hoverState = 'in'
      return
    }

    clearTimeout(self.timeout)

    self.hoverState = 'in'

    if (!self.options.delay || !self.options.delay.show) return self.show()

    self.timeout = setTimeout(function () {
      if (self.hoverState == 'in') self.show()
    }, self.options.delay.show)
  }

  Tooltip.prototype.isInStateTrue = function () {
    for (var key in this.inState) {
      if (this.inState[key]) return true
    }

    return false
  }

  Tooltip.prototype.leave = function (obj) {
    var self = obj instanceof this.constructor ?
      obj : $(obj.currentTarget).data('bs.' + this.type)

    if (!self) {
      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
      $(obj.currentTarget).data('bs.' + this.type, self)
    }

    if (obj instanceof $.Event) {
      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
    }

    if (self.isInStateTrue()) return

    clearTimeout(self.timeout)

    self.hoverState = 'out'

    if (!self.options.delay || !self.options.delay.hide) return self.hide()

    self.timeout = setTimeout(function () {
      if (self.hoverState == 'out') self.hide()
    }, self.options.delay.hide)
  }

  Tooltip.prototype.show = function () {
    var e = $.Event('show.bs.' + this.type)

    if (this.hasContent() && this.enabled) {
      this.$element.trigger(e)

      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
      if (e.isDefaultPrevented() || !inDom) return
      var that = this

      var $tip = this.tip()

      var tipId = this.getUID(this.type)

      this.setContent()
      $tip.attr('id', tipId)
      this.$element.attr('aria-describedby', tipId)

      if (this.options.animation) $tip.addClass('fade')

      var placement = typeof this.options.placement == 'function' ?
        this.options.placement.call(this, $tip[0], this.$element[0]) :
        this.options.placement

      var autoToken = /\s?auto?\s?/i
      var autoPlace = autoToken.test(placement)
      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'

      $tip
        .detach()
        .css({ top: 0, left: 0, display: 'block' })
        .addClass(placement)
        .data('bs.' + this.type, this)

      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
      this.$element.trigger('inserted.bs.' + this.type)

      var pos          = this.getPosition()
      var actualWidth  = $tip[0].offsetWidth
      var actualHeight = $tip[0].offsetHeight

      if (autoPlace) {
        var orgPlacement = placement
        var viewportDim = this.getPosition(this.$viewport)

        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
                    placement

        $tip
          .removeClass(orgPlacement)
          .addClass(placement)
      }

      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)

      this.applyPlacement(calculatedOffset, placement)

      var complete = function () {
        var prevHoverState = that.hoverState
        that.$element.trigger('shown.bs.' + that.type)
        that.hoverState = null

        if (prevHoverState == 'out') that.leave(that)
      }

      $.support.transition && this.$tip.hasClass('fade') ?
        $tip
          .one('bsTransitionEnd', complete)
          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
        complete()
    }
  }

  Tooltip.prototype.applyPlacement = function (offset, placement) {
    var $tip   = this.tip()
    var width  = $tip[0].offsetWidth
    var height = $tip[0].offsetHeight

    // manually read margins because getBoundingClientRect includes difference
    var marginTop = parseInt($tip.css('margin-top'), 10)
    var marginLeft = parseInt($tip.css('margin-left'), 10)

    // we must check for NaN for ie 8/9
    if (isNaN(marginTop))  marginTop  = 0
    if (isNaN(marginLeft)) marginLeft = 0

    offset.top  += marginTop
    offset.left += marginLeft

    // $.fn.offset doesn't round pixel values
    // so we use setOffset directly with our own function B-0
    $.offset.setOffset($tip[0], $.extend({
      using: function (props) {
        $tip.css({
          top: Math.round(props.top),
          left: Math.round(props.left)
        })
      }
    }, offset), 0)

    $tip.addClass('in')

    // check to see if placing tip in new offset caused the tip to resize itself
    var actualWidth  = $tip[0].offsetWidth
    var actualHeight = $tip[0].offsetHeight

    if (placement == 'top' && actualHeight != height) {
      offset.top = offset.top + height - actualHeight
    }

    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)

    if (delta.left) offset.left += delta.left
    else offset.top += delta.top

    var isVertical          = /top|bottom/.test(placement)
    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'

    $tip.offset(offset)
    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
  }

  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
    this.arrow()
      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
      .css(isVertical ? 'top' : 'left', '')
  }

  Tooltip.prototype.setContent = function () {
    var $tip  = this.tip()
    var title = this.getTitle()

    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
    $tip.removeClass('fade in top bottom left right')
  }

  Tooltip.prototype.hide = function (callback) {
    var that = this
    var $tip = $(this.$tip)
    var e    = $.Event('hide.bs.' + this.type)

    function complete() {
      if (that.hoverState != 'in') $tip.detach()
      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
        that.$element
          .removeAttr('aria-describedby')
          .trigger('hidden.bs.' + that.type)
      }
      callback && callback()
    }

    this.$element.trigger(e)

    if (e.isDefaultPrevented()) return

    $tip.removeClass('in')

    $.support.transition && $tip.hasClass('fade') ?
      $tip
        .one('bsTransitionEnd', complete)
        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
      complete()

    this.hoverState = null

    return this
  }

  Tooltip.prototype.fixTitle = function () {
    var $e = this.$element
    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
    }
  }

  Tooltip.prototype.hasContent = function () {
    return this.getTitle()
  }

  Tooltip.prototype.getPosition = function ($element) {
    $element   = $element || this.$element

    var el     = $element[0]
    var isBody = el.tagName == 'BODY'

    var elRect    = el.getBoundingClientRect()
    if (elRect.width == null) {
      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
    }
    var isSvg = window.SVGElement && el instanceof window.SVGElement
    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
    // See https://github.com/twbs/bootstrap/issues/20280
    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null

    return $.extend({}, elRect, scroll, outerDims, elOffset)
  }

  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }

  }

  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
    var delta = { top: 0, left: 0 }
    if (!this.$viewport) return delta

    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
    var viewportDimensions = this.getPosition(this.$viewport)

    if (/right|left/.test(placement)) {
      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
      if (topEdgeOffset < viewportDimensions.top) { // top overflow
        delta.top = viewportDimensions.top - topEdgeOffset
      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
      }
    } else {
      var leftEdgeOffset  = pos.left - viewportPadding
      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
        delta.left = viewportDimensions.left - leftEdgeOffset
      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
      }
    }

    return delta
  }

  Tooltip.prototype.getTitle = function () {
    var title
    var $e = this.$element
    var o  = this.options

    title = $e.attr('data-original-title')
      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)

    return title
  }

  Tooltip.prototype.getUID = function (prefix) {
    do prefix += ~~(Math.random() * 1000000)
    while (document.getElementById(prefix))
    return prefix
  }

  Tooltip.prototype.tip = function () {
    if (!this.$tip) {
      this.$tip = $(this.options.template)
      if (this.$tip.length != 1) {
        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
      }
    }
    return this.$tip
  }

  Tooltip.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
  }

  Tooltip.prototype.enable = function () {
    this.enabled = true
  }

  Tooltip.prototype.disable = function () {
    this.enabled = false
  }

  Tooltip.prototype.toggleEnabled = function () {
    this.enabled = !this.enabled
  }

  Tooltip.prototype.toggle = function (e) {
    var self = this
    if (e) {
      self = $(e.currentTarget).data('bs.' + this.type)
      if (!self) {
        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
        $(e.currentTarget).data('bs.' + this.type, self)
      }
    }

    if (e) {
      self.inState.click = !self.inState.click
      if (self.isInStateTrue()) self.enter(self)
      else self.leave(self)
    } else {
      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
    }
  }

  Tooltip.prototype.destroy = function () {
    var that = this
    clearTimeout(this.timeout)
    this.hide(function () {
      that.$element.off('.' + that.type).removeData('bs.' + that.type)
      if (that.$tip) {
        that.$tip.detach()
      }
      that.$tip = null
      that.$arrow = null
      that.$viewport = null
      that.$element = null
    })
  }


  // TOOLTIP PLUGIN DEFINITION
  // =========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.tooltip')
      var options = typeof option == 'object' && option

      if (!data && /destroy|hide/.test(option)) return
      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.tooltip

  $.fn.tooltip             = Plugin
  $.fn.tooltip.Constructor = Tooltip


  // TOOLTIP NO CONFLICT
  // ===================

  $.fn.tooltip.noConflict = function () {
    $.fn.tooltip = old
    return this
  }

}(jQuery);

/* ========================================================================
 * Bootstrap: popover.js v3.3.7
 * http://getbootstrap.com/javascript/#popovers
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // POPOVER PUBLIC CLASS DEFINITION
  // ===============================

  var Popover = function (element, options) {
    this.init('popover', element, options)
  }

  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')

  Popover.VERSION  = '3.3.7'

  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
    placement: 'right',
    trigger: 'click',
    content: '',
    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
  })


  // NOTE: POPOVER EXTENDS tooltip.js
  // ================================

  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)

  Popover.prototype.constructor = Popover

  Popover.prototype.getDefaults = function () {
    return Popover.DEFAULTS
  }

  Popover.prototype.setContent = function () {
    var $tip    = this.tip()
    var title   = this.getTitle()
    var content = this.getContent()

    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
    ](content)

    $tip.removeClass('fade top bottom left right in')

    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
    // this manually by checking the contents.
    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
  }

  Popover.prototype.hasContent = function () {
    return this.getTitle() || this.getContent()
  }

  Popover.prototype.getContent = function () {
    var $e = this.$element
    var o  = this.options

    return $e.attr('data-content')
      || (typeof o.content == 'function' ?
            o.content.call($e[0]) :
            o.content)
  }

  Popover.prototype.arrow = function () {
    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
  }


  // POPOVER PLUGIN DEFINITION
  // =========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.popover')
      var options = typeof option == 'object' && option

      if (!data && /destroy|hide/.test(option)) return
      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.popover

  $.fn.popover             = Plugin
  $.fn.popover.Constructor = Popover


  // POPOVER NO CONFLICT
  // ===================

  $.fn.popover.noConflict = function () {
    $.fn.popover = old
    return this
  }

}(jQuery);

/* ========================================================================
 * Bootstrap: scrollspy.js v3.3.7
 * http://getbootstrap.com/javascript/#scrollspy
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // SCROLLSPY CLASS DEFINITION
  // ==========================

  function ScrollSpy(element, options) {
    this.$body          = $(document.body)
    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
    this.selector       = (this.options.target || '') + ' .nav li > a'
    this.offsets        = []
    this.targets        = []
    this.activeTarget   = null
    this.scrollHeight   = 0

    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
    this.refresh()
    this.process()
  }

  ScrollSpy.VERSION  = '3.3.7'

  ScrollSpy.DEFAULTS = {
    offset: 10
  }

  ScrollSpy.prototype.getScrollHeight = function () {
    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
  }

  ScrollSpy.prototype.refresh = function () {
    var that          = this
    var offsetMethod  = 'offset'
    var offsetBase    = 0

    this.offsets      = []
    this.targets      = []
    this.scrollHeight = this.getScrollHeight()

    if (!$.isWindow(this.$scrollElement[0])) {
      offsetMethod = 'position'
      offsetBase   = this.$scrollElement.scrollTop()
    }

    this.$body
      .find(this.selector)
      .map(function () {
        var $el   = $(this)
        var href  = $el.data('target') || $el.attr('href')
        var $href = /^#./.test(href) && $(href)

        return ($href
          && $href.length
          && $href.is(':visible')
          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
      })
      .sort(function (a, b) { return a[0] - b[0] })
      .each(function () {
        that.offsets.push(this[0])
        that.targets.push(this[1])
      })
  }

  ScrollSpy.prototype.process = function () {
    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
    var scrollHeight = this.getScrollHeight()
    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
    var offsets      = this.offsets
    var targets      = this.targets
    var activeTarget = this.activeTarget
    var i

    if (this.scrollHeight != scrollHeight) {
      this.refresh()
    }

    if (scrollTop >= maxScroll) {
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
    }

    if (activeTarget && scrollTop < offsets[0]) {
      this.activeTarget = null
      return this.clear()
    }

    for (i = offsets.length; i--;) {
      activeTarget != targets[i]
        && scrollTop >= offsets[i]
        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
        && this.activate(targets[i])
    }
  }

  ScrollSpy.prototype.activate = function (target) {
    this.activeTarget = target

    this.clear()

    var selector = this.selector +
      '[data-target="' + target + '"],' +
      this.selector + '[href="' + target + '"]'

    var active = $(selector)
      .parents('li')
      .addClass('active')

    if (active.parent('.dropdown-menu').length) {
      active = active
        .closest('li.dropdown')
        .addClass('active')
    }

    active.trigger('activate.bs.scrollspy')
  }

  ScrollSpy.prototype.clear = function () {
    $(this.selector)
      .parentsUntil(this.options.target, '.active')
      .removeClass('active')
  }


  // SCROLLSPY PLUGIN DEFINITION
  // ===========================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.scrollspy')
      var options = typeof option == 'object' && option

      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.scrollspy

  $.fn.scrollspy             = Plugin
  $.fn.scrollspy.Constructor = ScrollSpy


  // SCROLLSPY NO CONFLICT
  // =====================

  $.fn.scrollspy.noConflict = function () {
    $.fn.scrollspy = old
    return this
  }


  // SCROLLSPY DATA-API
  // ==================

  $(window).on('load.bs.scrollspy.data-api', function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      Plugin.call($spy, $spy.data())
    })
  })

}(jQuery);

/* ========================================================================
 * Bootstrap: tab.js v3.3.7
 * http://getbootstrap.com/javascript/#tabs
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // TAB CLASS DEFINITION
  // ====================

  var Tab = function (element) {
    // jscs:disable requireDollarBeforejQueryAssignment
    this.element = $(element)
    // jscs:enable requireDollarBeforejQueryAssignment
  }

  Tab.VERSION = '3.3.7'

  Tab.TRANSITION_DURATION = 150

  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.data('target')

    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
    }

    if ($this.parent('li').hasClass('active')) return

    var $previous = $ul.find('.active:last a')
    var hideEvent = $.Event('hide.bs.tab', {
      relatedTarget: $this[0]
    })
    var showEvent = $.Event('show.bs.tab', {
      relatedTarget: $previous[0]
    })

    $previous.trigger(hideEvent)
    $this.trigger(showEvent)

    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return

    var $target = $(selector)

    this.activate($this.closest('li'), $ul)
    this.activate($target, $target.parent(), function () {
      $previous.trigger({
        type: 'hidden.bs.tab',
        relatedTarget: $this[0]
      })
      $this.trigger({
        type: 'shown.bs.tab',
        relatedTarget: $previous[0]
      })
    })
  }

  Tab.prototype.activate = function (element, container, callback) {
    var $active    = container.find('> .active')
    var transition = callback
      && $.support.transition
      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)

    function next() {
      $active
        .removeClass('active')
        .find('> .dropdown-menu > .active')
          .removeClass('active')
        .end()
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', false)

      element
        .addClass('active')
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', true)

      if (transition) {
        element[0].offsetWidth // reflow for transition
        element.addClass('in')
      } else {
        element.removeClass('fade')
      }

      if (element.parent('.dropdown-menu').length) {
        element
          .closest('li.dropdown')
            .addClass('active')
          .end()
          .find('[data-toggle="tab"]')
            .attr('aria-expanded', true)
      }

      callback && callback()
    }

    $active.length && transition ?
      $active
        .one('bsTransitionEnd', next)
        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
      next()

    $active.removeClass('in')
  }


  // TAB PLUGIN DEFINITION
  // =====================

  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.tab')

      if (!data) $this.data('bs.tab', (data = new Tab(this)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.tab

  $.fn.tab             = Plugin
  $.fn.tab.Constructor = Tab


  // TAB NO CONFLICT
  // ===============

  $.fn.tab.noConflict = function () {
    $.fn.tab = old
    return this
  }


  // TAB DATA-API
  // ============

  var clickHandler = function (e) {
    e.preventDefault()
    Plugin.call($(this), 'show')
  }

  $(document)
    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)

}(jQuery);

/* ========================================================================
 * Bootstrap: affix.js v3.3.7
 * http://getbootstrap.com/javascript/#affix
 * ========================================================================
 * Copyright 2011-2016 Twitter, Inc.
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
 * ======================================================================== */


+function ($) {
  'use strict';

  // AFFIX CLASS DEFINITION
  // ======================

  var Affix = function (element, options) {
    this.options = $.extend({}, Affix.DEFAULTS, options)

    this.$target = $(this.options.target)
      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))

    this.$element     = $(element)
    this.affixed      = null
    this.unpin        = null
    this.pinnedOffset = null

    this.checkPosition()
  }

  Affix.VERSION  = '3.3.7'

  Affix.RESET    = 'affix affix-top affix-bottom'

  Affix.DEFAULTS = {
    offset: 0,
    target: window
  }

  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
    var scrollTop    = this.$target.scrollTop()
    var position     = this.$element.offset()
    var targetHeight = this.$target.height()

    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false

    if (this.affixed == 'bottom') {
      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
    }

    var initializing   = this.affixed == null
    var colliderTop    = initializing ? scrollTop : position.top
    var colliderHeight = initializing ? targetHeight : height

    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'

    return false
  }

  Affix.prototype.getPinnedOffset = function () {
    if (this.pinnedOffset) return this.pinnedOffset
    this.$element.removeClass(Affix.RESET).addClass('affix')
    var scrollTop = this.$target.scrollTop()
    var position  = this.$element.offset()
    return (this.pinnedOffset = position.top - scrollTop)
  }

  Affix.prototype.checkPositionWithEventLoop = function () {
    setTimeout($.proxy(this.checkPosition, this), 1)
  }

  Affix.prototype.checkPosition = function () {
    if (!this.$element.is(':visible')) return

    var height       = this.$element.height()
    var offset       = this.options.offset
    var offsetTop    = offset.top
    var offsetBottom = offset.bottom
    var scrollHeight = Math.max($(document).height(), $(document.body).height())

    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)

    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)

    if (this.affixed != affix) {
      if (this.unpin != null) this.$element.css('top', '')

      var affixType = 'affix' + (affix ? '-' + affix : '')
      var e         = $.Event(affixType + '.bs.affix')

      this.$element.trigger(e)

      if (e.isDefaultPrevented()) return

      this.affixed = affix
      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null

      this.$element
        .removeClass(Affix.RESET)
        .addClass(affixType)
        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
    }

    if (affix == 'bottom') {
      this.$element.offset({
        top: scrollHeight - height - offsetBottom
      })
    }
  }


  // AFFIX PLUGIN DEFINITION
  // =======================

  function Plugin(option) {
    return this.each(function () {
      var $this   = $(this)
      var data    = $this.data('bs.affix')
      var options = typeof option == 'object' && option

      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }

  var old = $.fn.affix

  $.fn.affix             = Plugin
  $.fn.affix.Constructor = Affix


  // AFFIX NO CONFLICT
  // =================

  $.fn.affix.noConflict = function () {
    $.fn.affix = old
    return this
  }


  // AFFIX DATA-API
  // ==============

  $(window).on('load', function () {
    $('[data-spy="affix"]').each(function () {
      var $spy = $(this)
      var data = $spy.data()

      data.offset = data.offset || {}

      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
      if (data.offsetTop    != null) data.offset.top    = data.offsetTop

      Plugin.call($spy, data)
    })
  })

}(jQuery);
/*
     _ _      _       _
 ___| (_) ___| | __  (_)___
/ __| | |/ __| |/ /  | / __|
\__ \ | | (__|   < _ | \__ \
|___/_|_|\___|_|\_(_)/ |___/
                   |__/

 Version: 1.6.0
  Author: Ken Wheeler
 Website: http://kenwheeler.github.io
    Docs: http://kenwheeler.github.io/slick
    Repo: http://github.com/kenwheeler/slick
  Issues: http://github.com/kenwheeler/slick/issues

 */
/* global window, document, define, jQuery, setInterval, clearInterval */
(function(factory) {
    'use strict';
    if (typeof define === 'function' && define.amd) {
        define(['jquery'], factory);
    } else if (typeof exports !== 'undefined') {
        module.exports = factory(require('jquery'));
    } else {
        factory(jQuery);
    }

}(function(jQuery) {
    'use strict';
    var Slick = window.Slick || {};

    Slick = (function() {

        var instanceUid = 0;

        function Slick(element, settings) {

            var _ = this, dataSettings;

            _.defaults = {
                accessibility: true,
                adaptiveHeight: false,
                appendArrows: jQuery(element),
                appendDots: jQuery(element),
                arrows: true,
                asNavFor: null,
                prevArrow: '<button type="button" data-role="none" class="slick-prev" aria-label="Previous" tabindex="0" role="button">Previous</button>',
                nextArrow: '<button type="button" data-role="none" class="slick-next" aria-label="Next" tabindex="0" role="button">Next</button>',
                autoplay: false,
                autoplaySpeed: 3000,
                centerMode: false,
                centerPadding: '50px',
                cssEase: 'ease',
                customPaging: function(slider, i) {
                    return jQuery('<button type="button" data-role="none" role="button" tabindex="0" />').text(i + 1);
                },
                dots: false,
                dotsClass: 'slick-dots',
                draggable: true,
                easing: 'linear',
                edgeFriction: 0.35,
                fade: false,
                focusOnSelect: false,
                infinite: true,
                initialSlide: 0,
                lazyLoad: 'ondemand',
                mobileFirst: false,
                pauseOnHover: true,
                pauseOnFocus: true,
                pauseOnDotsHover: false,
                respondTo: 'window',
                responsive: null,
                rows: 1,
                rtl: false,
                slide: '',
                slidesPerRow: 1,
                slidesToShow: 1,
                slidesToScroll: 1,
                speed: 500,
                swipe: true,
                swipeToSlide: false,
                touchMove: true,
                touchThreshold: 5,
                useCSS: true,
                useTransform: true,
                variableWidth: false,
                vertical: false,
                verticalSwiping: false,
                waitForAnimate: true,
                zIndex: 1000
            };

            _.initials = {
                animating: false,
                dragging: false,
                autoPlayTimer: null,
                currentDirection: 0,
                currentLeft: null,
                currentSlide: 0,
                direction: 1,
                jQuerydots: null,
                listWidth: null,
                listHeight: null,
                loadIndex: 0,
                jQuerynextArrow: null,
                jQueryprevArrow: null,
                slideCount: null,
                slideWidth: null,
                jQueryslideTrack: null,
                jQueryslides: null,
                sliding: false,
                slideOffset: 0,
                swipeLeft: null,
                jQuerylist: null,
                touchObject: {},
                transformsEnabled: false,
                unslicked: false
            };

            jQuery.extend(_, _.initials);

            _.activeBreakpoint = null;
            _.animType = null;
            _.animProp = null;
            _.breakpoints = [];
            _.breakpointSettings = [];
            _.cssTransitions = false;
            _.focussed = false;
            _.interrupted = false;
            _.hidden = 'hidden';
            _.paused = true;
            _.positionProp = null;
            _.respondTo = null;
            _.rowCount = 1;
            _.shouldClick = true;
            _.jQueryslider = jQuery(element);
            _.jQueryslidesCache = null;
            _.transformType = null;
            _.transitionType = null;
            _.visibilityChange = 'visibilitychange';
            _.windowWidth = 0;
            _.windowTimer = null;

            dataSettings = jQuery(element).data('slick') || {};

            _.options = jQuery.extend({}, _.defaults, settings, dataSettings);

            _.currentSlide = _.options.initialSlide;

            _.originalSettings = _.options;

            if (typeof document.mozHidden !== 'undefined') {
                _.hidden = 'mozHidden';
                _.visibilityChange = 'mozvisibilitychange';
            } else if (typeof document.webkitHidden !== 'undefined') {
                _.hidden = 'webkitHidden';
                _.visibilityChange = 'webkitvisibilitychange';
            }

            _.autoPlay = jQuery.proxy(_.autoPlay, _);
            _.autoPlayClear = jQuery.proxy(_.autoPlayClear, _);
            _.autoPlayIterator = jQuery.proxy(_.autoPlayIterator, _);
            _.changeSlide = jQuery.proxy(_.changeSlide, _);
            _.clickHandler = jQuery.proxy(_.clickHandler, _);
            _.selectHandler = jQuery.proxy(_.selectHandler, _);
            _.setPosition = jQuery.proxy(_.setPosition, _);
            _.swipeHandler = jQuery.proxy(_.swipeHandler, _);
            _.dragHandler = jQuery.proxy(_.dragHandler, _);
            _.keyHandler = jQuery.proxy(_.keyHandler, _);

            _.instanceUid = instanceUid++;

            // A simple way to check for HTML strings
            // Strict HTML recognition (must start with <)
            // Extracted from jQuery v1.11 source
            _.htmlExpr = /^(?:\s*(<[\w\W]+>)[^>]*)$/;


            _.registerBreakpoints();
            _.init(true);

        }

        return Slick;

    }());

    Slick.prototype.activateADA = function() {
        var _ = this;

        _.jQueryslideTrack.find('.slick-active').attr({
            'aria-hidden': 'false'
        }).find('a, input, button, select').attr({
            'tabindex': '0'
        });

    };

    Slick.prototype.addSlide = Slick.prototype.slickAdd = function(markup, index, addBefore) {

        var _ = this;

        if (typeof(index) === 'boolean') {
            addBefore = index;
            index = null;
        } else if (index < 0 || (index >= _.slideCount)) {
            return false;
        }

        _.unload();

        if (typeof(index) === 'number') {
            if (index === 0 && _.jQueryslides.length === 0) {
                jQuery(markup).appendTo(_.jQueryslideTrack);
            } else if (addBefore) {
                jQuery(markup).insertBefore(_.jQueryslides.eq(index));
            } else {
                jQuery(markup).insertAfter(_.jQueryslides.eq(index));
            }
        } else {
            if (addBefore === true) {
                jQuery(markup).prependTo(_.jQueryslideTrack);
            } else {
                jQuery(markup).appendTo(_.jQueryslideTrack);
            }
        }

        _.jQueryslides = _.jQueryslideTrack.children(this.options.slide);

        _.jQueryslideTrack.children(this.options.slide).detach();

        _.jQueryslideTrack.append(_.jQueryslides);

        _.jQueryslides.each(function(index, element) {
            jQuery(element).attr('data-slick-index', index);
        });

        _.jQueryslidesCache = _.jQueryslides;

        _.reinit();

    };

    Slick.prototype.animateHeight = function() {
        var _ = this;
        if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {
            var targetHeight = _.jQueryslides.eq(_.currentSlide).outerHeight(true);
            _.jQuerylist.animate({
                height: targetHeight
            }, _.options.speed);
        }
    };

    Slick.prototype.animateSlide = function(targetLeft, callback) {

        var animProps = {},
            _ = this;

        _.animateHeight();

        if (_.options.rtl === true && _.options.vertical === false) {
            targetLeft = -targetLeft;
        }
        if (_.transformsEnabled === false) {
            if (_.options.vertical === false) {
                _.jQueryslideTrack.animate({
                    left: targetLeft
                }, _.options.speed, _.options.easing, callback);
            } else {
                _.jQueryslideTrack.animate({
                    top: targetLeft
                }, _.options.speed, _.options.easing, callback);
            }

        } else {

            if (_.cssTransitions === false) {
                if (_.options.rtl === true) {
                    _.currentLeft = -(_.currentLeft);
                }
                jQuery({
                    animStart: _.currentLeft
                }).animate({
                    animStart: targetLeft
                }, {
                    duration: _.options.speed,
                    easing: _.options.easing,
                    step: function(now) {
                        now = Math.ceil(now);
                        if (_.options.vertical === false) {
                            animProps[_.animType] = 'translate(' +
                                now + 'px, 0px)';
                            _.jQueryslideTrack.css(animProps);
                        } else {
                            animProps[_.animType] = 'translate(0px,' +
                                now + 'px)';
                            _.jQueryslideTrack.css(animProps);
                        }
                    },
                    complete: function() {
                        if (callback) {
                            callback.call();
                        }
                    }
                });

            } else {

                _.applyTransition();
                targetLeft = Math.ceil(targetLeft);

                if (_.options.vertical === false) {
                    animProps[_.animType] = 'translate3d(' + targetLeft + 'px, 0px, 0px)';
                } else {
                    animProps[_.animType] = 'translate3d(0px,' + targetLeft + 'px, 0px)';
                }
                _.jQueryslideTrack.css(animProps);

                if (callback) {
                    setTimeout(function() {

                        _.disableTransition();

                        callback.call();
                    }, _.options.speed);
                }

            }

        }

    };

    Slick.prototype.getNavTarget = function() {

        var _ = this,
            asNavFor = _.options.asNavFor;

        if ( asNavFor && asNavFor !== null ) {
            asNavFor = jQuery(asNavFor).not(_.jQueryslider);
        }

        return asNavFor;

    };

    Slick.prototype.asNavFor = function(index) {

        var _ = this,
            asNavFor = _.getNavTarget();

        if ( asNavFor !== null && typeof asNavFor === 'object' ) {
            asNavFor.each(function() {
                var target = jQuery(this).slick('getSlick');
                if(!target.unslicked) {
                    target.slideHandler(index, true);
                }
            });
        }

    };

    Slick.prototype.applyTransition = function(slide) {

        var _ = this,
            transition = {};

        if (_.options.fade === false) {
            transition[_.transitionType] = _.transformType + ' ' + _.options.speed + 'ms ' + _.options.cssEase;
        } else {
            transition[_.transitionType] = 'opacity ' + _.options.speed + 'ms ' + _.options.cssEase;
        }

        if (_.options.fade === false) {
            _.jQueryslideTrack.css(transition);
        } else {
            _.jQueryslides.eq(slide).css(transition);
        }

    };

    Slick.prototype.autoPlay = function() {

        var _ = this;

        _.autoPlayClear();

        if ( _.slideCount > _.options.slidesToShow ) {
            _.autoPlayTimer = setInterval( _.autoPlayIterator, _.options.autoplaySpeed );
        }

    };

    Slick.prototype.autoPlayClear = function() {

        var _ = this;

        if (_.autoPlayTimer) {
            clearInterval(_.autoPlayTimer);
        }

    };

    Slick.prototype.autoPlayIterator = function() {

        var _ = this,
            slideTo = _.currentSlide + _.options.slidesToScroll;

        if ( !_.paused && !_.interrupted && !_.focussed ) {

            if ( _.options.infinite === false ) {

                if ( _.direction === 1 && ( _.currentSlide + 1 ) === ( _.slideCount - 1 )) {
                    _.direction = 0;
                }

                else if ( _.direction === 0 ) {

                    slideTo = _.currentSlide - _.options.slidesToScroll;

                    if ( _.currentSlide - 1 === 0 ) {
                        _.direction = 1;
                    }

                }

            }

            _.slideHandler( slideTo );

        }

    };

    Slick.prototype.buildArrows = function() {

        var _ = this;

        if (_.options.arrows === true ) {

            _.jQueryprevArrow = jQuery(_.options.prevArrow).addClass('slick-arrow');
            _.jQuerynextArrow = jQuery(_.options.nextArrow).addClass('slick-arrow');

            if( _.slideCount > _.options.slidesToShow ) {

                _.jQueryprevArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex');
                _.jQuerynextArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex');

                if (_.htmlExpr.test(_.options.prevArrow)) {
                    _.jQueryprevArrow.prependTo(_.options.appendArrows);
                }

                if (_.htmlExpr.test(_.options.nextArrow)) {
                    _.jQuerynextArrow.appendTo(_.options.appendArrows);
                }

                if (_.options.infinite !== true) {
                    _.jQueryprevArrow
                        .addClass('slick-disabled')
                        .attr('aria-disabled', 'true');
                }

            } else {

                _.jQueryprevArrow.add( _.jQuerynextArrow )

                    .addClass('slick-hidden')
                    .attr({
                        'aria-disabled': 'true',
                        'tabindex': '-1'
                    });

            }

        }

    };

    Slick.prototype.buildDots = function() {

        var _ = this,
            i, dot;

        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {

            _.jQueryslider.addClass('slick-dotted');

            dot = jQuery('<ul />').addClass(_.options.dotsClass);

            for (i = 0; i <= _.getDotCount(); i += 1) {
                dot.append(jQuery('<li />').append(_.options.customPaging.call(this, _, i)));
            }

            _.jQuerydots = dot.appendTo(_.options.appendDots);

            _.jQuerydots.find('li').first().addClass('slick-active').attr('aria-hidden', 'false');

        }

    };

    Slick.prototype.buildOut = function() {

        var _ = this;

        _.jQueryslides =
            _.jQueryslider
                .children( _.options.slide + ':not(.slick-cloned)')
                .addClass('slick-slide');

        _.slideCount = _.jQueryslides.length;

        _.jQueryslides.each(function(index, element) {
            jQuery(element)
                .attr('data-slick-index', index)
                .data('originalStyling', jQuery(element).attr('style') || '');
        });

        _.jQueryslider.addClass('slick-slider');

        _.jQueryslideTrack = (_.slideCount === 0) ?
            jQuery('<div class="slick-track"/>').appendTo(_.jQueryslider) :
            _.jQueryslides.wrapAll('<div class="slick-track"/>').parent();

        _.jQuerylist = _.jQueryslideTrack.wrap(
            '<div aria-live="polite" class="slick-list"/>').parent();
        _.jQueryslideTrack.css('opacity', 0);

        if (_.options.centerMode === true || _.options.swipeToSlide === true) {
            _.options.slidesToScroll = 1;
        }

        jQuery('img[data-lazy]', _.jQueryslider).not('[src]').addClass('slick-loading');

        _.setupInfinite();

        _.buildDots();

        _.updateDots();

        _.buildArrows();

        _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);

        if (_.options.draggable === true) {
            _.jQuerylist.addClass('draggable');
        }

    };

    Slick.prototype.buildRows = function() {

        var _ = this, a, b, c, newSlides, numOfSlides, originalSlides,slidesPerSection;

        newSlides = document.createDocumentFragment();
        originalSlides = _.jQueryslider.children();

        if(_.options.rows > 0) {

            slidesPerSection = _.options.slidesPerRow * _.options.rows;
            numOfSlides = Math.ceil(
                originalSlides.length / slidesPerSection
            );

            for(a = 0; a < numOfSlides; a++){
                var slide = document.createElement('div');
                for(b = 0; b < _.options.rows; b++) {
                    var row = document.createElement('div');
                    for(c = 0; c < _.options.slidesPerRow; c++) {
                        var target = (a * slidesPerSection + ((b * _.options.slidesPerRow) + c));
                        if (originalSlides.get(target)) {
                            row.appendChild(originalSlides.get(target));
                        }
                    }
                    slide.appendChild(row);
                }
                newSlides.appendChild(slide);
            }

            _.jQueryslider.empty().append(newSlides);
            _.jQueryslider.children().children().children()
                .css({
                    'width':(100 / _.options.slidesPerRow) + '%',
                    'display': 'inline-block'
                });

        }

    };

    Slick.prototype.checkResponsive = function(initial, forceUpdate) {

        var _ = this,
            breakpoint, targetBreakpoint, respondToWidth, triggerBreakpoint = false;
        var sliderWidth = _.jQueryslider.width();
        var windowWidth = window.innerWidth || jQuery(window).width();

        if (_.respondTo === 'window') {
            respondToWidth = windowWidth;
        } else if (_.respondTo === 'slider') {
            respondToWidth = sliderWidth;
        } else if (_.respondTo === 'min') {
            respondToWidth = Math.min(windowWidth, sliderWidth);
        }

        if ( _.options.responsive &&
            _.options.responsive.length &&
            _.options.responsive !== null) {

            targetBreakpoint = null;

            for (breakpoint in _.breakpoints) {
                if (_.breakpoints.hasOwnProperty(breakpoint)) {
                    if (_.originalSettings.mobileFirst === false) {
                        if (respondToWidth < _.breakpoints[breakpoint]) {
                            targetBreakpoint = _.breakpoints[breakpoint];
                        }
                    } else {
                        if (respondToWidth > _.breakpoints[breakpoint]) {
                            targetBreakpoint = _.breakpoints[breakpoint];
                        }
                    }
                }
            }

            if (targetBreakpoint !== null) {
                if (_.activeBreakpoint !== null) {
                    if (targetBreakpoint !== _.activeBreakpoint || forceUpdate) {
                        _.activeBreakpoint =
                            targetBreakpoint;
                        if (_.breakpointSettings[targetBreakpoint] === 'unslick') {
                            _.unslick(targetBreakpoint);
                        } else {
                            _.options = jQuery.extend({}, _.originalSettings,
                                _.breakpointSettings[
                                    targetBreakpoint]);
                            if (initial === true) {
                                _.currentSlide = _.options.initialSlide;
                            }
                            _.refresh(initial);
                        }
                        triggerBreakpoint = targetBreakpoint;
                    }
                } else {
                    _.activeBreakpoint = targetBreakpoint;
                    if (_.breakpointSettings[targetBreakpoint] === 'unslick') {
                        _.unslick(targetBreakpoint);
                    } else {
                        _.options = jQuery.extend({}, _.originalSettings,
                            _.breakpointSettings[
                                targetBreakpoint]);
                        if (initial === true) {
                            _.currentSlide = _.options.initialSlide;
                        }
                        _.refresh(initial);
                    }
                    triggerBreakpoint = targetBreakpoint;
                }
            } else {
                if (_.activeBreakpoint !== null) {
                    _.activeBreakpoint = null;
                    _.options = _.originalSettings;
                    if (initial === true) {
                        _.currentSlide = _.options.initialSlide;
                    }
                    _.refresh(initial);
                    triggerBreakpoint = targetBreakpoint;
                }
            }

            // only trigger breakpoints during an actual break. not on initialize.
            if( !initial && triggerBreakpoint !== false ) {
                _.jQueryslider.trigger('breakpoint', [_, triggerBreakpoint]);
            }
        }

    };

    Slick.prototype.changeSlide = function(event, dontAnimate) {

        var _ = this,
            jQuerytarget = jQuery(event.currentTarget),
            indexOffset, slideOffset, unevenOffset;

        // If target is a link, prevent default action.
        if(jQuerytarget.is('a')) {
            event.preventDefault();
        }

        // If target is not the <li> element (ie: a child), find the <li>.
        if(!jQuerytarget.is('li')) {
            jQuerytarget = jQuerytarget.closest('li');
        }

        unevenOffset = (_.slideCount % _.options.slidesToScroll !== 0);
        indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) % _.options.slidesToScroll;

        switch (event.data.message) {

            case 'previous':
                slideOffset = indexOffset === 0 ? _.options.slidesToScroll : _.options.slidesToShow - indexOffset;
                if (_.slideCount > _.options.slidesToShow) {
                    _.slideHandler(_.currentSlide - slideOffset, false, dontAnimate);
                }
                break;

            case 'next':
                slideOffset = indexOffset === 0 ? _.options.slidesToScroll : indexOffset;
                if (_.slideCount > _.options.slidesToShow) {
                    _.slideHandler(_.currentSlide + slideOffset, false, dontAnimate);
                }
                break;

            case 'index':
                var index = event.data.index === 0 ? 0 :
                    event.data.index || jQuerytarget.index() * _.options.slidesToScroll;

                _.slideHandler(_.checkNavigable(index), false, dontAnimate);
                jQuerytarget.children().trigger('focus');
                break;

            default:
                return;
        }

    };

    Slick.prototype.checkNavigable = function(index) {

        var _ = this,
            navigables, prevNavigable;

        navigables = _.getNavigableIndexes();
        prevNavigable = 0;
        if (index > navigables[navigables.length - 1]) {
            index = navigables[navigables.length - 1];
        } else {
            for (var n in navigables) {
                if (index < navigables[n]) {
                    index = prevNavigable;
                    break;
                }
                prevNavigable = navigables[n];
            }
        }

        return index;
    };

    Slick.prototype.cleanUpEvents = function() {

        var _ = this;

        if (_.options.dots && _.jQuerydots !== null) {

            jQuery('li', _.jQuerydots)
                .off('click.slick', _.changeSlide)
                .off('mouseenter.slick', jQuery.proxy(_.interrupt, _, true))
                .off('mouseleave.slick', jQuery.proxy(_.interrupt, _, false));

        }

        _.jQueryslider.off('focus.slick blur.slick');

        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
            _.jQueryprevArrow && _.jQueryprevArrow.off('click.slick', _.changeSlide);
            _.jQuerynextArrow && _.jQuerynextArrow.off('click.slick', _.changeSlide);
        }

        _.jQuerylist.off('touchstart.slick mousedown.slick', _.swipeHandler);
        _.jQuerylist.off('touchmove.slick mousemove.slick', _.swipeHandler);
        _.jQuerylist.off('touchend.slick mouseup.slick', _.swipeHandler);
        _.jQuerylist.off('touchcancel.slick mouseleave.slick', _.swipeHandler);

        _.jQuerylist.off('click.slick', _.clickHandler);

        jQuery(document).off(_.visibilityChange, _.visibility);

        _.cleanUpSlideEvents();

        if (_.options.accessibility === true) {
            _.jQuerylist.off('keydown.slick', _.keyHandler);
        }

        if (_.options.focusOnSelect === true) {
            jQuery(_.jQueryslideTrack).children().off('click.slick', _.selectHandler);
        }

        jQuery(window).off('orientationchange.slick.slick-' + _.instanceUid, _.orientationChange);

        jQuery(window).off('resize.slick.slick-' + _.instanceUid, _.resize);

        jQuery('[draggable!=true]', _.jQueryslideTrack).off('dragstart', _.preventDefault);

        jQuery(window).off('load.slick.slick-' + _.instanceUid, _.setPosition);
        jQuery(document).off('ready.slick.slick-' + _.instanceUid, _.setPosition);

    };

    Slick.prototype.cleanUpSlideEvents = function() {

        var _ = this;

        _.jQuerylist.off('mouseenter.slick', jQuery.proxy(_.interrupt, _, true));
        _.jQuerylist.off('mouseleave.slick', jQuery.proxy(_.interrupt, _, false));

    };

    Slick.prototype.cleanUpRows = function() {

        var _ = this, originalSlides;

        if(_.options.rows > 0) {
            originalSlides = _.jQueryslides.children().children();
            originalSlides.removeAttr('style');
            _.jQueryslider.empty().append(originalSlides);
        }

    };

    Slick.prototype.clickHandler = function(event) {

        var _ = this;

        if (_.shouldClick === false) {
            event.stopImmediatePropagation();
            event.stopPropagation();
            event.preventDefault();
        }

    };

    Slick.prototype.destroy = function(refresh) {

        var _ = this;

        _.autoPlayClear();

        _.touchObject = {};

        _.cleanUpEvents();

        jQuery('.slick-cloned', _.jQueryslider).detach();

        if (_.jQuerydots) {
            _.jQuerydots.remove();
        }


        if ( _.jQueryprevArrow && _.jQueryprevArrow.length ) {

            _.jQueryprevArrow
                .removeClass('slick-disabled slick-arrow slick-hidden')
                .removeAttr('aria-hidden aria-disabled tabindex')
                .css('display','');

            if ( _.htmlExpr.test( _.options.prevArrow )) {
                _.jQueryprevArrow.remove();
            }
        }

        if ( _.jQuerynextArrow && _.jQuerynextArrow.length ) {

            _.jQuerynextArrow
                .removeClass('slick-disabled slick-arrow slick-hidden')
                .removeAttr('aria-hidden aria-disabled tabindex')
                .css('display','');

            if ( _.htmlExpr.test( _.options.nextArrow )) {
                _.jQuerynextArrow.remove();
            }

        }


        if (_.jQueryslides) {

            _.jQueryslides
                .removeClass('slick-slide slick-active slick-center slick-visible slick-current')
                .removeAttr('aria-hidden')
                .removeAttr('data-slick-index')
                .each(function(){
                    jQuery(this).attr('style', jQuery(this).data('originalStyling'));
                });

            _.jQueryslideTrack.children(this.options.slide).detach();

            _.jQueryslideTrack.detach();

            _.jQuerylist.detach();

            _.jQueryslider.append(_.jQueryslides);
        }

        _.cleanUpRows();

        _.jQueryslider.removeClass('slick-slider');
        _.jQueryslider.removeClass('slick-initialized');
        _.jQueryslider.removeClass('slick-dotted');

        _.unslicked = true;

        if(!refresh) {
            _.jQueryslider.trigger('destroy', [_]);
        }

    };

    Slick.prototype.disableTransition = function(slide) {

        var _ = this,
            transition = {};

        transition[_.transitionType] = '';

        if (_.options.fade === false) {
            _.jQueryslideTrack.css(transition);
        } else {
            _.jQueryslides.eq(slide).css(transition);
        }

    };

    Slick.prototype.fadeSlide = function(slideIndex, callback) {

        var _ = this;

        if (_.cssTransitions === false) {

            _.jQueryslides.eq(slideIndex).css({
                zIndex: _.options.zIndex
            });

            _.jQueryslides.eq(slideIndex).animate({
                opacity: 1
            }, _.options.speed, _.options.easing, callback);

        } else {

            _.applyTransition(slideIndex);

            _.jQueryslides.eq(slideIndex).css({
                opacity: 1,
                zIndex: _.options.zIndex
            });

            if (callback) {
                setTimeout(function() {

                    _.disableTransition(slideIndex);

                    callback.call();
                }, _.options.speed);
            }

        }

    };

    Slick.prototype.fadeSlideOut = function(slideIndex) {

        var _ = this;

        if (_.cssTransitions === false) {

            _.jQueryslides.eq(slideIndex).animate({
                opacity: 0,
                zIndex: _.options.zIndex - 2
            }, _.options.speed, _.options.easing);

        } else {

            _.applyTransition(slideIndex);

            _.jQueryslides.eq(slideIndex).css({
                opacity: 0,
                zIndex: _.options.zIndex - 2
            });

        }

    };

    Slick.prototype.filterSlides = Slick.prototype.slickFilter = function(filter) {

        var _ = this;

        if (filter !== null) {

            _.jQueryslidesCache = _.jQueryslides;

            _.unload();

            _.jQueryslideTrack.children(this.options.slide).detach();

            _.jQueryslidesCache.filter(filter).appendTo(_.jQueryslideTrack);

            _.reinit();

        }

    };

    Slick.prototype.focusHandler = function() {

        var _ = this;

        _.jQueryslider
            .off('focus.slick blur.slick')
            .on('focus.slick blur.slick',
                '*:not(.slick-arrow)', function(event) {

            event.stopImmediatePropagation();
            var jQuerysf = jQuery(this);

            setTimeout(function() {

                if( _.options.pauseOnFocus ) {
                    _.focussed = jQuerysf.is(':focus');
                    _.autoPlay();
                }

            }, 0);

        });
    };

    Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide = function() {

        var _ = this;
        return _.currentSlide;

    };

    Slick.prototype.getDotCount = function() {

        var _ = this;

        var breakPoint = 0;
        var counter = 0;
        var pagerQty = 0;

        if (_.options.infinite === true) {
            while (breakPoint < _.slideCount) {
                ++pagerQty;
                breakPoint = counter + _.options.slidesToScroll;
                counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
            }
        } else if (_.options.centerMode === true) {
            pagerQty = _.slideCount;
        } else if(!_.options.asNavFor) {
            pagerQty = 1 + Math.ceil((_.slideCount - _.options.slidesToShow) / _.options.slidesToScroll);
        }else {
            while (breakPoint < _.slideCount) {
                ++pagerQty;
                breakPoint = counter + _.options.slidesToScroll;
                counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
            }
        }

        return pagerQty - 1;

    };

    Slick.prototype.getLeft = function(slideIndex) {

        var _ = this,
            targetLeft,
            verticalHeight,
            verticalOffset = 0,
            targetSlide;

        _.slideOffset = 0;
        verticalHeight = _.jQueryslides.first().outerHeight(true);

        if (_.options.infinite === true) {
            if (_.slideCount > _.options.slidesToShow) {
                _.slideOffset = (_.slideWidth * _.options.slidesToShow) * -1;
                verticalOffset = (verticalHeight * _.options.slidesToShow) * -1;
            }
            if (_.slideCount % _.options.slidesToScroll !== 0) {
                if (slideIndex + _.options.slidesToScroll > _.slideCount && _.slideCount > _.options.slidesToShow) {
                    if (slideIndex > _.slideCount) {
                        _.slideOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * _.slideWidth) * -1;
                        verticalOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * verticalHeight) * -1;
                    } else {
                        _.slideOffset = ((_.slideCount % _.options.slidesToScroll) * _.slideWidth) * -1;
                        verticalOffset = ((_.slideCount % _.options.slidesToScroll) * verticalHeight) * -1;
                    }
                }
            }
        } else {
            if (slideIndex + _.options.slidesToShow > _.slideCount) {
                _.slideOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * _.slideWidth;
                verticalOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * verticalHeight;
            }
        }

        if (_.slideCount <= _.options.slidesToShow) {
            _.slideOffset = 0;
            verticalOffset = 0;
        }

        if (_.options.centerMode === true && _.options.infinite === true) {
            _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2) - _.slideWidth;
        } else if (_.options.centerMode === true) {
            _.slideOffset = 0;
            _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2);
        }

        if (_.options.vertical === false) {
            targetLeft = ((slideIndex * _.slideWidth) * -1) + _.slideOffset;
        } else {
            targetLeft = ((slideIndex * verticalHeight) * -1) + verticalOffset;
        }

        if (_.options.variableWidth === true) {

            if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {
                targetSlide = _.jQueryslideTrack.children('.slick-slide').eq(slideIndex);
            } else {
                targetSlide = _.jQueryslideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow);
            }

            if (_.options.rtl === true) {
                if (targetSlide[0]) {
                    targetLeft = (_.jQueryslideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;
                } else {
                    targetLeft =  0;
                }
            } else {
                targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;
            }

            if (_.options.centerMode === true) {
                if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {
                    targetSlide = _.jQueryslideTrack.children('.slick-slide').eq(slideIndex);
                } else {
                    targetSlide = _.jQueryslideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow + 1);
                }

                if (_.options.rtl === true) {
                    if (targetSlide[0]) {
                        targetLeft = (_.jQueryslideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1;
                    } else {
                        targetLeft =  0;
                    }
                } else {
                    targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;
                }

                targetLeft += (_.jQuerylist.width() - targetSlide.outerWidth()) / 2;
            }
        }

        return targetLeft;

    };

    Slick.prototype.getOption = Slick.prototype.slickGetOption = function(option) {

        var _ = this;

        return _.options[option];

    };

    Slick.prototype.getNavigableIndexes = function() {

        var _ = this,
            breakPoint = 0,
            counter = 0,
            indexes = [],
            max;

        if (_.options.infinite === false) {
            max = _.slideCount;
        } else {
            breakPoint = _.options.slidesToScroll * -1;
            counter = _.options.slidesToScroll * -1;
            max = _.slideCount * 2;
        }

        while (breakPoint < max) {
            indexes.push(breakPoint);
            breakPoint = counter + _.options.slidesToScroll;
            counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
        }

        return indexes;

    };

    Slick.prototype.getSlick = function() {

        return this;

    };

    Slick.prototype.getSlideCount = function() {

        var _ = this,
            slidesTraversed, swipedSlide, centerOffset;

        centerOffset = _.options.centerMode === true ? _.slideWidth * Math.floor(_.options.slidesToShow / 2) : 0;

        if (_.options.swipeToSlide === true) {
            _.jQueryslideTrack.find('.slick-slide').each(function(index, slide) {
                if (slide.offsetLeft - centerOffset + (jQuery(slide).outerWidth() / 2) > (_.swipeLeft * -1)) {
                    swipedSlide = slide;
                    return false;
                }
            });

            slidesTraversed = Math.abs(jQuery(swipedSlide).attr('data-slick-index') - _.currentSlide) || 1;

            return slidesTraversed;

        } else {
            return _.options.slidesToScroll;
        }

    };

    Slick.prototype.goTo = Slick.prototype.slickGoTo = function(slide, dontAnimate) {

        var _ = this;

        _.changeSlide({
            data: {
                message: 'index',
                index: parseInt(slide)
            }
        }, dontAnimate);

    };

    Slick.prototype.init = function(creation) {

        var _ = this;

        if (!jQuery(_.jQueryslider).hasClass('slick-initialized')) {

            jQuery(_.jQueryslider).addClass('slick-initialized');

            _.buildRows();
            _.buildOut();
            _.setProps();
            _.startLoad();
            _.loadSlider();
            _.initializeEvents();
            _.updateArrows();
            _.updateDots();
            _.checkResponsive(true);
            _.focusHandler();

        }

        if (creation) {
            _.jQueryslider.trigger('init', [_]);
        }

        if (_.options.accessibility === true) {
            _.initADA();
        }

        if ( _.options.autoplay ) {

            _.paused = false;
            _.autoPlay();

        }

    };

    Slick.prototype.initADA = function() {
        var _ = this;
        _.jQueryslides.add(_.jQueryslideTrack.find('.slick-cloned')).attr({
            'aria-hidden': 'true',
            'tabindex': '-1'
        }).find('a, input, button, select').attr({
            'tabindex': '-1'
        });

        _.jQueryslideTrack.attr('role', 'listbox');

        _.jQueryslides.not(_.jQueryslideTrack.find('.slick-cloned')).each(function(i) {
            jQuery(this).attr({
                'role': 'option',
                'aria-describedby': 'slick-slide' + _.instanceUid + i + ''
            });
        });

        if (_.jQuerydots !== null) {
            _.jQuerydots.attr('role', 'tablist').find('li').each(function(i) {
                jQuery(this).attr({
                    'role': 'presentation',
                    'aria-selected': 'false',
                    'aria-controls': 'navigation' + _.instanceUid + i + '',
                    'id': 'slick-slide' + _.instanceUid + i + ''
                });
            })
                .first().attr('aria-selected', 'true').end()
                .find('button').attr('role', 'button').end()
                .closest('div').attr('role', 'toolbar');
        }
        _.activateADA();

    };

    Slick.prototype.initArrowEvents = function() {

        var _ = this;

        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
            _.jQueryprevArrow
               .off('click.slick')
               .on('click.slick', {
                    message: 'previous'
               }, _.changeSlide);
            _.jQuerynextArrow
               .off('click.slick')
               .on('click.slick', {
                    message: 'next'
               }, _.changeSlide);
        }

    };

    Slick.prototype.initDotEvents = function() {

        var _ = this;

        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
            jQuery('li', _.jQuerydots).on('click.slick', {
                message: 'index'
            }, _.changeSlide);
        }

        if ( _.options.dots === true && _.options.pauseOnDotsHover === true ) {

            jQuery('li', _.jQuerydots)
                .on('mouseenter.slick', jQuery.proxy(_.interrupt, _, true))
                .on('mouseleave.slick', jQuery.proxy(_.interrupt, _, false));

        }

    };

    Slick.prototype.initSlideEvents = function() {

        var _ = this;

        if ( _.options.pauseOnHover ) {

            _.jQuerylist.on('mouseenter.slick', jQuery.proxy(_.interrupt, _, true));
            _.jQuerylist.on('mouseleave.slick', jQuery.proxy(_.interrupt, _, false));

        }

    };

    Slick.prototype.initializeEvents = function() {

        var _ = this;

        _.initArrowEvents();

        _.initDotEvents();
        _.initSlideEvents();

        _.jQuerylist.on('touchstart.slick mousedown.slick', {
            action: 'start'
        }, _.swipeHandler);
        _.jQuerylist.on('touchmove.slick mousemove.slick', {
            action: 'move'
        }, _.swipeHandler);
        _.jQuerylist.on('touchend.slick mouseup.slick', {
            action: 'end'
        }, _.swipeHandler);
        _.jQuerylist.on('touchcancel.slick mouseleave.slick', {
            action: 'end'
        }, _.swipeHandler);

        _.jQuerylist.on('click.slick', _.clickHandler);

        jQuery(document).on(_.visibilityChange, jQuery.proxy(_.visibility, _));

        if (_.options.accessibility === true) {
            _.jQuerylist.on('keydown.slick', _.keyHandler);
        }

        if (_.options.focusOnSelect === true) {
            jQuery(_.jQueryslideTrack).children().on('click.slick', _.selectHandler);
        }

        jQuery(window).on('orientationchange.slick.slick-' + _.instanceUid, jQuery.proxy(_.orientationChange, _));

        jQuery(window).on('resize.slick.slick-' + _.instanceUid, jQuery.proxy(_.resize, _));

        jQuery('[draggable!=true]', _.jQueryslideTrack).on('dragstart', _.preventDefault);

        jQuery(window).on('load.slick.slick-' + _.instanceUid, _.setPosition);
        jQuery(document).on('ready.slick.slick-' + _.instanceUid, _.setPosition);

    };

    Slick.prototype.initUI = function() {

        var _ = this;

        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {

            _.jQueryprevArrow.show();
            _.jQuerynextArrow.show();

        }

        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {

            _.jQuerydots.show();

        }

    };

    Slick.prototype.keyHandler = function(event) {

        var _ = this;
         //Dont slide if the cursor is inside the form fields and arrow keys are pressed
        if(!event.target.tagName.match('TEXTAREA|INPUT|SELECT')) {
            if (event.keyCode === 37 && _.options.accessibility === true) {
                _.changeSlide({
                    data: {
                        message: _.options.rtl === true ? 'next' :  'previous'
                    }
                });
            } else if (event.keyCode === 39 && _.options.accessibility === true) {
                _.changeSlide({
                    data: {
                        message: _.options.rtl === true ? 'previous' : 'next'
                    }
                });
            }
        }

    };

    Slick.prototype.lazyLoad = function() {

        var _ = this,
            loadRange, cloneRange, rangeStart, rangeEnd;

        function loadImages(imagesScope) {

            jQuery('img[data-lazy]', imagesScope).each(function() {

                var image = jQuery(this),
                    imageSource = jQuery(this).attr('data-lazy'),
                    imageToLoad = document.createElement('img');

                imageToLoad.onload = function() {

                    image
                        .animate({ opacity: 0 }, 100, function() {
                            image
                                .attr('src', imageSource)
                                .animate({ opacity: 1 }, 200, function() {
                                    image
                                        .removeAttr('data-lazy')
                                        .removeClass('slick-loading');
                                });
                            _.jQueryslider.trigger('lazyLoaded', [_, image, imageSource]);
                        });

                };

                imageToLoad.onerror = function() {

                    image
                        .removeAttr( 'data-lazy' )
                        .removeClass( 'slick-loading' )
                        .addClass( 'slick-lazyload-error' );

                    _.jQueryslider.trigger('lazyLoadError', [ _, image, imageSource ]);

                };

                imageToLoad.src = imageSource;

            });

        }

        if (_.options.centerMode === true) {
            if (_.options.infinite === true) {
                rangeStart = _.currentSlide + (_.options.slidesToShow / 2 + 1);
                rangeEnd = rangeStart + _.options.slidesToShow + 2;
            } else {
                rangeStart = Math.max(0, _.currentSlide - (_.options.slidesToShow / 2 + 1));
                rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) + _.currentSlide;
            }
        } else {
            rangeStart = _.options.infinite ? _.options.slidesToShow + _.currentSlide : _.currentSlide;
            rangeEnd = Math.ceil(rangeStart + _.options.slidesToShow);
            if (_.options.fade === true) {
                if (rangeStart > 0) rangeStart--;
                if (rangeEnd <= _.slideCount) rangeEnd++;
            }
        }

        loadRange = _.jQueryslider.find('.slick-slide').slice(rangeStart, rangeEnd);
        loadImages(loadRange);

        if (_.slideCount <= _.options.slidesToShow) {
            cloneRange = _.jQueryslider.find('.slick-slide');
            loadImages(cloneRange);
        } else
        if (_.currentSlide >= _.slideCount - _.options.slidesToShow) {
            cloneRange = _.jQueryslider.find('.slick-cloned').slice(0, _.options.slidesToShow);
            loadImages(cloneRange);
        } else if (_.currentSlide === 0) {
            cloneRange = _.jQueryslider.find('.slick-cloned').slice(_.options.slidesToShow * -1);
            loadImages(cloneRange);
        }

    };

    Slick.prototype.loadSlider = function() {

        var _ = this;

        _.setPosition();

        _.jQueryslideTrack.css({
            opacity: 1
        });

        _.jQueryslider.removeClass('slick-loading');

        _.initUI();

        if (_.options.lazyLoad === 'progressive') {
            _.progressiveLazyLoad();
        }

    };

    Slick.prototype.next = Slick.prototype.slickNext = function() {

        var _ = this;

        _.changeSlide({
            data: {
                message: 'next'
            }
        });

    };

    Slick.prototype.orientationChange = function() {

        var _ = this;

        _.checkResponsive();
        _.setPosition();

    };

    Slick.prototype.pause = Slick.prototype.slickPause = function() {

        var _ = this;

        _.autoPlayClear();
        _.paused = true;

    };

    Slick.prototype.play = Slick.prototype.slickPlay = function() {

        var _ = this;

        _.autoPlay();
        _.options.autoplay = true;
        _.paused = false;
        _.focussed = false;
        _.interrupted = false;

    };

    Slick.prototype.postSlide = function(index) {

        var _ = this;

        if( !_.unslicked ) {

            _.jQueryslider.trigger('afterChange', [_, index]);

            _.animating = false;

            _.setPosition();

            _.swipeLeft = null;

            if ( _.options.autoplay ) {
                _.autoPlay();
            }

            if (_.options.accessibility === true) {
                _.initADA();
            }

        }

    };

    Slick.prototype.prev = Slick.prototype.slickPrev = function() {

        var _ = this;

        _.changeSlide({
            data: {
                message: 'previous'
            }
        });

    };

    Slick.prototype.preventDefault = function(event) {

        event.preventDefault();

    };

    Slick.prototype.progressiveLazyLoad = function( tryCount ) {

        tryCount = tryCount || 1;

        var _ = this,
            jQueryimgsToLoad = jQuery( 'img[data-lazy]', _.jQueryslider ),
            image,
            imageSource,
            imageToLoad;

        if ( jQueryimgsToLoad.length ) {

            image = jQueryimgsToLoad.first();
            imageSource = image.attr('data-lazy');
            imageToLoad = document.createElement('img');

            imageToLoad.onload = function() {

                image
                    .attr( 'src', imageSource )
                    .removeAttr('data-lazy')
                    .removeClass('slick-loading');

                if ( _.options.adaptiveHeight === true ) {
                    _.setPosition();
                }

                _.jQueryslider.trigger('lazyLoaded', [ _, image, imageSource ]);
                _.progressiveLazyLoad();

            };

            imageToLoad.onerror = function() {

                if ( tryCount < 3 ) {

                    /**
                     * try to load the image 3 times,
                     * leave a slight delay so we don't get
                     * servers blocking the request.
                     */
                    setTimeout( function() {
                        _.progressiveLazyLoad( tryCount + 1 );
                    }, 500 );

                } else {

                    image
                        .removeAttr( 'data-lazy' )
                        .removeClass( 'slick-loading' )
                        .addClass( 'slick-lazyload-error' );

                    _.jQueryslider.trigger('lazyLoadError', [ _, image, imageSource ]);

                    _.progressiveLazyLoad();

                }

            };

            imageToLoad.src = imageSource;

        } else {

            _.jQueryslider.trigger('allImagesLoaded', [ _ ]);

        }

    };

    Slick.prototype.refresh = function( initializing ) {

        var _ = this, currentSlide, lastVisibleIndex;

        lastVisibleIndex = _.slideCount - _.options.slidesToShow;

        // in non-infinite sliders, we don't want to go past the
        // last visible index.
        if( !_.options.infinite && ( _.currentSlide > lastVisibleIndex )) {
            _.currentSlide = lastVisibleIndex;
        }

        // if less slides than to show, go to start.
        if ( _.slideCount <= _.options.slidesToShow ) {
            _.currentSlide = 0;

        }

        currentSlide = _.currentSlide;

        _.destroy(true);

        jQuery.extend(_, _.initials, { currentSlide: currentSlide });

        _.init();

        if( !initializing ) {

            _.changeSlide({
                data: {
                    message: 'index',
                    index: currentSlide
                }
            }, false);

        }

    };

    Slick.prototype.registerBreakpoints = function() {

        var _ = this, breakpoint, currentBreakpoint, l,
            responsiveSettings = _.options.responsive || null;

        if ( jQuery.type(responsiveSettings) === 'array' && responsiveSettings.length ) {

            _.respondTo = _.options.respondTo || 'window';

            for ( breakpoint in responsiveSettings ) {

                l = _.breakpoints.length-1;
                currentBreakpoint = responsiveSettings[breakpoint].breakpoint;

                if (responsiveSettings.hasOwnProperty(breakpoint)) {

                    // loop through the breakpoints and cut out any existing
                    // ones with the same breakpoint number, we don't want dupes.
                    while( l >= 0 ) {
                        if( _.breakpoints[l] && _.breakpoints[l] === currentBreakpoint ) {
                            _.breakpoints.splice(l,1);
                        }
                        l--;
                    }

                    _.breakpoints.push(currentBreakpoint);
                    _.breakpointSettings[currentBreakpoint] = responsiveSettings[breakpoint].settings;

                }

            }

            _.breakpoints.sort(function(a, b) {
                return ( _.options.mobileFirst ) ? a-b : b-a;
            });

        }

    };

    Slick.prototype.reinit = function() {

        var _ = this;

        _.jQueryslides =
            _.jQueryslideTrack
                .children(_.options.slide)
                .addClass('slick-slide');

        _.slideCount = _.jQueryslides.length;

        if (_.currentSlide >= _.slideCount && _.currentSlide !== 0) {
            _.currentSlide = _.currentSlide - _.options.slidesToScroll;
        }

        if (_.slideCount <= _.options.slidesToShow) {
            _.currentSlide = 0;
        }

        _.registerBreakpoints();

        _.setProps();
        _.setupInfinite();

        _.buildDots();
        _.updateDots();
        _.initDotEvents();
        _.buildArrows();
        _.updateArrows();
        _.initArrowEvents();
        _.cleanUpSlideEvents();
        _.initSlideEvents();

        _.checkResponsive(false, true);

        if (_.options.focusOnSelect === true) {
            jQuery(_.jQueryslideTrack).children().on('click.slick', _.selectHandler);
        }

        _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0);

        _.setPosition();
        _.focusHandler();

        _.paused = !_.options.autoplay;
        _.autoPlay();

        _.jQueryslider.trigger('reInit', [_]);

    };

    Slick.prototype.resize = function() {

        var _ = this;

        if (jQuery(window).width() !== _.windowWidth) {
            clearTimeout(_.windowDelay);
            _.windowDelay = window.setTimeout(function() {
                _.windowWidth = jQuery(window).width();
                _.checkResponsive();
                if( !_.unslicked ) { _.setPosition(); }
            }, 50);
        }
    };

    Slick.prototype.removeSlide = Slick.prototype.slickRemove = function(index, removeBefore, removeAll) {

        var _ = this;

        if (typeof(index) === 'boolean') {
            removeBefore = index;
            index = removeBefore === true ? 0 : _.slideCount - 1;
        } else {
            index = removeBefore === true ? --index : index;
        }

        if (_.slideCount < 1 || index < 0 || index > _.slideCount - 1) {
            return false;
        }

        _.unload();

        if (removeAll === true) {
            _.jQueryslideTrack.children().remove();
        } else {
            _.jQueryslideTrack.children(this.options.slide).eq(index).remove();
        }

        _.jQueryslides = _.jQueryslideTrack.children(this.options.slide);

        _.jQueryslideTrack.children(this.options.slide).detach();

        _.jQueryslideTrack.append(_.jQueryslides);

        _.jQueryslidesCache = _.jQueryslides;

        _.reinit();

    };

    Slick.prototype.setCSS = function(position) {

        var _ = this,
            positionProps = {},
            x, y;

        if (_.options.rtl === true) {
            position = -position;
        }
        x = _.positionProp == 'left' ? Math.ceil(position) + 'px' : '0px';
        y = _.positionProp == 'top' ? Math.ceil(position) + 'px' : '0px';

        positionProps[_.positionProp] = position;

        if (_.transformsEnabled === false) {
            _.jQueryslideTrack.css(positionProps);
        } else {
            positionProps = {};
            if (_.cssTransitions === false) {
                positionProps[_.animType] = 'translate(' + x + ', ' + y + ')';
                _.jQueryslideTrack.css(positionProps);
            } else {
                positionProps[_.animType] = 'translate3d(' + x + ', ' + y + ', 0px)';
                _.jQueryslideTrack.css(positionProps);
            }
        }

    };

    Slick.prototype.setDimensions = function() {

        var _ = this;

        if (_.options.vertical === false) {
            if (_.options.centerMode === true) {
                _.jQuerylist.css({
                    padding: ('0px ' + _.options.centerPadding)
                });
            }
        } else {
            _.jQuerylist.height(_.jQueryslides.first().outerHeight(true) * _.options.slidesToShow);
            if (_.options.centerMode === true) {
                _.jQuerylist.css({
                    padding: (_.options.centerPadding + ' 0px')
                });
            }
        }

        _.listWidth = _.jQuerylist.width();
        _.listHeight = _.jQuerylist.height();


        if (_.options.vertical === false && _.options.variableWidth === false) {
            _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow);
            _.jQueryslideTrack.width(Math.ceil((_.slideWidth * _.jQueryslideTrack.children('.slick-slide').length)));

        } else if (_.options.variableWidth === true) {
            _.jQueryslideTrack.width(5000 * _.slideCount);
        } else {
            _.slideWidth = Math.ceil(_.listWidth);
            _.jQueryslideTrack.height(Math.ceil((_.jQueryslides.first().outerHeight(true) * _.jQueryslideTrack.children('.slick-slide').length)));
        }

        var offset = _.jQueryslides.first().outerWidth(true) - _.jQueryslides.first().width();
        if (_.options.variableWidth === false) _.jQueryslideTrack.children('.slick-slide').width(_.slideWidth - offset);

    };

    Slick.prototype.setFade = function() {

        var _ = this,
            targetLeft;

        _.jQueryslides.each(function(index, element) {
            targetLeft = (_.slideWidth * index) * -1;
            if (_.options.rtl === true) {
                jQuery(element).css({
                    position: 'relative',
                    right: targetLeft,
                    top: 0,
                    zIndex: _.options.zIndex - 2,
                    opacity: 0
                });
            } else {
                jQuery(element).css({
                    position: 'relative',
                    left: targetLeft,
                    top: 0,
                    zIndex: _.options.zIndex - 2,
                    opacity: 0
                });
            }
        });

        _.jQueryslides.eq(_.currentSlide).css({
            zIndex: _.options.zIndex - 1,
            opacity: 1
        });

    };

    Slick.prototype.setHeight = function() {

        var _ = this;

        if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {
            var targetHeight = _.jQueryslides.eq(_.currentSlide).outerHeight(true);
            _.jQuerylist.css('height', targetHeight);
        }

    };

    Slick.prototype.setOption =
    Slick.prototype.slickSetOption = function() {

        /**
         * accepts arguments in format of:
         *
         *  - for changing a single option's value:
         *     .slick("setOption", option, value, refresh )
         *
         *  - for changing a set of responsive options:
         *     .slick("setOption", 'responsive', [{}, ...], refresh )
         *
         *  - for updating multiple values at once (not responsive)
         *     .slick("setOption", { 'option': value, ... }, refresh )
         */

        var _ = this, l, item, option, value, refresh = false, type;

        if( jQuery.type( arguments[0] ) === 'object' ) {

            option =  arguments[0];
            refresh = arguments[1];
            type = 'multiple';

        } else if ( jQuery.type( arguments[0] ) === 'string' ) {

            option =  arguments[0];
            value = arguments[1];
            refresh = arguments[2];

            if ( arguments[0] === 'responsive' && jQuery.type( arguments[1] ) === 'array' ) {

                type = 'responsive';

            } else if ( typeof arguments[1] !== 'undefined' ) {

                type = 'single';

            }

        }

        if ( type === 'single' ) {

            _.options[option] = value;


        } else if ( type === 'multiple' ) {

            jQuery.each( option , function( opt, val ) {

                _.options[opt] = val;

            });


        } else if ( type === 'responsive' ) {

            for ( item in value ) {

                if( jQuery.type( _.options.responsive ) !== 'array' ) {

                    _.options.responsive = [ value[item] ];

                } else {

                    l = _.options.responsive.length-1;

                    // loop through the responsive object and splice out duplicates.
                    while( l >= 0 ) {

                        if( _.options.responsive[l].breakpoint === value[item].breakpoint ) {

                            _.options.responsive.splice(l,1);

                        }

                        l--;

                    }

                    _.options.responsive.push( value[item] );

                }

            }

        }

        if ( refresh ) {

            _.unload();
            _.reinit();

        }

    };

    Slick.prototype.setPosition = function() {

        var _ = this;

        _.setDimensions();

        _.setHeight();

        if (_.options.fade === false) {
            _.setCSS(_.getLeft(_.currentSlide));
        } else {
            _.setFade();
        }

        _.jQueryslider.trigger('setPosition', [_]);

    };

    Slick.prototype.setProps = function() {

        var _ = this,
            bodyStyle = document.body.style;

        _.positionProp = _.options.vertical === true ? 'top' : 'left';

        if (_.positionProp === 'top') {
            _.jQueryslider.addClass('slick-vertical');
        } else {
            _.jQueryslider.removeClass('slick-vertical');
        }

        if (bodyStyle.WebkitTransition !== undefined ||
            bodyStyle.MozTransition !== undefined ||
            bodyStyle.msTransition !== undefined) {
            if (_.options.useCSS === true) {
                _.cssTransitions = true;
            }
        }

        if ( _.options.fade ) {
            if ( typeof _.options.zIndex === 'number' ) {
                if( _.options.zIndex < 3 ) {
                    _.options.zIndex = 3;
                }
            } else {
                _.options.zIndex = _.defaults.zIndex;
            }
        }

        if (bodyStyle.OTransform !== undefined) {
            _.animType = 'OTransform';
            _.transformType = '-o-transform';
            _.transitionType = 'OTransition';
            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;
        }
        if (bodyStyle.MozTransform !== undefined) {
            _.animType = 'MozTransform';
            _.transformType = '-moz-transform';
            _.transitionType = 'MozTransition';
            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.MozPerspective === undefined) _.animType = false;
        }
        if (bodyStyle.webkitTransform !== undefined) {
            _.animType = 'webkitTransform';
            _.transformType = '-webkit-transform';
            _.transitionType = 'webkitTransition';
            if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;
        }
        if (bodyStyle.msTransform !== undefined) {
            _.animType = 'msTransform';
            _.transformType = '-ms-transform';
            _.transitionType = 'msTransition';
            if (bodyStyle.msTransform === undefined) _.animType = false;
        }
        if (bodyStyle.transform !== undefined && _.animType !== false) {
            _.animType = 'transform';
            _.transformType = 'transform';
            _.transitionType = 'transition';
        }
        _.transformsEnabled = _.options.useTransform && (_.animType !== null && _.animType !== false);
    };


    Slick.prototype.setSlideClasses = function(index) {

        var _ = this,
            centerOffset, allSlides, indexOffset, remainder;

        allSlides = _.jQueryslider
            .find('.slick-slide')
            .removeClass('slick-active slick-center slick-current')
            .attr('aria-hidden', 'true');

        _.jQueryslides
            .eq(index)
            .addClass('slick-current');

        if (_.options.centerMode === true) {

            centerOffset = Math.floor(_.options.slidesToShow / 2);

            if (_.options.infinite === true) {

                if (index >= centerOffset && index <= (_.slideCount - 1) - centerOffset) {

                    _.jQueryslides
                        .slice(index - centerOffset, index + centerOffset + 1)
                        .addClass('slick-active')
                        .attr('aria-hidden', 'false');

                } else {

                    indexOffset = _.options.slidesToShow + index;
                    allSlides
                        .slice(indexOffset - centerOffset + 1, indexOffset + centerOffset + 2)
                        .addClass('slick-active')
                        .attr('aria-hidden', 'false');

                }

                if (index === 0) {

                    allSlides
                        .eq(allSlides.length - 1 - _.options.slidesToShow)
                        .addClass('slick-center');

                } else if (index === _.slideCount - 1) {

                    allSlides
                        .eq(_.options.slidesToShow)
                        .addClass('slick-center');

                }

            }

            _.jQueryslides
                .eq(index)
                .addClass('slick-center');

        } else {

            if (index >= 0 && index <= (_.slideCount - _.options.slidesToShow)) {

                _.jQueryslides
                    .slice(index, index + _.options.slidesToShow)
                    .addClass('slick-active')
                    .attr('aria-hidden', 'false');

            } else if (allSlides.length <= _.options.slidesToShow) {

                allSlides
                    .addClass('slick-active')
                    .attr('aria-hidden', 'false');

            } else {

                remainder = _.slideCount % _.options.slidesToShow;
                indexOffset = _.options.infinite === true ? _.options.slidesToShow + index : index;

                if (_.options.slidesToShow == _.options.slidesToScroll && (_.slideCount - index) < _.options.slidesToShow) {

                    allSlides
                        .slice(indexOffset - (_.options.slidesToShow - remainder), indexOffset + remainder)
                        .addClass('slick-active')
                        .attr('aria-hidden', 'false');

                } else {

                    allSlides
                        .slice(indexOffset, indexOffset + _.options.slidesToShow)
                        .addClass('slick-active')
                        .attr('aria-hidden', 'false');

                }

            }

        }

        if (_.options.lazyLoad === 'ondemand') {
            _.lazyLoad();
        }

    };

    Slick.prototype.setupInfinite = function() {

        var _ = this,
            i, slideIndex, infiniteCount;

        if (_.options.fade === true) {
            _.options.centerMode = false;
        }

        if (_.options.infinite === true && _.options.fade === false) {

            slideIndex = null;

            if (_.slideCount > _.options.slidesToShow) {

                if (_.options.centerMode === true) {
                    infiniteCount = _.options.slidesToShow + 1;
                } else {
                    infiniteCount = _.options.slidesToShow;
                }

                for (i = _.slideCount; i > (_.slideCount -
                        infiniteCount); i -= 1) {
                    slideIndex = i - 1;
                    jQuery(_.jQueryslides[slideIndex]).clone(true).attr('id', '')
                        .attr('data-slick-index', slideIndex - _.slideCount)
                        .prependTo(_.jQueryslideTrack).addClass('slick-cloned');
                }
                for (i = 0; i < infiniteCount; i += 1) {
                    slideIndex = i;
                    jQuery(_.jQueryslides[slideIndex]).clone(true).attr('id', '')
                        .attr('data-slick-index', slideIndex + _.slideCount)
                        .appendTo(_.jQueryslideTrack).addClass('slick-cloned');
                }
                _.jQueryslideTrack.find('.slick-cloned').find('[id]').each(function() {
                    jQuery(this).attr('id', '');
                });

            }

        }

    };

    Slick.prototype.interrupt = function( toggle ) {

        var _ = this;

        if( !toggle ) {
            _.autoPlay();
        }
        _.interrupted = toggle;

    };

    Slick.prototype.selectHandler = function(event) {

        var _ = this;

        var targetElement =
            jQuery(event.target).is('.slick-slide') ?
                jQuery(event.target) :
                jQuery(event.target).parents('.slick-slide');

        var index = parseInt(targetElement.attr('data-slick-index'));

        if (!index) index = 0;

        if (_.slideCount <= _.options.slidesToShow) {

            _.setSlideClasses(index);
            _.asNavFor(index);
            return;

        }

        _.slideHandler(index);

    };

    Slick.prototype.slideHandler = function(index, sync, dontAnimate) {

        var targetSlide, animSlide, oldSlide, slideLeft, targetLeft = null,
            _ = this, navTarget;

        sync = sync || false;

        if (_.animating === true && _.options.waitForAnimate === true) {
            return;
        }

        if (_.options.fade === true && _.currentSlide === index) {
            return;
        }

        if (_.slideCount <= _.options.slidesToShow) {
            return;
        }

        if (sync === false) {
            _.asNavFor(index);
        }

        targetSlide = index;
        targetLeft = _.getLeft(targetSlide);
        slideLeft = _.getLeft(_.currentSlide);

        _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft;

        if (_.options.infinite === false && _.options.centerMode === false && (index < 0 || index > _.getDotCount() * _.options.slidesToScroll)) {
            if (_.options.fade === false) {
                targetSlide = _.currentSlide;
                if (dontAnimate !== true) {
                    _.animateSlide(slideLeft, function() {
                        _.postSlide(targetSlide);
                    });
                } else {
                    _.postSlide(targetSlide);
                }
            }
            return;
        } else if (_.options.infinite === false && _.options.centerMode === true && (index < 0 || index > (_.slideCount - _.options.slidesToScroll))) {
            if (_.options.fade === false) {
                targetSlide = _.currentSlide;
                if (dontAnimate !== true) {
                    _.animateSlide(slideLeft, function() {
                        _.postSlide(targetSlide);
                    });
                } else {
                    _.postSlide(targetSlide);
                }
            }
            return;
        }

        if ( _.options.autoplay ) {
            clearInterval(_.autoPlayTimer);
        }

        if (targetSlide < 0) {
            if (_.slideCount % _.options.slidesToScroll !== 0) {
                animSlide = _.slideCount - (_.slideCount % _.options.slidesToScroll);
            } else {
                animSlide = _.slideCount + targetSlide;
            }
        } else if (targetSlide >= _.slideCount) {
            if (_.slideCount % _.options.slidesToScroll !== 0) {
                animSlide = 0;
            } else {
                animSlide = targetSlide - _.slideCount;
            }
        } else {
            animSlide = targetSlide;
        }

        _.animating = true;

        _.jQueryslider.trigger('beforeChange', [_, _.currentSlide, animSlide]);

        oldSlide = _.currentSlide;
        _.currentSlide = animSlide;

        _.setSlideClasses(_.currentSlide);

        if ( _.options.asNavFor ) {

            navTarget = _.getNavTarget();
            navTarget = navTarget.slick('getSlick');

            if ( navTarget.slideCount <= navTarget.options.slidesToShow ) {
                navTarget.setSlideClasses(_.currentSlide);
            }

        }

        _.updateDots();
        _.updateArrows();

        if (_.options.fade === true) {
            if (dontAnimate !== true) {

                _.fadeSlideOut(oldSlide);

                _.fadeSlide(animSlide, function() {
                    _.postSlide(animSlide);
                });

            } else {
                _.postSlide(animSlide);
            }
            _.animateHeight();
            return;
        }

        if (dontAnimate !== true) {
            _.animateSlide(targetLeft, function() {
                _.postSlide(animSlide);
            });
        } else {
            _.postSlide(animSlide);
        }

    };

    Slick.prototype.startLoad = function() {

        var _ = this;

        if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {

            _.jQueryprevArrow.hide();
            _.jQuerynextArrow.hide();

        }

        if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {

            _.jQuerydots.hide();

        }

        _.jQueryslider.addClass('slick-loading');

    };

    Slick.prototype.swipeDirection = function() {

        var xDist, yDist, r, swipeAngle, _ = this;

        xDist = _.touchObject.startX - _.touchObject.curX;
        yDist = _.touchObject.startY - _.touchObject.curY;
        r = Math.atan2(yDist, xDist);

        swipeAngle = Math.round(r * 180 / Math.PI);
        if (swipeAngle < 0) {
            swipeAngle = 360 - Math.abs(swipeAngle);
        }

        if ((swipeAngle <= 45) && (swipeAngle >= 0)) {
            return (_.options.rtl === false ? 'left' : 'right');
        }
        if ((swipeAngle <= 360) && (swipeAngle >= 315)) {
            return (_.options.rtl === false ? 'left' : 'right');
        }
        if ((swipeAngle >= 135) && (swipeAngle <= 225)) {
            return (_.options.rtl === false ? 'right' : 'left');
        }
        if (_.options.verticalSwiping === true) {
            if ((swipeAngle >= 35) && (swipeAngle <= 135)) {
                return 'down';
            } else {
                return 'up';
            }
        }

        return 'vertical';

    };

    Slick.prototype.swipeEnd = function(event) {

        var _ = this,
            slideCount,
            direction;

        _.dragging = false;
        _.interrupted = false;
        _.shouldClick = ( _.touchObject.swipeLength > 10 ) ? false : true;

        if ( _.touchObject.curX === undefined ) {
            return false;
        }

        if ( _.touchObject.edgeHit === true ) {
            _.jQueryslider.trigger('edge', [_, _.swipeDirection() ]);
        }

        if ( _.touchObject.swipeLength >= _.touchObject.minSwipe ) {

            direction = _.swipeDirection();

            switch ( direction ) {

                case 'left':
                case 'down':

                    slideCount =
                        _.options.swipeToSlide ?
                            _.checkNavigable( _.currentSlide + _.getSlideCount() ) :
                            _.currentSlide + _.getSlideCount();

                    _.currentDirection = 0;

                    break;

                case 'right':
                case 'up':

                    slideCount =
                        _.options.swipeToSlide ?
                            _.checkNavigable( _.currentSlide - _.getSlideCount() ) :
                            _.currentSlide - _.getSlideCount();

                    _.currentDirection = 1;

                    break;

                default:


            }

            if( direction != 'vertical' ) {

                _.slideHandler( slideCount );
                _.touchObject = {};
                _.jQueryslider.trigger('swipe', [_, direction ]);

            }

        } else {

            if ( _.touchObject.startX !== _.touchObject.curX ) {

                _.slideHandler( _.currentSlide );
                _.touchObject = {};

            }

        }

    };

    Slick.prototype.swipeHandler = function(event) {

        var _ = this;

        if ((_.options.swipe === false) || ('ontouchend' in document && _.options.swipe === false)) {
            return;
        } else if (_.options.draggable === false && event.type.indexOf('mouse') !== -1) {
            return;
        }

        _.touchObject.fingerCount = event.originalEvent && event.originalEvent.touches !== undefined ?
            event.originalEvent.touches.length : 1;

        _.touchObject.minSwipe = _.listWidth / _.options
            .touchThreshold;

        if (_.options.verticalSwiping === true) {
            _.touchObject.minSwipe = _.listHeight / _.options
                .touchThreshold;
        }

        switch (event.data.action) {

            case 'start':
                _.swipeStart(event);
                break;

            case 'move':
                _.swipeMove(event);
                break;

            case 'end':
                _.swipeEnd(event);
                break;

        }

    };

    Slick.prototype.swipeMove = function(event) {

        var _ = this,
            edgeWasHit = false,
            curLeft, swipeDirection, swipeLength, positionOffset, touches;

        touches = event.originalEvent !== undefined ? event.originalEvent.touches : null;

        if (!_.dragging || touches && touches.length !== 1) {
            return false;
        }

        curLeft = _.getLeft(_.currentSlide);

        _.touchObject.curX = touches !== undefined ? touches[0].pageX : event.clientX;
        _.touchObject.curY = touches !== undefined ? touches[0].pageY : event.clientY;

        _.touchObject.swipeLength = Math.round(Math.sqrt(
            Math.pow(_.touchObject.curX - _.touchObject.startX, 2)));

        if (_.options.verticalSwiping === true) {
            _.touchObject.swipeLength = Math.round(Math.sqrt(
                Math.pow(_.touchObject.curY - _.touchObject.startY, 2)));
        }

        swipeDirection = _.swipeDirection();

        if (swipeDirection === 'vertical') {
            return;
        }

        if (event.originalEvent !== undefined && _.touchObject.swipeLength > 4) {
            event.preventDefault();
        }

        positionOffset = (_.options.rtl === false ? 1 : -1) * (_.touchObject.curX > _.touchObject.startX ? 1 : -1);
        if (_.options.verticalSwiping === true) {
            positionOffset = _.touchObject.curY > _.touchObject.startY ? 1 : -1;
        }


        swipeLength = _.touchObject.swipeLength;

        _.touchObject.edgeHit = false;

        if (_.options.infinite === false) {
            if ((_.currentSlide === 0 && swipeDirection === 'right') || (_.currentSlide >= _.getDotCount() && swipeDirection === 'left')) {
                swipeLength = _.touchObject.swipeLength * _.options.edgeFriction;
                _.touchObject.edgeHit = true;
            }
        }

        if (_.options.vertical === false) {
            _.swipeLeft = curLeft + swipeLength * positionOffset;
        } else {
            _.swipeLeft = curLeft + (swipeLength * (_.jQuerylist.height() / _.listWidth)) * positionOffset;
        }
        if (_.options.verticalSwiping === true) {
            _.swipeLeft = curLeft + swipeLength * positionOffset;
        }

        if (_.options.fade === true || _.options.touchMove === false) {
            return false;
        }

        if (_.animating === true) {
            _.swipeLeft = null;
            return false;
        }

        _.setCSS(_.swipeLeft);

    };

    Slick.prototype.swipeStart = function(event) {

        var _ = this,
            touches;

        _.interrupted = true;

        if (_.touchObject.fingerCount !== 1 || _.slideCount <= _.options.slidesToShow) {
            _.touchObject = {};
            return false;
        }

        if (event.originalEvent !== undefined && event.originalEvent.touches !== undefined) {
            touches = event.originalEvent.touches[0];
        }

        _.touchObject.startX = _.touchObject.curX = touches !== undefined ? touches.pageX : event.clientX;
        _.touchObject.startY = _.touchObject.curY = touches !== undefined ? touches.pageY : event.clientY;

        _.dragging = true;

    };

    Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter = function() {

        var _ = this;

        if (_.jQueryslidesCache !== null) {

            _.unload();

            _.jQueryslideTrack.children(this.options.slide).detach();

            _.jQueryslidesCache.appendTo(_.jQueryslideTrack);

            _.reinit();

        }

    };

    Slick.prototype.unload = function() {

        var _ = this;

        jQuery('.slick-cloned', _.jQueryslider).remove();

        if (_.jQuerydots) {
            _.jQuerydots.remove();
        }

        if (_.jQueryprevArrow && _.htmlExpr.test(_.options.prevArrow)) {
            _.jQueryprevArrow.remove();
        }

        if (_.jQuerynextArrow && _.htmlExpr.test(_.options.nextArrow)) {
            _.jQuerynextArrow.remove();
        }

        _.jQueryslides
            .removeClass('slick-slide slick-active slick-visible slick-current')
            .attr('aria-hidden', 'true')
            .css('width', '');

    };

    Slick.prototype.unslick = function(fromBreakpoint) {

        var _ = this;
        _.jQueryslider.trigger('unslick', [_, fromBreakpoint]);
        _.destroy();

    };

    Slick.prototype.updateArrows = function() {

        var _ = this,
            centerOffset;

        centerOffset = Math.floor(_.options.slidesToShow / 2);

        if ( _.options.arrows === true &&
            _.slideCount > _.options.slidesToShow &&
            !_.options.infinite ) {

            _.jQueryprevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');
            _.jQuerynextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');

            if (_.currentSlide === 0) {

                _.jQueryprevArrow.addClass('slick-disabled').attr('aria-disabled', 'true');
                _.jQuerynextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');

            } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow && _.options.centerMode === false) {

                _.jQuerynextArrow.addClass('slick-disabled').attr('aria-disabled', 'true');
                _.jQueryprevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');

            } else if (_.currentSlide >= _.slideCount - 1 && _.options.centerMode === true) {

                _.jQuerynextArrow.addClass('slick-disabled').attr('aria-disabled', 'true');
                _.jQueryprevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false');

            }

        }

    };

    Slick.prototype.updateDots = function() {

        var _ = this;

        if (_.jQuerydots !== null) {

            _.jQuerydots
                .find('li')
                .removeClass('slick-active')
                .attr('aria-hidden', 'true');

            _.jQuerydots
                .find('li')
                .eq(Math.floor(_.currentSlide / _.options.slidesToScroll))
                .addClass('slick-active')
                .attr('aria-hidden', 'false');

        }

    };

    Slick.prototype.visibility = function() {

        var _ = this;

        if ( _.options.autoplay ) {

            if ( document[_.hidden] ) {

                _.interrupted = true;

            } else {

                _.interrupted = false;

            }

        }

    };

    jQuery.fn.slick = function() {
        var _ = this,
            opt = arguments[0],
            args = Array.prototype.slice.call(arguments, 1),
            l = _.length,
            i,
            ret;
        for (i = 0; i < l; i++) {
            if (typeof opt == 'object' || typeof opt == 'undefined')
                _[i].slick = new Slick(_[i], opt);
            else
                ret = _[i].slick[opt].apply(_[i].slick, args);
            if (typeof ret != 'undefined') return ret;
        }
        return _;
    };

}));
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Slideout=t()}}(function(){var t,e,n;return function i(t,e,n){function o(r,a){if(!e[r]){if(!t[r]){var u=typeof require=="function"&&require;if(!a&&u)return u(r,!0);if(s)return s(r,!0);var l=new Error("Cannot find module '"+r+"'");throw l.code="MODULE_NOT_FOUND",l}var h=e[r]={exports:{}};t[r][0].call(h.exports,function(e){var n=t[r][1][e];return o(n?n:e)},h,h.exports,i,t,e,n)}return e[r].exports}var s=typeof require=="function"&&require;for(var r=0;r<n.length;r++)o(n[r]);return o}({1:[function(t,e,n){"use strict";var i=t("decouple");var o=t("emitter");var s;var r=false;var a=window.document;var u=a.documentElement;var l=window.navigator.msPointerEnabled;var h={start:l?"MSPointerDown":"touchstart",move:l?"MSPointerMove":"touchmove",end:l?"MSPointerUp":"touchend"};var f=function v(){var t=/^(Webkit|Khtml|Moz|ms|O)(?=[A-Z])/;var e=a.getElementsByTagName("script")[0].style;for(var n in e){if(t.test(n)){return"-"+n.match(t)[0].toLowerCase()+"-"}}if("WebkitOpacity"in e){return"-webkit-"}if("KhtmlOpacity"in e){return"-khtml-"}return""}();function c(t,e){for(var n in e){if(e[n]){t[n]=e[n]}}return t}function p(t,e){t.prototype=c(t.prototype||{},e.prototype)}function d(t){while(t.parentNode){if(t.getAttribute("data-slideout-ignore")!==null){return t}t=t.parentNode}return null}function _(t){t=t||{};this._startOffsetX=0;this._currentOffsetX=0;this._opening=false;this._moved=false;this._opened=false;this._preventOpen=false;this.panel=t.panel;this.menu=t.menu;this._touch=t.touch===undefined?true:t.touch&&true;this._side=t.side||"left";this._easing=t.fx||t.easing||"ease";this._duration=parseInt(t.duration,10)||300;this._tolerance=parseInt(t.tolerance,10)||70;this._padding=this._translateTo=parseInt(t.padding,10)||256;this._orientation=this._side==="right"?-1:1;this._translateTo*=this._orientation;if(!this.panel.classList.contains("slideout-panel")){this.panel.classList.add("slideout-panel")}if(!this.panel.classList.contains("slideout-panel-"+this._side)){this.panel.classList.add("slideout-panel-"+this._side)}if(!this.menu.classList.contains("slideout-menu")){this.menu.classList.add("slideout-menu")}if(!this.menu.classList.contains("slideout-menu-"+this._side)){this.menu.classList.add("slideout-menu-"+this._side)}if(this._touch){this._initTouchEvents()}}p(_,o);_.prototype.open=function(){var t=this;this.emit("beforeopen");if(!u.classList.contains("slideout-open")){u.classList.add("slideout-open")}this._setTransition();this._translateXTo(this._translateTo);this._opened=true;setTimeout(function(){t.panel.style.transition=t.panel.style["-webkit-transition"]="";t.emit("open")},this._duration+50);return this};_.prototype.close=function(){var t=this;if(!this.isOpen()&&!this._opening){return this}this.emit("beforeclose");this._setTransition();this._translateXTo(0);this._opened=false;setTimeout(function(){u.classList.remove("slideout-open");t.panel.style.transition=t.panel.style["-webkit-transition"]=t.panel.style[f+"transform"]=t.panel.style.transform="";t.emit("close")},this._duration+50);return this};_.prototype.toggle=function(){return this.isOpen()?this.close():this.open()};_.prototype.isOpen=function(){return this._opened};_.prototype._translateXTo=function(t){this._currentOffsetX=t;this.panel.style[f+"transform"]=this.panel.style.transform="translateX("+t+"px)";return this};_.prototype._setTransition=function(){this.panel.style[f+"transition"]=this.panel.style.transition=f+"transform "+this._duration+"ms "+this._easing;return this};_.prototype._initTouchEvents=function(){var t=this;this._onScrollFn=i(a,"scroll",function(){if(!t._moved){clearTimeout(s);r=true;s=setTimeout(function(){r=false},250)}});this._preventMove=function(e){if(t._moved){e.preventDefault()}};a.addEventListener(h.move,this._preventMove);this._resetTouchFn=function(e){if(typeof e.touches==="undefined"){return}t._moved=false;t._opening=false;t._startOffsetX=e.touches[0].pageX;t._preventOpen=!t._touch||!t.isOpen()&&t.menu.clientWidth!==0};this.panel.addEventListener(h.start,this._resetTouchFn);this._onTouchCancelFn=function(){t._moved=false;t._opening=false};this.panel.addEventListener("touchcancel",this._onTouchCancelFn);this._onTouchEndFn=function(){if(t._moved){t.emit("translateend");t._opening&&Math.abs(t._currentOffsetX)>t._tolerance?t.open():t.close()}t._moved=false};this.panel.addEventListener(h.end,this._onTouchEndFn);this._onTouchMoveFn=function(e){if(r||t._preventOpen||typeof e.touches==="undefined"||d(e.target)){return}var n=e.touches[0].clientX-t._startOffsetX;var i=t._currentOffsetX=n;if(Math.abs(i)>t._padding){return}if(Math.abs(n)>20){t._opening=true;var o=n*t._orientation;if(t._opened&&o>0||!t._opened&&o<0){return}if(!t._moved){t.emit("translatestart")}if(o<=0){i=n+t._padding*t._orientation;t._opening=false}if(!(t._moved&&u.classList.contains("slideout-open"))){u.classList.add("slideout-open")}t.panel.style[f+"transform"]=t.panel.style.transform="translateX("+i+"px)";t.emit("translate",i);t._moved=true}};this.panel.addEventListener(h.move,this._onTouchMoveFn);return this};_.prototype.enableTouch=function(){this._touch=true;return this};_.prototype.disableTouch=function(){this._touch=false;return this};_.prototype.destroy=function(){this.close();a.removeEventListener(h.move,this._preventMove);this.panel.removeEventListener(h.start,this._resetTouchFn);this.panel.removeEventListener("touchcancel",this._onTouchCancelFn);this.panel.removeEventListener(h.end,this._onTouchEndFn);this.panel.removeEventListener(h.move,this._onTouchMoveFn);a.removeEventListener("scroll",this._onScrollFn);this.open=this.close=function(){};return this};e.exports=_},{decouple:2,emitter:3}],2:[function(t,e,n){"use strict";var i=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)}}();function o(t,e,n){var o,s=false;function r(t){o=t;a()}function a(){if(!s){i(u);s=true}}function u(){n.call(t,o);s=false}t.addEventListener(e,r,false);return r}e.exports=o},{}],3:[function(t,e,n){"use strict";var i=function(t,e){if(!(t instanceof e)){throw new TypeError("Cannot call a class as a function")}};n.__esModule=true;var o=function(){function t(){i(this,t)}t.prototype.on=function e(t,n){this._eventCollection=this._eventCollection||{};this._eventCollection[t]=this._eventCollection[t]||[];this._eventCollection[t].push(n);return this};t.prototype.once=function n(t,e){var n=this;function i(){n.off(t,i);e.apply(this,arguments)}i.listener=e;this.on(t,i);return this};t.prototype.off=function o(t,e){var n=undefined;if(!this._eventCollection||!(n=this._eventCollection[t])){return this}n.forEach(function(t,i){if(t===e||t.listener===e){n.splice(i,1)}});if(n.length===0){delete this._eventCollection[t]}return this};t.prototype.emit=function s(t){var e=this;for(var n=arguments.length,i=Array(n>1?n-1:0),o=1;o<n;o++){i[o-1]=arguments[o]}var s=undefined;if(!this._eventCollection||!(s=this._eventCollection[t])){return this}s=s.slice(0);s.forEach(function(t){return t.apply(e,i)});return this};return t}();n["default"]=o;e.exports=n["default"]},{}]},{},[1])(1)});


(function ($) {
  'use strict';

  //<editor-fold desc="Shims">
  if (!String.prototype.includes) {
    (function () {
      'use strict'; // needed to support `apply`/`call` with `undefined`/`null`
      var toString = {}.toString;
      var defineProperty = (function () {
        // IE 8 only supports `Object.defineProperty` on DOM elements
        try {
          var object = {};
          var $defineProperty = Object.defineProperty;
          var result = $defineProperty(object, object, object) && $defineProperty;
        } catch (error) {
        }
        return result;
      }());
      var indexOf = ''.indexOf;
      var includes = function (search) {
        if (this == null) {
          throw new TypeError();
        }
        var string = String(this);
        if (search && toString.call(search) == '[object RegExp]') {
          throw new TypeError();
        }
        var stringLength = string.length;
        var searchString = String(search);
        var searchLength = searchString.length;
        var position = arguments.length > 1 ? arguments[1] : undefined;
        // `ToInteger`
        var pos = position ? Number(position) : 0;
        if (pos != pos) { // better `isNaN`
          pos = 0;
        }
        var start = Math.min(Math.max(pos, 0), stringLength);
        // Avoid the `indexOf` call if no match is possible
        if (searchLength + start > stringLength) {
          return false;
        }
        return indexOf.call(string, searchString, pos) != -1;
      };
      if (defineProperty) {
        defineProperty(String.prototype, 'includes', {
          'value': includes,
          'configurable': true,
          'writable': true
        });
      } else {
        String.prototype.includes = includes;
      }
    }());
  }

  if (!String.prototype.startsWith) {
    (function () {
      'use strict'; // needed to support `apply`/`call` with `undefined`/`null`
      var defineProperty = (function () {
        // IE 8 only supports `Object.defineProperty` on DOM elements
        try {
          var object = {};
          var $defineProperty = Object.defineProperty;
          var result = $defineProperty(object, object, object) && $defineProperty;
        } catch (error) {
        }
        return result;
      }());
      var toString = {}.toString;
      var startsWith = function (search) {
        if (this == null) {
          throw new TypeError();
        }
        var string = String(this);
        if (search && toString.call(search) == '[object RegExp]') {
          throw new TypeError();
        }
        var stringLength = string.length;
        var searchString = String(search);
        var searchLength = searchString.length;
        var position = arguments.length > 1 ? arguments[1] : undefined;
        // `ToInteger`
        var pos = position ? Number(position) : 0;
        if (pos != pos) { // better `isNaN`
          pos = 0;
        }
        var start = Math.min(Math.max(pos, 0), stringLength);
        // Avoid the `indexOf` call if no match is possible
        if (searchLength + start > stringLength) {
          return false;
        }
        var index = -1;
        while (++index < searchLength) {
          if (string.charCodeAt(start + index) != searchString.charCodeAt(index)) {
            return false;
          }
        }
        return true;
      };
      if (defineProperty) {
        defineProperty(String.prototype, 'startsWith', {
          'value': startsWith,
          'configurable': true,
          'writable': true
        });
      } else {
        String.prototype.startsWith = startsWith;
      }
    }());
  }

  if (!Object.keys) {
    Object.keys = function (
      o, // object
      k, // key
      r  // result array
      ){
      // initialize object and result
      r=[];
      // iterate over object keys
      for (k in o)
          // fill result array with non-prototypical keys
        r.hasOwnProperty.call(o, k) && r.push(k);
      // return result
      return r;
    };
  }

  // set data-selected on options that are programmatically selected
  // prior to initialization of bootstrap-select
  var _val = $.fn.val;
  $.fn.val = function(value){
    if (this.is('select') && value) {
      this.find('option[value="' + value + '"]').data('selected', true);
    }

    return _val.apply(this, arguments);
  };

  $.fn.triggerNative = function (eventName) {
    var el = this[0],
        event;

    if (el.dispatchEvent) {
      if (typeof Event === 'function') {
        // For modern browsers
        event = new Event(eventName, {
          bubbles: true
        });
      } else {
        // For IE since it doesn't support Event constructor
        event = document.createEvent('Event');
        event.initEvent(eventName, true, false);
      }

      el.dispatchEvent(event);
    } else {
      if (el.fireEvent) {
        event = document.createEventObject();
        event.eventType = eventName;
        el.fireEvent('on' + eventName, event);
      }

      this.trigger(eventName);
    }
  };
  //</editor-fold>

  // Case insensitive contains search
  $.expr[':'].icontains = function (obj, index, meta) {
    var $obj = $(obj);
    var haystack = ($obj.data('tokens') || $obj.text()).toString().toUpperCase();
    return haystack.includes(meta[3].toUpperCase());
  };

  // Case insensitive begins search
  $.expr[':'].ibegins = function (obj, index, meta) {
    var $obj = $(obj);
    var haystack = ($obj.data('tokens') || $obj.text()).toString().toUpperCase();
    return haystack.startsWith(meta[3].toUpperCase());
  };

  // Case and accent insensitive contains search
  $.expr[':'].aicontains = function (obj, index, meta) {
    var $obj = $(obj);
    var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toString().toUpperCase();
    return haystack.includes(meta[3].toUpperCase());
  };

  // Case and accent insensitive begins search
  $.expr[':'].aibegins = function (obj, index, meta) {
    var $obj = $(obj);
    var haystack = ($obj.data('tokens') || $obj.data('normalizedText') || $obj.text()).toString().toUpperCase();
    return haystack.startsWith(meta[3].toUpperCase());
  };

  /**
   * Remove all diatrics from the given text.
   * @access private
   * @param {String} text
   * @returns {String}
   */
  function normalizeToBase(text) {
    var rExps = [
      {re: /[\xC0-\xC6]/g, ch: "A"},
      {re: /[\xE0-\xE6]/g, ch: "a"},
      {re: /[\xC8-\xCB]/g, ch: "E"},
      {re: /[\xE8-\xEB]/g, ch: "e"},
      {re: /[\xCC-\xCF]/g, ch: "I"},
      {re: /[\xEC-\xEF]/g, ch: "i"},
      {re: /[\xD2-\xD6]/g, ch: "O"},
      {re: /[\xF2-\xF6]/g, ch: "o"},
      {re: /[\xD9-\xDC]/g, ch: "U"},
      {re: /[\xF9-\xFC]/g, ch: "u"},
      {re: /[\xC7-\xE7]/g, ch: "c"},
      {re: /[\xD1]/g, ch: "N"},
      {re: /[\xF1]/g, ch: "n"}
    ];
    $.each(rExps, function () {
      text = text.replace(this.re, this.ch);
    });
    return text;
  }


  function htmlEscape(html) {
    var escapeMap = {
      '&': '&amp;',
      '<': '&lt;',
      '>': '&gt;',
      '"': '&quot;',
      "'": '&#x27;',
      '`': '&#x60;'
    };
    var source = '(?:' + Object.keys(escapeMap).join('|') + ')',
        testRegexp = new RegExp(source),
        replaceRegexp = new RegExp(source, 'g'),
        string = html == null ? '' : '' + html;
    return testRegexp.test(string) ? string.replace(replaceRegexp, function (match) {
      return escapeMap[match];
    }) : string;
  }

  var Selectpicker = function (element, options, e) {
    // bootstrap-select has been initialized - revert val back to its original function
    if (_val) {
      $.fn.val = _val;
      _val = null;
    }

    if (e) {
      e.stopPropagation();
      e.preventDefault();
    }

    this.$element = $(element);
    this.$newElement = null;
    this.$button = null;
    this.$menu = null;
    this.$lis = null;
    this.options = options;

    // If we have no title yet, try to pull it from the html title attribute (jQuery doesnt' pick it up as it's not a
    // data-attribute)
    if (this.options.title === null) {
      this.options.title = this.$element.attr('title');
    }

    //Expose public methods
    this.val = Selectpicker.prototype.val;
    this.render = Selectpicker.prototype.render;
    this.refresh = Selectpicker.prototype.refresh;
    this.setStyle = Selectpicker.prototype.setStyle;
    this.selectAll = Selectpicker.prototype.selectAll;
    this.deselectAll = Selectpicker.prototype.deselectAll;
    this.destroy = Selectpicker.prototype.destroy;
    this.remove = Selectpicker.prototype.remove;
    this.show = Selectpicker.prototype.show;
    this.hide = Selectpicker.prototype.hide;

    this.init();
  };

  Selectpicker.VERSION = '1.10.0';

  // part of this is duplicated in i18n/defaults-en_US.js. Make sure to update both.
  Selectpicker.DEFAULTS = {
    noneSelectedText: 'Nothing selected',
    noneResultsText: 'No results matched {0}',
    countSelectedText: function (numSelected, numTotal) {
      return (numSelected == 1) ? "{0} item selected" : "{0} items selected";
    },
    maxOptionsText: function (numAll, numGroup) {
      return [
        (numAll == 1) ? 'Limit reached ({n} item max)' : 'Limit reached ({n} items max)',
        (numGroup == 1) ? 'Group limit reached ({n} item max)' : 'Group limit reached ({n} items max)'
      ];
    },
    selectAllText: 'Select All',
    deselectAllText: 'Deselect All',
    doneButton: false,
    doneButtonText: 'Close',
    multipleSeparator: ', ',
    styleBase: 'btn',
    style: 'btn-default',
    size: 'auto',
    title: null,
    selectedTextFormat: 'values',
    width: false,
    container: false,
    hideDisabled: false,
    showSubtext: false,
    showIcon: true,
    showContent: true,
    dropupAuto: true,
    header: false,
    liveSearch: false,
    liveSearchPlaceholder: null,
    liveSearchNormalize: false,
    liveSearchStyle: 'contains',
    actionsBox: false,
    iconBase: 'glyphicon',
    tickIcon: 'glyphicon-ok',
    showTick: false,
    template: {
      caret: '<span class="caret"></span>'
    },
    maxOptions: false,
    mobile: false,
    selectOnTab: false,
    dropdownAlignRight: false,
    hideOnClickSelectAll: false
  };

  Selectpicker.prototype = {

    constructor: Selectpicker,

    init: function () {
      var that = this,
          id = this.$element.attr('id');

      this.$element.addClass('bs-select-hidden');

      // store originalIndex (key) and newIndex (value) in this.liObj for fast accessibility
      // allows us to do this.$lis.eq(that.liObj[index]) instead of this.$lis.filter('[data-original-index="' + index + '"]')
      this.liObj = {};
      this.multiple = this.$element.prop('multiple');
      this.autofocus = this.$element.prop('autofocus');
      this.$newElement = this.createView();
      this.$element
        .after(this.$newElement)
        .appendTo(this.$newElement);
      this.$button = this.$newElement.children('button');
      this.$menu = this.$newElement.children('.dropdown-menu');
      this.$menuInner = this.$menu.children('.inner');
      this.$searchbox = this.$menu.find('input');

      this.$element.removeClass('bs-select-hidden');

      if (this.options.dropdownAlignRight === true) this.$menu.addClass('dropdown-menu-right');

      if (typeof id !== 'undefined') {
        this.$button.attr('data-id', id);
        $('label[for="' + id + '"]').click(function (e) {
          e.preventDefault();
          that.$button.focus();
        });
      }

      this.checkDisabled();
      this.clickListener();
      if (this.options.liveSearch) this.liveSearchListener();
      this.render();
      this.setStyle();
      this.setWidth();
      if (this.options.container) this.selectPosition();
      this.$menu.data('this', this);
      this.$newElement.data('this', this);
      if (this.options.mobile) this.mobile();

      this.$newElement.on({
        'hide.bs.dropdown': function (e) {
          that.$menuInner.attr('aria-expanded', false);
          that.$element.trigger('hide.bs.select', e);
        },
        'hidden.bs.dropdown': function (e) {
          that.$element.trigger('hidden.bs.select', e);
        },
        'show.bs.dropdown': function (e) {
          that.$menuInner.attr('aria-expanded', true);
          that.$element.trigger('show.bs.select', e);
        },
        'shown.bs.dropdown': function (e) {
          that.$element.trigger('shown.bs.select', e);
        }
      });

      if (that.$element[0].hasAttribute('required')) {
        this.$element.on('invalid', function () {
          that.$button
            .addClass('bs-invalid')
            .focus();

          that.$element.on({
            'focus.bs.select': function () {
              that.$button.focus();
              that.$element.off('focus.bs.select');
            },
            'shown.bs.select': function () {
              that.$element
                .val(that.$element.val()) // set the value to hide the validation message in Chrome when menu is opened
                .off('shown.bs.select');
            },
            'rendered.bs.select': function () {
              // if select is no longer invalid, remove the bs-invalid class
              if (this.validity.valid) that.$button.removeClass('bs-invalid');
              that.$element.off('rendered.bs.select');
            }
          });
        });
      }

      setTimeout(function () {
        that.$element.trigger('loaded.bs.select');
      });
    },

    createDropdown: function () {
      // Options
      // If we are multiple or showTick option is set, then add the show-tick class
      var showTick = (this.multiple || this.options.showTick) ? ' show-tick' : '',
          inputGroup = this.$element.parent().hasClass('input-group') ? ' input-group-btn' : '',
          autofocus = this.autofocus ? ' autofocus' : '';
      // Elements
      var header = this.options.header ? '<div class="popover-title"><button type="button" class="close" aria-hidden="true">&times;</button>' + this.options.header + '</div>' : '';
      var searchbox = this.options.liveSearch ?
      '<div class="bs-searchbox">' +
      '<input type="text" class="form-control" autocomplete="off"' +
      (null === this.options.liveSearchPlaceholder ? '' : ' placeholder="' + htmlEscape(this.options.liveSearchPlaceholder) + '"') + ' role="textbox" aria-label="Search">' +
      '</div>'
          : '';
      var actionsbox = this.multiple && this.options.actionsBox ?
      '<div class="bs-actionsbox">' +
      '<div class="btn-group btn-group-sm btn-block">' +
      '<button type="button" class="actions-btn bs-select-all btn btn-default">' +
      this.options.selectAllText +
      '</button>' +
      '<button type="button" class="actions-btn bs-deselect-all btn btn-default">' +
      this.options.deselectAllText +
      '</button>' +
      '</div>' +
      '</div>'
          : '';
      var donebutton = this.multiple && this.options.doneButton ?
      '<div class="bs-donebutton">' +
      '<div class="btn-group btn-block">' +
      '<button type="button" class="btn btn-sm btn-default">' +
      this.options.doneButtonText +
      '</button>' +
      '</div>' +
      '</div>'
          : '';
      var drop =
          '<div class="btn-group bootstrap-select' + showTick + inputGroup + '">' +
          '<button type="button" class="' + this.options.styleBase + ' dropdown-toggle" data-toggle="dropdown"' + autofocus + ' role="button">' +
          '<span class="filter-option pull-left"></span>&nbsp;' +
          '<span class="bs-caret">' +
          this.options.template.caret +
          '</span>' +
          '</button>' +
          '<div class="dropdown-menu open" role="combobox">' +
          header +
          searchbox +
          actionsbox +
          '<ul class="dropdown-menu inner" role="listbox" aria-expanded="false">' +
          '</ul>' +
          donebutton +
          '</div>' +
          '</div>';

      return $(drop);
    },

    createView: function () {
      var $drop = this.createDropdown(),
          li = this.createLi();

      $drop.find('ul')[0].innerHTML = li;
      return $drop;
    },

    reloadLi: function () {
      //Remove all children.
      this.destroyLi();
      //Re build
      var li = this.createLi();
      this.$menuInner[0].innerHTML = li;
    },

    destroyLi: function () {
      this.$menu.find('li').remove();
    },

    createLi: function () {
      var that = this,
          _li = [],
          optID = 0,
          titleOption = document.createElement('option'),
          liIndex = -1; // increment liIndex whenever a new <li> element is created to ensure liObj is correct

      // Helper functions
      /**
       * @param content
       * @param [index]
       * @param [classes]
       * @param [optgroup]
       * @returns {string}
       */
      var generateLI = function (content, index, classes, optgroup) {
        return '<li' +
            ((typeof classes !== 'undefined' & '' !== classes) ? ' class="' + classes + '"' : '') +
            ((typeof index !== 'undefined' & null !== index) ? ' data-original-index="' + index + '"' : '') +
            ((typeof optgroup !== 'undefined' & null !== optgroup) ? 'data-optgroup="' + optgroup + '"' : '') +
            '>' + content + '</li>';
      };

      /**
       * @param text
       * @param [classes]
       * @param [inline]
       * @param [tokens]
       * @returns {string}
       */
      var generateA = function (text, classes, inline, tokens) {
        return '<a tabindex="0"' +
            (typeof classes !== 'undefined' ? ' class="' + classes + '"' : '') +
            (typeof inline !== 'undefined' ? ' style="' + inline + '"' : '') +
            (that.options.liveSearchNormalize ? ' data-normalized-text="' + normalizeToBase(htmlEscape(text)) + '"' : '') +
            (typeof tokens !== 'undefined' || tokens !== null ? ' data-tokens="' + tokens + '"' : '') +
            ' role="option">' + text +
            '<span class="' + that.options.iconBase + ' ' + that.options.tickIcon + ' check-mark"></span>' +
            '</a>';
      };

      if (this.options.title && !this.multiple) {
        // this option doesn't create a new <li> element, but does add a new option, so liIndex is decreased
        // since liObj is recalculated on every refresh, liIndex needs to be decreased even if the titleOption is already appended
        liIndex--;

        if (!this.$element.find('.bs-title-option').length) {
          // Use native JS to prepend option (faster)
          var element = this.$element[0];
          titleOption.className = 'bs-title-option';
          titleOption.appendChild(document.createTextNode(this.options.title));
          titleOption.value = '';
          element.insertBefore(titleOption, element.firstChild);
          // Check if selected or data-selected attribute is already set on an option. If not, select the titleOption option.
          // the selected item may have been changed by user or programmatically before the bootstrap select plugin runs,
          // if so, the option will have the data-selected attribute
          var $opt = $(element.options[element.selectedIndex]);
          if ($opt.attr('selected') === undefined && $opt.data('selected') === undefined) {
            titleOption.selected = true;
          }
        }
      }

      this.$element.find('option').each(function (index) {
        var $this = $(this);

        liIndex++;

        if ($this.hasClass('bs-title-option')) return;

        // Get the class and text for the option
        var optionClass = this.className || '',
            inline = this.style.cssText,
            text = $this.data('content') ? $this.data('content') : $this.html(),
            tokens = $this.data('tokens') ? $this.data('tokens') : null,
            subtext = typeof $this.data('subtext') !== 'undefined' ? '<small class="text-muted">' + $this.data('subtext') + '</small>' : '',
            icon = typeof $this.data('icon') !== 'undefined' ? '<span class="' + that.options.iconBase + ' ' + $this.data('icon') + '"></span> ' : '',
            $parent = $this.parent(),
            isOptgroup = $parent[0].tagName === 'OPTGROUP',
            isOptgroupDisabled = isOptgroup && $parent[0].disabled,
            isDisabled = this.disabled || isOptgroupDisabled;

        if (icon !== '' && isDisabled) {
          icon = '<span>' + icon + '</span>';
        }

        if (that.options.hideDisabled && (isDisabled && !isOptgroup || isOptgroupDisabled)) {
          liIndex--;
          return;
        }

        if (!$this.data('content')) {
          // Prepend any icon and append any subtext to the main text.
          text = icon + '<span class="text">' + text + subtext + '</span>';
        }

        if (isOptgroup && $this.data('divider') !== true) {
          if (that.options.hideDisabled && isDisabled) {
            if ($parent.data('allOptionsDisabled') === undefined) {
              var $options = $parent.children();
              $parent.data('allOptionsDisabled', $options.filter(':disabled').length === $options.length);
            }

            if ($parent.data('allOptionsDisabled')) {
              liIndex--;
              return;
            }
          }

          var optGroupClass = ' ' + $parent[0].className || '';

          if ($this.index() === 0) { // Is it the first option of the optgroup?
            optID += 1;

            // Get the opt group label
            var label = $parent[0].label,
                labelSubtext = typeof $parent.data('subtext') !== 'undefined' ? '<small class="text-muted">' + $parent.data('subtext') + '</small>' : '',
                labelIcon = $parent.data('icon') ? '<span class="' + that.options.iconBase + ' ' + $parent.data('icon') + '"></span> ' : '';

            label = labelIcon + '<span class="text">' + label + labelSubtext + '</span>';

            if (index !== 0 && _li.length > 0) { // Is it NOT the first option of the select && are there elements in the dropdown?
              liIndex++;
              _li.push(generateLI('', null, 'divider', optID + 'div'));
            }
            liIndex++;
            _li.push(generateLI(label, null, 'dropdown-header' + optGroupClass, optID));
          }

          if (that.options.hideDisabled && isDisabled) {
            liIndex--;
            return;
          }

          _li.push(generateLI(generateA(text, 'opt ' + optionClass + optGroupClass, inline, tokens), index, '', optID));
        } else if ($this.data('divider') === true) {
          _li.push(generateLI('', index, 'divider'));
        } else if ($this.data('hidden') === true) {
          _li.push(generateLI(generateA(text, optionClass, inline, tokens), index, 'hidden is-hidden'));
        } else {
          var showDivider = this.previousElementSibling && this.previousElementSibling.tagName === 'OPTGROUP';

          // if previous element is not an optgroup and hideDisabled is true
          if (!showDivider && that.options.hideDisabled) {
            // get previous elements
            var $prev = $(this).prevAll();

            for (var i = 0; i < $prev.length; i++) {
              // find the first element in the previous elements that is an optgroup
              if ($prev[i].tagName === 'OPTGROUP') {
                var optGroupDistance = 0;

                // loop through the options in between the current option and the optgroup
                // and check if they are hidden or disabled
                for (var d = 0; d < i; d++) {
                  var prevOption = $prev[d];
                  if (prevOption.disabled || $(prevOption).data('hidden') === true) optGroupDistance++;
                }

                // if all of the options between the current option and the optgroup are hidden or disabled, show the divider
                if (optGroupDistance === i) showDivider = true;

                break;
              }
            }
          }

          if (showDivider) {
            liIndex++;
            _li.push(generateLI('', null, 'divider', optID + 'div'));
          }
          _li.push(generateLI(generateA(text, optionClass, inline, tokens), index));
        }

        that.liObj[index] = liIndex;
      });

      //If we are not multiple, we don't have a selected item, and we don't have a title, select the first element so something is set in the button
      if (!this.multiple && this.$element.find('option:selected').length === 0 && !this.options.title) {
        this.$element.find('option').eq(0).prop('selected', true).attr('selected', 'selected');
      }

      return _li.join('');
    },

    findLis: function () {
      if (this.$lis == null) this.$lis = this.$menu.find('li');
      return this.$lis;
    },

    /**
     * @param [updateLi] defaults to true
     */
    render: function (updateLi) {
      var that = this,
          notDisabled;

      //Update the LI to match the SELECT
      if (updateLi !== false) {
        this.$element.find('option').each(function (index) {
          var $lis = that.findLis().eq(that.liObj[index]);

          that.setDisabled(index, this.disabled || this.parentNode.tagName === 'OPTGROUP' && this.parentNode.disabled, $lis);
          that.setSelected(index, this.selected, $lis);
        });

        this.togglePlaceholder();
      }

      this.tabIndex();

      var selectedItems = this.$element.find('option').map(function () {
        if (this.selected) {
          if (that.options.hideDisabled && (this.disabled || this.parentNode.tagName === 'OPTGROUP' && this.parentNode.disabled)) return;

          var $this = $(this),
              icon = $this.data('icon') && that.options.showIcon ? '<i class="' + that.options.iconBase + ' ' + $this.data('icon') + '"></i> ' : '',
              subtext;

          if (that.options.showSubtext && $this.data('subtext') && !that.multiple) {
            subtext = ' <small class="text-muted">' + $this.data('subtext') + '</small>';
          } else {
            subtext = '';
          }
          if (typeof $this.attr('title') !== 'undefined') {
            return $this.attr('title');
          } else if ($this.data('content') && that.options.showContent) {
            return $this.data('content');
          } else {
            return icon + $this.html() + subtext;
          }
        }
      }).toArray();

      //Fixes issue in IE10 occurring when no default option is selected and at least one option is disabled
      //Convert all the values into a comma delimited string
      var title = !this.multiple ? selectedItems[0] : selectedItems.join(this.options.multipleSeparator);

      //If this is multi select, and the selectText type is count, the show 1 of 2 selected etc..
      if (this.multiple && this.options.selectedTextFormat.indexOf('count') > -1) {
        var max = this.options.selectedTextFormat.split('>');
        if ((max.length > 1 && selectedItems.length > max[1]) || (max.length == 1 && selectedItems.length >= 2)) {
          notDisabled = this.options.hideDisabled ? ', [disabled]' : '';
          var totalCount = this.$element.find('option').not('[data-divider="true"], [data-hidden="true"]' + notDisabled).length,
              tr8nText = (typeof this.options.countSelectedText === 'function') ? this.options.countSelectedText(selectedItems.length, totalCount) : this.options.countSelectedText;
          title = tr8nText.replace('{0}', selectedItems.length.toString()).replace('{1}', totalCount.toString());
        }
      }

      if (this.options.title == undefined) {
        this.options.title = this.$element.attr('title');
      }

      if (this.options.selectedTextFormat == 'static') {
        title = this.options.title;
      }

      //If we dont have a title, then use the default, or if nothing is set at all, use the not selected text
      if (!title) {
        title = typeof this.options.title !== 'undefined' ? this.options.title : this.options.noneSelectedText;
      }

      //strip all html-tags and trim the result
      this.$button.attr('title', $.trim(title.replace(/<[^>]*>?/g, '')));
      this.$button.children('.filter-option').html(title);

      this.$element.trigger('rendered.bs.select');
    },

    /**
     * @param [style]
     * @param [status]
     */
    setStyle: function (style, status) {
      if (this.$element.attr('class')) {
        this.$newElement.addClass(this.$element.attr('class').replace(/selectpicker|mobile-device|bs-select-hidden|validate\[.*\]/gi, ''));
      }

      var buttonClass = style ? style : this.options.style;

      if (status == 'add') {
        this.$button.addClass(buttonClass);
      } else if (status == 'remove') {
        this.$button.removeClass(buttonClass);
      } else {
        this.$button.removeClass(this.options.style);
        this.$button.addClass(buttonClass);
      }
    },

    liHeight: function (refresh) {
      if (!refresh && (this.options.size === false || this.sizeInfo)) return;

      var newElement = document.createElement('div'),
          menu = document.createElement('div'),
          menuInner = document.createElement('ul'),
          divider = document.createElement('li'),
          li = document.createElement('li'),
          a = document.createElement('a'),
          text = document.createElement('span'),
          header = this.options.header && this.$menu.find('.popover-title').length > 0 ? this.$menu.find('.popover-title')[0].cloneNode(true) : null,
          search = this.options.liveSearch ? document.createElement('div') : null,
          actions = this.options.actionsBox && this.multiple && this.$menu.find('.bs-actionsbox').length > 0 ? this.$menu.find('.bs-actionsbox')[0].cloneNode(true) : null,
          doneButton = this.options.doneButton && this.multiple && this.$menu.find('.bs-donebutton').length > 0 ? this.$menu.find('.bs-donebutton')[0].cloneNode(true) : null;

      text.className = 'text';
      newElement.className = this.$menu[0].parentNode.className + ' open';
      menu.className = 'dropdown-menu open';
      menuInner.className = 'dropdown-menu inner';
      divider.className = 'divider';

      text.appendChild(document.createTextNode('Inner text'));
      a.appendChild(text);
      li.appendChild(a);
      menuInner.appendChild(li);
      menuInner.appendChild(divider);
      if (header) menu.appendChild(header);
      if (search) {
        // create a span instead of input as creating an input element is slower
        var input = document.createElement('span');
        search.className = 'bs-searchbox';
        input.className = 'form-control';
        search.appendChild(input);
        menu.appendChild(search);
      }
      if (actions) menu.appendChild(actions);
      menu.appendChild(menuInner);
      if (doneButton) menu.appendChild(doneButton);
      newElement.appendChild(menu);

      document.body.appendChild(newElement);

      var liHeight = a.offsetHeight,
          headerHeight = header ? header.offsetHeight : 0,
          searchHeight = search ? search.offsetHeight : 0,
          actionsHeight = actions ? actions.offsetHeight : 0,
          doneButtonHeight = doneButton ? doneButton.offsetHeight : 0,
          dividerHeight = $(divider).outerHeight(true),
          // fall back to jQuery if getComputedStyle is not supported
          menuStyle = typeof getComputedStyle === 'function' ? getComputedStyle(menu) : false,
          $menu = menuStyle ? null : $(menu),
          menuPadding = {
            vert: parseInt(menuStyle ? menuStyle.paddingTop : $menu.css('paddingTop')) +
                  parseInt(menuStyle ? menuStyle.paddingBottom : $menu.css('paddingBottom')) +
                  parseInt(menuStyle ? menuStyle.borderTopWidth : $menu.css('borderTopWidth')) +
                  parseInt(menuStyle ? menuStyle.borderBottomWidth : $menu.css('borderBottomWidth')),
            horiz: parseInt(menuStyle ? menuStyle.paddingLeft : $menu.css('paddingLeft')) +
                  parseInt(menuStyle ? menuStyle.paddingRight : $menu.css('paddingRight')) +
                  parseInt(menuStyle ? menuStyle.borderLeftWidth : $menu.css('borderLeftWidth')) +
                  parseInt(menuStyle ? menuStyle.borderRightWidth : $menu.css('borderRightWidth'))
          },
          menuExtras =  {
            vert: menuPadding.vert +
                  parseInt(menuStyle ? menuStyle.marginTop : $menu.css('marginTop')) +
                  parseInt(menuStyle ? menuStyle.marginBottom : $menu.css('marginBottom')) + 2,
            horiz: menuPadding.horiz +
                  parseInt(menuStyle ? menuStyle.marginLeft : $menu.css('marginLeft')) +
                  parseInt(menuStyle ? menuStyle.marginRight : $menu.css('marginRight')) + 2
          }

      document.body.removeChild(newElement);

      this.sizeInfo = {
        liHeight: liHeight,
        headerHeight: headerHeight,
        searchHeight: searchHeight,
        actionsHeight: actionsHeight,
        doneButtonHeight: doneButtonHeight,
        dividerHeight: dividerHeight,
        menuPadding: menuPadding,
        menuExtras: menuExtras
      };
    },

    setSize: function () {
      this.findLis();
      this.liHeight();

      if (this.options.header) this.$menu.css('padding-top', 0);
      if (this.options.size === false) return;

      var that = this,
          $menu = this.$menu,
          $menuInner = this.$menuInner,
          $window = $(window),
          selectHeight = this.$newElement[0].offsetHeight,
          selectWidth = this.$newElement[0].offsetWidth,
          liHeight = this.sizeInfo['liHeight'],
          headerHeight = this.sizeInfo['headerHeight'],
          searchHeight = this.sizeInfo['searchHeight'],
          actionsHeight = this.sizeInfo['actionsHeight'],
          doneButtonHeight = this.sizeInfo['doneButtonHeight'],
          divHeight = this.sizeInfo['dividerHeight'],
          menuPadding = this.sizeInfo['menuPadding'],
          menuExtras = this.sizeInfo['menuExtras'],
          notDisabled = this.options.hideDisabled ? '.disabled' : '',
          menuHeight,
          menuWidth,
          getHeight,
          getWidth,
          selectOffsetTop,
          selectOffsetBot,
          selectOffsetLeft,
          selectOffsetRight,
          getPos = function() {
            var pos = that.$newElement.offset(),
                $container = $(that.options.container),
                containerPos;

            if (that.options.container && !$container.is('body')) {
              containerPos = $container.offset();
              containerPos.top += parseInt($container.css('borderTopWidth'));
              containerPos.left += parseInt($container.css('borderLeftWidth'));
            } else {
              containerPos = { top: 0, left: 0 };
            }

            selectOffsetTop = pos.top - containerPos.top - $window.scrollTop();
            selectOffsetBot = $window.height() - selectOffsetTop - selectHeight - containerPos.top;
            selectOffsetLeft = pos.left - containerPos.left - $window.scrollLeft();
            selectOffsetRight = $window.width() - selectOffsetLeft - selectWidth - containerPos.left;
          };

      getPos();

      if (this.options.size === 'auto') {
        var getSize = function () {
          var minHeight,
              hasClass = function (className, include) {
                return function (element) {
                    if (include) {
                        return (element.classList ? element.classList.contains(className) : $(element).hasClass(className));
                    } else {
                        return !(element.classList ? element.classList.contains(className) : $(element).hasClass(className));
                    }
                };
              },
              lis = that.$menuInner[0].getElementsByTagName('li'),
              lisVisible = Array.prototype.filter ? Array.prototype.filter.call(lis, hasClass('hidden', false)) : that.$lis.not('.hidden'),
              optGroup = Array.prototype.filter ? Array.prototype.filter.call(lisVisible, hasClass('dropdown-header', true)) : lisVisible.filter('.dropdown-header');

          getPos();
          menuHeight = selectOffsetBot - menuExtras.vert;
          menuWidth = selectOffsetRight - menuExtras.horiz;

          if (that.options.container) {
            if (!$menu.data('height')) $menu.data('height', $menu.height());
            getHeight = $menu.data('height');

            if (!$menu.data('width')) $menu.data('width', $menu.width());
            getWidth = $menu.data('width');
          } else {
            getHeight = $menu.height();
            getWidth = $menu.width();
          }

          if (that.options.dropupAuto) {
            that.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras.vert) < getHeight);
          }

          if (that.$newElement.hasClass('dropup')) {
            menuHeight = selectOffsetTop - menuExtras.vert;
          }

          if (that.options.dropdownAlignRight === 'auto') {
            $menu.toggleClass('dropdown-menu-right', selectOffsetLeft > selectOffsetRight && (menuWidth - menuExtras.horiz) < (getWidth - selectWidth));
          }

          if ((lisVisible.length + optGroup.length) > 3) {
            minHeight = liHeight * 3 + menuExtras.vert - 2;
          } else {
            minHeight = 0;
          }

          $menu.css({
            'max-height': menuHeight + 'px',
            'overflow': 'hidden',
            'min-height': minHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px'
          });
          $menuInner.css({
            'max-height': menuHeight - headerHeight - searchHeight - actionsHeight - doneButtonHeight - menuPadding.vert + 'px',
            'overflow-y': 'auto',
            'min-height': Math.max(minHeight - menuPadding.vert, 0) + 'px'
          });
        };
        getSize();
        this.$searchbox.off('input.getSize propertychange.getSize').on('input.getSize propertychange.getSize', getSize);
        $window.off('resize.getSize scroll.getSize').on('resize.getSize scroll.getSize', getSize);
      } else if (this.options.size && this.options.size != 'auto' && this.$lis.not(notDisabled).length > this.options.size) {
        var optIndex = this.$lis.not('.divider').not(notDisabled).children().slice(0, this.options.size).last().parent().index(),
            divLength = this.$lis.slice(0, optIndex + 1).filter('.divider').length;
        menuHeight = liHeight * this.options.size + divLength * divHeight + menuPadding.vert;

        if (that.options.container) {
          if (!$menu.data('height')) $menu.data('height', $menu.height());
          getHeight = $menu.data('height');
        } else {
          getHeight = $menu.height();
        }

        if (that.options.dropupAuto) {
          //noinspection JSUnusedAssignment
          this.$newElement.toggleClass('dropup', selectOffsetTop > selectOffsetBot && (menuHeight - menuExtras.vert) < getHeight);
        }
        $menu.css({
          'max-height': menuHeight + headerHeight + searchHeight + actionsHeight + doneButtonHeight + 'px',
          'overflow': 'hidden',
          'min-height': ''
        });
        $menuInner.css({
          'max-height': menuHeight - menuPadding.vert + 'px',
          'overflow-y': 'auto',
          'min-height': ''
        });
      }
    },

    setWidth: function () {
      if (this.options.width === 'auto') {
        this.$menu.css('min-width', '0');

        // Get correct width if element is hidden
        var $selectClone = this.$menu.parent().clone().appendTo('body'),
            $selectClone2 = this.options.container ? this.$newElement.clone().appendTo('body') : $selectClone,
            ulWidth = $selectClone.children('.dropdown-menu').outerWidth(),
            btnWidth = $selectClone2.css('width', 'auto').children('button').outerWidth();

        $selectClone.remove();
        $selectClone2.remove();

        // Set width to whatever's larger, button title or longest option
        this.$newElement.css('width', Math.max(ulWidth, btnWidth) + 'px');
      } else if (this.options.width === 'fit') {
        // Remove inline min-width so width can be changed from 'auto'
        this.$menu.css('min-width', '');
        this.$newElement.css('width', '').addClass('fit-width');
      } else if (this.options.width) {
        // Remove inline min-width so width can be changed from 'auto'
        this.$menu.css('min-width', '');
        this.$newElement.css('width', this.options.width);
      } else {
        // Remove inline min-width/width so width can be changed
        this.$menu.css('min-width', '');
        this.$newElement.css('width', '');
      }
      // Remove fit-width class if width is changed programmatically
      if (this.$newElement.hasClass('fit-width') && this.options.width !== 'fit') {
        this.$newElement.removeClass('fit-width');
      }
    },

    selectPosition: function () {
      this.$bsContainer = $('<div class="bs-container" />');

      var that = this,
          $container = $(this.options.container),
          pos,
          containerPos,
          actualHeight,
          getPlacement = function ($element) {
            that.$bsContainer.addClass($element.attr('class').replace(/form-control|fit-width/gi, '')).toggleClass('dropup', $element.hasClass('dropup'));
            pos = $element.offset();

            if (!$container.is('body')) {
              containerPos = $container.offset();
              containerPos.top += parseInt($container.css('borderTopWidth')) - $container.scrollTop();
              containerPos.left += parseInt($container.css('borderLeftWidth')) - $container.scrollLeft();
            } else {
              containerPos = { top: 0, left: 0 };
            }

            actualHeight = $element.hasClass('dropup') ? 0 : $element[0].offsetHeight;

            that.$bsContainer.css({
              'top': pos.top - containerPos.top + actualHeight,
              'left': pos.left - containerPos.left,
              'width': $element[0].offsetWidth
            });
          };

      this.$button.on('click', function () {
        var $this = $(this);

        if (that.isDisabled()) {
          return;
        }

        getPlacement(that.$newElement);

        that.$bsContainer
          .appendTo(that.options.container)
          .toggleClass('open', !$this.hasClass('open'))
          .append(that.$menu);
      });

      $(window).on('resize scroll', function () {
        getPlacement(that.$newElement);
      });

      this.$element.on('hide.bs.select', function () {
        that.$menu.data('height', that.$menu.height());
        that.$bsContainer.detach();
      });
    },

    /**
     * @param {number} index - the index of the option that is being changed
     * @param {boolean} selected - true if the option is being selected, false if being deselected
     * @param {JQuery} $lis - the 'li' element that is being modified
     */
    setSelected: function (index, selected, $lis) {
      if (!$lis) {
        this.togglePlaceholder(); // check if setSelected is being called by changing the value of the select
        $lis = this.findLis().eq(this.liObj[index]);
      }

      $lis.toggleClass('selected', selected).find('a').attr('aria-selected', selected);
    },

    /**
     * @param {number} index - the index of the option that is being disabled
     * @param {boolean} disabled - true if the option is being disabled, false if being enabled
     * @param {JQuery} $lis - the 'li' element that is being modified
     */
    setDisabled: function (index, disabled, $lis) {
      if (!$lis) {
        $lis = this.findLis().eq(this.liObj[index]);
      }

      if (disabled) {
        $lis.addClass('disabled').children('a').attr('href', '#').attr('tabindex', -1);
      } else {
        $lis.removeClass('disabled').children('a').removeAttr('href').attr('tabindex', 0);
      }
    },

    isDisabled: function () {
      return this.$element[0].disabled;
    },

    checkDisabled: function () {
      var that = this;

      if (this.isDisabled()) {
        this.$newElement.addClass('disabled');
        this.$button.addClass('disabled').attr('tabindex', -1);
      } else {
        if (this.$button.hasClass('disabled')) {
          this.$newElement.removeClass('disabled');
          this.$button.removeClass('disabled');
        }

        if (this.$button.attr('tabindex') == -1 && !this.$element.data('tabindex')) {
          this.$button.removeAttr('tabindex');
        }
      }

      this.$button.click(function () {
        return !that.isDisabled();
      });
    },

    togglePlaceholder: function () {
      var value = this.$element.val();
      this.$button.toggleClass('bs-placeholder', value === [] || value === null || value === '');
      // console.log(value);
      // if (value == null) {
      //   value = [];
      // }
      // console.log(value);
      //this.$button.toggleClass('bs-placeholder', value === []);
    },

    tabIndex: function () {
      if (this.$element.data('tabindex') !== this.$element.attr('tabindex') &&
        (this.$element.attr('tabindex') !== -98 && this.$element.attr('tabindex') !== '-98')) {
        this.$element.data('tabindex', this.$element.attr('tabindex'));
        this.$button.attr('tabindex', this.$element.data('tabindex'));
      }

      this.$element.attr('tabindex', -98);
    },

    clickListener: function () {
      var that = this,
          $document = $(document);

      this.$newElement.on('touchstart.dropdown', '.dropdown-menu', function (e) {
        e.stopPropagation();
      });

      $document.data('spaceSelect', false);

      this.$button.on('keyup', function (e) {
        if (/(32)/.test(e.keyCode.toString(10)) && $document.data('spaceSelect')) {
            e.preventDefault();
            $document.data('spaceSelect', false);
        }
      });

      this.$button.on('click', function () {
        that.setSize();
      });

      this.$element.on('shown.bs.select', function () {
        if (!that.options.liveSearch && !that.multiple) {
          that.$menuInner.find('.selected a').focus();
        } else if (!that.multiple) {
          var selectedIndex = that.liObj[that.$element[0].selectedIndex];

          if (typeof selectedIndex !== 'number' || that.options.size === false) return;

          // scroll to selected option
          var offset = that.$lis.eq(selectedIndex)[0].offsetTop - that.$menuInner[0].offsetTop;
          offset = offset - that.$menuInner[0].offsetHeight/2 + that.sizeInfo.liHeight/2;
          that.$menuInner[0].scrollTop = offset;
        }
      });

      this.$menuInner.on('click', 'li a', function (e) {
        var $this = $(this),
            clickedIndex = $this.parent().data('originalIndex'),
            prevValue = that.$element.val(),
            prevIndex = that.$element.prop('selectedIndex'),
            triggerChange = true;

        // Don't close on multi choice menu
        if (that.multiple && that.options.maxOptions !== 1) {
          e.stopPropagation();
        }

        e.preventDefault();

        //Don't run if we have been disabled
        if (!that.isDisabled() && !$this.parent().hasClass('disabled')) {
          var $options = that.$element.find('option'),
              $option = $options.eq(clickedIndex),
              state = $option.prop('selected'),
              $optgroup = $option.parent('optgroup'),
              maxOptions = that.options.maxOptions,
              maxOptionsGrp = $optgroup.data('maxOptions') || false;

          if (!that.multiple) { // Deselect all others if not multi select box
            $options.prop('selected', false);
            $option.prop('selected', true);
            that.$menuInner.find('.selected').removeClass('selected').find('a').attr('aria-selected', false);
            that.setSelected(clickedIndex, true);
          } else { // Toggle the one we have chosen if we are multi select.
            $option.prop('selected', !state);
            that.setSelected(clickedIndex, !state);
            $this.blur();

            if (maxOptions !== false || maxOptionsGrp !== false) {
              var maxReached = maxOptions < $options.filter(':selected').length,
                  maxReachedGrp = maxOptionsGrp < $optgroup.find('option:selected').length;

              if ((maxOptions && maxReached) || (maxOptionsGrp && maxReachedGrp)) {
                if (maxOptions && maxOptions == 1) {
                  $options.prop('selected', false);
                  $option.prop('selected', true);
                  that.$menuInner.find('.selected').removeClass('selected');
                  that.setSelected(clickedIndex, true);
                } else if (maxOptionsGrp && maxOptionsGrp == 1) {
                  $optgroup.find('option:selected').prop('selected', false);
                  $option.prop('selected', true);
                  var optgroupID = $this.parent().data('optgroup');
                  that.$menuInner.find('[data-optgroup="' + optgroupID + '"]').removeClass('selected');
                  that.setSelected(clickedIndex, true);
                } else {
                  var maxOptionsText = typeof that.options.maxOptionsText === 'string' ? [that.options.maxOptionsText, that.options.maxOptionsText] : that.options.maxOptionsText,
                      maxOptionsArr = typeof maxOptionsText === 'function' ? maxOptionsText(maxOptions, maxOptionsGrp) : maxOptionsText,
                      maxTxt = maxOptionsArr[0].replace('{n}', maxOptions),
                      maxTxtGrp = maxOptionsArr[1].replace('{n}', maxOptionsGrp),
                      $notify = $('<div class="notify"></div>');
                  // If {var} is set in array, replace it
                  /** @deprecated */
                  if (maxOptionsArr[2]) {
                    maxTxt = maxTxt.replace('{var}', maxOptionsArr[2][maxOptions > 1 ? 0 : 1]);
                    maxTxtGrp = maxTxtGrp.replace('{var}', maxOptionsArr[2][maxOptionsGrp > 1 ? 0 : 1]);
                  }

                  $option.prop('selected', false);

                  that.$menu.append($notify);

                  if (maxOptions && maxReached) {
                    $notify.append($('<div>' + maxTxt + '</div>'));
                    triggerChange = false;
                    that.$element.trigger('maxReached.bs.select');
                  }

                  if (maxOptionsGrp && maxReachedGrp) {
                    $notify.append($('<div>' + maxTxtGrp + '</div>'));
                    triggerChange = false;
                    that.$element.trigger('maxReachedGrp.bs.select');
                  }

                  setTimeout(function () {
                    that.setSelected(clickedIndex, false);
                  }, 10);

                  $notify.delay(750).fadeOut(300, function () {
                    $(this).remove();
                  });
                }
              }
            }
          }

          if (!that.multiple || (that.multiple && that.options.maxOptions === 1)) {
            that.$button.focus();
          } else if (that.options.liveSearch) {
            that.$searchbox.focus();
          }

          // Trigger select 'change'
          if (triggerChange) {
            if ((prevValue != that.$element.val() && that.multiple) || (prevIndex != that.$element.prop('selectedIndex') && !that.multiple)) {
              // $option.prop('selected') is current option state (selected/unselected). state is previous option state.
              that.$element
                .trigger('changed.bs.select', [clickedIndex, $option.prop('selected'), state])
                .triggerNative('change');
            }
          }
        }
      });

      this.$menu.on('click', 'li.disabled a, .popover-title, .popover-title :not(.close)', function (e) {
        if (e.currentTarget == this) {
          e.preventDefault();
          e.stopPropagation();
          if (that.options.liveSearch && !$(e.target).hasClass('close')) {
            that.$searchbox.focus();
          } else {
            that.$button.focus();
          }
        }
      });

      this.$menuInner.on('click', '.divider, .dropdown-header', function (e) {
        e.preventDefault();
        e.stopPropagation();
        if (that.options.liveSearch) {
          that.$searchbox.focus();
        } else {
          that.$button.focus();
        }
      });

      this.$menu.on('click', '.popover-title .close', function () {
        that.$button.click();
      });

      this.$searchbox.on('click', function (e) {
        e.stopPropagation();
      });

      this.$menu.on('click', '.actions-btn', function (e) {
        if (that.options.liveSearch) {
          that.$searchbox.focus();
        } else {
          that.$button.focus();
        }

        e.preventDefault();
        e.stopPropagation();

        if ($(this).hasClass('bs-select-all')) {
          if (that.options.hideOnClickSelectAll) {
            $(this).closest('.btn.dropdown-toggle.btn-default').attr('aria-expanded', false);
            $(this).closest('.bootstrap-select.open').removeClass('open');
          } else {
            that.selectAll();
          }
        } else {
          that.deselectAll();
        }
      });

      this.$element.change(function () {
        that.render(false);
      });
    },

    liveSearchListener: function () {
      var that = this,
          $no_results = $('<li class="no-results"></li>');

      this.$button.on('click.dropdown.data-api touchstart.dropdown.data-api', function () {
        that.$menuInner.find('.active').removeClass('active');
        if (!!that.$searchbox.val()) {
          that.$searchbox.val('');
          that.$lis.not('.is-hidden').removeClass('hidden');
          if (!!$no_results.parent().length) $no_results.remove();
        }
        if (!that.multiple) that.$menuInner.find('.selected').addClass('active');
        setTimeout(function () {
          that.$searchbox.focus();
        }, 10);
      });

      this.$searchbox.on('click.dropdown.data-api focus.dropdown.data-api touchend.dropdown.data-api', function (e) {
        e.stopPropagation();
      });

      this.$searchbox.on('input propertychange', function () {
        if (that.$searchbox.val()) {
          var $searchBase = that.$lis.not('.is-hidden').removeClass('hidden').children('a');
          if (that.options.liveSearchNormalize) {
            $searchBase = $searchBase.not(':a' + that._searchStyle() + '("' + normalizeToBase(that.$searchbox.val()) + '")');
          } else {
            $searchBase = $searchBase.not(':' + that._searchStyle() + '("' + that.$searchbox.val() + '")');
          }
          $searchBase.parent().addClass('hidden');

          that.$lis.filter('.dropdown-header').each(function () {
            var $this = $(this),
                optgroup = $this.data('optgroup');

            if (that.$lis.filter('[data-optgroup=' + optgroup + ']').not($this).not('.hidden').length === 0) {
              $this.addClass('hidden');
              that.$lis.filter('[data-optgroup=' + optgroup + 'div]').addClass('hidden');
            }
          });

          var $lisVisible = that.$lis.not('.hidden');

          // hide divider if first or last visible, or if followed by another divider
          $lisVisible.each(function (index) {
            var $this = $(this);

            if ($this.hasClass('divider') && (
              $this.index() === $lisVisible.first().index() ||
              $this.index() === $lisVisible.last().index() ||
              $lisVisible.eq(index + 1).hasClass('divider'))) {
              $this.addClass('hidden');
            }
          });

          if (!that.$lis.not('.hidden, .no-results').length) {
            if (!!$no_results.parent().length) {
              $no_results.remove();
            }
            $no_results.html(that.options.noneResultsText.replace('{0}', '"' + htmlEscape(that.$searchbox.val()) + '"')).show();
            that.$menuInner.append($no_results);
          } else if (!!$no_results.parent().length) {
            $no_results.remove();
          }
        } else {
          that.$lis.not('.is-hidden').removeClass('hidden');
          if (!!$no_results.parent().length) {
            $no_results.remove();
          }
        }

        that.$lis.filter('.active').removeClass('active');
        if (that.$searchbox.val()) that.$lis.not('.hidden, .divider, .dropdown-header').eq(0).addClass('active').children('a').focus();
        $(this).focus();
      });
    },

    _searchStyle: function () {
      var styles = {
        begins: 'ibegins',
        startsWith: 'ibegins'
      };

      return styles[this.options.liveSearchStyle] || 'icontains';
    },

    val: function (value) {
      if (typeof value !== 'undefined') {
        this.$element.val(value);
        this.render();

        return this.$element;
      } else {
        if (value === null) {
          return [];
        } else {
          return this.$element.val();
        }

      }
    },

    changeAll: function (status) {
      if (!this.multiple) return;
      if (typeof status === 'undefined') status = true;

      this.findLis();

      var $options = this.$element.find('option'),
          $lisVisible = this.$lis.not('.divider, .dropdown-header, .disabled, .hidden'),
          lisVisLen = $lisVisible.length,
          selectedOptions = [];

      if (status) {
        if ($lisVisible.filter('.selected').length === $lisVisible.length) return;
      } else {
        if ($lisVisible.filter('.selected').length === 0) return;
      }

      $lisVisible.toggleClass('selected', status);

      for (var i = 0; i < lisVisLen; i++) {
        var origIndex = $lisVisible[i].getAttribute('data-original-index');
        selectedOptions[selectedOptions.length] = $options.eq(origIndex)[0];
      }

      $(selectedOptions).prop('selected', status);

      this.render(false);

      this.togglePlaceholder();

      this.$element
        .trigger('changed.bs.select')
        .triggerNative('change');
    },

    selectAll: function () {
      return this.changeAll(true);
    },

    deselectAll: function () {
      return this.changeAll(false);
    },

    toggle: function (e) {
      e = e || window.event;

      if (e) e.stopPropagation();

      this.$button.trigger('click');
    },

    keydown: function (e) {
      var $this = $(this),
          $parent = $this.is('input') ? $this.parent().parent() : $this.parent(),
          $items,
          that = $parent.data('this'),
          index,
          next,
          first,
          last,
          prev,
          nextPrev,
          prevIndex,
          isActive,
          selector = ':not(.disabled, .hidden, .dropdown-header, .divider)',
          keyCodeMap = {
            32: ' ',
            48: '0',
            49: '1',
            50: '2',
            51: '3',
            52: '4',
            53: '5',
            54: '6',
            55: '7',
            56: '8',
            57: '9',
            59: ';',
            65: 'a',
            66: 'b',
            67: 'c',
            68: 'd',
            69: 'e',
            70: 'f',
            71: 'g',
            72: 'h',
            73: 'i',
            74: 'j',
            75: 'k',
            76: 'l',
            77: 'm',
            78: 'n',
            79: 'o',
            80: 'p',
            81: 'q',
            82: 'r',
            83: 's',
            84: 't',
            85: 'u',
            86: 'v',
            87: 'w',
            88: 'x',
            89: 'y',
            90: 'z',
            96: '0',
            97: '1',
            98: '2',
            99: '3',
            100: '4',
            101: '5',
            102: '6',
            103: '7',
            104: '8',
            105: '9'
          };

      if (that.options.liveSearch) $parent = $this.parent().parent();

      if (that.options.container) $parent = that.$menu;

      $items = $('[role="listbox"] li', $parent);

      isActive = that.$newElement.hasClass('open');

      if (!isActive && (e.keyCode >= 48 && e.keyCode <= 57 || e.keyCode >= 96 && e.keyCode <= 105 || e.keyCode >= 65 && e.keyCode <= 90)) {
        if (!that.options.container) {
          that.setSize();
          that.$menu.parent().addClass('open');
          isActive = true;
        } else {
          that.$button.trigger('click');
        }
        that.$searchbox.focus();
        return;
      }

      if (that.options.liveSearch) {
        if (/(^9$|27)/.test(e.keyCode.toString(10)) && isActive && that.$menu.find('.active').length === 0) {
          e.preventDefault();
          that.$menu.parent().removeClass('open');
          if (that.options.container) that.$newElement.removeClass('open');
          that.$button.focus();
        }
        // $items contains li elements when liveSearch is enabled
        $items = $('[role="listbox"] li' + selector, $parent);
        if (!$this.val() && !/(38|40)/.test(e.keyCode.toString(10))) {
          if ($items.filter('.active').length === 0) {
            $items = that.$menuInner.find('li');
            if (that.options.liveSearchNormalize) {
              $items = $items.filter(':a' + that._searchStyle() + '(' + normalizeToBase(keyCodeMap[e.keyCode]) + ')');
            } else {
              $items = $items.filter(':' + that._searchStyle() + '(' + keyCodeMap[e.keyCode] + ')');
            }
          }
        }
      }

      if (!$items.length) return;

      if (/(38|40)/.test(e.keyCode.toString(10))) {
        index = $items.index($items.find('a').filter(':focus').parent());
        first = $items.filter(selector).first().index();
        last = $items.filter(selector).last().index();
        next = $items.eq(index).nextAll(selector).eq(0).index();
        prev = $items.eq(index).prevAll(selector).eq(0).index();
        nextPrev = $items.eq(next).prevAll(selector).eq(0).index();

        if (that.options.liveSearch) {
          $items.each(function (i) {
            if (!$(this).hasClass('disabled')) {
              $(this).data('index', i);
            }
          });
          index = $items.index($items.filter('.active'));
          first = $items.first().data('index');
          last = $items.last().data('index');
          next = $items.eq(index).nextAll().eq(0).data('index');
          prev = $items.eq(index).prevAll().eq(0).data('index');
          nextPrev = $items.eq(next).prevAll().eq(0).data('index');
        }

        prevIndex = $this.data('prevIndex');

        if (e.keyCode == 38) {
          if (that.options.liveSearch) index--;
          if (index != nextPrev && index > prev) index = prev;
          if (index < first) index = first;
          if (index == prevIndex) index = last;
        } else if (e.keyCode == 40) {
          if (that.options.liveSearch) index++;
          if (index == -1) index = 0;
          if (index != nextPrev && index < next) index = next;
          if (index > last) index = last;
          if (index == prevIndex) index = first;
        }

        $this.data('prevIndex', index);

        if (!that.options.liveSearch) {
          $items.eq(index).children('a').focus();
        } else {
          e.preventDefault();
          if (!$this.hasClass('dropdown-toggle')) {
            $items.removeClass('active').eq(index).addClass('active').children('a').focus();
            $this.focus();
          }
        }

      } else if (!$this.is('input')) {
        var keyIndex = [],
            count,
            prevKey;

        $items.each(function () {
          if (!$(this).hasClass('disabled')) {
            if ($.trim($(this).children('a').text().toLowerCase()).substring(0, 1) == keyCodeMap[e.keyCode]) {
              keyIndex.push($(this).index());
            }
          }
        });

        count = $(document).data('keycount');
        count++;
        $(document).data('keycount', count);

        prevKey = $.trim($(':focus').text().toLowerCase()).substring(0, 1);

        if (prevKey != keyCodeMap[e.keyCode]) {
          count = 1;
          $(document).data('keycount', count);
        } else if (count >= keyIndex.length) {
          $(document).data('keycount', 0);
          if (count > keyIndex.length) count = 1;
        }

        $items.eq(keyIndex[count - 1]).children('a').focus();
      }

      // Select focused option if "Enter", "Spacebar" or "Tab" (when selectOnTab is true) are pressed inside the menu.
      if ((/(13|32)/.test(e.keyCode.toString(10)) || (/(^9$)/.test(e.keyCode.toString(10)) && that.options.selectOnTab)) && isActive) {
        if (!/(32)/.test(e.keyCode.toString(10))) e.preventDefault();
        if (!that.options.liveSearch) {
          var elem = $(':focus');
          elem.click();
          // Bring back focus for multiselects
          elem.focus();
          // Prevent screen from scrolling if the user hit the spacebar
          e.preventDefault();
          // Fixes spacebar selection of dropdown items in FF & IE
          $(document).data('spaceSelect', true);
        } else if (!/(32)/.test(e.keyCode.toString(10))) {
          that.$menuInner.find('.active a').click();
          $this.focus();
        }
        $(document).data('keycount', 0);
      }

      if ((/(^9$|27)/.test(e.keyCode.toString(10)) && isActive && (that.multiple || that.options.liveSearch)) || (/(27)/.test(e.keyCode.toString(10)) && !isActive)) {
        that.$menu.parent().removeClass('open');
        if (that.options.container) that.$newElement.removeClass('open');
        that.$button.focus();
      }
    },

    mobile: function () {
      this.$element.addClass('mobile-device');
    },

    refresh: function () {
      this.$lis = null;
      this.liObj = {};
      this.reloadLi();
      this.render();
      this.checkDisabled();
      this.liHeight(true);
      this.setStyle();
      this.setWidth();
      if (this.$lis) this.$searchbox.trigger('propertychange');

      this.$element.trigger('refreshed.bs.select');
    },

    hide: function () {
      this.$newElement.hide();
    },

    show: function () {
      this.$newElement.show();
    },

    remove: function () {
      this.$newElement.remove();
      this.$element.remove();
    },

    destroy: function () {
      this.$newElement.before(this.$element).remove();

      if (this.$bsContainer) {
        this.$bsContainer.remove();
      } else {
        this.$menu.remove();
      }

      this.$element
        .off('.bs.select')
        .removeData('selectpicker')
        .removeClass('bs-select-hidden selectpicker');
    }
  };

  // SELECTPICKER PLUGIN DEFINITION
  // ==============================
  function Plugin(option, event) {
    // get the args of the outer function..
    var args = arguments;
    // The arguments of the function are explicitly re-defined from the argument list, because the shift causes them
    // to get lost/corrupted in android 2.3 and IE9 #715 #775
    var _option = option,
        _event = event;
    [].shift.apply(args);

    var value;
    var chain = this.each(function () {
      var $this = $(this);
      if ($this.is('select')) {
        var data = $this.data('selectpicker'),
            options = typeof _option == 'object' && _option;

        if (!data) {
          var config = $.extend({}, Selectpicker.DEFAULTS, $.fn.selectpicker.defaults || {}, $this.data(), options);
          config.template = $.extend({}, Selectpicker.DEFAULTS.template, ($.fn.selectpicker.defaults ? $.fn.selectpicker.defaults.template : {}), $this.data().template, options.template);
          $this.data('selectpicker', (data = new Selectpicker(this, config, _event)));
        } else if (options) {
          for (var i in options) {
            if (options.hasOwnProperty(i)) {
              data.options[i] = options[i];
            }
          }
        }

        if (typeof _option == 'string') {
          if (data[_option] instanceof Function) {
            value = data[_option].apply(data, args);
          } else {
            value = data.options[_option];
          }
        }
      }
    });

    if (typeof value !== 'undefined') {
      //noinspection JSUnusedAssignment
      return value;
    } else {
      return chain;
    }
  }

  var old = $.fn.selectpicker;
  $.fn.selectpicker = Plugin;
  $.fn.selectpicker.Constructor = Selectpicker;

  // SELECTPICKER NO CONFLICT
  // ========================
  $.fn.selectpicker.noConflict = function () {
    $.fn.selectpicker = old;
    return this;
  };

  $(document)
      .data('keycount', 0)
      .on('keydown.bs.select', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="listbox"], .bs-searchbox input', Selectpicker.prototype.keydown)
      .on('focusin.modal', '.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="listbox"], .bs-searchbox input', function (e) {
        e.stopPropagation();
      });

  // SELECTPICKER DATA-API
  // =====================
  $(window).on('load.bs.select.data-api', function () {
    $('.selectpicker').each(function () {
      var $selectpicker = $(this);
      Plugin.call($selectpicker, $selectpicker.data());
    })
  });
})(jQuery);
+function(a){"use strict";function b(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var c=function(){function a(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}();(function(a){var d="ekkoLightbox",e=a.fn[d],f={title:"",footer:"",showArrows:!0,wrapping:!0,type:null,alwaysShowClose:!1,loadingMessage:'<div class="ekko-lightbox-loader"><div><div></div><div></div></div></div>',leftArrow:"<span>&#10094;</span>",rightArrow:"<span>&#10095;</span>",strings:{close:"Close",fail:"Failed to load image:",type:"Could not detect remote target type. Force the type using data-type"},doc:document,onShow:function(){},onShown:function(){},onHide:function(){},onHidden:function(){},onNavigate:function(){},onContentLoaded:function(){}},g=function(){function d(c,e){var g=this;b(this,d),this._config=a.extend({},f,e),this._$modalArrows=null,this._galleryIndex=0,this._galleryName=null,this._padding=null,this._border=null,this._titleIsShown=!1,this._footerIsShown=!1,this._wantedWidth=0,this._wantedHeight=0,this._touchstartX=0,this._touchendX=0,this._modalId="ekkoLightbox-"+Math.floor(1e3*Math.random()+1),this._$element=c instanceof jQuery?c:a(c),this._isBootstrap3=3==a.fn.modal.Constructor.VERSION[0];var h='<h4 class="modal-title">'+(this._config.title||"&nbsp;")+"</h4>",i='<button type="button" class="close" data-dismiss="modal" aria-label="'+this._config.strings.close+'"><span aria-hidden="true">&times;</span></button>',j='<div class="modal-header'+(this._config.title||this._config.alwaysShowClose?"":" hide")+'">'+(this._isBootstrap3?i+h:h+i)+"</div>",k='<div class="modal-footer'+(this._config.footer?"":" hide")+'">'+(this._config.footer||"&nbsp;")+"</div>",l='<div class="modal-body"><div class="ekko-lightbox-container"><div class="ekko-lightbox-item fade in show"></div><div class="ekko-lightbox-item fade"></div></div></div>',m='<div class="modal-dialog" role="document"><div class="modal-content">'+j+l+k+"</div></div>";a(this._config.doc.body).append('<div id="'+this._modalId+'" class="ekko-lightbox modal fade" tabindex="-1" tabindex="-1" role="dialog" aria-hidden="true">'+m+"</div>"),this._$modal=a("#"+this._modalId,this._config.doc),this._$modalDialog=this._$modal.find(".modal-dialog").first(),this._$modalContent=this._$modal.find(".modal-content").first(),this._$modalBody=this._$modal.find(".modal-body").first(),this._$modalHeader=this._$modal.find(".modal-header").first(),this._$modalFooter=this._$modal.find(".modal-footer").first(),this._$lightboxContainer=this._$modalBody.find(".ekko-lightbox-container").first(),this._$lightboxBodyOne=this._$lightboxContainer.find("> div:first-child").first(),this._$lightboxBodyTwo=this._$lightboxContainer.find("> div:last-child").first(),this._border=this._calculateBorders(),this._padding=this._calculatePadding(),this._galleryName=this._$element.data("gallery"),this._galleryName&&(this._$galleryItems=a(document.body).find('*[data-gallery="'+this._galleryName+'"]'),this._galleryIndex=this._$galleryItems.index(this._$element),a(document).on("keydown.ekkoLightbox",this._navigationalBinder.bind(this)),this._config.showArrows&&this._$galleryItems.length>1&&(this._$lightboxContainer.append('<div class="ekko-lightbox-nav-overlay"><a href="#">'+this._config.leftArrow+'</a><a href="#">'+this._config.rightArrow+"</a></div>"),this._$modalArrows=this._$lightboxContainer.find("div.ekko-lightbox-nav-overlay").first(),this._$lightboxContainer.on("click","a:first-child",function(a){return a.preventDefault(),g.navigateLeft()}),this._$lightboxContainer.on("click","a:last-child",function(a){return a.preventDefault(),g.navigateRight()}),this.updateNavigation())),this._$modal.on("show.bs.modal",this._config.onShow.bind(this)).on("shown.bs.modal",function(){return g._toggleLoading(!0),g._handle(),g._config.onShown.call(g)}).on("hide.bs.modal",this._config.onHide.bind(this)).on("hidden.bs.modal",function(){return g._galleryName&&(a(document).off("keydown.ekkoLightbox"),a(window).off("resize.ekkoLightbox")),g._$modal.remove(),g._config.onHidden.call(g)}).modal(this._config),a(window).on("resize.ekkoLightbox",function(){g._resize(g._wantedWidth,g._wantedHeight)}),this._$lightboxContainer.on("touchstart",function(){g._touchstartX=event.changedTouches[0].screenX}).on("touchend",function(){g._touchendX=event.changedTouches[0].screenX,g._swipeGesure()})}return c(d,null,[{key:"Default",get:function(){return f}}]),c(d,[{key:"element",value:function(){return this._$element}},{key:"modal",value:function(){return this._$modal}},{key:"navigateTo",value:function(b){return b<0||b>this._$galleryItems.length-1?this:(this._galleryIndex=b,this.updateNavigation(),this._$element=a(this._$galleryItems.get(this._galleryIndex)),void this._handle())}},{key:"navigateLeft",value:function(){if(this._$galleryItems&&1!==this._$galleryItems.length){if(0===this._galleryIndex){if(!this._config.wrapping)return;this._galleryIndex=this._$galleryItems.length-1}else this._galleryIndex--;return this._config.onNavigate.call(this,"left",this._galleryIndex),this.navigateTo(this._galleryIndex)}}},{key:"navigateRight",value:function(){if(this._$galleryItems&&1!==this._$galleryItems.length){if(this._galleryIndex===this._$galleryItems.length-1){if(!this._config.wrapping)return;this._galleryIndex=0}else this._galleryIndex++;return this._config.onNavigate.call(this,"right",this._galleryIndex),this.navigateTo(this._galleryIndex)}}},{key:"updateNavigation",value:function(){if(!this._config.wrapping){var a=this._$lightboxContainer.find("div.ekko-lightbox-nav-overlay");0===this._galleryIndex?a.find("a:first-child").addClass("disabled"):a.find("a:first-child").removeClass("disabled"),this._galleryIndex===this._$galleryItems.length-1?a.find("a:last-child").addClass("disabled"):a.find("a:last-child").removeClass("disabled")}}},{key:"close",value:function(){return this._$modal.modal("hide")}},{key:"_navigationalBinder",value:function(a){return a=a||window.event,39===a.keyCode?this.navigateRight():37===a.keyCode?this.navigateLeft():void 0}},{key:"_detectRemoteType",value:function(a,b){return b=b||!1,!b&&this._isImage(a)&&(b="image"),!b&&this._getYoutubeId(a)&&(b="youtube"),!b&&this._getVimeoId(a)&&(b="vimeo"),!b&&this._getInstagramId(a)&&(b="instagram"),(!b||["image","youtube","vimeo","instagram","video","url"].indexOf(b)<0)&&(b="url"),b}},{key:"_isImage",value:function(a){return a&&a.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i)}},{key:"_containerToUse",value:function(){var a=this,b=this._$lightboxBodyTwo,c=this._$lightboxBodyOne;return this._$lightboxBodyTwo.hasClass("in")&&(b=this._$lightboxBodyOne,c=this._$lightboxBodyTwo),c.removeClass("in show"),setTimeout(function(){a._$lightboxBodyTwo.hasClass("in")||a._$lightboxBodyTwo.empty(),a._$lightboxBodyOne.hasClass("in")||a._$lightboxBodyOne.empty()},500),b.addClass("in show"),b}},{key:"_handle",value:function(){var a=this._containerToUse();this._updateTitleAndFooter();var b=this._$element.attr("data-remote")||this._$element.attr("href"),c=this._detectRemoteType(b,this._$element.attr("data-type")||!1);if(["image","youtube","vimeo","instagram","video","url"].indexOf(c)<0)return this._error(this._config.strings.type);switch(c){case"image":this._preloadImage(b,a),this._preloadImageByIndex(this._galleryIndex,3);break;case"youtube":this._showYoutubeVideo(b,a);break;case"vimeo":this._showVimeoVideo(this._getVimeoId(b),a);break;case"instagram":this._showInstagramVideo(this._getInstagramId(b),a);break;case"video":this._showHtml5Video(b,a);break;default:this._loadRemoteContent(b,a)}return this}},{key:"_getYoutubeId",value:function(a){if(!a)return!1;var b=a.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/);return!(!b||11!==b[2].length)&&b[2]}},{key:"_getVimeoId",value:function(a){return!!(a&&a.indexOf("vimeo")>0)&&a}},{key:"_getInstagramId",value:function(a){return!!(a&&a.indexOf("instagram")>0)&&a}},{key:"_toggleLoading",value:function(b){return b=b||!1,b?(this._$modalDialog.css("display","none"),this._$modal.removeClass("in show"),a(".modal-backdrop").append(this._config.loadingMessage)):(this._$modalDialog.css("display","block"),this._$modal.addClass("in show"),a(".modal-backdrop").find(".ekko-lightbox-loader").remove()),this}},{key:"_calculateBorders",value:function(){return{top:this._totalCssByAttribute("border-top-width"),right:this._totalCssByAttribute("border-right-width"),bottom:this._totalCssByAttribute("border-bottom-width"),left:this._totalCssByAttribute("border-left-width")}}},{key:"_calculatePadding",value:function(){return{top:this._totalCssByAttribute("padding-top"),right:this._totalCssByAttribute("padding-right"),bottom:this._totalCssByAttribute("padding-bottom"),left:this._totalCssByAttribute("padding-left")}}},{key:"_totalCssByAttribute",value:function(a){return parseInt(this._$modalDialog.css(a),10)+parseInt(this._$modalContent.css(a),10)+parseInt(this._$modalBody.css(a),10)}},{key:"_updateTitleAndFooter",value:function(){var a=this._$element.data("title")||"",b=this._$element.data("footer")||"";return this._titleIsShown=!1,a||this._config.alwaysShowClose?(this._titleIsShown=!0,this._$modalHeader.css("display","").find(".modal-title").html(a||"&nbsp;")):this._$modalHeader.css("display","none"),this._footerIsShown=!1,b?(this._footerIsShown=!0,this._$modalFooter.css("display","").html(b)):this._$modalFooter.css("display","none"),this}},{key:"_showYoutubeVideo",value:function(a,b){var c=this._getYoutubeId(a),d=a.indexOf("&")>0?a.substr(a.indexOf("&")):"",e=this._$element.data("width")||560,f=this._$element.data("height")||e/(560/315);return this._showVideoIframe("//www.youtube.com/embed/"+c+"?badge=0&autoplay=1&html5=1"+d,e,f,b)}},{key:"_showVimeoVideo",value:function(a,b){var c=this._$element.data("width")||500,d=this._$element.data("height")||c/(560/315);return this._showVideoIframe(a+"?autoplay=1",c,d,b)}},{key:"_showInstagramVideo",value:function(a,b){var c=this._$element.data("width")||612,d=c+80;return a="/"!==a.substr(-1)?a+"/":a,b.html('<iframe width="'+c+'" height="'+d+'" src="'+a+'embed/" frameborder="0" allowfullscreen></iframe>'),this._resize(c,d),this._config.onContentLoaded.call(this),this._$modalArrows&&this._$modalArrows.css("display","none"),this._toggleLoading(!1),this}},{key:"_showVideoIframe",value:function(a,b,c,d){return c=c||b,d.html('<div class="embed-responsive embed-responsive-16by9"><iframe width="'+b+'" height="'+c+'" src="'+a+'" frameborder="0" allowfullscreen class="embed-responsive-item"></iframe></div>'),this._resize(b,c),this._config.onContentLoaded.call(this),this._$modalArrows&&this._$modalArrows.css("display","none"),this._toggleLoading(!1),this}},{key:"_showHtml5Video",value:function(a,b){var c=this._$element.data("width")||560,d=this._$element.data("height")||c/(560/315);return b.html('<div class="embed-responsive embed-responsive-16by9"><video width="'+c+'" height="'+d+'" src="'+a+'" preload="auto" autoplay controls class="embed-responsive-item"></video></div>'),this._resize(c,d),this._config.onContentLoaded.call(this),this._$modalArrows&&this._$modalArrows.css("display","none"),this._toggleLoading(!1),this}},{key:"_loadRemoteContent",value:function(b,c){var d=this,e=this._$element.data("width")||560,f=this._$element.data("height")||560,g=this._$element.data("disableExternalCheck")||!1;return this._toggleLoading(!1),g||this._isExternal(b)?(c.html('<iframe src="'+b+'" frameborder="0" allowfullscreen></iframe>'),this._config.onContentLoaded.call(this)):c.load(b,a.proxy(function(){return d._$element.trigger("loaded.bs.modal")})),this._$modalArrows&&this._$modalArrows.css("display","none"),this._resize(e,f),this}},{key:"_isExternal",value:function(a){var b=a.match(/^([^:\/?#]+:)?(?:\/\/([^\/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/);return"string"==typeof b[1]&&b[1].length>0&&b[1].toLowerCase()!==location.protocol||"string"==typeof b[2]&&b[2].length>0&&b[2].replace(new RegExp(":("+{"http:":80,"https:":443}[location.protocol]+")?$"),"")!==location.host}},{key:"_error",value:function(a){return console.error(a),this._containerToUse().html(a),this._resize(300,300),this}},{key:"_preloadImageByIndex",value:function(b,c){if(this._$galleryItems){var d=a(this._$galleryItems.get(b),!1);if("undefined"!=typeof d){var e=d.attr("data-remote")||d.attr("href");return("image"===d.attr("data-type")||this._isImage(e))&&this._preloadImage(e,!1),c>0?this._preloadImageByIndex(b+1,c-1):void 0}}}},{key:"_preloadImage",value:function(b,c){var d=this;c=c||!1;var e=new Image;return c&&!function(){var f=setTimeout(function(){c.append(d._config.loadingMessage)},200);e.onload=function(){f&&clearTimeout(f),f=null;var b=a("<img />");return b.attr("src",e.src),b.addClass("img-fluid"),b.css("width","100%"),c.html(b),d._$modalArrows&&d._$modalArrows.css("display",""),d._resize(e.width,e.height),d._toggleLoading(!1),d._config.onContentLoaded.call(d)},e.onerror=function(){return d._toggleLoading(!1),d._error(d._config.strings.fail+("  "+b))}}(),e.src=b,e}},{key:"_swipeGesure",value:function(){return this._touchendX<this._touchstartX?this.navigateRight():this._touchendX>this._touchstartX?this.navigateLeft():void 0}},{key:"_resize",value:function(b,c){c=c||b,this._wantedWidth=b,this._wantedHeight=c;var d=this._padding.left+this._padding.right+this._border.left+this._border.right,e=Math.min(b+d,this._config.doc.body.clientWidth);b+d>e?(c=(e-d)/b*c,b=e):b+=d;var f=0,g=0;this._footerIsShown&&(g=this._$modalFooter.outerHeight(!0)||55),this._titleIsShown&&(f=this._$modalHeader.outerHeight(!0)||67);var h=this._padding.top+this._padding.bottom+this._border.bottom+this._border.top,i=parseFloat(this._$modalDialog.css("margin-top"))+parseFloat(this._$modalDialog.css("margin-bottom")),j=Math.min(c,a(window).height()-h-i-f-g);if(c>j){var k=Math.min(j/c,1);b=Math.ceil(k*b)}this._$lightboxContainer.css("height",j),this._$modalDialog.css("width","auto").css("maxWidth",b);var l=this._$modal.data("bs.modal");if(l)try{l._handleUpdate()}catch(m){l.handleUpdate()}return this}}],[{key:"_jQueryInterface",value:function(b){var c=this;return b=b||{},this.each(function(){var e=a(c),f=a.extend({},d.Default,e.data(),"object"==typeof b&&b);new d(c,f)})}}]),d}();return a.fn[d]=g._jQueryInterface,a.fn[d].Constructor=g,a.fn[d].noConflict=function(){return a.fn[d]=e,g._jQueryInterface},g})(jQuery)}(jQuery);
//# sourceMappingURL=ekko-lightbox.min.js.map
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJtYWluLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IGRrbyBvbiA3LzE0LzIwMTcuXHJcbiAqL1xyXG5cclxuLyohIGpRdWVyeSB2My4zLjEgfCAoYykgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzIHwganF1ZXJ5Lm9yZy9saWNlbnNlICovXHJcbiFmdW5jdGlvbihlLHQpe1widXNlIHN0cmljdFwiO1wib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1lLmRvY3VtZW50P3QoZSwhMCk6ZnVuY3Rpb24oZSl7aWYoIWUuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiKTtyZXR1cm4gdChlKX06dChlKX0oXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihlLHQpe1widXNlIHN0cmljdFwiO3ZhciBuPVtdLHI9ZS5kb2N1bWVudCxpPU9iamVjdC5nZXRQcm90b3R5cGVPZixvPW4uc2xpY2UsYT1uLmNvbmNhdCxzPW4ucHVzaCx1PW4uaW5kZXhPZixsPXt9LGM9bC50b1N0cmluZyxmPWwuaGFzT3duUHJvcGVydHkscD1mLnRvU3RyaW5nLGQ9cC5jYWxsKE9iamVjdCksaD17fSxnPWZ1bmN0aW9uIGUodCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdCYmXCJudW1iZXJcIiE9dHlwZW9mIHQubm9kZVR5cGV9LHk9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbnVsbCE9dCYmdD09PXQud2luZG93fSx2PXt0eXBlOiEwLHNyYzohMCxub01vZHVsZTohMH07ZnVuY3Rpb24gbShlLHQsbil7dmFyIGksbz0odD10fHxyKS5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO2lmKG8udGV4dD1lLG4pZm9yKGkgaW4gdiluW2ldJiYob1tpXT1uW2ldKTt0LmhlYWQuYXBwZW5kQ2hpbGQobykucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKX1mdW5jdGlvbiB4KGUpe3JldHVybiBudWxsPT1lP2UrXCJcIjpcIm9iamVjdFwiPT10eXBlb2YgZXx8XCJmdW5jdGlvblwiPT10eXBlb2YgZT9sW2MuY2FsbChlKV18fFwib2JqZWN0XCI6dHlwZW9mIGV9dmFyIGI9XCIzLjMuMVwiLHc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IHcuZm4uaW5pdChlLHQpfSxUPS9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZzt3LmZuPXcucHJvdG90eXBlPXtqcXVlcnk6XCIzLjMuMVwiLGNvbnN0cnVjdG9yOncsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBvLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9vLmNhbGwodGhpcyk6ZTwwP3RoaXNbZSt0aGlzLmxlbmd0aF06dGhpc1tlXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGUpe3ZhciB0PXcubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGUpO3JldHVybiB0LnByZXZPYmplY3Q9dGhpcyx0fSxlYWNoOmZ1bmN0aW9uKGUpe3JldHVybiB3LmVhY2godGhpcyxlKX0sbWFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayh3Lm1hcCh0aGlzLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuY2FsbCh0LG4sdCl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoZTwwP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4+PTAmJm48dD9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6cyxzb3J0Om4uc29ydCxzcGxpY2U6bi5zcGxpY2V9LHcuZXh0ZW5kPXcuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvLGE9YXJndW1lbnRzWzBdfHx7fSxzPTEsdT1hcmd1bWVudHMubGVuZ3RoLGw9ITE7Zm9yKFwiYm9vbGVhblwiPT10eXBlb2YgYSYmKGw9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSxcIm9iamVjdFwiPT10eXBlb2YgYXx8ZyhhKXx8KGE9e30pLHM9PT11JiYoYT10aGlzLHMtLSk7czx1O3MrKylpZihudWxsIT0oZT1hcmd1bWVudHNbc10pKWZvcih0IGluIGUpbj1hW3RdLGEhPT0ocj1lW3RdKSYmKGwmJnImJih3LmlzUGxhaW5PYmplY3Qocil8fChpPUFycmF5LmlzQXJyYXkocikpKT8oaT8oaT0hMSxvPW4mJkFycmF5LmlzQXJyYXkobik/bjpbXSk6bz1uJiZ3LmlzUGxhaW5PYmplY3Qobik/bjp7fSxhW3RdPXcuZXh0ZW5kKGwsbyxyKSk6dm9pZCAwIT09ciYmKGFbdF09cikpO3JldHVybiBhfSx3LmV4dGVuZCh7ZXhwYW5kbzpcImpRdWVyeVwiKyhcIjMuMy4xXCIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXFxEL2csXCJcIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoZSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4hKCFlfHxcIltvYmplY3QgT2JqZWN0XVwiIT09Yy5jYWxsKGUpKSYmKCEodD1pKGUpKXx8XCJmdW5jdGlvblwiPT10eXBlb2Yobj1mLmNhbGwodCxcImNvbnN0cnVjdG9yXCIpJiZ0LmNvbnN0cnVjdG9yKSYmcC5jYWxsKG4pPT09ZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbihlKXttKGUpfSxlYWNoOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wO2lmKEMoZSkpe2ZvcihuPWUubGVuZ3RoO3I8bjtyKyspaWYoITE9PT10LmNhbGwoZVtyXSxyLGVbcl0pKWJyZWFrfWVsc2UgZm9yKHIgaW4gZSlpZighMT09PXQuY2FsbChlW3JdLHIsZVtyXSkpYnJlYWs7cmV0dXJuIGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/XCJcIjooZStcIlwiKS5yZXBsYWNlKFQsXCJcIil9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoQyhPYmplY3QoZSkpP3cubWVyZ2UobixcInN0cmluZ1wiPT10eXBlb2YgZT9bZV06ZSk6cy5jYWxsKG4sZSkpLG59LGluQXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsPT10Py0xOnUuY2FsbCh0LGUsbil9LG1lcmdlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPSt0Lmxlbmd0aCxyPTAsaT1lLmxlbmd0aDtyPG47cisrKWVbaSsrXT10W3JdO3JldHVybiBlLmxlbmd0aD1pLGV9LGdyZXA6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcixpPVtdLG89MCxhPWUubGVuZ3RoLHM9IW47bzxhO28rKykocj0hdChlW29dLG8pKSE9PXMmJmkucHVzaChlW29dKTtyZXR1cm4gaX0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89MCxzPVtdO2lmKEMoZSkpZm9yKHI9ZS5sZW5ndGg7bzxyO28rKyludWxsIT0oaT10KGVbb10sbyxuKSkmJnMucHVzaChpKTtlbHNlIGZvcihvIGluIGUpbnVsbCE9KGk9dChlW29dLG8sbikpJiZzLnB1c2goaSk7cmV0dXJuIGEuYXBwbHkoW10scyl9LGd1aWQ6MSxzdXBwb3J0Omh9KSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJih3LmZuW1N5bWJvbC5pdGVyYXRvcl09bltTeW1ib2wuaXRlcmF0b3JdKSx3LmVhY2goXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbFwiLnNwbGl0KFwiIFwiKSxmdW5jdGlvbihlLHQpe2xbXCJbb2JqZWN0IFwiK3QrXCJdXCJdPXQudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIEMoZSl7dmFyIHQ9ISFlJiZcImxlbmd0aFwiaW4gZSYmZS5sZW5ndGgsbj14KGUpO3JldHVybiFnKGUpJiYheShlKSYmKFwiYXJyYXlcIj09PW58fDA9PT10fHxcIm51bWJlclwiPT10eXBlb2YgdCYmdD4wJiZ0LTEgaW4gZSl9dmFyIEU9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHMsdSxsLGMsZixwLGQsaCxnLHksdixtLHgsYj1cInNpenpsZVwiKzEqbmV3IERhdGUsdz1lLmRvY3VtZW50LFQ9MCxDPTAsRT1hZSgpLGs9YWUoKSxTPWFlKCksRD1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dCYmKGY9ITApLDB9LE49e30uaGFzT3duUHJvcGVydHksQT1bXSxqPUEucG9wLHE9QS5wdXNoLEw9QS5wdXNoLEg9QS5zbGljZSxPPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWlmKGVbbl09PT10KXJldHVybiBuO3JldHVybi0xfSxQPVwiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWRcIixNPVwiW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZl1cIixSPVwiKD86XFxcXFxcXFwufFtcXFxcdy1dfFteXFwwLVxcXFx4YTBdKStcIixJPVwiXFxcXFtcIitNK1wiKihcIitSK1wiKSg/OlwiK00rXCIqKFsqXiR8IX5dPz0pXCIrTStcIiooPzonKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcJ10pKiknfFxcXCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFxcXFwiXSkqKVxcXCJ8KFwiK1IrXCIpKXwpXCIrTStcIipcXFxcXVwiLFc9XCI6KFwiK1IrXCIpKD86XFxcXCgoKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8KCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKClbXFxcXF1dfFwiK0krXCIpKil8LiopXFxcXCl8KVwiLCQ9bmV3IFJlZ0V4cChNK1wiK1wiLFwiZ1wiKSxCPW5ldyBSZWdFeHAoXCJeXCIrTStcIit8KCg/Ol58W15cXFxcXFxcXF0pKD86XFxcXFxcXFwuKSopXCIrTStcIiskXCIsXCJnXCIpLEY9bmV3IFJlZ0V4cChcIl5cIitNK1wiKixcIitNK1wiKlwiKSxfPW5ldyBSZWdFeHAoXCJeXCIrTStcIiooWz4rfl18XCIrTStcIilcIitNK1wiKlwiKSx6PW5ldyBSZWdFeHAoXCI9XCIrTStcIiooW15cXFxcXSdcXFwiXSo/KVwiK00rXCIqXFxcXF1cIixcImdcIiksWD1uZXcgUmVnRXhwKFcpLFU9bmV3IFJlZ0V4cChcIl5cIitSK1wiJFwiKSxWPXtJRDpuZXcgUmVnRXhwKFwiXiMoXCIrUitcIilcIiksQ0xBU1M6bmV3IFJlZ0V4cChcIl5cXFxcLihcIitSK1wiKVwiKSxUQUc6bmV3IFJlZ0V4cChcIl4oXCIrUitcInxbKl0pXCIpLEFUVFI6bmV3IFJlZ0V4cChcIl5cIitJKSxQU0VVRE86bmV3IFJlZ0V4cChcIl5cIitXKSxDSElMRDpuZXcgUmVnRXhwKFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIitNK1wiKihldmVufG9kZHwoKFsrLV18KShcXFxcZCopbnwpXCIrTStcIiooPzooWystXXwpXCIrTStcIiooXFxcXGQrKXwpKVwiK00rXCIqXFxcXCl8KVwiLFwiaVwiKSxib29sOm5ldyBSZWdFeHAoXCJeKD86XCIrUCtcIikkXCIsXCJpXCIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKFwiXlwiK00rXCIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXFxcKFwiK00rXCIqKCg/Oi1cXFxcZCk/XFxcXGQqKVwiK00rXCIqXFxcXCl8KSg/PVteLV18JClcIixcImlcIil9LEc9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxZPS9eaFxcZCQvaSxRPS9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sSj0vXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxLPS9bK35dLyxaPW5ldyBSZWdFeHAoXCJcXFxcXFxcXChbXFxcXGRhLWZdezEsNn1cIitNK1wiP3woXCIrTStcIil8LilcIixcImlnXCIpLGVlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1cIjB4XCIrdC02NTUzNjtyZXR1cm4gciE9PXJ8fG4/dDpyPDA/U3RyaW5nLmZyb21DaGFyQ29kZShyKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKHI+PjEwfDU1Mjk2LDEwMjMmcnw1NjMyMCl9LHRlPS8oW1xcMC1cXHgxZlxceDdmXXxeLT9cXGQpfF4tJHxbXlxcMC1cXHgxZlxceDdmLVxcdUZGRkZcXHctXS9nLG5lPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/XCJcXDBcIj09PWU/XCJcXHVmZmZkXCI6ZS5zbGljZSgwLC0xKStcIlxcXFxcIitlLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpK1wiIFwiOlwiXFxcXFwiK2V9LHJlPWZ1bmN0aW9uKCl7cCgpfSxpZT1tZShmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJihcImZvcm1cImluIGV8fFwibGFiZWxcImluIGUpfSx7ZGlyOlwicGFyZW50Tm9kZVwiLG5leHQ6XCJsZWdlbmRcIn0pO3RyeXtMLmFwcGx5KEE9SC5jYWxsKHcuY2hpbGROb2Rlcyksdy5jaGlsZE5vZGVzKSxBW3cuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKGUpe0w9e2FwcGx5OkEubGVuZ3RoP2Z1bmN0aW9uKGUsdCl7cS5hcHBseShlLEguY2FsbCh0KSl9OmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5sZW5ndGgscj0wO3doaWxlKGVbbisrXT10W3IrK10pO2UubGVuZ3RoPW4tMX19fWZ1bmN0aW9uIG9lKGUsdCxyLGkpe3ZhciBvLHMsbCxjLGYsaCx2LG09dCYmdC5vd25lckRvY3VtZW50LFQ9dD90Lm5vZGVUeXBlOjk7aWYocj1yfHxbXSxcInN0cmluZ1wiIT10eXBlb2YgZXx8IWV8fDEhPT1UJiY5IT09VCYmMTEhPT1UKXJldHVybiByO2lmKCFpJiYoKHQ/dC5vd25lckRvY3VtZW50fHx0OncpIT09ZCYmcCh0KSx0PXR8fGQsZykpe2lmKDExIT09VCYmKGY9Si5leGVjKGUpKSlpZihvPWZbMV0pe2lmKDk9PT1UKXtpZighKGw9dC5nZXRFbGVtZW50QnlJZChvKSkpcmV0dXJuIHI7aWYobC5pZD09PW8pcmV0dXJuIHIucHVzaChsKSxyfWVsc2UgaWYobSYmKGw9bS5nZXRFbGVtZW50QnlJZChvKSkmJngodCxsKSYmbC5pZD09PW8pcmV0dXJuIHIucHVzaChsKSxyfWVsc2V7aWYoZlsyXSlyZXR1cm4gTC5hcHBseShyLHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSkpLHI7aWYoKG89ZlszXSkmJm4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBMLmFwcGx5KHIsdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKG8pKSxyfWlmKG4ucXNhJiYhU1tlK1wiIFwiXSYmKCF5fHwheS50ZXN0KGUpKSl7aWYoMSE9PVQpbT10LHY9ZTtlbHNlIGlmKFwib2JqZWN0XCIhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpeyhjPXQuZ2V0QXR0cmlidXRlKFwiaWRcIikpP2M9Yy5yZXBsYWNlKHRlLG5lKTp0LnNldEF0dHJpYnV0ZShcImlkXCIsYz1iKSxzPShoPWEoZSkpLmxlbmd0aDt3aGlsZShzLS0paFtzXT1cIiNcIitjK1wiIFwiK3ZlKGhbc10pO3Y9aC5qb2luKFwiLFwiKSxtPUsudGVzdChlKSYmZ2UodC5wYXJlbnROb2RlKXx8dH1pZih2KXRyeXtyZXR1cm4gTC5hcHBseShyLG0ucXVlcnlTZWxlY3RvckFsbCh2KSkscn1jYXRjaChlKXt9ZmluYWxseXtjPT09YiYmdC5yZW1vdmVBdHRyaWJ1dGUoXCJpZFwiKX19fXJldHVybiB1KGUucmVwbGFjZShCLFwiJDFcIiksdCxyLGkpfWZ1bmN0aW9uIGFlKCl7dmFyIGU9W107ZnVuY3Rpb24gdChuLGkpe3JldHVybiBlLnB1c2gobitcIiBcIik+ci5jYWNoZUxlbmd0aCYmZGVsZXRlIHRbZS5zaGlmdCgpXSx0W24rXCIgXCJdPWl9cmV0dXJuIHR9ZnVuY3Rpb24gc2UoZSl7cmV0dXJuIGVbYl09ITAsZX1mdW5jdGlvbiB1ZShlKXt2YXIgdD1kLmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKTt0cnl7cmV0dXJuISFlKHQpfWNhdGNoKGUpe3JldHVybiExfWZpbmFsbHl7dC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksdD1udWxsfX1mdW5jdGlvbiBsZShlLHQpe3ZhciBuPWUuc3BsaXQoXCJ8XCIpLGk9bi5sZW5ndGg7d2hpbGUoaS0tKXIuYXR0ckhhbmRsZVtuW2ldXT10fWZ1bmN0aW9uIGNlKGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBmZShlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuXCJpbnB1dFwiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBwZShlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihcImlucHV0XCI9PT1ufHxcImJ1dHRvblwiPT09bikmJnQudHlwZT09PWV9fWZ1bmN0aW9uIGRlKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm5cImZvcm1cImluIHQ/dC5wYXJlbnROb2RlJiYhMT09PXQuZGlzYWJsZWQ/XCJsYWJlbFwiaW4gdD9cImxhYmVsXCJpbiB0LnBhcmVudE5vZGU/dC5wYXJlbnROb2RlLmRpc2FibGVkPT09ZTp0LmRpc2FibGVkPT09ZTp0LmlzRGlzYWJsZWQ9PT1lfHx0LmlzRGlzYWJsZWQhPT0hZSYmaWUodCk9PT1lOnQuZGlzYWJsZWQ9PT1lOlwibGFiZWxcImluIHQmJnQuZGlzYWJsZWQ9PT1lfX1mdW5jdGlvbiBoZShlKXtyZXR1cm4gc2UoZnVuY3Rpb24odCl7cmV0dXJuIHQ9K3Qsc2UoZnVuY3Rpb24obixyKXt2YXIgaSxvPWUoW10sbi5sZW5ndGgsdCksYT1vLmxlbmd0aDt3aGlsZShhLS0pbltpPW9bYV1dJiYobltpXT0hKHJbaV09bltpXSkpfSl9KX1mdW5jdGlvbiBnZShlKXtyZXR1cm4gZSYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmV9bj1vZS5zdXBwb3J0PXt9LG89b2UuaXNYTUw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmKGUub3duZXJEb2N1bWVudHx8ZSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiEhdCYmXCJIVE1MXCIhPT10Lm5vZGVOYW1lfSxwPW9lLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3ZhciB0LGksYT1lP2Uub3duZXJEb2N1bWVudHx8ZTp3O3JldHVybiBhIT09ZCYmOT09PWEubm9kZVR5cGUmJmEuZG9jdW1lbnRFbGVtZW50PyhkPWEsaD1kLmRvY3VtZW50RWxlbWVudCxnPSFvKGQpLHchPT1kJiYoaT1kLmRlZmF1bHRWaWV3KSYmaS50b3AhPT1pJiYoaS5hZGRFdmVudExpc3RlbmVyP2kuYWRkRXZlbnRMaXN0ZW5lcihcInVubG9hZFwiLHJlLCExKTppLmF0dGFjaEV2ZW50JiZpLmF0dGFjaEV2ZW50KFwib251bmxvYWRcIixyZSkpLG4uYXR0cmlidXRlcz11ZShmdW5jdGlvbihlKXtyZXR1cm4gZS5jbGFzc05hbWU9XCJpXCIsIWUuZ2V0QXR0cmlidXRlKFwiY2xhc3NOYW1lXCIpfSksbi5nZXRFbGVtZW50c0J5VGFnTmFtZT11ZShmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChkLmNyZWF0ZUNvbW1lbnQoXCJcIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKS5sZW5ndGh9KSxuLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9US50ZXN0KGQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksbi5nZXRCeUlkPXVlKGZ1bmN0aW9uKGUpe3JldHVybiBoLmFwcGVuZENoaWxkKGUpLmlkPWIsIWQuZ2V0RWxlbWVudHNCeU5hbWV8fCFkLmdldEVsZW1lbnRzQnlOYW1lKGIpLmxlbmd0aH0pLG4uZ2V0QnlJZD8oci5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJpZFwiKT09PXR9fSxyLmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgdC5nZXRFbGVtZW50QnlJZCYmZyl7dmFyIG49dC5nZXRFbGVtZW50QnlJZChlKTtyZXR1cm4gbj9bbl06W119fSk6KHIuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShaLGVlKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlTm9kZSYmZS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7cmV0dXJuIG4mJm4udmFsdWU9PT10fX0sci5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQmJmcpe3ZhciBuLHIsaSxvPXQuZ2V0RWxlbWVudEJ5SWQoZSk7aWYobyl7aWYoKG49by5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5bb107aT10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDt3aGlsZShvPWlbcisrXSlpZigobj1vLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKSkmJm4udmFsdWU9PT1lKXJldHVybltvXX1yZXR1cm5bXX19KSxyLmZpbmQuVEFHPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oZSx0KXtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2YgdC5nZXRFbGVtZW50c0J5VGFnTmFtZT90LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpOm4ucXNhP3QucXVlcnlTZWxlY3RvckFsbChlKTp2b2lkIDB9OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxpPTAsbz10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2lmKFwiKlwiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sci5maW5kLkNMQVNTPW4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZnKXJldHVybiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSl9LHY9W10seT1bXSwobi5xc2E9US50ZXN0KGQucXVlcnlTZWxlY3RvckFsbCkpJiYodWUoZnVuY3Rpb24oZSl7aC5hcHBlbmRDaGlsZChlKS5pbm5lckhUTUw9XCI8YSBpZD0nXCIrYitcIic+PC9hPjxzZWxlY3QgaWQ9J1wiK2IrXCItXFxyXFxcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD5cIixlLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGgmJnkucHVzaChcIlsqXiRdPVwiK00rXCIqKD86Jyd8XFxcIlxcXCIpXCIpLGUucXVlcnlTZWxlY3RvckFsbChcIltzZWxlY3RlZF1cIikubGVuZ3RofHx5LnB1c2goXCJcXFxcW1wiK00rXCIqKD86dmFsdWV8XCIrUCtcIilcIiksZS5xdWVyeVNlbGVjdG9yQWxsKFwiW2lkfj1cIitiK1wiLV1cIikubGVuZ3RofHx5LnB1c2goXCJ+PVwiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6Y2hlY2tlZFwiKS5sZW5ndGh8fHkucHVzaChcIjpjaGVja2VkXCIpLGUucXVlcnlTZWxlY3RvckFsbChcImEjXCIrYitcIisqXCIpLmxlbmd0aHx8eS5wdXNoKFwiLiMuK1srfl1cIil9KSx1ZShmdW5jdGlvbihlKXtlLmlubmVySFRNTD1cIjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+PHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PlwiO3ZhciB0PWQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO3Quc2V0QXR0cmlidXRlKFwidHlwZVwiLFwiaGlkZGVuXCIpLGUuYXBwZW5kQ2hpbGQodCkuc2V0QXR0cmlidXRlKFwibmFtZVwiLFwiRFwiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbmFtZT1kXVwiKS5sZW5ndGgmJnkucHVzaChcIm5hbWVcIitNK1wiKlsqXiR8IX5dPz1cIiksMiE9PWUucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCYmeS5wdXNoKFwiOmVuYWJsZWRcIixcIjpkaXNhYmxlZFwiKSxoLmFwcGVuZENoaWxkKGUpLmRpc2FibGVkPSEwLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6ZGlzYWJsZWRcIikubGVuZ3RoJiZ5LnB1c2goXCI6ZW5hYmxlZFwiLFwiOmRpc2FibGVkXCIpLGUucXVlcnlTZWxlY3RvckFsbChcIiosOnhcIikseS5wdXNoKFwiLC4qOlwiKX0pKSwobi5tYXRjaGVzU2VsZWN0b3I9US50ZXN0KG09aC5tYXRjaGVzfHxoLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8aC5tb3pNYXRjaGVzU2VsZWN0b3J8fGgub01hdGNoZXNTZWxlY3Rvcnx8aC5tc01hdGNoZXNTZWxlY3RvcikpJiZ1ZShmdW5jdGlvbihlKXtuLmRpc2Nvbm5lY3RlZE1hdGNoPW0uY2FsbChlLFwiKlwiKSxtLmNhbGwoZSxcIltzIT0nJ106eFwiKSx2LnB1c2goXCIhPVwiLFcpfSkseT15Lmxlbmd0aCYmbmV3IFJlZ0V4cCh5LmpvaW4oXCJ8XCIpKSx2PXYubGVuZ3RoJiZuZXcgUmVnRXhwKHYuam9pbihcInxcIikpLHQ9US50ZXN0KGguY29tcGFyZURvY3VtZW50UG9zaXRpb24pLHg9dHx8US50ZXN0KGguY29udGFpbnMpP2Z1bmN0aW9uKGUsdCl7dmFyIG49OT09PWUubm9kZVR5cGU/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKGUsdCl7aWYodCl3aGlsZSh0PXQucGFyZW50Tm9kZSlpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sRD10P2Z1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIGY9ITAsMDt2YXIgcj0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gcnx8KDEmKHI9KGUub3duZXJEb2N1bWVudHx8ZSk9PT0odC5vd25lckRvY3VtZW50fHx0KT9lLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpOjEpfHwhbi5zb3J0RGV0YWNoZWQmJnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSk9PT1yP2U9PT1kfHxlLm93bmVyRG9jdW1lbnQ9PT13JiZ4KHcsZSk/LTE6dD09PWR8fHQub3duZXJEb2N1bWVudD09PXcmJngodyx0KT8xOmM/TyhjLGUpLU8oYyx0KTowOjQmcj8tMToxKX06ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gZj0hMCwwO3ZhciBuLHI9MCxpPWUucGFyZW50Tm9kZSxvPXQucGFyZW50Tm9kZSxhPVtlXSxzPVt0XTtpZighaXx8IW8pcmV0dXJuIGU9PT1kPy0xOnQ9PT1kPzE6aT8tMTpvPzE6Yz9PKGMsZSktTyhjLHQpOjA7aWYoaT09PW8pcmV0dXJuIGNlKGUsdCk7bj1lO3doaWxlKG49bi5wYXJlbnROb2RlKWEudW5zaGlmdChuKTtuPXQ7d2hpbGUobj1uLnBhcmVudE5vZGUpcy51bnNoaWZ0KG4pO3doaWxlKGFbcl09PT1zW3JdKXIrKztyZXR1cm4gcj9jZShhW3JdLHNbcl0pOmFbcl09PT13Py0xOnNbcl09PT13PzE6MH0sZCk6ZH0sb2UubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBvZShlLG51bGwsbnVsbCx0KX0sb2UubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7aWYoKGUub3duZXJEb2N1bWVudHx8ZSkhPT1kJiZwKGUpLHQ9dC5yZXBsYWNlKHosXCI9JyQxJ11cIiksbi5tYXRjaGVzU2VsZWN0b3ImJmcmJiFTW3QrXCIgXCJdJiYoIXZ8fCF2LnRlc3QodCkpJiYoIXl8fCF5LnRlc3QodCkpKXRyeXt2YXIgcj1tLmNhbGwoZSx0KTtpZihyfHxuLmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIHJ9Y2F0Y2goZSl7fXJldHVybiBvZSh0LGQsbnVsbCxbZV0pLmxlbmd0aD4wfSxvZS5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybihlLm93bmVyRG9jdW1lbnR8fGUpIT09ZCYmcChlKSx4KGUsdCl9LG9lLmF0dHI9ZnVuY3Rpb24oZSx0KXsoZS5vd25lckRvY3VtZW50fHxlKSE9PWQmJnAoZSk7dmFyIGk9ci5hdHRySGFuZGxlW3QudG9Mb3dlckNhc2UoKV0sbz1pJiZOLmNhbGwoci5hdHRySGFuZGxlLHQudG9Mb3dlckNhc2UoKSk/aShlLHQsIWcpOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09bz9vOm4uYXR0cmlidXRlc3x8IWc/ZS5nZXRBdHRyaWJ1dGUodCk6KG89ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmby5zcGVjaWZpZWQ/by52YWx1ZTpudWxsfSxvZS5lc2NhcGU9ZnVuY3Rpb24oZSl7cmV0dXJuKGUrXCJcIikucmVwbGFjZSh0ZSxuZSl9LG9lLmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiK2UpfSxvZS51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LHI9W10saT0wLG89MDtpZihmPSFuLmRldGVjdER1cGxpY2F0ZXMsYz0hbi5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydChEKSxmKXt3aGlsZSh0PWVbbysrXSl0PT09ZVtvXSYmKGk9ci5wdXNoKG8pKTt3aGlsZShpLS0pZS5zcGxpY2UocltpXSwxKX1yZXR1cm4gYz1udWxsLGV9LGk9b2UuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPVwiXCIscj0wLG89ZS5ub2RlVHlwZTtpZihvKXtpZigxPT09b3x8OT09PW98fDExPT09byl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGUudGV4dENvbnRlbnQpcmV0dXJuIGUudGV4dENvbnRlbnQ7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKW4rPWkoZSl9ZWxzZSBpZigzPT09b3x8ND09PW8pcmV0dXJuIGUubm9kZVZhbHVlfWVsc2Ugd2hpbGUodD1lW3IrK10pbis9aSh0KTtyZXR1cm4gbn0sKHI9b2Uuc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86c2UsbWF0Y2g6VixhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6e1wiPlwiOntkaXI6XCJwYXJlbnROb2RlXCIsZmlyc3Q6ITB9LFwiIFwiOntkaXI6XCJwYXJlbnROb2RlXCJ9LFwiK1wiOntkaXI6XCJwcmV2aW91c1NpYmxpbmdcIixmaXJzdDohMH0sXCJ+XCI6e2RpcjpcInByZXZpb3VzU2libGluZ1wifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZShaLGVlKSxlWzNdPShlWzNdfHxlWzRdfHxlWzVdfHxcIlwiKS5yZXBsYWNlKFosZWUpLFwifj1cIj09PWVbMl0mJihlWzNdPVwiIFwiK2VbM10rXCIgXCIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLFwibnRoXCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fG9lLmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKFwiZXZlblwiPT09ZVszXXx8XCJvZGRcIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHxcIm9kZFwiPT09ZVszXSkpOmVbM10mJm9lLmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzZdJiZlWzJdO3JldHVybiBWLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXT9lWzJdPWVbNF18fGVbNV18fFwiXCI6biYmWC50ZXN0KG4pJiYodD1hKG4sITApKSYmKHQ9bi5pbmRleE9mKFwiKVwiLG4ubGVuZ3RoLXQpLW4ubGVuZ3RoKSYmKGVbMF09ZVswXS5zbGljZSgwLHQpLGVbMl09bi5zbGljZSgwLHQpKSxlLnNsaWNlKDAsMykpfX0sZmlsdGVyOntUQUc6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFosZWUpLnRvTG93ZXJDYXNlKCk7cmV0dXJuXCIqXCI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9RVtlK1wiIFwiXTtyZXR1cm4gdHx8KHQ9bmV3IFJlZ0V4cChcIihefFwiK00rXCIpXCIrZStcIihcIitNK1wifCQpXCIpKSYmRShlLGZ1bmN0aW9uKGUpe3JldHVybiB0LnRlc3QoXCJzdHJpbmdcIj09dHlwZW9mIGUuY2xhc3NOYW1lJiZlLmNsYXNzTmFtZXx8XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxcIlwiKX0pfSxBVFRSOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIGk9b2UuYXR0cihyLGUpO3JldHVybiBudWxsPT1pP1wiIT1cIj09PXQ6IXR8fChpKz1cIlwiLFwiPVwiPT09dD9pPT09bjpcIiE9XCI9PT10P2khPT1uOlwiXj1cIj09PXQ/biYmMD09PWkuaW5kZXhPZihuKTpcIio9XCI9PT10P24mJmkuaW5kZXhPZihuKT4tMTpcIiQ9XCI9PT10P24mJmkuc2xpY2UoLW4ubGVuZ3RoKT09PW46XCJ+PVwiPT09dD8oXCIgXCIraS5yZXBsYWNlKCQsXCIgXCIpK1wiIFwiKS5pbmRleE9mKG4pPi0xOlwifD1cIj09PXQmJihpPT09bnx8aS5zbGljZSgwLG4ubGVuZ3RoKzEpPT09bitcIi1cIikpfX0sQ0hJTEQ6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbz1cIm50aFwiIT09ZS5zbGljZSgwLDMpLGE9XCJsYXN0XCIhPT1lLnNsaWNlKC00KSxzPVwib2YtdHlwZVwiPT09dDtyZXR1cm4gMT09PXImJjA9PT1pP2Z1bmN0aW9uKGUpe3JldHVybiEhZS5wYXJlbnROb2RlfTpmdW5jdGlvbih0LG4sdSl7dmFyIGwsYyxmLHAsZCxoLGc9byE9PWE/XCJuZXh0U2libGluZ1wiOlwicHJldmlvdXNTaWJsaW5nXCIseT10LnBhcmVudE5vZGUsdj1zJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbT0hdSYmIXMseD0hMTtpZih5KXtpZihvKXt3aGlsZShnKXtwPXQ7d2hpbGUocD1wW2ddKWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09djoxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtoPWc9XCJvbmx5XCI9PT1lJiYhaCYmXCJuZXh0U2libGluZ1wifXJldHVybiEwfWlmKGg9W2E/eS5maXJzdENoaWxkOnkubGFzdENoaWxkXSxhJiZtKXt4PShkPShsPShjPShmPShwPXkpW2JdfHwocFtiXT17fSkpW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSkpW2VdfHxbXSlbMF09PT1UJiZsWzFdKSYmbFsyXSxwPWQmJnkuY2hpbGROb2Rlc1tkXTt3aGlsZShwPSsrZCYmcCYmcFtnXXx8KHg9ZD0wKXx8aC5wb3AoKSlpZigxPT09cC5ub2RlVHlwZSYmKyt4JiZwPT09dCl7Y1tlXT1bVCxkLHhdO2JyZWFrfX1lbHNlIGlmKG0mJih4PWQ9KGw9KGM9KGY9KHA9dClbYl18fChwW2JdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbZV18fFtdKVswXT09PVQmJmxbMV0pLCExPT09eCl3aGlsZShwPSsrZCYmcCYmcFtnXXx8KHg9ZD0wKXx8aC5wb3AoKSlpZigocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT12OjE9PT1wLm5vZGVUeXBlKSYmKyt4JiYobSYmKChjPShmPXBbYl18fChwW2JdPXt9KSlbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSlbZV09W1QseF0pLHA9PT10KSlicmVhaztyZXR1cm4oeC09aSk9PT1yfHx4JXI9PTAmJngvcj49MH19fSxQU0VVRE86ZnVuY3Rpb24oZSx0KXt2YXIgbixpPXIucHNldWRvc1tlXXx8ci5zZXRGaWx0ZXJzW2UudG9Mb3dlckNhc2UoKV18fG9lLmVycm9yKFwidW5zdXBwb3J0ZWQgcHNldWRvOiBcIitlKTtyZXR1cm4gaVtiXT9pKHQpOmkubGVuZ3RoPjE/KG49W2UsZSxcIlwiLHRdLHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP3NlKGZ1bmN0aW9uKGUsbil7dmFyIHIsbz1pKGUsdCksYT1vLmxlbmd0aDt3aGlsZShhLS0pZVtyPU8oZSxvW2FdKV09IShuW3JdPW9bYV0pfSk6ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSwwLG4pfSk6aX19LHBzZXVkb3M6e25vdDpzZShmdW5jdGlvbihlKXt2YXIgdD1bXSxuPVtdLHI9cyhlLnJlcGxhY2UoQixcIiQxXCIpKTtyZXR1cm4gcltiXT9zZShmdW5jdGlvbihlLHQsbixpKXt2YXIgbyxhPXIoZSxudWxsLGksW10pLHM9ZS5sZW5ndGg7d2hpbGUocy0tKShvPWFbc10pJiYoZVtzXT0hKHRbc109bykpfSk6ZnVuY3Rpb24oZSxpLG8pe3JldHVybiB0WzBdPWUscih0LG51bGwsbyxuKSx0WzBdPW51bGwsIW4ucG9wKCl9fSksaGFzOnNlKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gb2UoZSx0KS5sZW5ndGg+MH19KSxjb250YWluczpzZShmdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoWixlZSksZnVuY3Rpb24odCl7cmV0dXJuKHQudGV4dENvbnRlbnR8fHQuaW5uZXJUZXh0fHxpKHQpKS5pbmRleE9mKGUpPi0xfX0pLGxhbmc6c2UoZnVuY3Rpb24oZSl7cmV0dXJuIFUudGVzdChlfHxcIlwiKXx8b2UuZXJyb3IoXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIitlKSxlPWUucmVwbGFjZShaLGVlKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKHQpe3ZhciBuO2Rve2lmKG49Zz90Lmxhbmc6dC5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKXx8dC5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpKXJldHVybihuPW4udG9Mb3dlckNhc2UoKSk9PT1lfHwwPT09bi5pbmRleE9mKGUrXCItXCIpfXdoaWxlKCh0PXQucGFyZW50Tm9kZSkmJjE9PT10Lm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24odCl7dmFyIG49ZS5sb2NhdGlvbiYmZS5sb2NhdGlvbi5oYXNoO3JldHVybiBuJiZuLnNsaWNlKDEpPT09dC5pZH0scm9vdDpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWh9LGZvY3VzOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09ZC5hY3RpdmVFbGVtZW50JiYoIWQuaGFzRm9jdXN8fGQuaGFzRm9jdXMoKSkmJiEhKGUudHlwZXx8ZS5ocmVmfHx+ZS50YWJJbmRleCl9LGVuYWJsZWQ6ZGUoITEpLGRpc2FibGVkOmRlKCEwKSxjaGVja2VkOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm5cImlucHV0XCI9PT10JiYhIWUuY2hlY2tlZHx8XCJvcHRpb25cIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIXIucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBZLnRlc3QoZS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBHLnRlc3QoZS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuXCJpbnB1dFwiPT09dCYmXCJidXR0b25cIj09PWUudHlwZXx8XCJidXR0b25cIj09PXR9LHRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuXCJpbnB1dFwiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZcInRleHRcIj09PWUudHlwZSYmKG51bGw9PSh0PWUuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSl8fFwidGV4dFwiPT09dC50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6aGUoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OmhlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QtMV19KSxlcTpoZShmdW5jdGlvbihlLHQsbil7cmV0dXJuW248MD9uK3Q6bl19KSxldmVuOmhlKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjx0O24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksb2RkOmhlKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTE7bjx0O24rPTIpZS5wdXNoKG4pO3JldHVybiBlfSksbHQ6aGUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47LS1yPj0wOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDpoZShmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPW48MD9uK3Q6bjsrK3I8dDspZS5wdXNoKHIpO3JldHVybiBlfSl9fSkucHNldWRvcy5udGg9ci5wc2V1ZG9zLmVxO2Zvcih0IGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KXIucHNldWRvc1t0XT1mZSh0KTtmb3IodCBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KXIucHNldWRvc1t0XT1wZSh0KTtmdW5jdGlvbiB5ZSgpe315ZS5wcm90b3R5cGU9ci5maWx0ZXJzPXIucHNldWRvcyxyLnNldEZpbHRlcnM9bmV3IHllLGE9b2UudG9rZW5pemU9ZnVuY3Rpb24oZSx0KXt2YXIgbixpLG8sYSxzLHUsbCxjPWtbZStcIiBcIl07aWYoYylyZXR1cm4gdD8wOmMuc2xpY2UoMCk7cz1lLHU9W10sbD1yLnByZUZpbHRlcjt3aGlsZShzKXtuJiYhKGk9Ri5leGVjKHMpKXx8KGkmJihzPXMuc2xpY2UoaVswXS5sZW5ndGgpfHxzKSx1LnB1c2gobz1bXSkpLG49ITEsKGk9Xy5leGVjKHMpKSYmKG49aS5zaGlmdCgpLG8ucHVzaCh7dmFsdWU6bix0eXBlOmlbMF0ucmVwbGFjZShCLFwiIFwiKX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2ZvcihhIGluIHIuZmlsdGVyKSEoaT1WW2FdLmV4ZWMocykpfHxsW2FdJiYhKGk9bFthXShpKSl8fChuPWkuc2hpZnQoKSxvLnB1c2goe3ZhbHVlOm4sdHlwZTphLG1hdGNoZXM6aX0pLHM9cy5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiB0P3MubGVuZ3RoOnM/b2UuZXJyb3IoZSk6ayhlLHUpLnNsaWNlKDApfTtmdW5jdGlvbiB2ZShlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoLHI9XCJcIjt0PG47dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gbWUoZSx0LG4pe3ZhciByPXQuZGlyLGk9dC5uZXh0LG89aXx8cixhPW4mJlwicGFyZW50Tm9kZVwiPT09byxzPUMrKztyZXR1cm4gdC5maXJzdD9mdW5jdGlvbih0LG4saSl7d2hpbGUodD10W3JdKWlmKDE9PT10Lm5vZGVUeXBlfHxhKXJldHVybiBlKHQsbixpKTtyZXR1cm4hMX06ZnVuY3Rpb24odCxuLHUpe3ZhciBsLGMsZixwPVtULHNdO2lmKHUpe3doaWxlKHQ9dFtyXSlpZigoMT09PXQubm9kZVR5cGV8fGEpJiZlKHQsbix1KSlyZXR1cm4hMH1lbHNlIHdoaWxlKHQ9dFtyXSlpZigxPT09dC5ub2RlVHlwZXx8YSlpZihmPXRbYl18fCh0W2JdPXt9KSxjPWZbdC51bmlxdWVJRF18fChmW3QudW5pcXVlSURdPXt9KSxpJiZpPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXQ9dFtyXXx8dDtlbHNle2lmKChsPWNbb10pJiZsWzBdPT09VCYmbFsxXT09PXMpcmV0dXJuIHBbMl09bFsyXTtpZihjW29dPXAscFsyXT1lKHQsbix1KSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24geGUoZSl7cmV0dXJuIGUubGVuZ3RoPjE/ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUubGVuZ3RoO3doaWxlKGktLSlpZighZVtpXSh0LG4scikpcmV0dXJuITE7cmV0dXJuITB9OmVbMF19ZnVuY3Rpb24gYmUoZSx0LG4pe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpO3IrKylvZShlLHRbcl0sbik7cmV0dXJuIG59ZnVuY3Rpb24gd2UoZSx0LG4scixpKXtmb3IodmFyIG8sYT1bXSxzPTAsdT1lLmxlbmd0aCxsPW51bGwhPXQ7czx1O3MrKykobz1lW3NdKSYmKG4mJiFuKG8scixpKXx8KGEucHVzaChvKSxsJiZ0LnB1c2gocykpKTtyZXR1cm4gYX1mdW5jdGlvbiBUZShlLHQsbixyLGksbyl7cmV0dXJuIHImJiFyW2JdJiYocj1UZShyKSksaSYmIWlbYl0mJihpPVRlKGksbykpLHNlKGZ1bmN0aW9uKG8sYSxzLHUpe3ZhciBsLGMsZixwPVtdLGQ9W10saD1hLmxlbmd0aCxnPW98fGJlKHR8fFwiKlwiLHMubm9kZVR5cGU/W3NdOnMsW10pLHk9IWV8fCFvJiZ0P2c6d2UoZyxwLGUscyx1KSx2PW4/aXx8KG8/ZTpofHxyKT9bXTphOnk7aWYobiYmbih5LHYscyx1KSxyKXtsPXdlKHYsZCkscihsLFtdLHMsdSksYz1sLmxlbmd0aDt3aGlsZShjLS0pKGY9bFtjXSkmJih2W2RbY11dPSEoeVtkW2NdXT1mKSl9aWYobyl7aWYoaXx8ZSl7aWYoaSl7bD1bXSxjPXYubGVuZ3RoO3doaWxlKGMtLSkoZj12W2NdKSYmbC5wdXNoKHlbY109Zik7aShudWxsLHY9W10sbCx1KX1jPXYubGVuZ3RoO3doaWxlKGMtLSkoZj12W2NdKSYmKGw9aT9PKG8sZik6cFtjXSk+LTEmJihvW2xdPSEoYVtsXT1mKSl9fWVsc2Ugdj13ZSh2PT09YT92LnNwbGljZShoLHYubGVuZ3RoKTp2KSxpP2kobnVsbCxhLHYsdSk6TC5hcHBseShhLHYpfSl9ZnVuY3Rpb24gQ2UoZSl7Zm9yKHZhciB0LG4saSxvPWUubGVuZ3RoLGE9ci5yZWxhdGl2ZVtlWzBdLnR5cGVdLHM9YXx8ci5yZWxhdGl2ZVtcIiBcIl0sdT1hPzE6MCxjPW1lKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0scywhMCksZj1tZShmdW5jdGlvbihlKXtyZXR1cm4gTyh0LGUpPi0xfSxzLCEwKSxwPVtmdW5jdGlvbihlLG4scil7dmFyIGk9IWEmJihyfHxuIT09bCl8fCgodD1uKS5ub2RlVHlwZT9jKGUsbixyKTpmKGUsbixyKSk7cmV0dXJuIHQ9bnVsbCxpfV07dTxvO3UrKylpZihuPXIucmVsYXRpdmVbZVt1XS50eXBlXSlwPVttZSh4ZShwKSxuKV07ZWxzZXtpZigobj1yLmZpbHRlcltlW3VdLnR5cGVdLmFwcGx5KG51bGwsZVt1XS5tYXRjaGVzKSlbYl0pe2ZvcihpPSsrdTtpPG87aSsrKWlmKHIucmVsYXRpdmVbZVtpXS50eXBlXSlicmVhaztyZXR1cm4gVGUodT4xJiZ4ZShwKSx1PjEmJnZlKGUuc2xpY2UoMCx1LTEpLmNvbmNhdCh7dmFsdWU6XCIgXCI9PT1lW3UtMl0udHlwZT9cIipcIjpcIlwifSkpLnJlcGxhY2UoQixcIiQxXCIpLG4sdTxpJiZDZShlLnNsaWNlKHUsaSkpLGk8byYmQ2UoZT1lLnNsaWNlKGkpKSxpPG8mJnZlKGUpKX1wLnB1c2gobil9cmV0dXJuIHhlKHApfWZ1bmN0aW9uIEVlKGUsdCl7dmFyIG49dC5sZW5ndGg+MCxpPWUubGVuZ3RoPjAsbz1mdW5jdGlvbihvLGEscyx1LGMpe3ZhciBmLGgseSx2PTAsbT1cIjBcIix4PW8mJltdLGI9W10sdz1sLEM9b3x8aSYmci5maW5kLlRBRyhcIipcIixjKSxFPVQrPW51bGw9PXc/MTpNYXRoLnJhbmRvbSgpfHwuMSxrPUMubGVuZ3RoO2ZvcihjJiYobD1hPT09ZHx8YXx8Yyk7bSE9PWsmJm51bGwhPShmPUNbbV0pO20rKyl7aWYoaSYmZil7aD0wLGF8fGYub3duZXJEb2N1bWVudD09PWR8fChwKGYpLHM9IWcpO3doaWxlKHk9ZVtoKytdKWlmKHkoZixhfHxkLHMpKXt1LnB1c2goZik7YnJlYWt9YyYmKFQ9RSl9biYmKChmPSF5JiZmKSYmdi0tLG8mJngucHVzaChmKSl9aWYodis9bSxuJiZtIT09dil7aD0wO3doaWxlKHk9dFtoKytdKXkoeCxiLGEscyk7aWYobyl7aWYodj4wKXdoaWxlKG0tLSl4W21dfHxiW21dfHwoYlttXT1qLmNhbGwodSkpO2I9d2UoYil9TC5hcHBseSh1LGIpLGMmJiFvJiZiLmxlbmd0aD4wJiZ2K3QubGVuZ3RoPjEmJm9lLnVuaXF1ZVNvcnQodSl9cmV0dXJuIGMmJihUPUUsbD13KSx4fTtyZXR1cm4gbj9zZShvKTpvfXJldHVybiBzPW9lLmNvbXBpbGU9ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9W10sbz1TW2UrXCIgXCJdO2lmKCFvKXt0fHwodD1hKGUpKSxuPXQubGVuZ3RoO3doaWxlKG4tLSkobz1DZSh0W25dKSlbYl0/ci5wdXNoKG8pOmkucHVzaChvKTsobz1TKGUsRWUoaSxyKSkpLnNlbGVjdG9yPWV9cmV0dXJuIG99LHU9b2Uuc2VsZWN0PWZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLHUsbCxjLGYscD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiZlLGQ9IWkmJmEoZT1wLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1kLmxlbmd0aCl7aWYoKHU9ZFswXT1kWzBdLnNsaWNlKDApKS5sZW5ndGg+MiYmXCJJRFwiPT09KGw9dVswXSkudHlwZSYmOT09PXQubm9kZVR5cGUmJmcmJnIucmVsYXRpdmVbdVsxXS50eXBlXSl7aWYoISh0PShyLmZpbmQuSUQobC5tYXRjaGVzWzBdLnJlcGxhY2UoWixlZSksdCl8fFtdKVswXSkpcmV0dXJuIG47cCYmKHQ9dC5wYXJlbnROb2RlKSxlPWUuc2xpY2UodS5zaGlmdCgpLnZhbHVlLmxlbmd0aCl9bz1WLm5lZWRzQ29udGV4dC50ZXN0KGUpPzA6dS5sZW5ndGg7d2hpbGUoby0tKXtpZihsPXVbb10sci5yZWxhdGl2ZVtjPWwudHlwZV0pYnJlYWs7aWYoKGY9ci5maW5kW2NdKSYmKGk9ZihsLm1hdGNoZXNbMF0ucmVwbGFjZShaLGVlKSxLLnRlc3QodVswXS50eXBlKSYmZ2UodC5wYXJlbnROb2RlKXx8dCkpKXtpZih1LnNwbGljZShvLDEpLCEoZT1pLmxlbmd0aCYmdmUodSkpKXJldHVybiBMLmFwcGx5KG4saSksbjticmVha319fXJldHVybihwfHxzKGUsZCkpKGksdCwhZyxuLCF0fHxLLnRlc3QoZSkmJmdlKHQucGFyZW50Tm9kZSl8fHQpLG59LG4uc29ydFN0YWJsZT1iLnNwbGl0KFwiXCIpLnNvcnQoRCkuam9pbihcIlwiKT09PWIsbi5kZXRlY3REdXBsaWNhdGVzPSEhZixwKCksbi5zb3J0RGV0YWNoZWQ9dWUoZnVuY3Rpb24oZSl7cmV0dXJuIDEmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkLmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKSl9KSx1ZShmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9XCI8YSBocmVmPScjJz48L2E+XCIsXCIjXCI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKX0pfHxsZShcInR5cGV8aHJlZnxoZWlnaHR8d2lkdGhcIixmdW5jdGlvbihlLHQsbil7aWYoIW4pcmV0dXJuIGUuZ2V0QXR0cmlidXRlKHQsXCJ0eXBlXCI9PT10LnRvTG93ZXJDYXNlKCk/MToyKX0pLG4uYXR0cmlidXRlcyYmdWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPVwiPGlucHV0Lz5cIixlLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKFwidmFsdWVcIixcIlwiKSxcIlwiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpfSl8fGxlKFwidmFsdWVcIixmdW5jdGlvbihlLHQsbil7aWYoIW4mJlwiaW5wdXRcIj09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlyZXR1cm4gZS5kZWZhdWx0VmFsdWV9KSx1ZShmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZS5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKX0pfHxsZShQLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZighbilyZXR1cm4hMD09PWVbdF0/dC50b0xvd2VyQ2FzZSgpOihyPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0pLG9lfShlKTt3LmZpbmQ9RSx3LmV4cHI9RS5zZWxlY3RvcnMsdy5leHByW1wiOlwiXT13LmV4cHIucHNldWRvcyx3LnVuaXF1ZVNvcnQ9dy51bmlxdWU9RS51bmlxdWVTb3J0LHcudGV4dD1FLmdldFRleHQsdy5pc1hNTERvYz1FLmlzWE1MLHcuY29udGFpbnM9RS5jb250YWlucyx3LmVzY2FwZVNlbGVjdG9yPUUuZXNjYXBlO3ZhciBrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxpPXZvaWQgMCE9PW47d2hpbGUoKGU9ZVt0XSkmJjkhPT1lLm5vZGVUeXBlKWlmKDE9PT1lLm5vZGVUeXBlKXtpZihpJiZ3KGUpLmlzKG4pKWJyZWFrO3IucHVzaChlKX1yZXR1cm4gcn0sUz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXTtlO2U9ZS5uZXh0U2libGluZykxPT09ZS5ub2RlVHlwZSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn0sRD13LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O2Z1bmN0aW9uIE4oZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfXZhciBBPS9ePChbYS16XVteXFwvXFwwPjpcXHgyMFxcdFxcclxcblxcZl0qKVtcXHgyMFxcdFxcclxcblxcZl0qXFwvPz4oPzo8XFwvXFwxPnwpJC9pO2Z1bmN0aW9uIGooZSx0LG4pe3JldHVybiBnKHQpP3cuZ3JlcChlLGZ1bmN0aW9uKGUscil7cmV0dXJuISF0LmNhbGwoZSxyLGUpIT09bn0pOnQubm9kZVR5cGU/dy5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10IT09bn0pOlwic3RyaW5nXCIhPXR5cGVvZiB0P3cuZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiB1LmNhbGwodCxlKT4tMSE9PW59KTp3LmZpbHRlcih0LGUsbil9dy5maWx0ZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRbMF07cmV0dXJuIG4mJihlPVwiOm5vdChcIitlK1wiKVwiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP3cuZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106dy5maW5kLm1hdGNoZXMoZSx3LmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LHcuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxpPXRoaXM7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGUpcmV0dXJuIHRoaXMucHVzaFN0YWNrKHcoZSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHQ9MDt0PHI7dCsrKWlmKHcuY29udGFpbnMoaVt0XSx0aGlzKSlyZXR1cm4hMH0pKTtmb3Iobj10aGlzLnB1c2hTdGFjayhbXSksdD0wO3Q8cjt0Kyspdy5maW5kKGUsaVt0XSxuKTtyZXR1cm4gcj4xP3cudW5pcXVlU29ydChuKTpufSxmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGoodGhpcyxlfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGoodGhpcyxlfHxbXSwhMCkpfSxpczpmdW5jdGlvbihlKXtyZXR1cm4hIWoodGhpcyxcInN0cmluZ1wiPT10eXBlb2YgZSYmRC50ZXN0KGUpP3coZSk6ZXx8W10sITEpLmxlbmd0aH19KTt2YXIgcSxMPS9eKD86XFxzKig8W1xcd1xcV10rPilbXj5dKnwjKFtcXHctXSspKSQvOyh3LmZuLmluaXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpLG87aWYoIWUpcmV0dXJuIHRoaXM7aWYobj1ufHxxLFwic3RyaW5nXCI9PXR5cGVvZiBlKXtpZighKGk9XCI8XCI9PT1lWzBdJiZcIj5cIj09PWVbZS5sZW5ndGgtMV0mJmUubGVuZ3RoPj0zP1tudWxsLGUsbnVsbF06TC5leGVjKGUpKXx8IWlbMV0mJnQpcmV0dXJuIXR8fHQuanF1ZXJ5Pyh0fHxuKS5maW5kKGUpOnRoaXMuY29uc3RydWN0b3IodCkuZmluZChlKTtpZihpWzFdKXtpZih0PXQgaW5zdGFuY2VvZiB3P3RbMF06dCx3Lm1lcmdlKHRoaXMsdy5wYXJzZUhUTUwoaVsxXSx0JiZ0Lm5vZGVUeXBlP3Qub3duZXJEb2N1bWVudHx8dDpyLCEwKSksQS50ZXN0KGlbMV0pJiZ3LmlzUGxhaW5PYmplY3QodCkpZm9yKGkgaW4gdClnKHRoaXNbaV0pP3RoaXNbaV0odFtpXSk6dGhpcy5hdHRyKGksdFtpXSk7cmV0dXJuIHRoaXN9cmV0dXJuKG89ci5nZXRFbGVtZW50QnlJZChpWzJdKSkmJih0aGlzWzBdPW8sdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gZS5ub2RlVHlwZT8odGhpc1swXT1lLHRoaXMubGVuZ3RoPTEsdGhpcyk6ZyhlKT92b2lkIDAhPT1uLnJlYWR5P24ucmVhZHkoZSk6ZSh3KTp3Lm1ha2VBcnJheShlLHRoaXMpfSkucHJvdG90eXBlPXcuZm4scT13KHIpO3ZhciBIPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLE89e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07dy5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihlKXt2YXIgdD13KGUsdGhpcyksbj10Lmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPG47ZSsrKWlmKHcuY29udGFpbnModGhpcyx0W2VdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLGk9dGhpcy5sZW5ndGgsbz1bXSxhPVwic3RyaW5nXCIhPXR5cGVvZiBlJiZ3KGUpO2lmKCFELnRlc3QoZSkpZm9yKDtyPGk7cisrKWZvcihuPXRoaXNbcl07biYmbiE9PXQ7bj1uLnBhcmVudE5vZGUpaWYobi5ub2RlVHlwZTwxMSYmKGE/YS5pbmRleChuKT4tMToxPT09bi5ub2RlVHlwZSYmdy5maW5kLm1hdGNoZXNTZWxlY3RvcihuLGUpKSl7by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhvLmxlbmd0aD4xP3cudW5pcXVlU29ydChvKTpvKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/XCJzdHJpbmdcIj09dHlwZW9mIGU/dS5jYWxsKHcoZSksdGhpc1swXSk6dS5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayh3LnVuaXF1ZVNvcnQody5tZXJnZSh0aGlzLmdldCgpLHcoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSk7ZnVuY3Rpb24gUChlLHQpe3doaWxlKChlPWVbdF0pJiYxIT09ZS5ub2RlVHlwZSk7cmV0dXJuIGV9dy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsXCJwYXJlbnROb2RlXCIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBrKGUsXCJwYXJlbnROb2RlXCIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFAoZSxcIm5leHRTaWJsaW5nXCIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBQKGUsXCJwcmV2aW91c1NpYmxpbmdcIil9LG5leHRBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIGsoZSxcIm5leHRTaWJsaW5nXCIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiBrKGUsXCJwcmV2aW91c1NpYmxpbmdcIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGsoZSxcIm5leHRTaWJsaW5nXCIsbil9LHByZXZVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGsoZSxcInByZXZpb3VzU2libGluZ1wiLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4gUygoZS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxlKX0sY2hpbGRyZW46ZnVuY3Rpb24oZSl7cmV0dXJuIFMoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIE4oZSxcImlmcmFtZVwiKT9lLmNvbnRlbnREb2N1bWVudDooTihlLFwidGVtcGxhdGVcIikmJihlPWUuY29udGVudHx8ZSksdy5tZXJnZShbXSxlLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKGUsdCl7dy5mbltlXT1mdW5jdGlvbihuLHIpe3ZhciBpPXcubWFwKHRoaXMsdCxuKTtyZXR1cm5cIlVudGlsXCIhPT1lLnNsaWNlKC01KSYmKHI9biksciYmXCJzdHJpbmdcIj09dHlwZW9mIHImJihpPXcuZmlsdGVyKHIsaSkpLHRoaXMubGVuZ3RoPjEmJihPW2VdfHx3LnVuaXF1ZVNvcnQoaSksSC50ZXN0KGUpJiZpLnJldmVyc2UoKSksdGhpcy5wdXNoU3RhY2soaSl9fSk7dmFyIE09L1teXFx4MjBcXHRcXHJcXG5cXGZdKy9nO2Z1bmN0aW9uIFIoZSl7dmFyIHQ9e307cmV0dXJuIHcuZWFjaChlLm1hdGNoKE0pfHxbXSxmdW5jdGlvbihlLG4pe3Rbbl09ITB9KSx0fXcuQ2FsbGJhY2tzPWZ1bmN0aW9uKGUpe2U9XCJzdHJpbmdcIj09dHlwZW9mIGU/UihlKTp3LmV4dGVuZCh7fSxlKTt2YXIgdCxuLHIsaSxvPVtdLGE9W10scz0tMSx1PWZ1bmN0aW9uKCl7Zm9yKGk9aXx8ZS5vbmNlLHI9dD0hMDthLmxlbmd0aDtzPS0xKXtuPWEuc2hpZnQoKTt3aGlsZSgrK3M8by5sZW5ndGgpITE9PT1vW3NdLmFwcGx5KG5bMF0sblsxXSkmJmUuc3RvcE9uRmFsc2UmJihzPW8ubGVuZ3RoLG49ITEpfWUubWVtb3J5fHwobj0hMSksdD0hMSxpJiYobz1uP1tdOlwiXCIpfSxsPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gbyYmKG4mJiF0JiYocz1vLmxlbmd0aC0xLGEucHVzaChuKSksZnVuY3Rpb24gdChuKXt3LmVhY2gobixmdW5jdGlvbihuLHIpe2cocik/ZS51bmlxdWUmJmwuaGFzKHIpfHxvLnB1c2gocik6ciYmci5sZW5ndGgmJlwic3RyaW5nXCIhPT14KHIpJiZ0KHIpfSl9KGFyZ3VtZW50cyksbiYmIXQmJnUoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHcuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgbjt3aGlsZSgobj13LmluQXJyYXkodCxvLG4pKT4tMSlvLnNwbGljZShuLDEpLG48PXMmJnMtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT93LmluQXJyYXkoZSxvKT4tMTpvLmxlbmd0aD4wfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBvJiYobz1bXSksdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBpPWE9W10sbz1uPVwiXCIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hb30sbG9jazpmdW5jdGlvbigpe3JldHVybiBpPWE9W10sbnx8dHx8KG89bj1cIlwiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWl9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsbil7cmV0dXJuIGl8fChuPVtlLChuPW58fFtdKS5zbGljZT9uLnNsaWNlKCk6bl0sYS5wdXNoKG4pLHR8fHUoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBsLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBsfTtmdW5jdGlvbiBJKGUpe3JldHVybiBlfWZ1bmN0aW9uIFcoZSl7dGhyb3cgZX1mdW5jdGlvbiAkKGUsdCxuLHIpe3ZhciBpO3RyeXtlJiZnKGk9ZS5wcm9taXNlKT9pLmNhbGwoZSkuZG9uZSh0KS5mYWlsKG4pOmUmJmcoaT1lLnRoZW4pP2kuY2FsbChlLHQsbik6dC5hcHBseSh2b2lkIDAsW2VdLnNsaWNlKHIpKX1jYXRjaChlKXtuLmFwcGx5KHZvaWQgMCxbZV0pfX13LmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24odCl7dmFyIG49W1tcIm5vdGlmeVwiLFwicHJvZ3Jlc3NcIix3LkNhbGxiYWNrcyhcIm1lbW9yeVwiKSx3LkNhbGxiYWNrcyhcIm1lbW9yeVwiKSwyXSxbXCJyZXNvbHZlXCIsXCJkb25lXCIsdy5DYWxsYmFja3MoXCJvbmNlIG1lbW9yeVwiKSx3LkNhbGxiYWNrcyhcIm9uY2UgbWVtb3J5XCIpLDAsXCJyZXNvbHZlZFwiXSxbXCJyZWplY3RcIixcImZhaWxcIix3LkNhbGxiYWNrcyhcIm9uY2UgbWVtb3J5XCIpLHcuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIiksMSxcInJlamVjdGVkXCJdXSxyPVwicGVuZGluZ1wiLGk9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBvLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sXCJjYXRjaFwiOmZ1bmN0aW9uKGUpe3JldHVybiBpLnRoZW4obnVsbCxlKX0scGlwZTpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4gdy5EZWZlcnJlZChmdW5jdGlvbih0KXt3LmVhY2gobixmdW5jdGlvbihuLHIpe3ZhciBpPWcoZVtyWzRdXSkmJmVbcls0XV07b1tyWzFdXShmdW5jdGlvbigpe3ZhciBlPWkmJmkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJmcoZS5wcm9taXNlKT9lLnByb21pc2UoKS5wcm9ncmVzcyh0Lm5vdGlmeSkuZG9uZSh0LnJlc29sdmUpLmZhaWwodC5yZWplY3QpOnRbclswXStcIldpdGhcIl0odGhpcyxpP1tlXTphcmd1bWVudHMpfSl9KSxlPW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24odCxyLGkpe3ZhciBvPTA7ZnVuY3Rpb24gYSh0LG4scixpKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcz10aGlzLHU9YXJndW1lbnRzLGw9ZnVuY3Rpb24oKXt2YXIgZSxsO2lmKCEodDxvKSl7aWYoKGU9ci5hcHBseShzLHUpKT09PW4ucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb25cIik7bD1lJiYoXCJvYmplY3RcIj09dHlwZW9mIGV8fFwiZnVuY3Rpb25cIj09dHlwZW9mIGUpJiZlLnRoZW4sZyhsKT9pP2wuY2FsbChlLGEobyxuLEksaSksYShvLG4sVyxpKSk6KG8rKyxsLmNhbGwoZSxhKG8sbixJLGkpLGEobyxuLFcsaSksYShvLG4sSSxuLm5vdGlmeVdpdGgpKSk6KHIhPT1JJiYocz12b2lkIDAsdT1bZV0pLChpfHxuLnJlc29sdmVXaXRoKShzLHUpKX19LGM9aT9sOmZ1bmN0aW9uKCl7dHJ5e2woKX1jYXRjaChlKXt3LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJncuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhlLGMuc3RhY2tUcmFjZSksdCsxPj1vJiYociE9PVcmJihzPXZvaWQgMCx1PVtlXSksbi5yZWplY3RXaXRoKHMsdSkpfX07dD9jKCk6KHcuRGVmZXJyZWQuZ2V0U3RhY2tIb29rJiYoYy5zdGFja1RyYWNlPXcuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLGUuc2V0VGltZW91dChjKSl9fXJldHVybiB3LkRlZmVycmVkKGZ1bmN0aW9uKGUpe25bMF1bM10uYWRkKGEoMCxlLGcoaSk/aTpJLGUubm90aWZ5V2l0aCkpLG5bMV1bM10uYWRkKGEoMCxlLGcodCk/dDpJKSksblsyXVszXS5hZGQoYSgwLGUsZyhyKT9yOlcpKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT93LmV4dGVuZChlLGkpOml9fSxvPXt9O3JldHVybiB3LmVhY2gobixmdW5jdGlvbihlLHQpe3ZhciBhPXRbMl0scz10WzVdO2lbdFsxXV09YS5hZGQscyYmYS5hZGQoZnVuY3Rpb24oKXtyPXN9LG5bMy1lXVsyXS5kaXNhYmxlLG5bMy1lXVszXS5kaXNhYmxlLG5bMF1bMl0ubG9jayxuWzBdWzNdLmxvY2spLGEuYWRkKHRbM10uZmlyZSksb1t0WzBdXT1mdW5jdGlvbigpe3JldHVybiBvW3RbMF0rXCJXaXRoXCJdKHRoaXM9PT1vP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30sb1t0WzBdK1wiV2l0aFwiXT1hLmZpcmVXaXRofSksaS5wcm9taXNlKG8pLHQmJnQuY2FsbChvLG8pLG99LHdoZW46ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPXQscj1BcnJheShuKSxpPW8uY2FsbChhcmd1bWVudHMpLGE9dy5EZWZlcnJlZCgpLHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JbZV09dGhpcyxpW2VdPWFyZ3VtZW50cy5sZW5ndGg+MT9vLmNhbGwoYXJndW1lbnRzKTpuLC0tdHx8YS5yZXNvbHZlV2l0aChyLGkpfX07aWYodDw9MSYmKCQoZSxhLmRvbmUocyhuKSkucmVzb2x2ZSxhLnJlamVjdCwhdCksXCJwZW5kaW5nXCI9PT1hLnN0YXRlKCl8fGcoaVtuXSYmaVtuXS50aGVuKSkpcmV0dXJuIGEudGhlbigpO3doaWxlKG4tLSkkKGlbbl0scyhuKSxhLnJlamVjdCk7cmV0dXJuIGEucHJvbWlzZSgpfX0pO3ZhciBCPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO3cuRGVmZXJyZWQuZXhjZXB0aW9uSG9vaz1mdW5jdGlvbih0LG4pe2UuY29uc29sZSYmZS5jb25zb2xlLndhcm4mJnQmJkIudGVzdCh0Lm5hbWUpJiZlLmNvbnNvbGUud2FybihcImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246IFwiK3QubWVzc2FnZSx0LnN0YWNrLG4pfSx3LnJlYWR5RXhjZXB0aW9uPWZ1bmN0aW9uKHQpe2Uuc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IHR9KX07dmFyIEY9dy5EZWZlcnJlZCgpO3cuZm4ucmVhZHk9ZnVuY3Rpb24oZSl7cmV0dXJuIEYudGhlbihlKVtcImNhdGNoXCJdKGZ1bmN0aW9uKGUpe3cucmVhZHlFeGNlcHRpb24oZSl9KSx0aGlzfSx3LmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihlKXsoITA9PT1lPy0tdy5yZWFkeVdhaXQ6dy5pc1JlYWR5KXx8KHcuaXNSZWFkeT0hMCwhMCE9PWUmJi0tdy5yZWFkeVdhaXQ+MHx8Ri5yZXNvbHZlV2l0aChyLFt3XSkpfX0pLHcucmVhZHkudGhlbj1GLnRoZW47ZnVuY3Rpb24gXygpe3IucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIixfKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsXyksdy5yZWFkeSgpfVwiY29tcGxldGVcIj09PXIucmVhZHlTdGF0ZXx8XCJsb2FkaW5nXCIhPT1yLnJlYWR5U3RhdGUmJiFyLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9lLnNldFRpbWVvdXQody5yZWFkeSk6KHIuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIixfKSxlLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsXykpO3ZhciB6PWZ1bmN0aW9uKGUsdCxuLHIsaSxvLGEpe3ZhciBzPTAsdT1lLmxlbmd0aCxsPW51bGw9PW47aWYoXCJvYmplY3RcIj09PXgobikpe2k9ITA7Zm9yKHMgaW4gbil6KGUsdCxzLG5bc10sITAsbyxhKX1lbHNlIGlmKHZvaWQgMCE9PXImJihpPSEwLGcocil8fChhPSEwKSxsJiYoYT8odC5jYWxsKGUsciksdD1udWxsKToobD10LHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBsLmNhbGwodyhlKSxuKX0pKSx0KSlmb3IoO3M8dTtzKyspdChlW3NdLG4sYT9yOnIuY2FsbChlW3NdLHMsdChlW3NdLG4pKSk7cmV0dXJuIGk/ZTpsP3QuY2FsbChlKTp1P3QoZVswXSxuKTpvfSxYPS9eLW1zLS8sVT0vLShbYS16XSkvZztmdW5jdGlvbiBWKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBHKGUpe3JldHVybiBlLnJlcGxhY2UoWCxcIm1zLVwiKS5yZXBsYWNlKFUsVil9dmFyIFk9ZnVuY3Rpb24oZSl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlfHw5PT09ZS5ub2RlVHlwZXx8IStlLm5vZGVUeXBlfTtmdW5jdGlvbiBRKCl7dGhpcy5leHBhbmRvPXcuZXhwYW5kbytRLnVpZCsrfVEudWlkPTEsUS5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9e30sWShlKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdGhpcy5leHBhbmRvLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pKSksdH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMuY2FjaGUoZSk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpaVtHKHQpXT1uO2Vsc2UgZm9yKHIgaW4gdClpW0cocildPXRbcl07cmV0dXJuIGl9LGdldDpmdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10P3RoaXMuY2FjaGUoZSk6ZVt0aGlzLmV4cGFuZG9dJiZlW3RoaXMuZXhwYW5kb11bRyh0KV19LGFjY2VzczpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHZvaWQgMD09PXR8fHQmJlwic3RyaW5nXCI9PXR5cGVvZiB0JiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KGUsdCk6KHRoaXMuc2V0KGUsdCxuKSx2b2lkIDAhPT1uP246dCl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9ZVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PXQpe249KHQ9QXJyYXkuaXNBcnJheSh0KT90Lm1hcChHKToodD1HKHQpKWluIHI/W3RdOnQubWF0Y2goTSl8fFtdKS5sZW5ndGg7d2hpbGUobi0tKWRlbGV0ZSByW3Rbbl1dfSh2b2lkIDA9PT10fHx3LmlzRW1wdHlPYmplY3QocikpJiYoZS5ub2RlVHlwZT9lW3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSBlW3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHZvaWQgMCE9PXQmJiF3LmlzRW1wdHlPYmplY3QodCl9fTt2YXIgSj1uZXcgUSxLPW5ldyBRLFo9L14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvLGVlPS9bQS1aXS9nO2Z1bmN0aW9uIHRlKGUpe3JldHVyblwidHJ1ZVwiPT09ZXx8XCJmYWxzZVwiIT09ZSYmKFwibnVsbFwiPT09ZT9udWxsOmU9PT0rZStcIlwiPytlOloudGVzdChlKT9KU09OLnBhcnNlKGUpOmUpfWZ1bmN0aW9uIG5lKGUsdCxuKXt2YXIgcjtpZih2b2lkIDA9PT1uJiYxPT09ZS5ub2RlVHlwZSlpZihyPVwiZGF0YS1cIit0LnJlcGxhY2UoZWUsXCItJCZcIikudG9Mb3dlckNhc2UoKSxcInN0cmluZ1wiPT10eXBlb2Yobj1lLmdldEF0dHJpYnV0ZShyKSkpe3RyeXtuPXRlKG4pfWNhdGNoKGUpe31LLnNldChlLHQsbil9ZWxzZSBuPXZvaWQgMDtyZXR1cm4gbn13LmV4dGVuZCh7aGFzRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gSy5oYXNEYXRhKGUpfHxKLmhhc0RhdGEoZSl9LGRhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBLLmFjY2VzcyhlLHQsbil9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtLLnJlbW92ZShlLHQpfSxfZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEouYWNjZXNzKGUsdCxuKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtKLnJlbW92ZShlLHQpfX0pLHcuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG89dGhpc1swXSxhPW8mJm8uYXR0cmlidXRlcztpZih2b2lkIDA9PT1lKXtpZih0aGlzLmxlbmd0aCYmKGk9Sy5nZXQobyksMT09PW8ubm9kZVR5cGUmJiFKLmdldChvLFwiaGFzRGF0YUF0dHJzXCIpKSl7bj1hLmxlbmd0aDt3aGlsZShuLS0pYVtuXSYmMD09PShyPWFbbl0ubmFtZSkuaW5kZXhPZihcImRhdGEtXCIpJiYocj1HKHIuc2xpY2UoNSkpLG5lKG8scixpW3JdKSk7Si5zZXQobyxcImhhc0RhdGFBdHRyc1wiLCEwKX1yZXR1cm4gaX1yZXR1cm5cIm9iamVjdFwiPT10eXBlb2YgZT90aGlzLmVhY2goZnVuY3Rpb24oKXtLLnNldCh0aGlzLGUpfSk6eih0aGlzLGZ1bmN0aW9uKHQpe3ZhciBuO2lmKG8mJnZvaWQgMD09PXQpe2lmKHZvaWQgMCE9PShuPUsuZ2V0KG8sZSkpKXJldHVybiBuO2lmKHZvaWQgMCE9PShuPW5lKG8sZSkpKXJldHVybiBufWVsc2UgdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Sy5zZXQodGhpcyxlLHQpfSl9LG51bGwsdCxhcmd1bWVudHMubGVuZ3RoPjEsbnVsbCwhMCl9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe0sucmVtb3ZlKHRoaXMsZSl9KX19KSx3LmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKGUpcmV0dXJuIHQ9KHR8fFwiZnhcIikrXCJxdWV1ZVwiLHI9Si5nZXQoZSx0KSxuJiYoIXJ8fEFycmF5LmlzQXJyYXkobik/cj1KLmFjY2VzcyhlLHQsdy5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24oZSx0KXt0PXR8fFwiZnhcIjt2YXIgbj13LnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxvPXcuX3F1ZXVlSG9va3MoZSx0KSxhPWZ1bmN0aW9uKCl7dy5kZXF1ZXVlKGUsdCl9O1wiaW5wcm9ncmVzc1wiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKFwiZnhcIj09PXQmJm4udW5zaGlmdChcImlucHJvZ3Jlc3NcIiksZGVsZXRlIG8uc3RvcCxpLmNhbGwoZSxhLG8pKSwhciYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCtcInF1ZXVlSG9va3NcIjtyZXR1cm4gSi5nZXQoZSxuKXx8Si5hY2Nlc3MoZSxuLHtlbXB0eTp3LkNhbGxiYWNrcyhcIm9uY2UgbWVtb3J5XCIpLmFkZChmdW5jdGlvbigpe0oucmVtb3ZlKGUsW3QrXCJxdWV1ZVwiLG5dKX0pfSl9fSksdy5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49MjtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgZSYmKHQ9ZSxlPVwiZnhcIixuLS0pLGFyZ3VtZW50cy5sZW5ndGg8bj93LnF1ZXVlKHRoaXNbMF0sZSk6dm9pZCAwPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBuPXcucXVldWUodGhpcyxlLHQpO3cuX3F1ZXVlSG9va3ModGhpcyxlKSxcImZ4XCI9PT1lJiZcImlucHJvZ3Jlc3NcIiE9PW5bMF0mJncuZGVxdWV1ZSh0aGlzLGUpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3cuZGVxdWV1ZSh0aGlzLGUpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8XCJmeFwiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MSxpPXcuRGVmZXJyZWQoKSxvPXRoaXMsYT10aGlzLmxlbmd0aCxzPWZ1bmN0aW9uKCl7LS1yfHxpLnJlc29sdmVXaXRoKG8sW29dKX07XCJzdHJpbmdcIiE9dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLGU9ZXx8XCJmeFwiO3doaWxlKGEtLSkobj1KLmdldChvW2FdLGUrXCJxdWV1ZUhvb2tzXCIpKSYmbi5lbXB0eSYmKHIrKyxuLmVtcHR5LmFkZChzKSk7cmV0dXJuIHMoKSxpLnByb21pc2UodCl9fSk7dmFyIHJlPS9bKy1dPyg/OlxcZCpcXC58KVxcZCsoPzpbZUVdWystXT9cXGQrfCkvLnNvdXJjZSxpZT1uZXcgUmVnRXhwKFwiXig/OihbKy1dKT18KShcIityZStcIikoW2EteiVdKikkXCIsXCJpXCIpLG9lPVtcIlRvcFwiLFwiUmlnaHRcIixcIkJvdHRvbVwiLFwiTGVmdFwiXSxhZT1mdW5jdGlvbihlLHQpe3JldHVyblwibm9uZVwiPT09KGU9dHx8ZSkuc3R5bGUuZGlzcGxheXx8XCJcIj09PWUuc3R5bGUuZGlzcGxheSYmdy5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSkmJlwibm9uZVwiPT09dy5jc3MoZSxcImRpc3BsYXlcIil9LHNlPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8sYT17fTtmb3IobyBpbiB0KWFbb109ZS5zdHlsZVtvXSxlLnN0eWxlW29dPXRbb107aT1uLmFwcGx5KGUscnx8W10pO2ZvcihvIGluIHQpZS5zdHlsZVtvXT1hW29dO3JldHVybiBpfTtmdW5jdGlvbiB1ZShlLHQsbixyKXt2YXIgaSxvLGE9MjAscz1yP2Z1bmN0aW9uKCl7cmV0dXJuIHIuY3VyKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIHcuY3NzKGUsdCxcIlwiKX0sdT1zKCksbD1uJiZuWzNdfHwody5jc3NOdW1iZXJbdF0/XCJcIjpcInB4XCIpLGM9KHcuY3NzTnVtYmVyW3RdfHxcInB4XCIhPT1sJiYrdSkmJmllLmV4ZWMody5jc3MoZSx0KSk7aWYoYyYmY1szXSE9PWwpe3UvPTIsbD1sfHxjWzNdLGM9K3V8fDE7d2hpbGUoYS0tKXcuc3R5bGUoZSx0LGMrbCksKDEtbykqKDEtKG89cygpL3V8fC41KSk8PTAmJihhPTApLGMvPW87Yyo9Mix3LnN0eWxlKGUsdCxjK2wpLG49bnx8W119cmV0dXJuIG4mJihjPStjfHwrdXx8MCxpPW5bMV0/YysoblsxXSsxKSpuWzJdOituWzJdLHImJihyLnVuaXQ9bCxyLnN0YXJ0PWMsci5lbmQ9aSkpLGl9dmFyIGxlPXt9O2Z1bmN0aW9uIGNlKGUpe3ZhciB0LG49ZS5vd25lckRvY3VtZW50LHI9ZS5ub2RlTmFtZSxpPWxlW3JdO3JldHVybiBpfHwodD1uLmJvZHkuYXBwZW5kQ2hpbGQobi5jcmVhdGVFbGVtZW50KHIpKSxpPXcuY3NzKHQsXCJkaXNwbGF5XCIpLHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSxcIm5vbmVcIj09PWkmJihpPVwiYmxvY2tcIiksbGVbcl09aSxpKX1mdW5jdGlvbiBmZShlLHQpe2Zvcih2YXIgbixyLGk9W10sbz0wLGE9ZS5sZW5ndGg7bzxhO28rKykocj1lW29dKS5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LHQ/KFwibm9uZVwiPT09biYmKGlbb109Si5nZXQocixcImRpc3BsYXlcIil8fG51bGwsaVtvXXx8KHIuc3R5bGUuZGlzcGxheT1cIlwiKSksXCJcIj09PXIuc3R5bGUuZGlzcGxheSYmYWUocikmJihpW29dPWNlKHIpKSk6XCJub25lXCIhPT1uJiYoaVtvXT1cIm5vbmVcIixKLnNldChyLFwiZGlzcGxheVwiLG4pKSk7Zm9yKG89MDtvPGE7bysrKW51bGwhPWlbb10mJihlW29dLnN0eWxlLmRpc3BsYXk9aVtvXSk7cmV0dXJuIGV9dy5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gZmUodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gZmUodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm5cImJvb2xlYW5cIj09dHlwZW9mIGU/ZT90aGlzLnNob3coKTp0aGlzLmhpZGUoKTp0aGlzLmVhY2goZnVuY3Rpb24oKXthZSh0aGlzKT93KHRoaXMpLnNob3coKTp3KHRoaXMpLmhpZGUoKX0pfX0pO3ZhciBwZT0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxkZT0vPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSspL2ksaGU9L14kfF5tb2R1bGUkfFxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSxnZT17b3B0aW9uOlsxLFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLFwiPC9zZWxlY3Q+XCJdLHRoZWFkOlsxLFwiPHRhYmxlPlwiLFwiPC90YWJsZT5cIl0sY29sOlsyLFwiPHRhYmxlPjxjb2xncm91cD5cIixcIjwvY29sZ3JvdXA+PC90YWJsZT5cIl0sdHI6WzIsXCI8dGFibGU+PHRib2R5PlwiLFwiPC90Ym9keT48L3RhYmxlPlwiXSx0ZDpbMyxcIjx0YWJsZT48dGJvZHk+PHRyPlwiLFwiPC90cj48L3Rib2R5PjwvdGFibGU+XCJdLF9kZWZhdWx0OlswLFwiXCIsXCJcIl19O2dlLm9wdGdyb3VwPWdlLm9wdGlvbixnZS50Ym9keT1nZS50Zm9vdD1nZS5jb2xncm91cD1nZS5jYXB0aW9uPWdlLnRoZWFkLGdlLnRoPWdlLnRkO2Z1bmN0aW9uIHllKGUsdCl7dmFyIG47cmV0dXJuIG49XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGUuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0fHxcIipcIik6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbD9lLnF1ZXJ5U2VsZWN0b3JBbGwodHx8XCIqXCIpOltdLHZvaWQgMD09PXR8fHQmJk4oZSx0KT93Lm1lcmdlKFtlXSxuKTpufWZ1bmN0aW9uIHZlKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKUouc2V0KGVbbl0sXCJnbG9iYWxFdmFsXCIsIXR8fEouZ2V0KHRbbl0sXCJnbG9iYWxFdmFsXCIpKX12YXIgbWU9Lzx8JiM/XFx3KzsvO2Z1bmN0aW9uIHhlKGUsdCxuLHIsaSl7Zm9yKHZhciBvLGEscyx1LGwsYyxmPXQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHA9W10sZD0wLGg9ZS5sZW5ndGg7ZDxoO2QrKylpZigobz1lW2RdKXx8MD09PW8paWYoXCJvYmplY3RcIj09PXgobykpdy5tZXJnZShwLG8ubm9kZVR5cGU/W29dOm8pO2Vsc2UgaWYobWUudGVzdChvKSl7YT1hfHxmLmFwcGVuZENoaWxkKHQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkscz0oZGUuZXhlYyhvKXx8W1wiXCIsXCJcIl0pWzFdLnRvTG93ZXJDYXNlKCksdT1nZVtzXXx8Z2UuX2RlZmF1bHQsYS5pbm5lckhUTUw9dVsxXSt3Lmh0bWxQcmVmaWx0ZXIobykrdVsyXSxjPXVbMF07d2hpbGUoYy0tKWE9YS5sYXN0Q2hpbGQ7dy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD1cIlwifWVsc2UgcC5wdXNoKHQuY3JlYXRlVGV4dE5vZGUobykpO2YudGV4dENvbnRlbnQ9XCJcIixkPTA7d2hpbGUobz1wW2QrK10paWYociYmdy5pbkFycmF5KG8scik+LTEpaSYmaS5wdXNoKG8pO2Vsc2UgaWYobD13LmNvbnRhaW5zKG8ub3duZXJEb2N1bWVudCxvKSxhPXllKGYuYXBwZW5kQ2hpbGQobyksXCJzY3JpcHRcIiksbCYmdmUoYSksbil7Yz0wO3doaWxlKG89YVtjKytdKWhlLnRlc3Qoby50eXBlfHxcIlwiKSYmbi5wdXNoKG8pfXJldHVybiBmfSFmdW5jdGlvbigpe3ZhciBlPXIuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmFwcGVuZENoaWxkKHIuY3JlYXRlRWxlbWVudChcImRpdlwiKSksdD1yLmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTt0LnNldEF0dHJpYnV0ZShcInR5cGVcIixcInJhZGlvXCIpLHQuc2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiLFwiY2hlY2tlZFwiKSx0LnNldEF0dHJpYnV0ZShcIm5hbWVcIixcInRcIiksZS5hcHBlbmRDaGlsZCh0KSxoLmNoZWNrQ2xvbmU9ZS5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsZS5pbm5lckhUTUw9XCI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+XCIsaC5ub0Nsb25lQ2hlY2tlZD0hIWUuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlfSgpO3ZhciBiZT1yLmRvY3VtZW50RWxlbWVudCx3ZT0vXmtleS8sVGU9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLENlPS9eKFteLl0qKSg/OlxcLiguKyl8KS87ZnVuY3Rpb24gRWUoKXtyZXR1cm4hMH1mdW5jdGlvbiBrZSgpe3JldHVybiExfWZ1bmN0aW9uIFNlKCl7dHJ5e3JldHVybiByLmFjdGl2ZUVsZW1lbnR9Y2F0Y2goZSl7fX1mdW5jdGlvbiBEZShlLHQsbixyLGksbyl7dmFyIGEscztpZihcIm9iamVjdFwiPT10eXBlb2YgdCl7XCJzdHJpbmdcIiE9dHlwZW9mIG4mJihyPXJ8fG4sbj12b2lkIDApO2ZvcihzIGluIHQpRGUoZSxzLG4scix0W3NdLG8pO3JldHVybiBlfWlmKG51bGw9PXImJm51bGw9PWk/KGk9bixyPW49dm9pZCAwKTpudWxsPT1pJiYoXCJzdHJpbmdcIj09dHlwZW9mIG4/KGk9cixyPXZvaWQgMCk6KGk9cixyPW4sbj12b2lkIDApKSwhMT09PWkpaT1rZTtlbHNlIGlmKCFpKXJldHVybiBlO3JldHVybiAxPT09byYmKGE9aSwoaT1mdW5jdGlvbihlKXtyZXR1cm4gdygpLm9mZihlKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPXcuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC5hZGQodGhpcyx0LGkscixuKX0pfXcuZXZlbnQ9e2dsb2JhbDp7fSxhZGQ6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsdSxsLGMsZixwLGQsaCxnLHk9Si5nZXQoZSk7aWYoeSl7bi5oYW5kbGVyJiYobj0obz1uKS5oYW5kbGVyLGk9by5zZWxlY3RvciksaSYmdy5maW5kLm1hdGNoZXNTZWxlY3RvcihiZSxpKSxuLmd1aWR8fChuLmd1aWQ9dy5ndWlkKyspLCh1PXkuZXZlbnRzKXx8KHU9eS5ldmVudHM9e30pLChhPXkuaGFuZGxlKXx8KGE9eS5oYW5kbGU9ZnVuY3Rpb24odCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHcmJncuZXZlbnQudHJpZ2dlcmVkIT09dC50eXBlP3cuZXZlbnQuZGlzcGF0Y2guYXBwbHkoZSxhcmd1bWVudHMpOnZvaWQgMH0pLGw9KHQ9KHR8fFwiXCIpLm1hdGNoKE0pfHxbXCJcIl0pLmxlbmd0aDt3aGlsZShsLS0pZD1nPShzPUNlLmV4ZWModFtsXSl8fFtdKVsxXSxoPShzWzJdfHxcIlwiKS5zcGxpdChcIi5cIikuc29ydCgpLGQmJihmPXcuZXZlbnQuc3BlY2lhbFtkXXx8e30sZD0oaT9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZCxmPXcuZXZlbnQuc3BlY2lhbFtkXXx8e30sYz13LmV4dGVuZCh7dHlwZTpkLG9yaWdUeXBlOmcsZGF0YTpyLGhhbmRsZXI6bixndWlkOm4uZ3VpZCxzZWxlY3RvcjppLG5lZWRzQ29udGV4dDppJiZ3LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoaSksbmFtZXNwYWNlOmguam9pbihcIi5cIil9LG8pLChwPXVbZF0pfHwoKHA9dVtkXT1bXSkuZGVsZWdhdGVDb3VudD0wLGYuc2V0dXAmJiExIT09Zi5zZXR1cC5jYWxsKGUscixoLGEpfHxlLmFkZEV2ZW50TGlzdGVuZXImJmUuYWRkRXZlbnRMaXN0ZW5lcihkLGEpKSxmLmFkZCYmKGYuYWRkLmNhbGwoZSxjKSxjLmhhbmRsZXIuZ3VpZHx8KGMuaGFuZGxlci5ndWlkPW4uZ3VpZCkpLGk/cC5zcGxpY2UocC5kZWxlZ2F0ZUNvdW50KyssMCxjKTpwLnB1c2goYyksdy5ldmVudC5nbG9iYWxbZF09ITApfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8sYSxzLHUsbCxjLGYscCxkLGgsZyx5PUouaGFzRGF0YShlKSYmSi5nZXQoZSk7aWYoeSYmKHU9eS5ldmVudHMpKXtsPSh0PSh0fHxcIlwiKS5tYXRjaChNKXx8W1wiXCJdKS5sZW5ndGg7d2hpbGUobC0tKWlmKHM9Q2UuZXhlYyh0W2xdKXx8W10sZD1nPXNbMV0saD0oc1syXXx8XCJcIikuc3BsaXQoXCIuXCIpLnNvcnQoKSxkKXtmPXcuZXZlbnQuc3BlY2lhbFtkXXx8e30scD11W2Q9KHI/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGRdfHxbXSxzPXNbMl0mJm5ldyBSZWdFeHAoXCIoXnxcXFxcLilcIitoLmpvaW4oXCJcXFxcLig/Oi4qXFxcXC58KVwiKStcIihcXFxcLnwkKVwiKSxhPW89cC5sZW5ndGg7d2hpbGUoby0tKWM9cFtvXSwhaSYmZyE9PWMub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWMuZ3VpZHx8cyYmIXMudGVzdChjLm5hbWVzcGFjZSl8fHImJnIhPT1jLnNlbGVjdG9yJiYoXCIqKlwiIT09cnx8IWMuc2VsZWN0b3IpfHwocC5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxmLnJlbW92ZSYmZi5yZW1vdmUuY2FsbChlLGMpKTthJiYhcC5sZW5ndGgmJihmLnRlYXJkb3duJiYhMSE9PWYudGVhcmRvd24uY2FsbChlLGgseS5oYW5kbGUpfHx3LnJlbW92ZUV2ZW50KGUsZCx5LmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSl3LmV2ZW50LnJlbW92ZShlLGQrdFtsXSxuLHIsITApO3cuaXNFbXB0eU9iamVjdCh1KSYmSi5yZW1vdmUoZSxcImhhbmRsZSBldmVudHNcIil9fSxkaXNwYXRjaDpmdW5jdGlvbihlKXt2YXIgdD13LmV2ZW50LmZpeChlKSxuLHIsaSxvLGEscyx1PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxsPShKLmdldCh0aGlzLFwiZXZlbnRzXCIpfHx7fSlbdC50eXBlXXx8W10sYz13LmV2ZW50LnNwZWNpYWxbdC50eXBlXXx8e307Zm9yKHVbMF09dCxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl1W25dPWFyZ3VtZW50c1tuXTtpZih0LmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWMucHJlRGlzcGF0Y2h8fCExIT09Yy5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsdCkpe3M9dy5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsdCxsKSxuPTA7d2hpbGUoKG89c1tuKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7dC5jdXJyZW50VGFyZ2V0PW8uZWxlbSxyPTA7d2hpbGUoKGE9by5oYW5kbGVyc1tyKytdKSYmIXQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSl0LnJuYW1lc3BhY2UmJiF0LnJuYW1lc3BhY2UudGVzdChhLm5hbWVzcGFjZSl8fCh0LmhhbmRsZU9iaj1hLHQuZGF0YT1hLmRhdGEsdm9pZCAwIT09KGk9KCh3LmV2ZW50LnNwZWNpYWxbYS5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGEuaGFuZGxlcikuYXBwbHkoby5lbGVtLHUpKSYmITE9PT0odC5yZXN1bHQ9aSkmJih0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSkpfXJldHVybiBjLnBvc3REaXNwYXRjaCYmYy5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLHQpLHQucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHM9W10sdT10LmRlbGVnYXRlQ291bnQsbD1lLnRhcmdldDtpZih1JiZsLm5vZGVUeXBlJiYhKFwiY2xpY2tcIj09PWUudHlwZSYmZS5idXR0b24+PTEpKWZvcig7bCE9PXRoaXM7bD1sLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWwubm9kZVR5cGUmJihcImNsaWNrXCIhPT1lLnR5cGV8fCEwIT09bC5kaXNhYmxlZCkpe2ZvcihvPVtdLGE9e30sbj0wO248dTtuKyspdm9pZCAwPT09YVtpPShyPXRbbl0pLnNlbGVjdG9yK1wiIFwiXSYmKGFbaV09ci5uZWVkc0NvbnRleHQ/dyhpLHRoaXMpLmluZGV4KGwpPi0xOncuZmluZChpLHRoaXMsbnVsbCxbbF0pLmxlbmd0aCksYVtpXSYmby5wdXNoKHIpO28ubGVuZ3RoJiZzLnB1c2goe2VsZW06bCxoYW5kbGVyczpvfSl9cmV0dXJuIGw9dGhpcyx1PHQubGVuZ3RoJiZzLnB1c2goe2VsZW06bCxoYW5kbGVyczp0LnNsaWNlKHUpfSksc30sYWRkUHJvcDpmdW5jdGlvbihlLHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3LkV2ZW50LnByb3RvdHlwZSxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6Zyh0KT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdCh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W2VdfSxzZXQ6ZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dH0pfX0pfSxmaXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbdy5leHBhbmRvXT9lOm5ldyB3LkV2ZW50KGUpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09U2UoKSYmdGhpcy5mb2N1cylyZXR1cm4gdGhpcy5mb2N1cygpLCExfSxkZWxlZ2F0ZVR5cGU6XCJmb2N1c2luXCJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzPT09U2UoKSYmdGhpcy5ibHVyKXJldHVybiB0aGlzLmJsdXIoKSwhMX0sZGVsZWdhdGVUeXBlOlwiZm9jdXNvdXRcIn0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZihcImNoZWNrYm94XCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2smJk4odGhpcyxcImlucHV0XCIpKXJldHVybiB0aGlzLmNsaWNrKCksITF9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3JldHVybiBOKGUudGFyZ2V0LFwiYVwiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUucmVzdWx0JiZlLm9yaWdpbmFsRXZlbnQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19fSx3LnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4pfSx3LkV2ZW50PWZ1bmN0aW9uKGUsdCl7aWYoISh0aGlzIGluc3RhbmNlb2Ygdy5FdmVudCkpcmV0dXJuIG5ldyB3LkV2ZW50KGUsdCk7ZSYmZS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWUuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09ZS5kZWZhdWx0UHJldmVudGVkJiYhMT09PWUucmV0dXJuVmFsdWU/RWU6a2UsdGhpcy50YXJnZXQ9ZS50YXJnZXQmJjM9PT1lLnRhcmdldC5ub2RlVHlwZT9lLnRhcmdldC5wYXJlbnROb2RlOmUudGFyZ2V0LHRoaXMuY3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQsdGhpcy5yZWxhdGVkVGFyZ2V0PWUucmVsYXRlZFRhcmdldCk6dGhpcy50eXBlPWUsdCYmdy5leHRlbmQodGhpcyx0KSx0aGlzLnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW3cuZXhwYW5kb109ITB9LHcuRXZlbnQucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp3LkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDprZSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDprZSxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDprZSxpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1FZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1FZSxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9RWUsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LHcuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCxcImNoYXJcIjohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbihlKXt2YXIgdD1lLmJ1dHRvbjtyZXR1cm4gbnVsbD09ZS53aGljaCYmd2UudGVzdChlLnR5cGUpP251bGwhPWUuY2hhckNvZGU/ZS5jaGFyQ29kZTplLmtleUNvZGU6IWUud2hpY2gmJnZvaWQgMCE9PXQmJlRlLnRlc3QoZS50eXBlKT8xJnQ/MToyJnQ/Mzo0JnQ/MjowOmUud2hpY2h9fSx3LmV2ZW50LmFkZFByb3ApLHcuZWFjaCh7bW91c2VlbnRlcjpcIm1vdXNlb3ZlclwiLG1vdXNlbGVhdmU6XCJtb3VzZW91dFwiLHBvaW50ZXJlbnRlcjpcInBvaW50ZXJvdmVyXCIscG9pbnRlcmxlYXZlOlwicG9pbnRlcm91dFwifSxmdW5jdGlvbihlLHQpe3cuZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LG89ZS5oYW5kbGVPYmo7cmV0dXJuIGkmJihpPT09cnx8dy5jb250YWlucyhyLGkpKXx8KGUudHlwZT1vLm9yaWdUeXBlLG49by5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLnR5cGU9dCksbn19fSksdy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBEZSh0aGlzLGUsdCxuLHIpfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIERlKHRoaXMsZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLHcoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrXCIuXCIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZihcIm9iamVjdFwiPT10eXBlb2YgZSl7Zm9yKGkgaW4gZSl0aGlzLm9mZihpLHQsZVtpXSk7cmV0dXJuIHRoaXN9cmV0dXJuITEhPT10JiZcImZ1bmN0aW9uXCIhPXR5cGVvZiB0fHwobj10LHQ9dm9pZCAwKSwhMT09PW4mJihuPWtlKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt3LmV2ZW50LnJlbW92ZSh0aGlzLGUsbix0KX0pfX0pO3ZhciBOZT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopW14+XSopXFwvPi9naSxBZT0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxqZT0vY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLHFlPS9eXFxzKjwhKD86XFxbQ0RBVEFcXFt8LS0pfCg/OlxcXVxcXXwtLSk+XFxzKiQvZztmdW5jdGlvbiBMZShlLHQpe3JldHVybiBOKGUsXCJ0YWJsZVwiKSYmTigxMSE9PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsXCJ0clwiKT93KGUpLmNoaWxkcmVuKFwidGJvZHlcIilbMF18fGU6ZX1mdW5jdGlvbiBIZShlKXtyZXR1cm4gZS50eXBlPShudWxsIT09ZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKStcIi9cIitlLnR5cGUsZX1mdW5jdGlvbiBPZShlKXtyZXR1cm5cInRydWUvXCI9PT0oZS50eXBlfHxcIlwiKS5zbGljZSgwLDUpP2UudHlwZT1lLnR5cGUuc2xpY2UoNSk6ZS5yZW1vdmVBdHRyaWJ1dGUoXCJ0eXBlXCIpLGV9ZnVuY3Rpb24gUGUoZSx0KXt2YXIgbixyLGksbyxhLHMsdSxsO2lmKDE9PT10Lm5vZGVUeXBlKXtpZihKLmhhc0RhdGEoZSkmJihvPUouYWNjZXNzKGUpLGE9Si5zZXQodCxvKSxsPW8uZXZlbnRzKSl7ZGVsZXRlIGEuaGFuZGxlLGEuZXZlbnRzPXt9O2ZvcihpIGluIGwpZm9yKG49MCxyPWxbaV0ubGVuZ3RoO248cjtuKyspdy5ldmVudC5hZGQodCxpLGxbaV1bbl0pfUsuaGFzRGF0YShlKSYmKHM9Sy5hY2Nlc3MoZSksdT13LmV4dGVuZCh7fSxzKSxLLnNldCh0LHUpKX19ZnVuY3Rpb24gTWUoZSx0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XCJpbnB1dFwiPT09biYmcGUudGVzdChlLnR5cGUpP3QuY2hlY2tlZD1lLmNoZWNrZWQ6XCJpbnB1dFwiIT09biYmXCJ0ZXh0YXJlYVwiIT09bnx8KHQuZGVmYXVsdFZhbHVlPWUuZGVmYXVsdFZhbHVlKX1mdW5jdGlvbiBSZShlLHQsbixyKXt0PWEuYXBwbHkoW10sdCk7dmFyIGksbyxzLHUsbCxjLGY9MCxwPWUubGVuZ3RoLGQ9cC0xLHk9dFswXSx2PWcoeSk7aWYodnx8cD4xJiZcInN0cmluZ1wiPT10eXBlb2YgeSYmIWguY2hlY2tDbG9uZSYmamUudGVzdCh5KSlyZXR1cm4gZS5lYWNoKGZ1bmN0aW9uKGkpe3ZhciBvPWUuZXEoaSk7diYmKHRbMF09eS5jYWxsKHRoaXMsaSxvLmh0bWwoKSkpLFJlKG8sdCxuLHIpfSk7aWYocCYmKGk9eGUodCxlWzBdLm93bmVyRG9jdW1lbnQsITEsZSxyKSxvPWkuZmlyc3RDaGlsZCwxPT09aS5jaGlsZE5vZGVzLmxlbmd0aCYmKGk9byksb3x8cikpe2Zvcih1PShzPXcubWFwKHllKGksXCJzY3JpcHRcIiksSGUpKS5sZW5ndGg7ZjxwO2YrKylsPWksZiE9PWQmJihsPXcuY2xvbmUobCwhMCwhMCksdSYmdy5tZXJnZShzLHllKGwsXCJzY3JpcHRcIikpKSxuLmNhbGwoZVtmXSxsLGYpO2lmKHUpZm9yKGM9c1tzLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LHcubWFwKHMsT2UpLGY9MDtmPHU7ZisrKWw9c1tmXSxoZS50ZXN0KGwudHlwZXx8XCJcIikmJiFKLmFjY2VzcyhsLFwiZ2xvYmFsRXZhbFwiKSYmdy5jb250YWlucyhjLGwpJiYobC5zcmMmJlwibW9kdWxlXCIhPT0obC50eXBlfHxcIlwiKS50b0xvd2VyQ2FzZSgpP3cuX2V2YWxVcmwmJncuX2V2YWxVcmwobC5zcmMpOm0obC50ZXh0Q29udGVudC5yZXBsYWNlKHFlLFwiXCIpLGMsbCkpfXJldHVybiBlfWZ1bmN0aW9uIEllKGUsdCxuKXtmb3IodmFyIHIsaT10P3cuZmlsdGVyKHQsZSk6ZSxvPTA7bnVsbCE9KHI9aVtvXSk7bysrKW58fDEhPT1yLm5vZGVUeXBlfHx3LmNsZWFuRGF0YSh5ZShyKSksci5wYXJlbnROb2RlJiYobiYmdy5jb250YWlucyhyLm93bmVyRG9jdW1lbnQscikmJnZlKHllKHIsXCJzY3JpcHRcIikpLHIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKSk7cmV0dXJuIGV9dy5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShOZSxcIjwkMT48LyQyPlwiKX0sY2xvbmU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5jbG9uZU5vZGUoITApLHU9dy5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSk7aWYoIShoLm5vQ2xvbmVDaGVja2VkfHwxIT09ZS5ub2RlVHlwZSYmMTEhPT1lLm5vZGVUeXBlfHx3LmlzWE1MRG9jKGUpKSlmb3IoYT15ZShzKSxyPTAsaT0obz15ZShlKSkubGVuZ3RoO3I8aTtyKyspTWUob1tyXSxhW3JdKTtpZih0KWlmKG4pZm9yKG89b3x8eWUoZSksYT1hfHx5ZShzKSxyPTAsaT1vLmxlbmd0aDtyPGk7cisrKVBlKG9bcl0sYVtyXSk7ZWxzZSBQZShlLHMpO3JldHVybihhPXllKHMsXCJzY3JpcHRcIikpLmxlbmd0aD4wJiZ2ZShhLCF1JiZ5ZShlLFwic2NyaXB0XCIpKSxzfSxjbGVhbkRhdGE6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scixpPXcuZXZlbnQuc3BlY2lhbCxvPTA7dm9pZCAwIT09KG49ZVtvXSk7bysrKWlmKFkobikpe2lmKHQ9bltKLmV4cGFuZG9dKXtpZih0LmV2ZW50cylmb3IociBpbiB0LmV2ZW50cylpW3JdP3cuZXZlbnQucmVtb3ZlKG4scik6dy5yZW1vdmVFdmVudChuLHIsdC5oYW5kbGUpO25bSi5leHBhbmRvXT12b2lkIDB9bltLLmV4cGFuZG9dJiYobltLLmV4cGFuZG9dPXZvaWQgMCl9fX0pLHcuZm4uZXh0ZW5kKHtkZXRhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIEllKHRoaXMsZSwhMCl9LHJlbW92ZTpmdW5jdGlvbihlKXtyZXR1cm4gSWUodGhpcyxlKX0sdGV4dDpmdW5jdGlvbihlKXtyZXR1cm4geih0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3cudGV4dCh0aGlzKTp0aGlzLmVtcHR5KCkuZWFjaChmdW5jdGlvbigpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHwodGhpcy50ZXh0Q29udGVudD1lKX0pfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8TGUodGhpcyxlKS5hcHBlbmRDaGlsZChlKX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIFJlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgdD1MZSh0aGlzLGUpO3QuaW5zZXJ0QmVmb3JlKGUsdC5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIFJlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIFJlKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMubmV4dFNpYmxpbmcpfSl9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9MDtudWxsIT0oZT10aGlzW3RdKTt0KyspMT09PWUubm9kZVR5cGUmJih3LmNsZWFuRGF0YSh5ZShlLCExKSksZS50ZXh0Q29udGVudD1cIlwiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1udWxsIT1lJiZlLHQ9bnVsbD09dD9lOnQsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdy5jbG9uZSh0aGlzLGUsdCl9KX0saHRtbDpmdW5jdGlvbihlKXtyZXR1cm4geih0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWUmJjE9PT10Lm5vZGVUeXBlKXJldHVybiB0LmlubmVySFRNTDtpZihcInN0cmluZ1wiPT10eXBlb2YgZSYmIUFlLnRlc3QoZSkmJiFnZVsoZGUuZXhlYyhlKXx8W1wiXCIsXCJcIl0pWzFdLnRvTG93ZXJDYXNlKCldKXtlPXcuaHRtbFByZWZpbHRlcihlKTt0cnl7Zm9yKDtuPHI7bisrKTE9PT0odD10aGlzW25dfHx7fSkubm9kZVR5cGUmJih3LmNsZWFuRGF0YSh5ZSh0LCExKSksdC5pbm5lckhUTUw9ZSk7dD0wfWNhdGNoKGUpe319dCYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBSZSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXt2YXIgbj10aGlzLnBhcmVudE5vZGU7dy5pbkFycmF5KHRoaXMsZSk8MCYmKHcuY2xlYW5EYXRhKHllKHRoaXMpKSxuJiZuLnJlcGxhY2VDaGlsZCh0LHRoaXMpKX0sZSl9fSksdy5lYWNoKHthcHBlbmRUbzpcImFwcGVuZFwiLHByZXBlbmRUbzpcInByZXBlbmRcIixpbnNlcnRCZWZvcmU6XCJiZWZvcmVcIixpbnNlcnRBZnRlcjpcImFmdGVyXCIscmVwbGFjZUFsbDpcInJlcGxhY2VXaXRoXCJ9LGZ1bmN0aW9uKGUsdCl7dy5mbltlXT1mdW5jdGlvbihlKXtmb3IodmFyIG4scj1bXSxpPXcoZSksbz1pLmxlbmd0aC0xLGE9MDthPD1vO2ErKyluPWE9PT1vP3RoaXM6dGhpcy5jbG9uZSghMCksdyhpW2FdKVt0XShuKSxzLmFwcGx5KHIsbi5nZXQoKSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHIpfX0pO3ZhciBXZT1uZXcgUmVnRXhwKFwiXihcIityZStcIikoPyFweClbYS16JV0rJFwiLFwiaVwiKSwkZT1mdW5jdGlvbih0KXt2YXIgbj10Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7cmV0dXJuIG4mJm4ub3BlbmVyfHwobj1lKSxuLmdldENvbXB1dGVkU3R5bGUodCl9LEJlPW5ldyBSZWdFeHAob2Uuam9pbihcInxcIiksXCJpXCIpOyFmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtpZihjKXtsLnN0eWxlLmNzc1RleHQ9XCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMTExMXB4O3dpZHRoOjYwcHg7bWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowXCIsYy5zdHlsZS5jc3NUZXh0PVwicG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJVwiLGJlLmFwcGVuZENoaWxkKGwpLmFwcGVuZENoaWxkKGMpO3ZhciB0PWUuZ2V0Q29tcHV0ZWRTdHlsZShjKTtpPVwiMSVcIiE9PXQudG9wLHU9MTI9PT1uKHQubWFyZ2luTGVmdCksYy5zdHlsZS5yaWdodD1cIjYwJVwiLHM9MzY9PT1uKHQucmlnaHQpLG89MzY9PT1uKHQud2lkdGgpLGMuc3R5bGUucG9zaXRpb249XCJhYnNvbHV0ZVwiLGE9MzY9PT1jLm9mZnNldFdpZHRofHxcImFic29sdXRlXCIsYmUucmVtb3ZlQ2hpbGQobCksYz1udWxsfX1mdW5jdGlvbiBuKGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciBpLG8sYSxzLHUsbD1yLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksYz1yLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Yy5zdHlsZSYmKGMuc3R5bGUuYmFja2dyb3VuZENsaXA9XCJjb250ZW50LWJveFwiLGMuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD1cIlwiLGguY2xlYXJDbG9uZVN0eWxlPVwiY29udGVudC1ib3hcIj09PWMuc3R5bGUuYmFja2dyb3VuZENsaXAsdy5leHRlbmQoaCx7Ym94U2l6aW5nUmVsaWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLG99LHBpeGVsQm94U3R5bGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxzfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxpfSxyZWxpYWJsZU1hcmdpbkxlZnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLHV9LHNjcm9sbGJveFNpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLGF9fSkpfSgpO2Z1bmN0aW9uIEZlKGUsdCxuKXt2YXIgcixpLG8sYSxzPWUuc3R5bGU7cmV0dXJuKG49bnx8JGUoZSkpJiYoXCJcIiE9PShhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSl8fHcuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHwoYT13LnN0eWxlKGUsdCkpLCFoLnBpeGVsQm94U3R5bGVzKCkmJldlLnRlc3QoYSkmJkJlLnRlc3QodCkmJihyPXMud2lkdGgsaT1zLm1pbldpZHRoLG89cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1pLHMubWF4V2lkdGg9bykpLHZvaWQgMCE9PWE/YStcIlwiOmF9ZnVuY3Rpb24gX2UoZSx0KXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7aWYoIWUoKSlyZXR1cm4odGhpcy5nZXQ9dCkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2RlbGV0ZSB0aGlzLmdldH19fXZhciB6ZT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sWGU9L14tLS8sVWU9e3Bvc2l0aW9uOlwiYWJzb2x1dGVcIix2aXNpYmlsaXR5OlwiaGlkZGVuXCIsZGlzcGxheTpcImJsb2NrXCJ9LFZlPXtsZXR0ZXJTcGFjaW5nOlwiMFwiLGZvbnRXZWlnaHQ6XCI0MDBcIn0sR2U9W1wiV2Via2l0XCIsXCJNb3pcIixcIm1zXCJdLFllPXIuY3JlYXRlRWxlbWVudChcImRpdlwiKS5zdHlsZTtmdW5jdGlvbiBRZShlKXtpZihlIGluIFllKXJldHVybiBlO3ZhciB0PWVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLG49R2UubGVuZ3RoO3doaWxlKG4tLSlpZigoZT1HZVtuXSt0KWluIFllKXJldHVybiBlfWZ1bmN0aW9uIEplKGUpe3ZhciB0PXcuY3NzUHJvcHNbZV07cmV0dXJuIHR8fCh0PXcuY3NzUHJvcHNbZV09UWUoZSl8fGUpLHR9ZnVuY3Rpb24gS2UoZSx0LG4pe3ZhciByPWllLmV4ZWModCk7cmV0dXJuIHI/TWF0aC5tYXgoMCxyWzJdLShufHwwKSkrKHJbM118fFwicHhcIik6dH1mdW5jdGlvbiBaZShlLHQsbixyLGksbyl7dmFyIGE9XCJ3aWR0aFwiPT09dD8xOjAscz0wLHU9MDtpZihuPT09KHI/XCJib3JkZXJcIjpcImNvbnRlbnRcIikpcmV0dXJuIDA7Zm9yKDthPDQ7YSs9MilcIm1hcmdpblwiPT09biYmKHUrPXcuY3NzKGUsbitvZVthXSwhMCxpKSkscj8oXCJjb250ZW50XCI9PT1uJiYodS09dy5jc3MoZSxcInBhZGRpbmdcIitvZVthXSwhMCxpKSksXCJtYXJnaW5cIiE9PW4mJih1LT13LmNzcyhlLFwiYm9yZGVyXCIrb2VbYV0rXCJXaWR0aFwiLCEwLGkpKSk6KHUrPXcuY3NzKGUsXCJwYWRkaW5nXCIrb2VbYV0sITAsaSksXCJwYWRkaW5nXCIhPT1uP3UrPXcuY3NzKGUsXCJib3JkZXJcIitvZVthXStcIldpZHRoXCIsITAsaSk6cys9dy5jc3MoZSxcImJvcmRlclwiK29lW2FdK1wiV2lkdGhcIiwhMCxpKSk7cmV0dXJuIXImJm8+PTAmJih1Kz1NYXRoLm1heCgwLE1hdGguY2VpbChlW1wib2Zmc2V0XCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLW8tdS1zLS41KSkpLHV9ZnVuY3Rpb24gZXQoZSx0LG4pe3ZhciByPSRlKGUpLGk9RmUoZSx0LHIpLG89XCJib3JkZXItYm94XCI9PT13LmNzcyhlLFwiYm94U2l6aW5nXCIsITEsciksYT1vO2lmKFdlLnRlc3QoaSkpe2lmKCFuKXJldHVybiBpO2k9XCJhdXRvXCJ9cmV0dXJuIGE9YSYmKGguYm94U2l6aW5nUmVsaWFibGUoKXx8aT09PWUuc3R5bGVbdF0pLChcImF1dG9cIj09PWl8fCFwYXJzZUZsb2F0KGkpJiZcImlubGluZVwiPT09dy5jc3MoZSxcImRpc3BsYXlcIiwhMSxyKSkmJihpPWVbXCJvZmZzZXRcIit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0sYT0hMCksKGk9cGFyc2VGbG9hdChpKXx8MCkrWmUoZSx0LG58fChvP1wiYm9yZGVyXCI6XCJjb250ZW50XCIpLGEscixpKStcInB4XCJ9dy5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj1GZShlLFwib3BhY2l0eVwiKTtyZXR1cm5cIlwiPT09bj9cIjFcIjpufX19fSxjc3NOdW1iZXI6e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGNvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZsZXhHcm93OiEwLGZsZXhTaHJpbms6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUmJjMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmZS5zdHlsZSl7dmFyIGksbyxhLHM9Ryh0KSx1PVhlLnRlc3QodCksbD1lLnN0eWxlO2lmKHV8fCh0PUplKHMpKSxhPXcuY3NzSG9va3NbdF18fHcuY3NzSG9va3Nbc10sdm9pZCAwPT09bilyZXR1cm4gYSYmXCJnZXRcImluIGEmJnZvaWQgMCE9PShpPWEuZ2V0KGUsITEscikpP2k6bFt0XTtcInN0cmluZ1wiPT0obz10eXBlb2YgbikmJihpPWllLmV4ZWMobikpJiZpWzFdJiYobj11ZShlLHQsaSksbz1cIm51bWJlclwiKSxudWxsIT1uJiZuPT09biYmKFwibnVtYmVyXCI9PT1vJiYobis9aSYmaVszXXx8KHcuY3NzTnVtYmVyW3NdP1wiXCI6XCJweFwiKSksaC5jbGVhckNsb25lU3R5bGV8fFwiXCIhPT1ufHwwIT09dC5pbmRleE9mKFwiYmFja2dyb3VuZFwiKXx8KGxbdF09XCJpbmhlcml0XCIpLGEmJlwic2V0XCJpbiBhJiZ2b2lkIDA9PT0obj1hLnNldChlLG4scikpfHwodT9sLnNldFByb3BlcnR5KHQsbik6bFt0XT1uKSl9fSxjc3M6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxhLHM9Ryh0KTtyZXR1cm4gWGUudGVzdCh0KXx8KHQ9SmUocykpLChhPXcuY3NzSG9va3NbdF18fHcuY3NzSG9va3Nbc10pJiZcImdldFwiaW4gYSYmKGk9YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09aSYmKGk9RmUoZSx0LHIpKSxcIm5vcm1hbFwiPT09aSYmdCBpbiBWZSYmKGk9VmVbdF0pLFwiXCI9PT1ufHxuPyhvPXBhcnNlRmxvYXQoaSksITA9PT1ufHxpc0Zpbml0ZShvKT9vfHwwOmkpOml9fSksdy5lYWNoKFtcImhlaWdodFwiLFwid2lkdGhcIl0sZnVuY3Rpb24oZSx0KXt3LmNzc0hvb2tzW3RdPXtnZXQ6ZnVuY3Rpb24oZSxuLHIpe2lmKG4pcmV0dXJuIXplLnRlc3Qody5jc3MoZSxcImRpc3BsYXlcIikpfHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiZlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoP2V0KGUsdCxyKTpzZShlLFVlLGZ1bmN0aW9uKCl7cmV0dXJuIGV0KGUsdCxyKX0pfSxzZXQ6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG89JGUoZSksYT1cImJvcmRlci1ib3hcIj09PXcuY3NzKGUsXCJib3hTaXppbmdcIiwhMSxvKSxzPXImJlplKGUsdCxyLGEsbyk7cmV0dXJuIGEmJmguc2Nyb2xsYm94U2l6ZSgpPT09by5wb3NpdGlvbiYmKHMtPU1hdGguY2VpbChlW1wib2Zmc2V0XCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLXBhcnNlRmxvYXQob1t0XSktWmUoZSx0LFwiYm9yZGVyXCIsITEsbyktLjUpKSxzJiYoaT1pZS5leGVjKG4pKSYmXCJweFwiIT09KGlbM118fFwicHhcIikmJihlLnN0eWxlW3RdPW4sbj13LmNzcyhlLHQpKSxLZShlLG4scyl9fX0pLHcuY3NzSG9va3MubWFyZ2luTGVmdD1fZShoLnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuKHBhcnNlRmxvYXQoRmUoZSxcIm1hcmdpbkxlZnRcIikpfHxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtc2UoZSx7bWFyZ2luTGVmdDowfSxmdW5jdGlvbigpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnR9KSkrXCJweFwifSksdy5lYWNoKHttYXJnaW46XCJcIixwYWRkaW5nOlwiXCIsYm9yZGVyOlwiV2lkdGhcIn0sZnVuY3Rpb24oZSx0KXt3LmNzc0hvb2tzW2UrdF09e2V4cGFuZDpmdW5jdGlvbihuKXtmb3IodmFyIHI9MCxpPXt9LG89XCJzdHJpbmdcIj09dHlwZW9mIG4/bi5zcGxpdChcIiBcIik6W25dO3I8NDtyKyspaVtlK29lW3JdK3RdPW9bcl18fG9bci0yXXx8b1swXTtyZXR1cm4gaX19LFwibWFyZ2luXCIhPT1lJiYody5jc3NIb29rc1tlK3RdLnNldD1LZSl9KSx3LmZuLmV4dGVuZCh7Y3NzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHoodGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPXt9LGE9MDtpZihBcnJheS5pc0FycmF5KHQpKXtmb3Iocj0kZShlKSxpPXQubGVuZ3RoO2E8aTthKyspb1t0W2FdXT13LmNzcyhlLHRbYV0sITEscik7cmV0dXJuIG99cmV0dXJuIHZvaWQgMCE9PW4/dy5zdHlsZShlLHQsbik6dy5jc3MoZSx0KX0sZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9fSk7ZnVuY3Rpb24gdHQoZSx0LG4scixpKXtyZXR1cm4gbmV3IHR0LnByb3RvdHlwZS5pbml0KGUsdCxuLHIsaSl9dy5Ud2Vlbj10dCx0dC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnR0LGluaXQ6ZnVuY3Rpb24oZSx0LG4scixpLG8pe3RoaXMuZWxlbT1lLHRoaXMucHJvcD1uLHRoaXMuZWFzaW5nPWl8fHcuZWFzaW5nLl9kZWZhdWx0LHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1vfHwody5jc3NOdW1iZXJbbl0/XCJcIjpcInB4XCIpfSxjdXI6ZnVuY3Rpb24oKXt2YXIgZT10dC5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gZSYmZS5nZXQ/ZS5nZXQodGhpcyk6dHQucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49dHQucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHRoaXMub3B0aW9ucy5kdXJhdGlvbj90aGlzLnBvcz10PXcuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTp0dC5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSx0dC5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9dHQucHJvdG90eXBlLHR0LnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gMSE9PWUuZWxlbS5ub2RlVHlwZXx8bnVsbCE9ZS5lbGVtW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtlLnByb3BdP2UuZWxlbVtlLnByb3BdOih0PXcuY3NzKGUuZWxlbSxlLnByb3AsXCJcIikpJiZcImF1dG9cIiE9PXQ/dDowfSxzZXQ6ZnVuY3Rpb24oZSl7dy5meC5zdGVwW2UucHJvcF0/dy5meC5zdGVwW2UucHJvcF0oZSk6MSE9PWUuZWxlbS5ub2RlVHlwZXx8bnVsbD09ZS5lbGVtLnN0eWxlW3cuY3NzUHJvcHNbZS5wcm9wXV0mJiF3LmNzc0hvb2tzW2UucHJvcF0/ZS5lbGVtW2UucHJvcF09ZS5ub3c6dy5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCl9fX0sdHQucHJvcEhvb2tzLnNjcm9sbFRvcD10dC5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSx3LmVhc2luZz17bGluZWFyOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxzd2luZzpmdW5jdGlvbihlKXtyZXR1cm4uNS1NYXRoLmNvcyhlKk1hdGguUEkpLzJ9LF9kZWZhdWx0Olwic3dpbmdcIn0sdy5meD10dC5wcm90b3R5cGUuaW5pdCx3LmZ4LnN0ZXA9e307dmFyIG50LHJ0LGl0PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxvdD0vcXVldWVIb29rcyQvO2Z1bmN0aW9uIGF0KCl7cnQmJighMT09PXIuaGlkZGVuJiZlLnJlcXVlc3RBbmltYXRpb25GcmFtZT9lLnJlcXVlc3RBbmltYXRpb25GcmFtZShhdCk6ZS5zZXRUaW1lb3V0KGF0LHcuZnguaW50ZXJ2YWwpLHcuZngudGljaygpKX1mdW5jdGlvbiBzdCgpe3JldHVybiBlLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtudD12b2lkIDB9KSxudD1EYXRlLm5vdygpfWZ1bmN0aW9uIHV0KGUsdCl7dmFyIG4scj0wLGk9e2hlaWdodDplfTtmb3IodD10PzE6MDtyPDQ7cis9Mi10KWlbXCJtYXJnaW5cIisobj1vZVtyXSldPWlbXCJwYWRkaW5nXCIrbl09ZTtyZXR1cm4gdCYmKGkub3BhY2l0eT1pLndpZHRoPWUpLGl9ZnVuY3Rpb24gbHQoZSx0LG4pe2Zvcih2YXIgcixpPShwdC50d2VlbmVyc1t0XXx8W10pLmNvbmNhdChwdC50d2VlbmVyc1tcIipcIl0pLG89MCxhPWkubGVuZ3RoO288YTtvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGN0KGUsdCxuKXt2YXIgcixpLG8sYSxzLHUsbCxjLGY9XCJ3aWR0aFwiaW4gdHx8XCJoZWlnaHRcImluIHQscD10aGlzLGQ9e30saD1lLnN0eWxlLGc9ZS5ub2RlVHlwZSYmYWUoZSkseT1KLmdldChlLFwiZnhzaG93XCIpO24ucXVldWV8fChudWxsPT0oYT13Ll9xdWV1ZUhvb2tzKGUsXCJmeFwiKSkudW5xdWV1ZWQmJihhLnVucXVldWVkPTAscz1hLmVtcHR5LmZpcmUsYS5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7YS51bnF1ZXVlZHx8cygpfSksYS51bnF1ZXVlZCsrLHAuYWx3YXlzKGZ1bmN0aW9uKCl7cC5hbHdheXMoZnVuY3Rpb24oKXthLnVucXVldWVkLS0sdy5xdWV1ZShlLFwiZnhcIikubGVuZ3RofHxhLmVtcHR5LmZpcmUoKX0pfSkpO2ZvcihyIGluIHQpaWYoaT10W3JdLGl0LnRlc3QoaSkpe2lmKGRlbGV0ZSB0W3JdLG89b3x8XCJ0b2dnbGVcIj09PWksaT09PShnP1wiaGlkZVwiOlwic2hvd1wiKSl7aWYoXCJzaG93XCIhPT1pfHwheXx8dm9pZCAwPT09eVtyXSljb250aW51ZTtnPSEwfWRbcl09eSYmeVtyXXx8dy5zdHlsZShlLHIpfWlmKCh1PSF3LmlzRW1wdHlPYmplY3QodCkpfHwhdy5pc0VtcHR5T2JqZWN0KGQpKXtmJiYxPT09ZS5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2gub3ZlcmZsb3csaC5vdmVyZmxvd1gsaC5vdmVyZmxvd1ldLG51bGw9PShsPXkmJnkuZGlzcGxheSkmJihsPUouZ2V0KGUsXCJkaXNwbGF5XCIpKSxcIm5vbmVcIj09PShjPXcuY3NzKGUsXCJkaXNwbGF5XCIpKSYmKGw/Yz1sOihmZShbZV0sITApLGw9ZS5zdHlsZS5kaXNwbGF5fHxsLGM9dy5jc3MoZSxcImRpc3BsYXlcIiksZmUoW2VdKSkpLChcImlubGluZVwiPT09Y3x8XCJpbmxpbmUtYmxvY2tcIj09PWMmJm51bGwhPWwpJiZcIm5vbmVcIj09PXcuY3NzKGUsXCJmbG9hdFwiKSYmKHV8fChwLmRvbmUoZnVuY3Rpb24oKXtoLmRpc3BsYXk9bH0pLG51bGw9PWwmJihjPWguZGlzcGxheSxsPVwibm9uZVwiPT09Yz9cIlwiOmMpKSxoLmRpc3BsYXk9XCJpbmxpbmUtYmxvY2tcIikpLG4ub3ZlcmZsb3cmJihoLm92ZXJmbG93PVwiaGlkZGVuXCIscC5hbHdheXMoZnVuY3Rpb24oKXtoLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0saC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxoLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpLHU9ITE7Zm9yKHIgaW4gZCl1fHwoeT9cImhpZGRlblwiaW4geSYmKGc9eS5oaWRkZW4pOnk9Si5hY2Nlc3MoZSxcImZ4c2hvd1wiLHtkaXNwbGF5Omx9KSxvJiYoeS5oaWRkZW49IWcpLGcmJmZlKFtlXSwhMCkscC5kb25lKGZ1bmN0aW9uKCl7Z3x8ZmUoW2VdKSxKLnJlbW92ZShlLFwiZnhzaG93XCIpO2ZvcihyIGluIGQpdy5zdHlsZShlLHIsZFtyXSl9KSksdT1sdChnP3lbcl06MCxyLHApLHIgaW4geXx8KHlbcl09dS5zdGFydCxnJiYodS5lbmQ9dS5zdGFydCx1LnN0YXJ0PTApKX19ZnVuY3Rpb24gZnQoZSx0KXt2YXIgbixyLGksbyxhO2ZvcihuIGluIGUpaWYocj1HKG4pLGk9dFtyXSxvPWVbbl0sQXJyYXkuaXNBcnJheShvKSYmKGk9b1sxXSxvPWVbbl09b1swXSksbiE9PXImJihlW3JdPW8sZGVsZXRlIGVbbl0pLChhPXcuY3NzSG9va3Nbcl0pJiZcImV4cGFuZFwiaW4gYSl7bz1hLmV4cGFuZChvKSxkZWxldGUgZVtyXTtmb3IobiBpbiBvKW4gaW4gZXx8KGVbbl09b1tuXSx0W25dPWkpfWVsc2UgdFtyXT1pfWZ1bmN0aW9uIHB0KGUsdCxuKXt2YXIgcixpLG89MCxhPXB0LnByZWZpbHRlcnMubGVuZ3RoLHM9dy5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSB1LmVsZW19KSx1PWZ1bmN0aW9uKCl7aWYoaSlyZXR1cm4hMTtmb3IodmFyIHQ9bnR8fHN0KCksbj1NYXRoLm1heCgwLGwuc3RhcnRUaW1lK2wuZHVyYXRpb24tdCkscj0xLShuL2wuZHVyYXRpb258fDApLG89MCxhPWwudHdlZW5zLmxlbmd0aDtvPGE7bysrKWwudHdlZW5zW29dLnJ1bihyKTtyZXR1cm4gcy5ub3RpZnlXaXRoKGUsW2wscixuXSkscjwxJiZhP246KGF8fHMubm90aWZ5V2l0aChlLFtsLDEsMF0pLHMucmVzb2x2ZVdpdGgoZSxbbF0pLCExKX0sbD1zLnByb21pc2Uoe2VsZW06ZSxwcm9wczp3LmV4dGVuZCh7fSx0KSxvcHRzOncuZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9LGVhc2luZzp3LmVhc2luZy5fZGVmYXVsdH0sbiksb3JpZ2luYWxQcm9wZXJ0aWVzOnQsb3JpZ2luYWxPcHRpb25zOm4sc3RhcnRUaW1lOm50fHxzdCgpLGR1cmF0aW9uOm4uZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKHQsbil7dmFyIHI9dy5Ud2VlbihlLGwub3B0cyx0LG4sbC5vcHRzLnNwZWNpYWxFYXNpbmdbdF18fGwub3B0cy5lYXNpbmcpO3JldHVybiBsLnR3ZWVucy5wdXNoKHIpLHJ9LHN0b3A6ZnVuY3Rpb24odCl7dmFyIG49MCxyPXQ/bC50d2VlbnMubGVuZ3RoOjA7aWYoaSlyZXR1cm4gdGhpcztmb3IoaT0hMDtuPHI7bisrKWwudHdlZW5zW25dLnJ1bigxKTtyZXR1cm4gdD8ocy5ub3RpZnlXaXRoKGUsW2wsMSwwXSkscy5yZXNvbHZlV2l0aChlLFtsLHRdKSk6cy5yZWplY3RXaXRoKGUsW2wsdF0pLHRoaXN9fSksYz1sLnByb3BzO2ZvcihmdChjLGwub3B0cy5zcGVjaWFsRWFzaW5nKTtvPGE7bysrKWlmKHI9cHQucHJlZmlsdGVyc1tvXS5jYWxsKGwsZSxjLGwub3B0cykpcmV0dXJuIGcoci5zdG9wKSYmKHcuX3F1ZXVlSG9va3MobC5lbGVtLGwub3B0cy5xdWV1ZSkuc3RvcD1yLnN0b3AuYmluZChyKSkscjtyZXR1cm4gdy5tYXAoYyxsdCxsKSxnKGwub3B0cy5zdGFydCkmJmwub3B0cy5zdGFydC5jYWxsKGUsbCksbC5wcm9ncmVzcyhsLm9wdHMucHJvZ3Jlc3MpLmRvbmUobC5vcHRzLmRvbmUsbC5vcHRzLmNvbXBsZXRlKS5mYWlsKGwub3B0cy5mYWlsKS5hbHdheXMobC5vcHRzLmFsd2F5cyksdy5meC50aW1lcih3LmV4dGVuZCh1LHtlbGVtOmUsYW5pbTpsLHF1ZXVlOmwub3B0cy5xdWV1ZX0pKSxsfXcuQW5pbWF0aW9uPXcuZXh0ZW5kKHB0LHt0d2VlbmVyczp7XCIqXCI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpO3JldHVybiB1ZShuLmVsZW0sZSxpZS5leGVjKHQpLG4pLG59XX0sdHdlZW5lcjpmdW5jdGlvbihlLHQpe2coZSk/KHQ9ZSxlPVtcIipcIl0pOmU9ZS5tYXRjaChNKTtmb3IodmFyIG4scj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluPWVbcl0scHQudHdlZW5lcnNbbl09cHQudHdlZW5lcnNbbl18fFtdLHB0LnR3ZWVuZXJzW25dLnVuc2hpZnQodCl9LHByZWZpbHRlcnM6W2N0XSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P3B0LnByZWZpbHRlcnMudW5zaGlmdChlKTpwdC5wcmVmaWx0ZXJzLnB1c2goZSl9fSksdy5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmXCJvYmplY3RcIj09dHlwZW9mIGU/dy5leHRlbmQoe30sZSk6e2NvbXBsZXRlOm58fCFuJiZ0fHxnKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiFnKHQpJiZ0fTtyZXR1cm4gdy5meC5vZmY/ci5kdXJhdGlvbj0wOlwibnVtYmVyXCIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiB3LmZ4LnNwZWVkcz9yLmR1cmF0aW9uPXcuZnguc3BlZWRzW3IuZHVyYXRpb25dOnIuZHVyYXRpb249dy5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9XCJmeFwiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXtnKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZ3LmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sdy5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoYWUpLmNzcyhcIm9wYWNpdHlcIiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTp0fSxlLG4scil9LGFuaW1hdGU6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dy5pc0VtcHR5T2JqZWN0KGUpLG89dy5zcGVlZCh0LG4sciksYT1mdW5jdGlvbigpe3ZhciB0PXB0KHRoaXMsdy5leHRlbmQoe30sZSksbyk7KGl8fEouZ2V0KHRoaXMsXCJmaW5pc2hcIikpJiZ0LnN0b3AoITApfTtyZXR1cm4gYS5maW5pc2g9YSxpfHwhMT09PW8ucXVldWU/dGhpcy5lYWNoKGEpOnRoaXMucXVldWUoby5xdWV1ZSxhKX0sc3RvcDpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChuKX07cmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIGUmJihuPXQsdD1lLGU9dm9pZCAwKSx0JiYhMSE9PWUmJnRoaXMucXVldWUoZXx8XCJmeFwiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD0hMCxpPW51bGwhPWUmJmUrXCJxdWV1ZUhvb2tzXCIsbz13LnRpbWVycyxhPUouZ2V0KHRoaXMpO2lmKGkpYVtpXSYmYVtpXS5zdG9wJiZyKGFbaV0pO2Vsc2UgZm9yKGkgaW4gYSlhW2ldJiZhW2ldLnN0b3AmJm90LnRlc3QoaSkmJnIoYVtpXSk7Zm9yKGk9by5sZW5ndGg7aS0tOylvW2ldLmVsZW0hPT10aGlzfHxudWxsIT1lJiZvW2ldLnF1ZXVlIT09ZXx8KG9baV0uYW5pbS5zdG9wKG4pLHQ9ITEsby5zcGxpY2UoaSwxKSk7IXQmJm58fHcuZGVxdWV1ZSh0aGlzLGUpfSl9LGZpbmlzaDpmdW5jdGlvbihlKXtyZXR1cm4hMSE9PWUmJihlPWV8fFwiZnhcIiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQsbj1KLmdldCh0aGlzKSxyPW5bZStcInF1ZXVlXCJdLGk9bltlK1wicXVldWVIb29rc1wiXSxvPXcudGltZXJzLGE9cj9yLmxlbmd0aDowO2ZvcihuLmZpbmlzaD0hMCx3LnF1ZXVlKHRoaXMsZSxbXSksaSYmaS5zdG9wJiZpLnN0b3AuY2FsbCh0aGlzLCEwKSx0PW8ubGVuZ3RoO3QtLTspb1t0XS5lbGVtPT09dGhpcyYmb1t0XS5xdWV1ZT09PWUmJihvW3RdLmFuaW0uc3RvcCghMCksby5zcGxpY2UodCwxKSk7Zm9yKHQ9MDt0PGE7dCsrKXJbdF0mJnJbdF0uZmluaXNoJiZyW3RdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBuLmZpbmlzaH0pfX0pLHcuZWFjaChbXCJ0b2dnbGVcIixcInNob3dcIixcImhpZGVcIl0sZnVuY3Rpb24oZSx0KXt2YXIgbj13LmZuW3RdO3cuZm5bdF09ZnVuY3Rpb24oZSxyLGkpe3JldHVybiBudWxsPT1lfHxcImJvb2xlYW5cIj09dHlwZW9mIGU/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKHV0KHQsITApLGUscixpKX19KSx3LmVhY2goe3NsaWRlRG93bjp1dChcInNob3dcIiksc2xpZGVVcDp1dChcImhpZGVcIiksc2xpZGVUb2dnbGU6dXQoXCJ0b2dnbGVcIiksZmFkZUluOntvcGFjaXR5Olwic2hvd1wifSxmYWRlT3V0OntvcGFjaXR5OlwiaGlkZVwifSxmYWRlVG9nZ2xlOntvcGFjaXR5OlwidG9nZ2xlXCJ9fSxmdW5jdGlvbihlLHQpe3cuZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSksdy50aW1lcnM9W10sdy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsdD0wLG49dy50aW1lcnM7Zm9yKG50PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8dy5meC5zdG9wKCksbnQ9dm9pZCAwfSx3LmZ4LnRpbWVyPWZ1bmN0aW9uKGUpe3cudGltZXJzLnB1c2goZSksdy5meC5zdGFydCgpfSx3LmZ4LmludGVydmFsPTEzLHcuZnguc3RhcnQ9ZnVuY3Rpb24oKXtydHx8KHJ0PSEwLGF0KCkpfSx3LmZ4LnN0b3A9ZnVuY3Rpb24oKXtydD1udWxsfSx3LmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSx3LmZuLmRlbGF5PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9dy5meD93LmZ4LnNwZWVkc1t0XXx8dDp0LG49bnx8XCJmeFwiLHRoaXMucXVldWUobixmdW5jdGlvbihuLHIpe3ZhciBpPWUuc2V0VGltZW91dChuLHQpO3Iuc3RvcD1mdW5jdGlvbigpe2UuY2xlYXJUaW1lb3V0KGkpfX0pfSxmdW5jdGlvbigpe3ZhciBlPXIuY3JlYXRlRWxlbWVudChcImlucHV0XCIpLHQ9ci5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpLmFwcGVuZENoaWxkKHIuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKSk7ZS50eXBlPVwiY2hlY2tib3hcIixoLmNoZWNrT249XCJcIiE9PWUudmFsdWUsaC5vcHRTZWxlY3RlZD10LnNlbGVjdGVkLChlPXIuY3JlYXRlRWxlbWVudChcImlucHV0XCIpKS52YWx1ZT1cInRcIixlLnR5cGU9XCJyYWRpb1wiLGgucmFkaW9WYWx1ZT1cInRcIj09PWUudmFsdWV9KCk7dmFyIGR0LGh0PXcuZXhwci5hdHRySGFuZGxlO3cuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHoodGhpcyx3LmF0dHIsZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3cucmVtb3ZlQXR0cih0aGlzLGUpfSl9fSksdy5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbz1lLm5vZGVUeXBlO2lmKDMhPT1vJiY4IT09byYmMiE9PW8pcmV0dXJuXCJ1bmRlZmluZWRcIj09dHlwZW9mIGUuZ2V0QXR0cmlidXRlP3cucHJvcChlLHQsbik6KDE9PT1vJiZ3LmlzWE1MRG9jKGUpfHwoaT13LmF0dHJIb29rc1t0LnRvTG93ZXJDYXNlKCldfHwody5leHByLm1hdGNoLmJvb2wudGVzdCh0KT9kdDp2b2lkIDApKSx2b2lkIDAhPT1uP251bGw9PT1uP3ZvaWQgdy5yZW1vdmVBdHRyKGUsdCk6aSYmXCJzZXRcImluIGkmJnZvaWQgMCE9PShyPWkuc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuK1wiXCIpLG4pOmkmJlwiZ2V0XCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjpudWxsPT0ocj13LmZpbmQuYXR0cihlLHQpKT92b2lkIDA6cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIWgucmFkaW9WYWx1ZSYmXCJyYWRpb1wiPT09dCYmTihlLFwiaW5wdXRcIikpe3ZhciBuPWUudmFsdWU7cmV0dXJuIGUuc2V0QXR0cmlidXRlKFwidHlwZVwiLHQpLG4mJihlLnZhbHVlPW4pLHR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsaT10JiZ0Lm1hdGNoKE0pO2lmKGkmJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49aVtyKytdKWUucmVtb3ZlQXR0cmlidXRlKG4pfX0pLGR0PXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExPT09dD93LnJlbW92ZUF0dHIoZSxuKTplLnNldEF0dHJpYnV0ZShuLG4pLG59fSx3LmVhY2gody5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cXHcrL2cpLGZ1bmN0aW9uKGUsdCl7dmFyIG49aHRbdF18fHcuZmluZC5hdHRyO2h0W3RdPWZ1bmN0aW9uKGUsdCxyKXt2YXIgaSxvLGE9dC50b0xvd2VyQ2FzZSgpO3JldHVybiByfHwobz1odFthXSxodFthXT1pLGk9bnVsbCE9bihlLHQscik/YTpudWxsLGh0W2FdPW8pLGl9fSk7dmFyIGd0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2kseXQ9L14oPzphfGFyZWEpJC9pO3cuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHoodGhpcyx3LnByb3AsZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW3cucHJvcEZpeFtlXXx8ZV19KX19KSx3LmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvPWUubm9kZVR5cGU7aWYoMyE9PW8mJjghPT1vJiYyIT09bylyZXR1cm4gMT09PW8mJncuaXNYTUxEb2MoZSl8fCh0PXcucHJvcEZpeFt0XXx8dCxpPXcucHJvcEhvb2tzW3RdKSx2b2lkIDAhPT1uP2kmJlwic2V0XCJpbiBpJiZ2b2lkIDAhPT0ocj1pLnNldChlLG4sdCkpP3I6ZVt0XT1uOmkmJlwiZ2V0XCJpbiBpJiZudWxsIT09KHI9aS5nZXQoZSx0KSk/cjplW3RdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dy5maW5kLmF0dHIoZSxcInRhYmluZGV4XCIpO3JldHVybiB0P3BhcnNlSW50KHQsMTApOmd0LnRlc3QoZS5ub2RlTmFtZSl8fHl0LnRlc3QoZS5ub2RlTmFtZSkmJmUuaHJlZj8wOi0xfX19LHByb3BGaXg6e1wiZm9yXCI6XCJodG1sRm9yXCIsXCJjbGFzc1wiOlwiY2xhc3NOYW1lXCJ9fSksaC5vcHRTZWxlY3RlZHx8KHcucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7dCYmKHQuc2VsZWN0ZWRJbmRleCx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSx3LmVhY2goW1widGFiSW5kZXhcIixcInJlYWRPbmx5XCIsXCJtYXhMZW5ndGhcIixcImNlbGxTcGFjaW5nXCIsXCJjZWxsUGFkZGluZ1wiLFwicm93U3BhblwiLFwiY29sU3BhblwiLFwidXNlTWFwXCIsXCJmcmFtZUJvcmRlclwiLFwiY29udGVudEVkaXRhYmxlXCJdLGZ1bmN0aW9uKCl7dy5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pO2Z1bmN0aW9uIHZ0KGUpe3JldHVybihlLm1hdGNoKE0pfHxbXSkuam9pbihcIiBcIil9ZnVuY3Rpb24gbXQoZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxcIlwifWZ1bmN0aW9uIHh0KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6XCJzdHJpbmdcIj09dHlwZW9mIGU/ZS5tYXRjaChNKXx8W106W119dy5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzLHU9MDtpZihnKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7dyh0aGlzKS5hZGRDbGFzcyhlLmNhbGwodGhpcyx0LG10KHRoaXMpKSl9KTtpZigodD14dChlKSkubGVuZ3RoKXdoaWxlKG49dGhpc1t1KytdKWlmKGk9bXQobikscj0xPT09bi5ub2RlVHlwZSYmXCIgXCIrdnQoaSkrXCIgXCIpe2E9MDt3aGlsZShvPXRbYSsrXSlyLmluZGV4T2YoXCIgXCIrbytcIiBcIik8MCYmKHIrPW8rXCIgXCIpO2khPT0ocz12dChyKSkmJm4uc2V0QXR0cmlidXRlKFwiY2xhc3NcIixzKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhLHMsdT0wO2lmKGcoZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt3KHRoaXMpLnJlbW92ZUNsYXNzKGUuY2FsbCh0aGlzLHQsbXQodGhpcykpKX0pO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmF0dHIoXCJjbGFzc1wiLFwiXCIpO2lmKCh0PXh0KGUpKS5sZW5ndGgpd2hpbGUobj10aGlzW3UrK10paWYoaT1tdChuKSxyPTE9PT1uLm5vZGVUeXBlJiZcIiBcIit2dChpKStcIiBcIil7YT0wO3doaWxlKG89dFthKytdKXdoaWxlKHIuaW5kZXhPZihcIiBcIitvK1wiIFwiKT4tMSlyPXIucmVwbGFjZShcIiBcIitvK1wiIFwiLFwiIFwiKTtpIT09KHM9dnQocikpJiZuLnNldEF0dHJpYnV0ZShcImNsYXNzXCIscyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIGUscj1cInN0cmluZ1wiPT09bnx8QXJyYXkuaXNBcnJheShlKTtyZXR1cm5cImJvb2xlYW5cIj09dHlwZW9mIHQmJnI/dD90aGlzLmFkZENsYXNzKGUpOnRoaXMucmVtb3ZlQ2xhc3MoZSk6ZyhlKT90aGlzLmVhY2goZnVuY3Rpb24obil7dyh0aGlzKS50b2dnbGVDbGFzcyhlLmNhbGwodGhpcyxuLG10KHRoaXMpLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQsaSxvLGE7aWYocil7aT0wLG89dyh0aGlzKSxhPXh0KGUpO3doaWxlKHQ9YVtpKytdKW8uaGFzQ2xhc3ModCk/by5yZW1vdmVDbGFzcyh0KTpvLmFkZENsYXNzKHQpfWVsc2Ugdm9pZCAwIT09ZSYmXCJib29sZWFuXCIhPT1ufHwoKHQ9bXQodGhpcykpJiZKLnNldCh0aGlzLFwiX19jbGFzc05hbWVfX1wiLHQpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsdHx8ITE9PT1lP1wiXCI6Si5nZXQodGhpcyxcIl9fY2xhc3NOYW1lX19cIil8fFwiXCIpKX0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHI9MDt0PVwiIFwiK2UrXCIgXCI7d2hpbGUobj10aGlzW3IrK10paWYoMT09PW4ubm9kZVR5cGUmJihcIiBcIit2dChtdChuKSkrXCIgXCIpLmluZGV4T2YodCk+LTEpcmV0dXJuITA7cmV0dXJuITF9fSk7dmFyIGJ0PS9cXHIvZzt3LmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHI9ZyhlKSx0aGlzLmVhY2goZnVuY3Rpb24obil7dmFyIGk7MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0oaT1yP2UuY2FsbCh0aGlzLG4sdyh0aGlzKS52YWwoKSk6ZSk/aT1cIlwiOlwibnVtYmVyXCI9PXR5cGVvZiBpP2krPVwiXCI6QXJyYXkuaXNBcnJheShpKSYmKGk9dy5tYXAoaSxmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9cIlwiOmUrXCJcIn0pKSwodD13LnZhbEhvb2tzW3RoaXMudHlwZV18fHcudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJlwic2V0XCJpbiB0JiZ2b2lkIDAhPT10LnNldCh0aGlzLGksXCJ2YWx1ZVwiKXx8KHRoaXMudmFsdWU9aSkpfSk7aWYoaSlyZXR1cm4odD13LnZhbEhvb2tzW2kudHlwZV18fHcudmFsSG9va3NbaS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJlwiZ2V0XCJpbiB0JiZ2b2lkIDAhPT0obj10LmdldChpLFwidmFsdWVcIikpP246XCJzdHJpbmdcIj09dHlwZW9mKG49aS52YWx1ZSk/bi5yZXBsYWNlKGJ0LFwiXCIpOm51bGw9PW4/XCJcIjpufX19KSx3LmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXcuZmluZC5hdHRyKGUsXCJ2YWx1ZVwiKTtyZXR1cm4gbnVsbCE9dD90OnZ0KHcudGV4dChlKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT1lLm9wdGlvbnMsbz1lLnNlbGVjdGVkSW5kZXgsYT1cInNlbGVjdC1vbmVcIj09PWUudHlwZSxzPWE/bnVsbDpbXSx1PWE/bysxOmkubGVuZ3RoO2ZvcihyPW88MD91OmE/bzowO3I8dTtyKyspaWYoKChuPWlbcl0pLnNlbGVjdGVkfHxyPT09bykmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IU4obi5wYXJlbnROb2RlLFwib3B0Z3JvdXBcIikpKXtpZih0PXcobikudmFsKCksYSlyZXR1cm4gdDtzLnB1c2godCl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLm9wdGlvbnMsbz13Lm1ha2VBcnJheSh0KSxhPWkubGVuZ3RoO3doaWxlKGEtLSkoKHI9aVthXSkuc2VsZWN0ZWQ9dy5pbkFycmF5KHcudmFsSG9va3Mub3B0aW9uLmdldChyKSxvKT4tMSkmJihuPSEwKTtyZXR1cm4gbnx8KGUuc2VsZWN0ZWRJbmRleD0tMSksb319fX0pLHcuZWFjaChbXCJyYWRpb1wiLFwiY2hlY2tib3hcIl0sZnVuY3Rpb24oKXt3LnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9dy5pbkFycmF5KHcoZSkudmFsKCksdCk+LTF9fSxoLmNoZWNrT258fCh3LnZhbEhvb2tzW3RoaXNdLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWUuZ2V0QXR0cmlidXRlKFwidmFsdWVcIik/XCJvblwiOmUudmFsdWV9KX0pLGguZm9jdXNpbj1cIm9uZm9jdXNpblwiaW4gZTt2YXIgd3Q9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFR0PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O3cuZXh0ZW5kKHcuZXZlbnQse3RyaWdnZXI6ZnVuY3Rpb24odCxuLGksbyl7dmFyIGEscyx1LGwsYyxwLGQsaCx2PVtpfHxyXSxtPWYuY2FsbCh0LFwidHlwZVwiKT90LnR5cGU6dCx4PWYuY2FsbCh0LFwibmFtZXNwYWNlXCIpP3QubmFtZXNwYWNlLnNwbGl0KFwiLlwiKTpbXTtpZihzPWg9dT1pPWl8fHIsMyE9PWkubm9kZVR5cGUmJjghPT1pLm5vZGVUeXBlJiYhd3QudGVzdChtK3cuZXZlbnQudHJpZ2dlcmVkKSYmKG0uaW5kZXhPZihcIi5cIik+LTEmJihtPSh4PW0uc3BsaXQoXCIuXCIpKS5zaGlmdCgpLHguc29ydCgpKSxjPW0uaW5kZXhPZihcIjpcIik8MCYmXCJvblwiK20sdD10W3cuZXhwYW5kb10/dDpuZXcgdy5FdmVudChtLFwib2JqZWN0XCI9PXR5cGVvZiB0JiZ0KSx0LmlzVHJpZ2dlcj1vPzI6Myx0Lm5hbWVzcGFjZT14LmpvaW4oXCIuXCIpLHQucm5hbWVzcGFjZT10Lm5hbWVzcGFjZT9uZXcgUmVnRXhwKFwiKF58XFxcXC4pXCIreC5qb2luKFwiXFxcXC4oPzouKlxcXFwufClcIikrXCIoXFxcXC58JClcIik6bnVsbCx0LnJlc3VsdD12b2lkIDAsdC50YXJnZXR8fCh0LnRhcmdldD1pKSxuPW51bGw9PW4/W3RdOncubWFrZUFycmF5KG4sW3RdKSxkPXcuZXZlbnQuc3BlY2lhbFttXXx8e30sb3x8IWQudHJpZ2dlcnx8ITEhPT1kLnRyaWdnZXIuYXBwbHkoaSxuKSkpe2lmKCFvJiYhZC5ub0J1YmJsZSYmIXkoaSkpe2ZvcihsPWQuZGVsZWdhdGVUeXBlfHxtLHd0LnRlc3QobCttKXx8KHM9cy5wYXJlbnROb2RlKTtzO3M9cy5wYXJlbnROb2RlKXYucHVzaChzKSx1PXM7dT09PShpLm93bmVyRG9jdW1lbnR8fHIpJiZ2LnB1c2godS5kZWZhdWx0Vmlld3x8dS5wYXJlbnRXaW5kb3d8fGUpfWE9MDt3aGlsZSgocz12W2ErK10pJiYhdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWg9cyx0LnR5cGU9YT4xP2w6ZC5iaW5kVHlwZXx8bSwocD0oSi5nZXQocyxcImV2ZW50c1wiKXx8e30pW3QudHlwZV0mJkouZ2V0KHMsXCJoYW5kbGVcIikpJiZwLmFwcGx5KHMsbiksKHA9YyYmc1tjXSkmJnAuYXBwbHkmJlkocykmJih0LnJlc3VsdD1wLmFwcGx5KHMsbiksITE9PT10LnJlc3VsdCYmdC5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm4gdC50eXBlPW0sb3x8dC5pc0RlZmF1bHRQcmV2ZW50ZWQoKXx8ZC5fZGVmYXVsdCYmITEhPT1kLl9kZWZhdWx0LmFwcGx5KHYucG9wKCksbil8fCFZKGkpfHxjJiZnKGlbbV0pJiYheShpKSYmKCh1PWlbY10pJiYoaVtjXT1udWxsKSx3LmV2ZW50LnRyaWdnZXJlZD1tLHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmaC5hZGRFdmVudExpc3RlbmVyKG0sVHQpLGlbbV0oKSx0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmgucmVtb3ZlRXZlbnRMaXN0ZW5lcihtLFR0KSx3LmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsdSYmKGlbY109dSkpLHQucmVzdWx0fX0sc2ltdWxhdGU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXcuZXh0ZW5kKG5ldyB3LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMH0pO3cuZXZlbnQudHJpZ2dlcihyLG51bGwsdCl9fSksdy5mbi5leHRlbmQoe3RyaWdnZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dy5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gdy5ldmVudC50cmlnZ2VyKGUsdCxuLCEwKX19KSxoLmZvY3VzaW58fHcuZWFjaCh7Zm9jdXM6XCJmb2N1c2luXCIsYmx1cjpcImZvY3Vzb3V0XCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIG49ZnVuY3Rpb24oZSl7dy5ldmVudC5zaW11bGF0ZSh0LGUudGFyZ2V0LHcuZXZlbnQuZml4KGUpKX07dy5ldmVudC5zcGVjaWFsW3RdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxpPUouYWNjZXNzKHIsdCk7aXx8ci5hZGRFdmVudExpc3RlbmVyKGUsbiwhMCksSi5hY2Nlc3Mocix0LChpfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgcj10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsaT1KLmFjY2VzcyhyLHQpLTE7aT9KLmFjY2VzcyhyLHQsaSk6KHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4sITApLEoucmVtb3ZlKHIsdCkpfX19KTt2YXIgQ3Q9ZS5sb2NhdGlvbixFdD1EYXRlLm5vdygpLGt0PS9cXD8vO3cucGFyc2VYTUw9ZnVuY3Rpb24odCl7dmFyIG47aWYoIXR8fFwic3RyaW5nXCIhPXR5cGVvZiB0KXJldHVybiBudWxsO3RyeXtuPShuZXcgZS5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyh0LFwidGV4dC94bWxcIil9Y2F0Y2goZSl7bj12b2lkIDB9cmV0dXJuIG4mJiFuLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwicGFyc2VyZXJyb3JcIikubGVuZ3RofHx3LmVycm9yKFwiSW52YWxpZCBYTUw6IFwiK3QpLG59O3ZhciBTdD0vXFxbXFxdJC8sRHQ9L1xccj9cXG4vZyxOdD0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksQXQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIGp0KGUsdCxuLHIpe3ZhciBpO2lmKEFycmF5LmlzQXJyYXkodCkpdy5lYWNoKHQsZnVuY3Rpb24odCxpKXtufHxTdC50ZXN0KGUpP3IoZSxpKTpqdChlK1wiW1wiKyhcIm9iamVjdFwiPT10eXBlb2YgaSYmbnVsbCE9aT90OlwiXCIpK1wiXVwiLGksbixyKX0pO2Vsc2UgaWYobnx8XCJvYmplY3RcIiE9PXgodCkpcihlLHQpO2Vsc2UgZm9yKGkgaW4gdClqdChlK1wiW1wiK2krXCJdXCIsdFtpXSxuLHIpfXcucGFyYW09ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj1nKHQpP3QoKTp0O3Jbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChlKStcIj1cIitlbmNvZGVVUklDb21wb25lbnQobnVsbD09bj9cIlwiOm4pfTtpZihBcnJheS5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIXcuaXNQbGFpbk9iamVjdChlKSl3LmVhY2goZSxmdW5jdGlvbigpe2kodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiBlKWp0KG4sZVtuXSx0LGkpO3JldHVybiByLmpvaW4oXCImXCIpfSx3LmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHcucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT13LnByb3AodGhpcyxcImVsZW1lbnRzXCIpO3JldHVybiBlP3cubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXcodGhpcykuaXMoXCI6ZGlzYWJsZWRcIikmJkF0LnRlc3QodGhpcy5ub2RlTmFtZSkmJiFOdC50ZXN0KGUpJiYodGhpcy5jaGVja2VkfHwhcGUudGVzdChlKSl9KS5tYXAoZnVuY3Rpb24oZSx0KXt2YXIgbj13KHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT93Lm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2UoRHQsXCJcXHJcXG5cIil9fSk6e25hbWU6dC5uYW1lLHZhbHVlOm4ucmVwbGFjZShEdCxcIlxcclxcblwiKX19KS5nZXQoKX19KTt2YXIgcXQ9LyUyMC9nLEx0PS8jLiokLyxIdD0vKFs/Jl0pXz1bXiZdKi8sT3Q9L14oLio/KTpbIFxcdF0qKFteXFxyXFxuXSopJC9nbSxQdD0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxNdD0vXig/OkdFVHxIRUFEKSQvLFJ0PS9eXFwvXFwvLyxJdD17fSxXdD17fSwkdD1cIiovXCIuY29uY2F0KFwiKlwiKSxCdD1yLmNyZWF0ZUVsZW1lbnQoXCJhXCIpO0J0LmhyZWY9Q3QuaHJlZjtmdW5jdGlvbiBGdChlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXtcInN0cmluZ1wiIT10eXBlb2YgdCYmKG49dCx0PVwiKlwiKTt2YXIgcixpPTAsbz10LnRvTG93ZXJDYXNlKCkubWF0Y2goTSl8fFtdO2lmKGcobikpd2hpbGUocj1vW2krK10pXCIrXCI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fFwiKlwiLChlW3JdPWVbcl18fFtdKS51bnNoaWZ0KG4pKTooZVtyXT1lW3JdfHxbXSkucHVzaChuKX19ZnVuY3Rpb24gX3QoZSx0LG4scil7dmFyIGk9e30sbz1lPT09V3Q7ZnVuY3Rpb24gYShzKXt2YXIgdTtyZXR1cm4gaVtzXT0hMCx3LmVhY2goZVtzXXx8W10sZnVuY3Rpb24oZSxzKXt2YXIgbD1zKHQsbixyKTtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgbHx8b3x8aVtsXT9vPyEodT1sKTp2b2lkIDA6KHQuZGF0YVR5cGVzLnVuc2hpZnQobCksYShsKSwhMSl9KSx1fXJldHVybiBhKHQuZGF0YVR5cGVzWzBdKXx8IWlbXCIqXCJdJiZhKFwiKlwiKX1mdW5jdGlvbiB6dChlLHQpe3ZhciBuLHIsaT13LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKG4gaW4gdCl2b2lkIDAhPT10W25dJiYoKGlbbl0/ZTpyfHwocj17fSkpW25dPXRbbl0pO3JldHVybiByJiZ3LmV4dGVuZCghMCxlLHIpLGV9ZnVuY3Rpb24gWHQoZSx0LG4pe3ZhciByLGksbyxhLHM9ZS5jb250ZW50cyx1PWUuZGF0YVR5cGVzO3doaWxlKFwiKlwiPT09dVswXSl1LnNoaWZ0KCksdm9pZCAwPT09ciYmKHI9ZS5taW1lVHlwZXx8dC5nZXRSZXNwb25zZUhlYWRlcihcIkNvbnRlbnQtVHlwZVwiKSk7aWYocilmb3IoaSBpbiBzKWlmKHNbaV0mJnNbaV0udGVzdChyKSl7dS51bnNoaWZ0KGkpO2JyZWFrfWlmKHVbMF1pbiBuKW89dVswXTtlbHNle2ZvcihpIGluIG4pe2lmKCF1WzBdfHxlLmNvbnZlcnRlcnNbaStcIiBcIit1WzBdXSl7bz1pO2JyZWFrfWF8fChhPWkpfW89b3x8YX1pZihvKXJldHVybiBvIT09dVswXSYmdS51bnNoaWZ0KG8pLG5bb119ZnVuY3Rpb24gVXQoZSx0LG4scil7dmFyIGksbyxhLHMsdSxsPXt9LGM9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihjWzFdKWZvcihhIGluIGUuY29udmVydGVycylsW2EudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW2FdO289Yy5zaGlmdCgpO3doaWxlKG8paWYoZS5yZXNwb25zZUZpZWxkc1tvXSYmKG5bZS5yZXNwb25zZUZpZWxkc1tvXV09dCksIXUmJnImJmUuZGF0YUZpbHRlciYmKHQ9ZS5kYXRhRmlsdGVyKHQsZS5kYXRhVHlwZSkpLHU9byxvPWMuc2hpZnQoKSlpZihcIipcIj09PW8pbz11O2Vsc2UgaWYoXCIqXCIhPT11JiZ1IT09byl7aWYoIShhPWxbdStcIiBcIitvXXx8bFtcIiogXCIrb10pKWZvcihpIGluIGwpaWYoKHM9aS5zcGxpdChcIiBcIikpWzFdPT09byYmKGE9bFt1K1wiIFwiK3NbMF1dfHxsW1wiKiBcIitzWzBdXSkpeyEwPT09YT9hPWxbaV06ITAhPT1sW2ldJiYobz1zWzBdLGMudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJmVbXCJ0aHJvd3NcIl0pdD1hKHQpO2Vsc2UgdHJ5e3Q9YSh0KX1jYXRjaChlKXtyZXR1cm57c3RhdGU6XCJwYXJzZXJlcnJvclwiLGVycm9yOmE/ZTpcIk5vIGNvbnZlcnNpb24gZnJvbSBcIit1K1wiIHRvIFwiK299fX1yZXR1cm57c3RhdGU6XCJzdWNjZXNzXCIsZGF0YTp0fX13LmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6Q3QuaHJlZix0eXBlOlwiR0VUXCIsaXNMb2NhbDpQdC50ZXN0KEN0LnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6XCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixhY2NlcHRzOntcIipcIjokdCx0ZXh0OlwidGV4dC9wbGFpblwiLGh0bWw6XCJ0ZXh0L2h0bWxcIix4bWw6XCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsanNvbjpcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwifSxjb250ZW50czp7eG1sOi9cXGJ4bWxcXGIvLGh0bWw6L1xcYmh0bWwvLGpzb246L1xcYmpzb25cXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOlwicmVzcG9uc2VYTUxcIix0ZXh0OlwicmVzcG9uc2VUZXh0XCIsanNvbjpcInJlc3BvbnNlSlNPTlwifSxjb252ZXJ0ZXJzOntcIiogdGV4dFwiOlN0cmluZyxcInRleHQgaHRtbFwiOiEwLFwidGV4dCBqc29uXCI6SlNPTi5wYXJzZSxcInRleHQgeG1sXCI6dy5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/enQoenQoZSx3LmFqYXhTZXR0aW5ncyksdCk6enQody5hamF4U2V0dGluZ3MsZSl9LGFqYXhQcmVmaWx0ZXI6RnQoSXQpLGFqYXhUcmFuc3BvcnQ6RnQoV3QpLGFqYXg6ZnVuY3Rpb24odCxuKXtcIm9iamVjdFwiPT10eXBlb2YgdCYmKG49dCx0PXZvaWQgMCksbj1ufHx7fTt2YXIgaSxvLGEscyx1LGwsYyxmLHAsZCxoPXcuYWpheFNldHVwKHt9LG4pLGc9aC5jb250ZXh0fHxoLHk9aC5jb250ZXh0JiYoZy5ub2RlVHlwZXx8Zy5qcXVlcnkpP3coZyk6dy5ldmVudCx2PXcuRGVmZXJyZWQoKSxtPXcuQ2FsbGJhY2tzKFwib25jZSBtZW1vcnlcIikseD1oLnN0YXR1c0NvZGV8fHt9LGI9e30sVD17fSxDPVwiY2FuY2VsZWRcIixFPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoYyl7aWYoIXMpe3M9e307d2hpbGUodD1PdC5leGVjKGEpKXNbdFsxXS50b0xvd2VyQ2FzZSgpXT10WzJdfXQ9c1tlLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT10P251bGw6dH0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGM/YTpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWMmJihlPVRbZS50b0xvd2VyQ2FzZSgpXT1UW2UudG9Mb3dlckNhc2UoKV18fGUsYltlXT10KSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1jJiYoaC5taW1lVHlwZT1lKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGUpaWYoYylFLmFsd2F5cyhlW0Uuc3RhdHVzXSk7ZWxzZSBmb3IodCBpbiBlKXhbdF09W3hbdF0sZVt0XV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWV8fEM7cmV0dXJuIGkmJmkuYWJvcnQodCksaygwLHQpLHRoaXN9fTtpZih2LnByb21pc2UoRSksaC51cmw9KCh0fHxoLnVybHx8Q3QuaHJlZikrXCJcIikucmVwbGFjZShSdCxDdC5wcm90b2NvbCtcIi8vXCIpLGgudHlwZT1uLm1ldGhvZHx8bi50eXBlfHxoLm1ldGhvZHx8aC50eXBlLGguZGF0YVR5cGVzPShoLmRhdGFUeXBlfHxcIipcIikudG9Mb3dlckNhc2UoKS5tYXRjaChNKXx8W1wiXCJdLG51bGw9PWguY3Jvc3NEb21haW4pe2w9ci5jcmVhdGVFbGVtZW50KFwiYVwiKTt0cnl7bC5ocmVmPWgudXJsLGwuaHJlZj1sLmhyZWYsaC5jcm9zc0RvbWFpbj1CdC5wcm90b2NvbCtcIi8vXCIrQnQuaG9zdCE9bC5wcm90b2NvbCtcIi8vXCIrbC5ob3N0fWNhdGNoKGUpe2guY3Jvc3NEb21haW49ITB9fWlmKGguZGF0YSYmaC5wcm9jZXNzRGF0YSYmXCJzdHJpbmdcIiE9dHlwZW9mIGguZGF0YSYmKGguZGF0YT13LnBhcmFtKGguZGF0YSxoLnRyYWRpdGlvbmFsKSksX3QoSXQsaCxuLEUpLGMpcmV0dXJuIEU7KGY9dy5ldmVudCYmaC5nbG9iYWwpJiYwPT13LmFjdGl2ZSsrJiZ3LmV2ZW50LnRyaWdnZXIoXCJhamF4U3RhcnRcIiksaC50eXBlPWgudHlwZS50b1VwcGVyQ2FzZSgpLGguaGFzQ29udGVudD0hTXQudGVzdChoLnR5cGUpLG89aC51cmwucmVwbGFjZShMdCxcIlwiKSxoLmhhc0NvbnRlbnQ/aC5kYXRhJiZoLnByb2Nlc3NEYXRhJiYwPT09KGguY29udGVudFR5cGV8fFwiXCIpLmluZGV4T2YoXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIikmJihoLmRhdGE9aC5kYXRhLnJlcGxhY2UocXQsXCIrXCIpKTooZD1oLnVybC5zbGljZShvLmxlbmd0aCksaC5kYXRhJiYoaC5wcm9jZXNzRGF0YXx8XCJzdHJpbmdcIj09dHlwZW9mIGguZGF0YSkmJihvKz0oa3QudGVzdChvKT9cIiZcIjpcIj9cIikraC5kYXRhLGRlbGV0ZSBoLmRhdGEpLCExPT09aC5jYWNoZSYmKG89by5yZXBsYWNlKEh0LFwiJDFcIiksZD0oa3QudGVzdChvKT9cIiZcIjpcIj9cIikrXCJfPVwiK0V0KysrZCksaC51cmw9bytkKSxoLmlmTW9kaWZpZWQmJih3Lmxhc3RNb2RpZmllZFtvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKFwiSWYtTW9kaWZpZWQtU2luY2VcIix3Lmxhc3RNb2RpZmllZFtvXSksdy5ldGFnW29dJiZFLnNldFJlcXVlc3RIZWFkZXIoXCJJZi1Ob25lLU1hdGNoXCIsdy5ldGFnW29dKSksKGguZGF0YSYmaC5oYXNDb250ZW50JiYhMSE9PWguY29udGVudFR5cGV8fG4uY29udGVudFR5cGUpJiZFLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIixoLmNvbnRlbnRUeXBlKSxFLnNldFJlcXVlc3RIZWFkZXIoXCJBY2NlcHRcIixoLmRhdGFUeXBlc1swXSYmaC5hY2NlcHRzW2guZGF0YVR5cGVzWzBdXT9oLmFjY2VwdHNbaC5kYXRhVHlwZXNbMF1dKyhcIipcIiE9PWguZGF0YVR5cGVzWzBdP1wiLCBcIiskdCtcIjsgcT0wLjAxXCI6XCJcIik6aC5hY2NlcHRzW1wiKlwiXSk7Zm9yKHAgaW4gaC5oZWFkZXJzKUUuc2V0UmVxdWVzdEhlYWRlcihwLGguaGVhZGVyc1twXSk7aWYoaC5iZWZvcmVTZW5kJiYoITE9PT1oLmJlZm9yZVNlbmQuY2FsbChnLEUsaCl8fGMpKXJldHVybiBFLmFib3J0KCk7aWYoQz1cImFib3J0XCIsbS5hZGQoaC5jb21wbGV0ZSksRS5kb25lKGguc3VjY2VzcyksRS5mYWlsKGguZXJyb3IpLGk9X3QoV3QsaCxuLEUpKXtpZihFLnJlYWR5U3RhdGU9MSxmJiZ5LnRyaWdnZXIoXCJhamF4U2VuZFwiLFtFLGhdKSxjKXJldHVybiBFO2guYXN5bmMmJmgudGltZW91dD4wJiYodT1lLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtFLmFib3J0KFwidGltZW91dFwiKX0saC50aW1lb3V0KSk7dHJ5e2M9ITEsaS5zZW5kKGIsayl9Y2F0Y2goZSl7aWYoYyl0aHJvdyBlO2soLTEsZSl9fWVsc2UgaygtMSxcIk5vIFRyYW5zcG9ydFwiKTtmdW5jdGlvbiBrKHQsbixyLHMpe3ZhciBsLHAsZCxiLFQsQz1uO2N8fChjPSEwLHUmJmUuY2xlYXJUaW1lb3V0KHUpLGk9dm9pZCAwLGE9c3x8XCJcIixFLnJlYWR5U3RhdGU9dD4wPzQ6MCxsPXQ+PTIwMCYmdDwzMDB8fDMwND09PXQsciYmKGI9WHQoaCxFLHIpKSxiPVV0KGgsYixFLGwpLGw/KGguaWZNb2RpZmllZCYmKChUPUUuZ2V0UmVzcG9uc2VIZWFkZXIoXCJMYXN0LU1vZGlmaWVkXCIpKSYmKHcubGFzdE1vZGlmaWVkW29dPVQpLChUPUUuZ2V0UmVzcG9uc2VIZWFkZXIoXCJldGFnXCIpKSYmKHcuZXRhZ1tvXT1UKSksMjA0PT09dHx8XCJIRUFEXCI9PT1oLnR5cGU/Qz1cIm5vY29udGVudFwiOjMwND09PXQ/Qz1cIm5vdG1vZGlmaWVkXCI6KEM9Yi5zdGF0ZSxwPWIuZGF0YSxsPSEoZD1iLmVycm9yKSkpOihkPUMsIXQmJkN8fChDPVwiZXJyb3JcIix0PDAmJih0PTApKSksRS5zdGF0dXM9dCxFLnN0YXR1c1RleHQ9KG58fEMpK1wiXCIsbD92LnJlc29sdmVXaXRoKGcsW3AsQyxFXSk6di5yZWplY3RXaXRoKGcsW0UsQyxkXSksRS5zdGF0dXNDb2RlKHgpLHg9dm9pZCAwLGYmJnkudHJpZ2dlcihsP1wiYWpheFN1Y2Nlc3NcIjpcImFqYXhFcnJvclwiLFtFLGgsbD9wOmRdKSxtLmZpcmVXaXRoKGcsW0UsQ10pLGYmJih5LnRyaWdnZXIoXCJhamF4Q29tcGxldGVcIixbRSxoXSksLS13LmFjdGl2ZXx8dy5ldmVudC50cmlnZ2VyKFwiYWpheFN0b3BcIikpKX1yZXR1cm4gRX0sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHcuZ2V0KGUsdCxuLFwianNvblwiKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHcuZ2V0KGUsdm9pZCAwLHQsXCJzY3JpcHRcIil9fSksdy5lYWNoKFtcImdldFwiLFwicG9zdFwiXSxmdW5jdGlvbihlLHQpe3dbdF09ZnVuY3Rpb24oZSxuLHIsaSl7cmV0dXJuIGcobikmJihpPWl8fHIscj1uLG49dm9pZCAwKSx3LmFqYXgody5leHRlbmQoe3VybDplLHR5cGU6dCxkYXRhVHlwZTppLGRhdGE6bixzdWNjZXNzOnJ9LHcuaXNQbGFpbk9iamVjdChlKSYmZSkpfX0pLHcuX2V2YWxVcmw9ZnVuY3Rpb24oZSl7cmV0dXJuIHcuYWpheCh7dXJsOmUsdHlwZTpcIkdFVFwiLGRhdGFUeXBlOlwic2NyaXB0XCIsY2FjaGU6ITAsYXN5bmM6ITEsZ2xvYmFsOiExLFwidGhyb3dzXCI6ITB9KX0sdy5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIHRoaXNbMF0mJihnKGUpJiYoZT1lLmNhbGwodGhpc1swXSkpLHQ9dyhlLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApLHRoaXNbMF0ucGFyZW50Tm9kZSYmdC5pbnNlcnRCZWZvcmUodGhpc1swXSksdC5tYXAoZnVuY3Rpb24oKXt2YXIgZT10aGlzO3doaWxlKGUuZmlyc3RFbGVtZW50Q2hpbGQpZT1lLmZpcnN0RWxlbWVudENoaWxkO3JldHVybiBlfSkuYXBwZW5kKHRoaXMpKSx0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGcoZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3codGhpcykud3JhcElubmVyKGUuY2FsbCh0aGlzLHQpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXcodGhpcyksbj10LmNvbnRlbnRzKCk7bi5sZW5ndGg/bi53cmFwQWxsKGUpOnQuYXBwZW5kKGUpfSl9LHdyYXA6ZnVuY3Rpb24oZSl7dmFyIHQ9ZyhlKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3codGhpcykud3JhcEFsbCh0P2UuY2FsbCh0aGlzLG4pOmUpfSl9LHVud3JhcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wYXJlbnQoZSkubm90KFwiYm9keVwiKS5lYWNoKGZ1bmN0aW9uKCl7dyh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSx3LmV4cHIucHNldWRvcy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIXcuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LHcuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSx3LmFqYXhTZXR0aW5ncy54aHI9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBWdD17MDoyMDAsMTIyMzoyMDR9LEd0PXcuYWpheFNldHRpbmdzLnhocigpO2guY29ycz0hIUd0JiZcIndpdGhDcmVkZW50aWFsc1wiaW4gR3QsaC5hamF4PUd0PSEhR3Qsdy5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKHQpe3ZhciBuLHI7aWYoaC5jb3JzfHxHdCYmIXQuY3Jvc3NEb21haW4pcmV0dXJue3NlbmQ6ZnVuY3Rpb24oaSxvKXt2YXIgYSxzPXQueGhyKCk7aWYocy5vcGVuKHQudHlwZSx0LnVybCx0LmFzeW5jLHQudXNlcm5hbWUsdC5wYXNzd29yZCksdC54aHJGaWVsZHMpZm9yKGEgaW4gdC54aHJGaWVsZHMpc1thXT10LnhockZpZWxkc1thXTt0Lm1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZSh0Lm1pbWVUeXBlKSx0LmNyb3NzRG9tYWlufHxpW1wiWC1SZXF1ZXN0ZWQtV2l0aFwiXXx8KGlbXCJYLVJlcXVlc3RlZC1XaXRoXCJdPVwiWE1MSHR0cFJlcXVlc3RcIik7Zm9yKGEgaW4gaSlzLnNldFJlcXVlc3RIZWFkZXIoYSxpW2FdKTtuPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe24mJihuPXI9cy5vbmxvYWQ9cy5vbmVycm9yPXMub25hYm9ydD1zLm9udGltZW91dD1zLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLFwiYWJvcnRcIj09PWU/cy5hYm9ydCgpOlwiZXJyb3JcIj09PWU/XCJudW1iZXJcIiE9dHlwZW9mIHMuc3RhdHVzP28oMCxcImVycm9yXCIpOm8ocy5zdGF0dXMscy5zdGF0dXNUZXh0KTpvKFZ0W3Muc3RhdHVzXXx8cy5zdGF0dXMscy5zdGF0dXNUZXh0LFwidGV4dFwiIT09KHMucmVzcG9uc2VUeXBlfHxcInRleHRcIil8fFwic3RyaW5nXCIhPXR5cGVvZiBzLnJlc3BvbnNlVGV4dD97YmluYXJ5OnMucmVzcG9uc2V9Ont0ZXh0OnMucmVzcG9uc2VUZXh0fSxzLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxzLm9ubG9hZD1uKCkscj1zLm9uZXJyb3I9cy5vbnRpbWVvdXQ9bihcImVycm9yXCIpLHZvaWQgMCE9PXMub25hYm9ydD9zLm9uYWJvcnQ9cjpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1zLnJlYWR5U3RhdGUmJmUuc2V0VGltZW91dChmdW5jdGlvbigpe24mJnIoKX0pfSxuPW4oXCJhYm9ydFwiKTt0cnl7cy5zZW5kKHQuaGFzQ29udGVudCYmdC5kYXRhfHxudWxsKX1jYXRjaChlKXtpZihuKXRocm93IGV9fSxhYm9ydDpmdW5jdGlvbigpe24mJm4oKX19fSksdy5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGUpe2UuY3Jvc3NEb21haW4mJihlLmNvbnRlbnRzLnNjcmlwdD0hMSl9KSx3LmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OlwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHRcIn0sY29udGVudHM6e3NjcmlwdDovXFxiKD86amF2YXxlY21hKXNjcmlwdFxcYi99LGNvbnZlcnRlcnM6e1widGV4dCBzY3JpcHRcIjpmdW5jdGlvbihlKXtyZXR1cm4gdy5nbG9iYWxFdmFsKGUpLGV9fX0pLHcuYWpheFByZWZpbHRlcihcInNjcmlwdFwiLGZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUuY2FjaGUmJihlLmNhY2hlPSExKSxlLmNyb3NzRG9tYWluJiYoZS50eXBlPVwiR0VUXCIpfSksdy5hamF4VHJhbnNwb3J0KFwic2NyaXB0XCIsZnVuY3Rpb24oZSl7aWYoZS5jcm9zc0RvbWFpbil7dmFyIHQsbjtyZXR1cm57c2VuZDpmdW5jdGlvbihpLG8pe3Q9dyhcIjxzY3JpcHQ+XCIpLnByb3Aoe2NoYXJzZXQ6ZS5zY3JpcHRDaGFyc2V0LHNyYzplLnVybH0pLm9uKFwibG9hZCBlcnJvclwiLG49ZnVuY3Rpb24oZSl7dC5yZW1vdmUoKSxuPW51bGwsZSYmbyhcImVycm9yXCI9PT1lLnR5cGU/NDA0OjIwMCxlLnR5cGUpfSksci5oZWFkLmFwcGVuZENoaWxkKHRbMF0pfSxhYm9ydDpmdW5jdGlvbigpe24mJm4oKX19fX0pO3ZhciBZdD1bXSxRdD0vKD0pXFw/KD89JnwkKXxcXD9cXD8vO3cuYWpheFNldHVwKHtqc29ucDpcImNhbGxiYWNrXCIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPVl0LnBvcCgpfHx3LmV4cGFuZG8rXCJfXCIrRXQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLHcuYWpheFByZWZpbHRlcihcImpzb24ganNvbnBcIixmdW5jdGlvbih0LG4scil7dmFyIGksbyxhLHM9ITEhPT10Lmpzb25wJiYoUXQudGVzdCh0LnVybCk/XCJ1cmxcIjpcInN0cmluZ1wiPT10eXBlb2YgdC5kYXRhJiYwPT09KHQuY29udGVudFR5cGV8fFwiXCIpLmluZGV4T2YoXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIikmJlF0LnRlc3QodC5kYXRhKSYmXCJkYXRhXCIpO2lmKHN8fFwianNvbnBcIj09PXQuZGF0YVR5cGVzWzBdKXJldHVybiBpPXQuanNvbnBDYWxsYmFjaz1nKHQuanNvbnBDYWxsYmFjayk/dC5qc29ucENhbGxiYWNrKCk6dC5qc29ucENhbGxiYWNrLHM/dFtzXT10W3NdLnJlcGxhY2UoUXQsXCIkMVwiK2kpOiExIT09dC5qc29ucCYmKHQudXJsKz0oa3QudGVzdCh0LnVybCk/XCImXCI6XCI/XCIpK3QuanNvbnArXCI9XCIraSksdC5jb252ZXJ0ZXJzW1wic2NyaXB0IGpzb25cIl09ZnVuY3Rpb24oKXtyZXR1cm4gYXx8dy5lcnJvcihpK1wiIHdhcyBub3QgY2FsbGVkXCIpLGFbMF19LHQuZGF0YVR5cGVzWzBdPVwianNvblwiLG89ZVtpXSxlW2ldPWZ1bmN0aW9uKCl7YT1hcmd1bWVudHN9LHIuYWx3YXlzKGZ1bmN0aW9uKCl7dm9pZCAwPT09bz93KGUpLnJlbW92ZVByb3AoaSk6ZVtpXT1vLHRbaV0mJih0Lmpzb25wQ2FsbGJhY2s9bi5qc29ucENhbGxiYWNrLFl0LnB1c2goaSkpLGEmJmcobykmJm8oYVswXSksYT1vPXZvaWQgMH0pLFwic2NyaXB0XCJ9KSxoLmNyZWF0ZUhUTUxEb2N1bWVudD1mdW5jdGlvbigpe3ZhciBlPXIuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KFwiXCIpLmJvZHk7cmV0dXJuIGUuaW5uZXJIVE1MPVwiPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT5cIiwyPT09ZS5jaGlsZE5vZGVzLmxlbmd0aH0oKSx3LnBhcnNlSFRNTD1mdW5jdGlvbihlLHQsbil7aWYoXCJzdHJpbmdcIiE9dHlwZW9mIGUpcmV0dXJuW107XCJib29sZWFuXCI9PXR5cGVvZiB0JiYobj10LHQ9ITEpO3ZhciBpLG8sYTtyZXR1cm4gdHx8KGguY3JlYXRlSFRNTERvY3VtZW50PygoaT0odD1yLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudChcIlwiKSkuY3JlYXRlRWxlbWVudChcImJhc2VcIikpLmhyZWY9ci5sb2NhdGlvbi5ocmVmLHQuaGVhZC5hcHBlbmRDaGlsZChpKSk6dD1yKSxvPUEuZXhlYyhlKSxhPSFuJiZbXSxvP1t0LmNyZWF0ZUVsZW1lbnQob1sxXSldOihvPXhlKFtlXSx0LGEpLGEmJmEubGVuZ3RoJiZ3KGEpLnJlbW92ZSgpLHcubWVyZ2UoW10sby5jaGlsZE5vZGVzKSl9LHcuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGE9dGhpcyxzPWUuaW5kZXhPZihcIiBcIik7cmV0dXJuIHM+LTEmJihyPXZ0KGUuc2xpY2UocykpLGU9ZS5zbGljZSgwLHMpKSxnKHQpPyhuPXQsdD12b2lkIDApOnQmJlwib2JqZWN0XCI9PXR5cGVvZiB0JiYoaT1cIlBPU1RcIiksYS5sZW5ndGg+MCYmdy5hamF4KHt1cmw6ZSx0eXBlOml8fFwiR0VUXCIsZGF0YVR5cGU6XCJodG1sXCIsZGF0YTp0fSkuZG9uZShmdW5jdGlvbihlKXtvPWFyZ3VtZW50cyxhLmh0bWwocj93KFwiPGRpdj5cIikuYXBwZW5kKHcucGFyc2VIVE1MKGUpKS5maW5kKHIpOmUpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKGUsdCl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pfSksdGhpc30sdy5lYWNoKFtcImFqYXhTdGFydFwiLFwiYWpheFN0b3BcIixcImFqYXhDb21wbGV0ZVwiLFwiYWpheEVycm9yXCIsXCJhamF4U3VjY2Vzc1wiLFwiYWpheFNlbmRcIl0sZnVuY3Rpb24oZSx0KXt3LmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksdy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHcuZ3JlcCh3LnRpbWVycyxmdW5jdGlvbih0KXtyZXR1cm4gZT09PXQuZWxlbX0pLmxlbmd0aH0sdy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyx1LGwsYz13LmNzcyhlLFwicG9zaXRpb25cIiksZj13KGUpLHA9e307XCJzdGF0aWNcIj09PWMmJihlLnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIikscz1mLm9mZnNldCgpLG89dy5jc3MoZSxcInRvcFwiKSx1PXcuY3NzKGUsXCJsZWZ0XCIpLChsPShcImFic29sdXRlXCI9PT1jfHxcImZpeGVkXCI9PT1jKSYmKG8rdSkuaW5kZXhPZihcImF1dG9cIik+LTEpPyhhPShyPWYucG9zaXRpb24oKSkudG9wLGk9ci5sZWZ0KTooYT1wYXJzZUZsb2F0KG8pfHwwLGk9cGFyc2VGbG9hdCh1KXx8MCksZyh0KSYmKHQ9dC5jYWxsKGUsbix3LmV4dGVuZCh7fSxzKSkpLG51bGwhPXQudG9wJiYocC50b3A9dC50b3Atcy50b3ArYSksbnVsbCE9dC5sZWZ0JiYocC5sZWZ0PXQubGVmdC1zLmxlZnQraSksXCJ1c2luZ1wiaW4gdD90LnVzaW5nLmNhbGwoZSxwKTpmLmNzcyhwKX19LHcuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oZSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt3Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIHQsbixyPXRoaXNbMF07aWYocilyZXR1cm4gci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8odD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6dC50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OnQubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH19LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxpPXt0b3A6MCxsZWZ0OjB9O2lmKFwiZml4ZWRcIj09PXcuY3NzKHIsXCJwb3NpdGlvblwiKSl0PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZXt0PXRoaXMub2Zmc2V0KCksbj1yLm93bmVyRG9jdW1lbnQsZT1yLm9mZnNldFBhcmVudHx8bi5kb2N1bWVudEVsZW1lbnQ7d2hpbGUoZSYmKGU9PT1uLmJvZHl8fGU9PT1uLmRvY3VtZW50RWxlbWVudCkmJlwic3RhdGljXCI9PT13LmNzcyhlLFwicG9zaXRpb25cIikpZT1lLnBhcmVudE5vZGU7ZSYmZSE9PXImJjE9PT1lLm5vZGVUeXBlJiYoKGk9dyhlKS5vZmZzZXQoKSkudG9wKz13LmNzcyhlLFwiYm9yZGVyVG9wV2lkdGhcIiwhMCksaS5sZWZ0Kz13LmNzcyhlLFwiYm9yZGVyTGVmdFdpZHRoXCIsITApKX1yZXR1cm57dG9wOnQudG9wLWkudG9wLXcuY3NzKHIsXCJtYXJnaW5Ub3BcIiwhMCksbGVmdDp0LmxlZnQtaS5sZWZ0LXcuY3NzKHIsXCJtYXJnaW5MZWZ0XCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXMub2Zmc2V0UGFyZW50O3doaWxlKGUmJlwic3RhdGljXCI9PT13LmNzcyhlLFwicG9zaXRpb25cIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8YmV9KX19KSx3LmVhY2goe3Njcm9sbExlZnQ6XCJwYWdlWE9mZnNldFwiLHNjcm9sbFRvcDpcInBhZ2VZT2Zmc2V0XCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIG49XCJwYWdlWU9mZnNldFwiPT09dDt3LmZuW2VdPWZ1bmN0aW9uKHIpe3JldHVybiB6KHRoaXMsZnVuY3Rpb24oZSxyLGkpe3ZhciBvO2lmKHkoZSk/bz1lOjk9PT1lLm5vZGVUeXBlJiYobz1lLmRlZmF1bHRWaWV3KSx2b2lkIDA9PT1pKXJldHVybiBvP29bdF06ZVtyXTtvP28uc2Nyb2xsVG8obj9vLnBhZ2VYT2Zmc2V0Omksbj9pOm8ucGFnZVlPZmZzZXQpOmVbcl09aX0sZSxyLGFyZ3VtZW50cy5sZW5ndGgpfX0pLHcuZWFjaChbXCJ0b3BcIixcImxlZnRcIl0sZnVuY3Rpb24oZSx0KXt3LmNzc0hvb2tzW3RdPV9lKGgucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLG4pe2lmKG4pcmV0dXJuIG49RmUoZSx0KSxXZS50ZXN0KG4pP3coZSkucG9zaXRpb24oKVt0XStcInB4XCI6bn0pfSksdy5lYWNoKHtIZWlnaHQ6XCJoZWlnaHRcIixXaWR0aDpcIndpZHRoXCJ9LGZ1bmN0aW9uKGUsdCl7dy5lYWNoKHtwYWRkaW5nOlwiaW5uZXJcIitlLGNvbnRlbnQ6dCxcIlwiOlwib3V0ZXJcIitlfSxmdW5jdGlvbihuLHIpe3cuZm5bcl09ZnVuY3Rpb24oaSxvKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoJiYobnx8XCJib29sZWFuXCIhPXR5cGVvZiBpKSxzPW58fCghMD09PWl8fCEwPT09bz9cIm1hcmdpblwiOlwiYm9yZGVyXCIpO3JldHVybiB6KHRoaXMsZnVuY3Rpb24odCxuLGkpe3ZhciBvO3JldHVybiB5KHQpPzA9PT1yLmluZGV4T2YoXCJvdXRlclwiKT90W1wiaW5uZXJcIitlXTp0LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtcImNsaWVudFwiK2VdOjk9PT10Lm5vZGVUeXBlPyhvPXQuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KHQuYm9keVtcInNjcm9sbFwiK2VdLG9bXCJzY3JvbGxcIitlXSx0LmJvZHlbXCJvZmZzZXRcIitlXSxvW1wib2Zmc2V0XCIrZV0sb1tcImNsaWVudFwiK2VdKSk6dm9pZCAwPT09aT93LmNzcyh0LG4scyk6dy5zdHlsZSh0LG4saSxzKX0sdCxhP2k6dm9pZCAwLGEpfX0pfSksdy5lYWNoKFwiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudVwiLnNwbGl0KFwiIFwiKSxmdW5jdGlvbihlLHQpe3cuZm5bdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24odCxudWxsLGUsbik6dGhpcy50cmlnZ2VyKHQpfX0pLHcuZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoZSkubW91c2VsZWF2ZSh0fHxlKX19KSx3LmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoZSxcIioqXCIpOnRoaXMub2ZmKHQsZXx8XCIqKlwiLG4pfX0pLHcucHJveHk9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQmJihuPWVbdF0sdD1lLGU9biksZyhlKSlyZXR1cm4gcj1vLmNhbGwoYXJndW1lbnRzLDIpLGk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0fHx0aGlzLHIuY29uY2F0KG8uY2FsbChhcmd1bWVudHMpKSl9LGkuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHx3Lmd1aWQrKyxpfSx3LmhvbGRSZWFkeT1mdW5jdGlvbihlKXtlP3cucmVhZHlXYWl0Kys6dy5yZWFkeSghMCl9LHcuaXNBcnJheT1BcnJheS5pc0FycmF5LHcucGFyc2VKU09OPUpTT04ucGFyc2Usdy5ub2RlTmFtZT1OLHcuaXNGdW5jdGlvbj1nLHcuaXNXaW5kb3c9eSx3LmNhbWVsQ2FzZT1HLHcudHlwZT14LHcubm93PURhdGUubm93LHcuaXNOdW1lcmljPWZ1bmN0aW9uKGUpe3ZhciB0PXcudHlwZShlKTtyZXR1cm4oXCJudW1iZXJcIj09PXR8fFwic3RyaW5nXCI9PT10KSYmIWlzTmFOKGUtcGFyc2VGbG9hdChlKSl9LFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKFwianF1ZXJ5XCIsW10sZnVuY3Rpb24oKXtyZXR1cm4gd30pO3ZhciBKdD1lLmpRdWVyeSxLdD1lLiQ7cmV0dXJuIHcubm9Db25mbGljdD1mdW5jdGlvbih0KXtyZXR1cm4gZS4kPT09dyYmKGUuJD1LdCksdCYmZS5qUXVlcnk9PT13JiYoZS5qUXVlcnk9SnQpLHd9LHR8fChlLmpRdWVyeT1lLiQ9dyksd30pO1xyXG4vKiEgalF1ZXJ5IFZhbGlkYXRpb24gUGx1Z2luIC0gdjEuMTkuMCAtIDExLzI4LzIwMThcclxuICogaHR0cHM6Ly9qcXVlcnl2YWxpZGF0aW9uLm9yZy9cclxuICogQ29weXJpZ2h0IChjKSAyMDE4IErDtnJuIFphZWZmZXJlcjsgTGljZW5zZWQgTUlUICovXHJcbiFmdW5jdGlvbihhKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcImpxdWVyeVwiXSxhKTpcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1hKHJlcXVpcmUoXCJqcXVlcnlcIikpOmEoalF1ZXJ5KX0oZnVuY3Rpb24oYSl7YS5leHRlbmQoYS5mbix7dmFsaWRhdGU6ZnVuY3Rpb24oYil7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB2b2lkKGImJmIuZGVidWcmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLndhcm4oXCJOb3RoaW5nIHNlbGVjdGVkLCBjYW4ndCB2YWxpZGF0ZSwgcmV0dXJuaW5nIG5vdGhpbmcuXCIpKTt2YXIgYz1hLmRhdGEodGhpc1swXSxcInZhbGlkYXRvclwiKTtyZXR1cm4gYz9jOih0aGlzLmF0dHIoXCJub3ZhbGlkYXRlXCIsXCJub3ZhbGlkYXRlXCIpLGM9bmV3IGEudmFsaWRhdG9yKGIsdGhpc1swXSksYS5kYXRhKHRoaXNbMF0sXCJ2YWxpZGF0b3JcIixjKSxjLnNldHRpbmdzLm9uc3VibWl0JiYodGhpcy5vbihcImNsaWNrLnZhbGlkYXRlXCIsXCI6c3VibWl0XCIsZnVuY3Rpb24oYil7Yy5zdWJtaXRCdXR0b249Yi5jdXJyZW50VGFyZ2V0LGEodGhpcykuaGFzQ2xhc3MoXCJjYW5jZWxcIikmJihjLmNhbmNlbFN1Ym1pdD0hMCksdm9pZCAwIT09YSh0aGlzKS5hdHRyKFwiZm9ybW5vdmFsaWRhdGVcIikmJihjLmNhbmNlbFN1Ym1pdD0hMCl9KSx0aGlzLm9uKFwic3VibWl0LnZhbGlkYXRlXCIsZnVuY3Rpb24oYil7ZnVuY3Rpb24gZCgpe3ZhciBkLGU7cmV0dXJuIGMuc3VibWl0QnV0dG9uJiYoYy5zZXR0aW5ncy5zdWJtaXRIYW5kbGVyfHxjLmZvcm1TdWJtaXR0ZWQpJiYoZD1hKFwiPGlucHV0IHR5cGU9J2hpZGRlbicvPlwiKS5hdHRyKFwibmFtZVwiLGMuc3VibWl0QnV0dG9uLm5hbWUpLnZhbChhKGMuc3VibWl0QnV0dG9uKS52YWwoKSkuYXBwZW5kVG8oYy5jdXJyZW50Rm9ybSkpLCEoYy5zZXR0aW5ncy5zdWJtaXRIYW5kbGVyJiYhYy5zZXR0aW5ncy5kZWJ1Zyl8fChlPWMuc2V0dGluZ3Muc3VibWl0SGFuZGxlci5jYWxsKGMsYy5jdXJyZW50Rm9ybSxiKSxkJiZkLnJlbW92ZSgpLHZvaWQgMCE9PWUmJmUpfXJldHVybiBjLnNldHRpbmdzLmRlYnVnJiZiLnByZXZlbnREZWZhdWx0KCksYy5jYW5jZWxTdWJtaXQ/KGMuY2FuY2VsU3VibWl0PSExLGQoKSk6Yy5mb3JtKCk/Yy5wZW5kaW5nUmVxdWVzdD8oYy5mb3JtU3VibWl0dGVkPSEwLCExKTpkKCk6KGMuZm9jdXNJbnZhbGlkKCksITEpfSkpLGMpfSx2YWxpZDpmdW5jdGlvbigpe3ZhciBiLGMsZDtyZXR1cm4gYSh0aGlzWzBdKS5pcyhcImZvcm1cIik/Yj10aGlzLnZhbGlkYXRlKCkuZm9ybSgpOihkPVtdLGI9ITAsYz1hKHRoaXNbMF0uZm9ybSkudmFsaWRhdGUoKSx0aGlzLmVhY2goZnVuY3Rpb24oKXtiPWMuZWxlbWVudCh0aGlzKSYmYixifHwoZD1kLmNvbmNhdChjLmVycm9yTGlzdCkpfSksYy5lcnJvckxpc3Q9ZCksYn0scnVsZXM6ZnVuY3Rpb24oYixjKXt2YXIgZCxlLGYsZyxoLGksaj10aGlzWzBdLGs9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHRoaXMuYXR0cihcImNvbnRlbnRlZGl0YWJsZVwiKSYmXCJmYWxzZVwiIT09dGhpcy5hdHRyKFwiY29udGVudGVkaXRhYmxlXCIpO2lmKG51bGwhPWomJighai5mb3JtJiZrJiYoai5mb3JtPXRoaXMuY2xvc2VzdChcImZvcm1cIilbMF0sai5uYW1lPXRoaXMuYXR0cihcIm5hbWVcIikpLG51bGwhPWouZm9ybSkpe2lmKGIpc3dpdGNoKGQ9YS5kYXRhKGouZm9ybSxcInZhbGlkYXRvclwiKS5zZXR0aW5ncyxlPWQucnVsZXMsZj1hLnZhbGlkYXRvci5zdGF0aWNSdWxlcyhqKSxiKXtjYXNlXCJhZGRcIjphLmV4dGVuZChmLGEudmFsaWRhdG9yLm5vcm1hbGl6ZVJ1bGUoYykpLGRlbGV0ZSBmLm1lc3NhZ2VzLGVbai5uYW1lXT1mLGMubWVzc2FnZXMmJihkLm1lc3NhZ2VzW2oubmFtZV09YS5leHRlbmQoZC5tZXNzYWdlc1tqLm5hbWVdLGMubWVzc2FnZXMpKTticmVhaztjYXNlXCJyZW1vdmVcIjpyZXR1cm4gYz8oaT17fSxhLmVhY2goYy5zcGxpdCgvXFxzLyksZnVuY3Rpb24oYSxiKXtpW2JdPWZbYl0sZGVsZXRlIGZbYl19KSxpKTooZGVsZXRlIGVbai5uYW1lXSxmKX1yZXR1cm4gZz1hLnZhbGlkYXRvci5ub3JtYWxpemVSdWxlcyhhLmV4dGVuZCh7fSxhLnZhbGlkYXRvci5jbGFzc1J1bGVzKGopLGEudmFsaWRhdG9yLmF0dHJpYnV0ZVJ1bGVzKGopLGEudmFsaWRhdG9yLmRhdGFSdWxlcyhqKSxhLnZhbGlkYXRvci5zdGF0aWNSdWxlcyhqKSksaiksZy5yZXF1aXJlZCYmKGg9Zy5yZXF1aXJlZCxkZWxldGUgZy5yZXF1aXJlZCxnPWEuZXh0ZW5kKHtyZXF1aXJlZDpofSxnKSksZy5yZW1vdGUmJihoPWcucmVtb3RlLGRlbGV0ZSBnLnJlbW90ZSxnPWEuZXh0ZW5kKGcse3JlbW90ZTpofSkpLGd9fX0pLGEuZXh0ZW5kKGEuZXhwci5wc2V1ZG9zfHxhLmV4cHJbXCI6XCJdLHtibGFuazpmdW5jdGlvbihiKXtyZXR1cm4hYS50cmltKFwiXCIrYShiKS52YWwoKSl9LGZpbGxlZDpmdW5jdGlvbihiKXt2YXIgYz1hKGIpLnZhbCgpO3JldHVybiBudWxsIT09YyYmISFhLnRyaW0oXCJcIitjKX0sdW5jaGVja2VkOmZ1bmN0aW9uKGIpe3JldHVybiFhKGIpLnByb3AoXCJjaGVja2VkXCIpfX0pLGEudmFsaWRhdG9yPWZ1bmN0aW9uKGIsYyl7dGhpcy5zZXR0aW5ncz1hLmV4dGVuZCghMCx7fSxhLnZhbGlkYXRvci5kZWZhdWx0cyxiKSx0aGlzLmN1cnJlbnRGb3JtPWMsdGhpcy5pbml0KCl9LGEudmFsaWRhdG9yLmZvcm1hdD1mdW5jdGlvbihiLGMpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9mdW5jdGlvbigpe3ZhciBjPWEubWFrZUFycmF5KGFyZ3VtZW50cyk7cmV0dXJuIGMudW5zaGlmdChiKSxhLnZhbGlkYXRvci5mb3JtYXQuYXBwbHkodGhpcyxjKX06dm9pZCAwPT09Yz9iOihhcmd1bWVudHMubGVuZ3RoPjImJmMuY29uc3RydWN0b3IhPT1BcnJheSYmKGM9YS5tYWtlQXJyYXkoYXJndW1lbnRzKS5zbGljZSgxKSksYy5jb25zdHJ1Y3RvciE9PUFycmF5JiYoYz1bY10pLGEuZWFjaChjLGZ1bmN0aW9uKGEsYyl7Yj1iLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcXFx7XCIrYStcIlxcXFx9XCIsXCJnXCIpLGZ1bmN0aW9uKCl7cmV0dXJuIGN9KX0pLGIpfSxhLmV4dGVuZChhLnZhbGlkYXRvcix7ZGVmYXVsdHM6e21lc3NhZ2VzOnt9LGdyb3Vwczp7fSxydWxlczp7fSxlcnJvckNsYXNzOlwiZXJyb3JcIixwZW5kaW5nQ2xhc3M6XCJwZW5kaW5nXCIsdmFsaWRDbGFzczpcInZhbGlkXCIsZXJyb3JFbGVtZW50OlwibGFiZWxcIixmb2N1c0NsZWFudXA6ITEsZm9jdXNJbnZhbGlkOiEwLGVycm9yQ29udGFpbmVyOmEoW10pLGVycm9yTGFiZWxDb250YWluZXI6YShbXSksb25zdWJtaXQ6ITAsaWdub3JlOlwiOmhpZGRlblwiLGlnbm9yZVRpdGxlOiExLG9uZm9jdXNpbjpmdW5jdGlvbihhKXt0aGlzLmxhc3RBY3RpdmU9YSx0aGlzLnNldHRpbmdzLmZvY3VzQ2xlYW51cCYmKHRoaXMuc2V0dGluZ3MudW5oaWdobGlnaHQmJnRoaXMuc2V0dGluZ3MudW5oaWdobGlnaHQuY2FsbCh0aGlzLGEsdGhpcy5zZXR0aW5ncy5lcnJvckNsYXNzLHRoaXMuc2V0dGluZ3MudmFsaWRDbGFzcyksdGhpcy5oaWRlVGhlc2UodGhpcy5lcnJvcnNGb3IoYSkpKX0sb25mb2N1c291dDpmdW5jdGlvbihhKXt0aGlzLmNoZWNrYWJsZShhKXx8IShhLm5hbWUgaW4gdGhpcy5zdWJtaXR0ZWQpJiZ0aGlzLm9wdGlvbmFsKGEpfHx0aGlzLmVsZW1lbnQoYSl9LG9ua2V5dXA6ZnVuY3Rpb24oYixjKXt2YXIgZD1bMTYsMTcsMTgsMjAsMzUsMzYsMzcsMzgsMzksNDAsNDUsMTQ0LDIyNV07OT09PWMud2hpY2gmJlwiXCI9PT10aGlzLmVsZW1lbnRWYWx1ZShiKXx8YS5pbkFycmF5KGMua2V5Q29kZSxkKSE9PS0xfHwoYi5uYW1lIGluIHRoaXMuc3VibWl0dGVkfHxiLm5hbWUgaW4gdGhpcy5pbnZhbGlkKSYmdGhpcy5lbGVtZW50KGIpfSxvbmNsaWNrOmZ1bmN0aW9uKGEpe2EubmFtZSBpbiB0aGlzLnN1Ym1pdHRlZD90aGlzLmVsZW1lbnQoYSk6YS5wYXJlbnROb2RlLm5hbWUgaW4gdGhpcy5zdWJtaXR0ZWQmJnRoaXMuZWxlbWVudChhLnBhcmVudE5vZGUpfSxoaWdobGlnaHQ6ZnVuY3Rpb24oYixjLGQpe1wicmFkaW9cIj09PWIudHlwZT90aGlzLmZpbmRCeU5hbWUoYi5uYW1lKS5hZGRDbGFzcyhjKS5yZW1vdmVDbGFzcyhkKTphKGIpLmFkZENsYXNzKGMpLnJlbW92ZUNsYXNzKGQpfSx1bmhpZ2hsaWdodDpmdW5jdGlvbihiLGMsZCl7XCJyYWRpb1wiPT09Yi50eXBlP3RoaXMuZmluZEJ5TmFtZShiLm5hbWUpLnJlbW92ZUNsYXNzKGMpLmFkZENsYXNzKGQpOmEoYikucmVtb3ZlQ2xhc3MoYykuYWRkQ2xhc3MoZCl9fSxzZXREZWZhdWx0czpmdW5jdGlvbihiKXthLmV4dGVuZChhLnZhbGlkYXRvci5kZWZhdWx0cyxiKX0sbWVzc2FnZXM6e3JlcXVpcmVkOlwiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC5cIixyZW1vdGU6XCJQbGVhc2UgZml4IHRoaXMgZmllbGQuXCIsZW1haWw6XCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLlwiLHVybDpcIlBsZWFzZSBlbnRlciBhIHZhbGlkIFVSTC5cIixkYXRlOlwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZS5cIixkYXRlSVNPOlwiUGxlYXNlIGVudGVyIGEgdmFsaWQgZGF0ZSAoSVNPKS5cIixudW1iZXI6XCJQbGVhc2UgZW50ZXIgYSB2YWxpZCBudW1iZXIuXCIsZGlnaXRzOlwiUGxlYXNlIGVudGVyIG9ubHkgZGlnaXRzLlwiLGVxdWFsVG86XCJQbGVhc2UgZW50ZXIgdGhlIHNhbWUgdmFsdWUgYWdhaW4uXCIsbWF4bGVuZ3RoOmEudmFsaWRhdG9yLmZvcm1hdChcIlBsZWFzZSBlbnRlciBubyBtb3JlIHRoYW4gezB9IGNoYXJhY3RlcnMuXCIpLG1pbmxlbmd0aDphLnZhbGlkYXRvci5mb3JtYXQoXCJQbGVhc2UgZW50ZXIgYXQgbGVhc3QgezB9IGNoYXJhY3RlcnMuXCIpLHJhbmdlbGVuZ3RoOmEudmFsaWRhdG9yLmZvcm1hdChcIlBsZWFzZSBlbnRlciBhIHZhbHVlIGJldHdlZW4gezB9IGFuZCB7MX0gY2hhcmFjdGVycyBsb25nLlwiKSxyYW5nZTphLnZhbGlkYXRvci5mb3JtYXQoXCJQbGVhc2UgZW50ZXIgYSB2YWx1ZSBiZXR3ZWVuIHswfSBhbmQgezF9LlwiKSxtYXg6YS52YWxpZGF0b3IuZm9ybWF0KFwiUGxlYXNlIGVudGVyIGEgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHswfS5cIiksbWluOmEudmFsaWRhdG9yLmZvcm1hdChcIlBsZWFzZSBlbnRlciBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB7MH0uXCIpLHN0ZXA6YS52YWxpZGF0b3IuZm9ybWF0KFwiUGxlYXNlIGVudGVyIGEgbXVsdGlwbGUgb2YgezB9LlwiKX0sYXV0b0NyZWF0ZVJhbmdlczohMSxwcm90b3R5cGU6e2luaXQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3ZhciBjPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBhKHRoaXMpLmF0dHIoXCJjb250ZW50ZWRpdGFibGVcIikmJlwiZmFsc2VcIiE9PWEodGhpcykuYXR0cihcImNvbnRlbnRlZGl0YWJsZVwiKTtpZighdGhpcy5mb3JtJiZjJiYodGhpcy5mb3JtPWEodGhpcykuY2xvc2VzdChcImZvcm1cIilbMF0sdGhpcy5uYW1lPWEodGhpcykuYXR0cihcIm5hbWVcIikpLGQ9PT10aGlzLmZvcm0pe3ZhciBlPWEuZGF0YSh0aGlzLmZvcm0sXCJ2YWxpZGF0b3JcIiksZj1cIm9uXCIrYi50eXBlLnJlcGxhY2UoL152YWxpZGF0ZS8sXCJcIiksZz1lLnNldHRpbmdzO2dbZl0mJiFhKHRoaXMpLmlzKGcuaWdub3JlKSYmZ1tmXS5jYWxsKGUsdGhpcyxiKX19dGhpcy5sYWJlbENvbnRhaW5lcj1hKHRoaXMuc2V0dGluZ3MuZXJyb3JMYWJlbENvbnRhaW5lciksdGhpcy5lcnJvckNvbnRleHQ9dGhpcy5sYWJlbENvbnRhaW5lci5sZW5ndGgmJnRoaXMubGFiZWxDb250YWluZXJ8fGEodGhpcy5jdXJyZW50Rm9ybSksdGhpcy5jb250YWluZXJzPWEodGhpcy5zZXR0aW5ncy5lcnJvckNvbnRhaW5lcikuYWRkKHRoaXMuc2V0dGluZ3MuZXJyb3JMYWJlbENvbnRhaW5lciksdGhpcy5zdWJtaXR0ZWQ9e30sdGhpcy52YWx1ZUNhY2hlPXt9LHRoaXMucGVuZGluZ1JlcXVlc3Q9MCx0aGlzLnBlbmRpbmc9e30sdGhpcy5pbnZhbGlkPXt9LHRoaXMucmVzZXQoKTt2YXIgYyxkPXRoaXMuY3VycmVudEZvcm0sZT10aGlzLmdyb3Vwcz17fTthLmVhY2godGhpcy5zZXR0aW5ncy5ncm91cHMsZnVuY3Rpb24oYixjKXtcInN0cmluZ1wiPT10eXBlb2YgYyYmKGM9Yy5zcGxpdCgvXFxzLykpLGEuZWFjaChjLGZ1bmN0aW9uKGEsYyl7ZVtjXT1ifSl9KSxjPXRoaXMuc2V0dGluZ3MucnVsZXMsYS5lYWNoKGMsZnVuY3Rpb24oYixkKXtjW2JdPWEudmFsaWRhdG9yLm5vcm1hbGl6ZVJ1bGUoZCl9KSxhKHRoaXMuY3VycmVudEZvcm0pLm9uKFwiZm9jdXNpbi52YWxpZGF0ZSBmb2N1c291dC52YWxpZGF0ZSBrZXl1cC52YWxpZGF0ZVwiLFwiOnRleHQsIFt0eXBlPSdwYXNzd29yZCddLCBbdHlwZT0nZmlsZSddLCBzZWxlY3QsIHRleHRhcmVhLCBbdHlwZT0nbnVtYmVyJ10sIFt0eXBlPSdzZWFyY2gnXSwgW3R5cGU9J3RlbCddLCBbdHlwZT0ndXJsJ10sIFt0eXBlPSdlbWFpbCddLCBbdHlwZT0nZGF0ZXRpbWUnXSwgW3R5cGU9J2RhdGUnXSwgW3R5cGU9J21vbnRoJ10sIFt0eXBlPSd3ZWVrJ10sIFt0eXBlPSd0aW1lJ10sIFt0eXBlPSdkYXRldGltZS1sb2NhbCddLCBbdHlwZT0ncmFuZ2UnXSwgW3R5cGU9J2NvbG9yJ10sIFt0eXBlPSdyYWRpbyddLCBbdHlwZT0nY2hlY2tib3gnXSwgW2NvbnRlbnRlZGl0YWJsZV0sIFt0eXBlPSdidXR0b24nXVwiLGIpLm9uKFwiY2xpY2sudmFsaWRhdGVcIixcInNlbGVjdCwgb3B0aW9uLCBbdHlwZT0ncmFkaW8nXSwgW3R5cGU9J2NoZWNrYm94J11cIixiKSx0aGlzLnNldHRpbmdzLmludmFsaWRIYW5kbGVyJiZhKHRoaXMuY3VycmVudEZvcm0pLm9uKFwiaW52YWxpZC1mb3JtLnZhbGlkYXRlXCIsdGhpcy5zZXR0aW5ncy5pbnZhbGlkSGFuZGxlcil9LGZvcm06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGVja0Zvcm0oKSxhLmV4dGVuZCh0aGlzLnN1Ym1pdHRlZCx0aGlzLmVycm9yTWFwKSx0aGlzLmludmFsaWQ9YS5leHRlbmQoe30sdGhpcy5lcnJvck1hcCksdGhpcy52YWxpZCgpfHxhKHRoaXMuY3VycmVudEZvcm0pLnRyaWdnZXJIYW5kbGVyKFwiaW52YWxpZC1mb3JtXCIsW3RoaXNdKSx0aGlzLnNob3dFcnJvcnMoKSx0aGlzLnZhbGlkKCl9LGNoZWNrRm9ybTpmdW5jdGlvbigpe3RoaXMucHJlcGFyZUZvcm0oKTtmb3IodmFyIGE9MCxiPXRoaXMuY3VycmVudEVsZW1lbnRzPXRoaXMuZWxlbWVudHMoKTtiW2FdO2ErKyl0aGlzLmNoZWNrKGJbYV0pO3JldHVybiB0aGlzLnZhbGlkKCl9LGVsZW1lbnQ6ZnVuY3Rpb24oYil7dmFyIGMsZCxlPXRoaXMuY2xlYW4oYiksZj10aGlzLnZhbGlkYXRpb25UYXJnZXRGb3IoZSksZz10aGlzLGg9ITA7cmV0dXJuIHZvaWQgMD09PWY/ZGVsZXRlIHRoaXMuaW52YWxpZFtlLm5hbWVdOih0aGlzLnByZXBhcmVFbGVtZW50KGYpLHRoaXMuY3VycmVudEVsZW1lbnRzPWEoZiksZD10aGlzLmdyb3Vwc1tmLm5hbWVdLGQmJmEuZWFjaCh0aGlzLmdyb3VwcyxmdW5jdGlvbihhLGIpe2I9PT1kJiZhIT09Zi5uYW1lJiYoZT1nLnZhbGlkYXRpb25UYXJnZXRGb3IoZy5jbGVhbihnLmZpbmRCeU5hbWUoYSkpKSxlJiZlLm5hbWUgaW4gZy5pbnZhbGlkJiYoZy5jdXJyZW50RWxlbWVudHMucHVzaChlKSxoPWcuY2hlY2soZSkmJmgpKX0pLGM9dGhpcy5jaGVjayhmKSE9PSExLGg9aCYmYyxjP3RoaXMuaW52YWxpZFtmLm5hbWVdPSExOnRoaXMuaW52YWxpZFtmLm5hbWVdPSEwLHRoaXMubnVtYmVyT2ZJbnZhbGlkcygpfHwodGhpcy50b0hpZGU9dGhpcy50b0hpZGUuYWRkKHRoaXMuY29udGFpbmVycykpLHRoaXMuc2hvd0Vycm9ycygpLGEoYikuYXR0cihcImFyaWEtaW52YWxpZFwiLCFjKSksaH0sc2hvd0Vycm9yczpmdW5jdGlvbihiKXtpZihiKXt2YXIgYz10aGlzO2EuZXh0ZW5kKHRoaXMuZXJyb3JNYXAsYiksdGhpcy5lcnJvckxpc3Q9YS5tYXAodGhpcy5lcnJvck1hcCxmdW5jdGlvbihhLGIpe3JldHVybnttZXNzYWdlOmEsZWxlbWVudDpjLmZpbmRCeU5hbWUoYilbMF19fSksdGhpcy5zdWNjZXNzTGlzdD1hLmdyZXAodGhpcy5zdWNjZXNzTGlzdCxmdW5jdGlvbihhKXtyZXR1cm4hKGEubmFtZSBpbiBiKX0pfXRoaXMuc2V0dGluZ3Muc2hvd0Vycm9ycz90aGlzLnNldHRpbmdzLnNob3dFcnJvcnMuY2FsbCh0aGlzLHRoaXMuZXJyb3JNYXAsdGhpcy5lcnJvckxpc3QpOnRoaXMuZGVmYXVsdFNob3dFcnJvcnMoKX0scmVzZXRGb3JtOmZ1bmN0aW9uKCl7YS5mbi5yZXNldEZvcm0mJmEodGhpcy5jdXJyZW50Rm9ybSkucmVzZXRGb3JtKCksdGhpcy5pbnZhbGlkPXt9LHRoaXMuc3VibWl0dGVkPXt9LHRoaXMucHJlcGFyZUZvcm0oKSx0aGlzLmhpZGVFcnJvcnMoKTt2YXIgYj10aGlzLmVsZW1lbnRzKCkucmVtb3ZlRGF0YShcInByZXZpb3VzVmFsdWVcIikucmVtb3ZlQXR0cihcImFyaWEtaW52YWxpZFwiKTt0aGlzLnJlc2V0RWxlbWVudHMoYil9LHJlc2V0RWxlbWVudHM6ZnVuY3Rpb24oYSl7dmFyIGI7aWYodGhpcy5zZXR0aW5ncy51bmhpZ2hsaWdodClmb3IoYj0wO2FbYl07YisrKXRoaXMuc2V0dGluZ3MudW5oaWdobGlnaHQuY2FsbCh0aGlzLGFbYl0sdGhpcy5zZXR0aW5ncy5lcnJvckNsYXNzLFwiXCIpLHRoaXMuZmluZEJ5TmFtZShhW2JdLm5hbWUpLnJlbW92ZUNsYXNzKHRoaXMuc2V0dGluZ3MudmFsaWRDbGFzcyk7ZWxzZSBhLnJlbW92ZUNsYXNzKHRoaXMuc2V0dGluZ3MuZXJyb3JDbGFzcykucmVtb3ZlQ2xhc3ModGhpcy5zZXR0aW5ncy52YWxpZENsYXNzKX0sbnVtYmVyT2ZJbnZhbGlkczpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9iamVjdExlbmd0aCh0aGlzLmludmFsaWQpfSxvYmplY3RMZW5ndGg6ZnVuY3Rpb24oYSl7dmFyIGIsYz0wO2ZvcihiIGluIGEpdm9pZCAwIT09YVtiXSYmbnVsbCE9PWFbYl0mJmFbYl0hPT0hMSYmYysrO3JldHVybiBjfSxoaWRlRXJyb3JzOmZ1bmN0aW9uKCl7dGhpcy5oaWRlVGhlc2UodGhpcy50b0hpZGUpfSxoaWRlVGhlc2U6ZnVuY3Rpb24oYSl7YS5ub3QodGhpcy5jb250YWluZXJzKS50ZXh0KFwiXCIpLHRoaXMuYWRkV3JhcHBlcihhKS5oaWRlKCl9LHZhbGlkOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnNpemUoKX0sc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yTGlzdC5sZW5ndGh9LGZvY3VzSW52YWxpZDpmdW5jdGlvbigpe2lmKHRoaXMuc2V0dGluZ3MuZm9jdXNJbnZhbGlkKXRyeXthKHRoaXMuZmluZExhc3RBY3RpdmUoKXx8dGhpcy5lcnJvckxpc3QubGVuZ3RoJiZ0aGlzLmVycm9yTGlzdFswXS5lbGVtZW50fHxbXSkuZmlsdGVyKFwiOnZpc2libGVcIikuZm9jdXMoKS50cmlnZ2VyKFwiZm9jdXNpblwiKX1jYXRjaChiKXt9fSxmaW5kTGFzdEFjdGl2ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMubGFzdEFjdGl2ZTtyZXR1cm4gYiYmMT09PWEuZ3JlcCh0aGlzLmVycm9yTGlzdCxmdW5jdGlvbihhKXtyZXR1cm4gYS5lbGVtZW50Lm5hbWU9PT1iLm5hbWV9KS5sZW5ndGgmJmJ9LGVsZW1lbnRzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcyxjPXt9O3JldHVybiBhKHRoaXMuY3VycmVudEZvcm0pLmZpbmQoXCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgW2NvbnRlbnRlZGl0YWJsZV1cIikubm90KFwiOnN1Ym1pdCwgOnJlc2V0LCA6aW1hZ2UsIDpkaXNhYmxlZFwiKS5ub3QodGhpcy5zZXR0aW5ncy5pZ25vcmUpLmZpbHRlcihmdW5jdGlvbigpe3ZhciBkPXRoaXMubmFtZXx8YSh0aGlzKS5hdHRyKFwibmFtZVwiKSxlPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBhKHRoaXMpLmF0dHIoXCJjb250ZW50ZWRpdGFibGVcIikmJlwiZmFsc2VcIiE9PWEodGhpcykuYXR0cihcImNvbnRlbnRlZGl0YWJsZVwiKTtyZXR1cm4hZCYmYi5zZXR0aW5ncy5kZWJ1ZyYmd2luZG93LmNvbnNvbGUmJmNvbnNvbGUuZXJyb3IoXCIlbyBoYXMgbm8gbmFtZSBhc3NpZ25lZFwiLHRoaXMpLGUmJih0aGlzLmZvcm09YSh0aGlzKS5jbG9zZXN0KFwiZm9ybVwiKVswXSx0aGlzLm5hbWU9ZCksdGhpcy5mb3JtPT09Yi5jdXJyZW50Rm9ybSYmKCEoZCBpbiBjfHwhYi5vYmplY3RMZW5ndGgoYSh0aGlzKS5ydWxlcygpKSkmJihjW2RdPSEwLCEwKSl9KX0sY2xlYW46ZnVuY3Rpb24oYil7cmV0dXJuIGEoYilbMF19LGVycm9yczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuc2V0dGluZ3MuZXJyb3JDbGFzcy5zcGxpdChcIiBcIikuam9pbihcIi5cIik7cmV0dXJuIGEodGhpcy5zZXR0aW5ncy5lcnJvckVsZW1lbnQrXCIuXCIrYix0aGlzLmVycm9yQ29udGV4dCl9LHJlc2V0SW50ZXJuYWxzOmZ1bmN0aW9uKCl7dGhpcy5zdWNjZXNzTGlzdD1bXSx0aGlzLmVycm9yTGlzdD1bXSx0aGlzLmVycm9yTWFwPXt9LHRoaXMudG9TaG93PWEoW10pLHRoaXMudG9IaWRlPWEoW10pfSxyZXNldDpmdW5jdGlvbigpe3RoaXMucmVzZXRJbnRlcm5hbHMoKSx0aGlzLmN1cnJlbnRFbGVtZW50cz1hKFtdKX0scHJlcGFyZUZvcm06ZnVuY3Rpb24oKXt0aGlzLnJlc2V0KCksdGhpcy50b0hpZGU9dGhpcy5lcnJvcnMoKS5hZGQodGhpcy5jb250YWluZXJzKX0scHJlcGFyZUVsZW1lbnQ6ZnVuY3Rpb24oYSl7dGhpcy5yZXNldCgpLHRoaXMudG9IaWRlPXRoaXMuZXJyb3JzRm9yKGEpfSxlbGVtZW50VmFsdWU6ZnVuY3Rpb24oYil7dmFyIGMsZCxlPWEoYiksZj1iLnR5cGUsZz1cInVuZGVmaW5lZFwiIT10eXBlb2YgZS5hdHRyKFwiY29udGVudGVkaXRhYmxlXCIpJiZcImZhbHNlXCIhPT1lLmF0dHIoXCJjb250ZW50ZWRpdGFibGVcIik7cmV0dXJuXCJyYWRpb1wiPT09Znx8XCJjaGVja2JveFwiPT09Zj90aGlzLmZpbmRCeU5hbWUoYi5uYW1lKS5maWx0ZXIoXCI6Y2hlY2tlZFwiKS52YWwoKTpcIm51bWJlclwiPT09ZiYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGIudmFsaWRpdHk/Yi52YWxpZGl0eS5iYWRJbnB1dD9cIk5hTlwiOmUudmFsKCk6KGM9Zz9lLnRleHQoKTplLnZhbCgpLFwiZmlsZVwiPT09Zj9cIkM6XFxcXGZha2VwYXRoXFxcXFwiPT09Yy5zdWJzdHIoMCwxMik/Yy5zdWJzdHIoMTIpOihkPWMubGFzdEluZGV4T2YoXCIvXCIpLGQ+PTA/Yy5zdWJzdHIoZCsxKTooZD1jLmxhc3RJbmRleE9mKFwiXFxcXFwiKSxkPj0wP2Muc3Vic3RyKGQrMSk6YykpOlwic3RyaW5nXCI9PXR5cGVvZiBjP2MucmVwbGFjZSgvXFxyL2csXCJcIik6Yyl9LGNoZWNrOmZ1bmN0aW9uKGIpe2I9dGhpcy52YWxpZGF0aW9uVGFyZ2V0Rm9yKHRoaXMuY2xlYW4oYikpO3ZhciBjLGQsZSxmLGc9YShiKS5ydWxlcygpLGg9YS5tYXAoZyxmdW5jdGlvbihhLGIpe3JldHVybiBifSkubGVuZ3RoLGk9ITEsaj10aGlzLmVsZW1lbnRWYWx1ZShiKTtcImZ1bmN0aW9uXCI9PXR5cGVvZiBnLm5vcm1hbGl6ZXI/Zj1nLm5vcm1hbGl6ZXI6XCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5zZXR0aW5ncy5ub3JtYWxpemVyJiYoZj10aGlzLnNldHRpbmdzLm5vcm1hbGl6ZXIpLGYmJihqPWYuY2FsbChiLGopLGRlbGV0ZSBnLm5vcm1hbGl6ZXIpO2ZvcihkIGluIGcpe2U9e21ldGhvZDpkLHBhcmFtZXRlcnM6Z1tkXX07dHJ5e2lmKGM9YS52YWxpZGF0b3IubWV0aG9kc1tkXS5jYWxsKHRoaXMsaixiLGUucGFyYW1ldGVycyksXCJkZXBlbmRlbmN5LW1pc21hdGNoXCI9PT1jJiYxPT09aCl7aT0hMDtjb250aW51ZX1pZihpPSExLFwicGVuZGluZ1wiPT09YylyZXR1cm4gdm9pZCh0aGlzLnRvSGlkZT10aGlzLnRvSGlkZS5ub3QodGhpcy5lcnJvcnNGb3IoYikpKTtpZighYylyZXR1cm4gdGhpcy5mb3JtYXRBbmRBZGQoYixlKSwhMX1jYXRjaChrKXt0aHJvdyB0aGlzLnNldHRpbmdzLmRlYnVnJiZ3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2coXCJFeGNlcHRpb24gb2NjdXJyZWQgd2hlbiBjaGVja2luZyBlbGVtZW50IFwiK2IuaWQrXCIsIGNoZWNrIHRoZSAnXCIrZS5tZXRob2QrXCInIG1ldGhvZC5cIixrKSxrIGluc3RhbmNlb2YgVHlwZUVycm9yJiYoay5tZXNzYWdlKz1cIi4gIEV4Y2VwdGlvbiBvY2N1cnJlZCB3aGVuIGNoZWNraW5nIGVsZW1lbnQgXCIrYi5pZCtcIiwgY2hlY2sgdGhlICdcIitlLm1ldGhvZCtcIicgbWV0aG9kLlwiKSxrfX1pZighaSlyZXR1cm4gdGhpcy5vYmplY3RMZW5ndGgoZykmJnRoaXMuc3VjY2Vzc0xpc3QucHVzaChiKSwhMH0sY3VzdG9tRGF0YU1lc3NhZ2U6ZnVuY3Rpb24oYixjKXtyZXR1cm4gYShiKS5kYXRhKFwibXNnXCIrYy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStjLnN1YnN0cmluZygxKS50b0xvd2VyQ2FzZSgpKXx8YShiKS5kYXRhKFwibXNnXCIpfSxjdXN0b21NZXNzYWdlOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5zZXR0aW5ncy5tZXNzYWdlc1thXTtyZXR1cm4gYyYmKGMuY29uc3RydWN0b3I9PT1TdHJpbmc/YzpjW2JdKX0sZmluZERlZmluZWQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPGFyZ3VtZW50cy5sZW5ndGg7YSsrKWlmKHZvaWQgMCE9PWFyZ3VtZW50c1thXSlyZXR1cm4gYXJndW1lbnRzW2FdfSxkZWZhdWx0TWVzc2FnZTpmdW5jdGlvbihiLGMpe1wic3RyaW5nXCI9PXR5cGVvZiBjJiYoYz17bWV0aG9kOmN9KTt2YXIgZD10aGlzLmZpbmREZWZpbmVkKHRoaXMuY3VzdG9tTWVzc2FnZShiLm5hbWUsYy5tZXRob2QpLHRoaXMuY3VzdG9tRGF0YU1lc3NhZ2UoYixjLm1ldGhvZCksIXRoaXMuc2V0dGluZ3MuaWdub3JlVGl0bGUmJmIudGl0bGV8fHZvaWQgMCxhLnZhbGlkYXRvci5tZXNzYWdlc1tjLm1ldGhvZF0sXCI8c3Ryb25nPldhcm5pbmc6IE5vIG1lc3NhZ2UgZGVmaW5lZCBmb3IgXCIrYi5uYW1lK1wiPC9zdHJvbmc+XCIpLGU9L1xcJD9cXHsoXFxkKylcXH0vZztyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBkP2Q9ZC5jYWxsKHRoaXMsYy5wYXJhbWV0ZXJzLGIpOmUudGVzdChkKSYmKGQ9YS52YWxpZGF0b3IuZm9ybWF0KGQucmVwbGFjZShlLFwieyQxfVwiKSxjLnBhcmFtZXRlcnMpKSxkfSxmb3JtYXRBbmRBZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLmRlZmF1bHRNZXNzYWdlKGEsYik7dGhpcy5lcnJvckxpc3QucHVzaCh7bWVzc2FnZTpjLGVsZW1lbnQ6YSxtZXRob2Q6Yi5tZXRob2R9KSx0aGlzLmVycm9yTWFwW2EubmFtZV09Yyx0aGlzLnN1Ym1pdHRlZFthLm5hbWVdPWN9LGFkZFdyYXBwZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0dGluZ3Mud3JhcHBlciYmKGE9YS5hZGQoYS5wYXJlbnQodGhpcy5zZXR0aW5ncy53cmFwcGVyKSkpLGF9LGRlZmF1bHRTaG93RXJyb3JzOmZ1bmN0aW9uKCl7dmFyIGEsYixjO2ZvcihhPTA7dGhpcy5lcnJvckxpc3RbYV07YSsrKWM9dGhpcy5lcnJvckxpc3RbYV0sdGhpcy5zZXR0aW5ncy5oaWdobGlnaHQmJnRoaXMuc2V0dGluZ3MuaGlnaGxpZ2h0LmNhbGwodGhpcyxjLmVsZW1lbnQsdGhpcy5zZXR0aW5ncy5lcnJvckNsYXNzLHRoaXMuc2V0dGluZ3MudmFsaWRDbGFzcyksdGhpcy5zaG93TGFiZWwoYy5lbGVtZW50LGMubWVzc2FnZSk7aWYodGhpcy5lcnJvckxpc3QubGVuZ3RoJiYodGhpcy50b1Nob3c9dGhpcy50b1Nob3cuYWRkKHRoaXMuY29udGFpbmVycykpLHRoaXMuc2V0dGluZ3Muc3VjY2Vzcylmb3IoYT0wO3RoaXMuc3VjY2Vzc0xpc3RbYV07YSsrKXRoaXMuc2hvd0xhYmVsKHRoaXMuc3VjY2Vzc0xpc3RbYV0pO2lmKHRoaXMuc2V0dGluZ3MudW5oaWdobGlnaHQpZm9yKGE9MCxiPXRoaXMudmFsaWRFbGVtZW50cygpO2JbYV07YSsrKXRoaXMuc2V0dGluZ3MudW5oaWdobGlnaHQuY2FsbCh0aGlzLGJbYV0sdGhpcy5zZXR0aW5ncy5lcnJvckNsYXNzLHRoaXMuc2V0dGluZ3MudmFsaWRDbGFzcyk7dGhpcy50b0hpZGU9dGhpcy50b0hpZGUubm90KHRoaXMudG9TaG93KSx0aGlzLmhpZGVFcnJvcnMoKSx0aGlzLmFkZFdyYXBwZXIodGhpcy50b1Nob3cpLnNob3coKX0sdmFsaWRFbGVtZW50czpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnJlbnRFbGVtZW50cy5ub3QodGhpcy5pbnZhbGlkRWxlbWVudHMoKSl9LGludmFsaWRFbGVtZW50czpmdW5jdGlvbigpe3JldHVybiBhKHRoaXMuZXJyb3JMaXN0KS5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50fSl9LHNob3dMYWJlbDpmdW5jdGlvbihiLGMpe3ZhciBkLGUsZixnLGg9dGhpcy5lcnJvcnNGb3IoYiksaT10aGlzLmlkT3JOYW1lKGIpLGo9YShiKS5hdHRyKFwiYXJpYS1kZXNjcmliZWRieVwiKTtoLmxlbmd0aD8oaC5yZW1vdmVDbGFzcyh0aGlzLnNldHRpbmdzLnZhbGlkQ2xhc3MpLmFkZENsYXNzKHRoaXMuc2V0dGluZ3MuZXJyb3JDbGFzcyksaC5odG1sKGMpKTooaD1hKFwiPFwiK3RoaXMuc2V0dGluZ3MuZXJyb3JFbGVtZW50K1wiPlwiKS5hdHRyKFwiaWRcIixpK1wiLWVycm9yXCIpLmFkZENsYXNzKHRoaXMuc2V0dGluZ3MuZXJyb3JDbGFzcykuaHRtbChjfHxcIlwiKSxkPWgsdGhpcy5zZXR0aW5ncy53cmFwcGVyJiYoZD1oLmhpZGUoKS5zaG93KCkud3JhcChcIjxcIit0aGlzLnNldHRpbmdzLndyYXBwZXIrXCIvPlwiKS5wYXJlbnQoKSksdGhpcy5sYWJlbENvbnRhaW5lci5sZW5ndGg/dGhpcy5sYWJlbENvbnRhaW5lci5hcHBlbmQoZCk6dGhpcy5zZXR0aW5ncy5lcnJvclBsYWNlbWVudD90aGlzLnNldHRpbmdzLmVycm9yUGxhY2VtZW50LmNhbGwodGhpcyxkLGEoYikpOmQuaW5zZXJ0QWZ0ZXIoYiksaC5pcyhcImxhYmVsXCIpP2guYXR0cihcImZvclwiLGkpOjA9PT1oLnBhcmVudHMoXCJsYWJlbFtmb3I9J1wiK3RoaXMuZXNjYXBlQ3NzTWV0YShpKStcIiddXCIpLmxlbmd0aCYmKGY9aC5hdHRyKFwiaWRcIiksaj9qLm1hdGNoKG5ldyBSZWdFeHAoXCJcXFxcYlwiK3RoaXMuZXNjYXBlQ3NzTWV0YShmKStcIlxcXFxiXCIpKXx8KGorPVwiIFwiK2YpOmo9ZixhKGIpLmF0dHIoXCJhcmlhLWRlc2NyaWJlZGJ5XCIsaiksZT10aGlzLmdyb3Vwc1tiLm5hbWVdLGUmJihnPXRoaXMsYS5lYWNoKGcuZ3JvdXBzLGZ1bmN0aW9uKGIsYyl7Yz09PWUmJmEoXCJbbmFtZT0nXCIrZy5lc2NhcGVDc3NNZXRhKGIpK1wiJ11cIixnLmN1cnJlbnRGb3JtKS5hdHRyKFwiYXJpYS1kZXNjcmliZWRieVwiLGguYXR0cihcImlkXCIpKX0pKSkpLCFjJiZ0aGlzLnNldHRpbmdzLnN1Y2Nlc3MmJihoLnRleHQoXCJcIiksXCJzdHJpbmdcIj09dHlwZW9mIHRoaXMuc2V0dGluZ3Muc3VjY2Vzcz9oLmFkZENsYXNzKHRoaXMuc2V0dGluZ3Muc3VjY2Vzcyk6dGhpcy5zZXR0aW5ncy5zdWNjZXNzKGgsYikpLHRoaXMudG9TaG93PXRoaXMudG9TaG93LmFkZChoKX0sZXJyb3JzRm9yOmZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMuZXNjYXBlQ3NzTWV0YSh0aGlzLmlkT3JOYW1lKGIpKSxkPWEoYikuYXR0cihcImFyaWEtZGVzY3JpYmVkYnlcIiksZT1cImxhYmVsW2Zvcj0nXCIrYytcIiddLCBsYWJlbFtmb3I9J1wiK2MrXCInXSAqXCI7cmV0dXJuIGQmJihlPWUrXCIsICNcIit0aGlzLmVzY2FwZUNzc01ldGEoZCkucmVwbGFjZSgvXFxzKy9nLFwiLCAjXCIpKSx0aGlzLmVycm9ycygpLmZpbHRlcihlKX0sZXNjYXBlQ3NzTWV0YTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZXBsYWNlKC8oW1xcXFwhXCIjJCUmJygpKissLlxcLzo7PD0+P0BcXFtcXF1eYHt8fX5dKS9nLFwiXFxcXCQxXCIpfSxpZE9yTmFtZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ncm91cHNbYS5uYW1lXXx8KHRoaXMuY2hlY2thYmxlKGEpP2EubmFtZTphLmlkfHxhLm5hbWUpfSx2YWxpZGF0aW9uVGFyZ2V0Rm9yOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmNoZWNrYWJsZShiKSYmKGI9dGhpcy5maW5kQnlOYW1lKGIubmFtZSkpLGEoYikubm90KHRoaXMuc2V0dGluZ3MuaWdub3JlKVswXX0sY2hlY2thYmxlOmZ1bmN0aW9uKGEpe3JldHVybi9yYWRpb3xjaGVja2JveC9pLnRlc3QoYS50eXBlKX0sZmluZEJ5TmFtZTpmdW5jdGlvbihiKXtyZXR1cm4gYSh0aGlzLmN1cnJlbnRGb3JtKS5maW5kKFwiW25hbWU9J1wiK3RoaXMuZXNjYXBlQ3NzTWV0YShiKStcIiddXCIpfSxnZXRMZW5ndGg6ZnVuY3Rpb24oYixjKXtzd2l0Y2goYy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXtjYXNlXCJzZWxlY3RcIjpyZXR1cm4gYShcIm9wdGlvbjpzZWxlY3RlZFwiLGMpLmxlbmd0aDtjYXNlXCJpbnB1dFwiOmlmKHRoaXMuY2hlY2thYmxlKGMpKXJldHVybiB0aGlzLmZpbmRCeU5hbWUoYy5uYW1lKS5maWx0ZXIoXCI6Y2hlY2tlZFwiKS5sZW5ndGh9cmV0dXJuIGIubGVuZ3RofSxkZXBlbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hdGhpcy5kZXBlbmRUeXBlc1t0eXBlb2YgYV18fHRoaXMuZGVwZW5kVHlwZXNbdHlwZW9mIGFdKGEsYil9LGRlcGVuZFR5cGVzOntcImJvb2xlYW5cIjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3RyaW5nOmZ1bmN0aW9uKGIsYyl7cmV0dXJuISFhKGIsYy5mb3JtKS5sZW5ndGh9LFwiZnVuY3Rpb25cIjpmdW5jdGlvbihhLGIpe3JldHVybiBhKGIpfX0sb3B0aW9uYWw6ZnVuY3Rpb24oYil7dmFyIGM9dGhpcy5lbGVtZW50VmFsdWUoYik7cmV0dXJuIWEudmFsaWRhdG9yLm1ldGhvZHMucmVxdWlyZWQuY2FsbCh0aGlzLGMsYikmJlwiZGVwZW5kZW5jeS1taXNtYXRjaFwifSxzdGFydFJlcXVlc3Q6ZnVuY3Rpb24oYil7dGhpcy5wZW5kaW5nW2IubmFtZV18fCh0aGlzLnBlbmRpbmdSZXF1ZXN0KyssYShiKS5hZGRDbGFzcyh0aGlzLnNldHRpbmdzLnBlbmRpbmdDbGFzcyksdGhpcy5wZW5kaW5nW2IubmFtZV09ITApfSxzdG9wUmVxdWVzdDpmdW5jdGlvbihiLGMpe3RoaXMucGVuZGluZ1JlcXVlc3QtLSx0aGlzLnBlbmRpbmdSZXF1ZXN0PDAmJih0aGlzLnBlbmRpbmdSZXF1ZXN0PTApLGRlbGV0ZSB0aGlzLnBlbmRpbmdbYi5uYW1lXSxhKGIpLnJlbW92ZUNsYXNzKHRoaXMuc2V0dGluZ3MucGVuZGluZ0NsYXNzKSxjJiYwPT09dGhpcy5wZW5kaW5nUmVxdWVzdCYmdGhpcy5mb3JtU3VibWl0dGVkJiZ0aGlzLmZvcm0oKT8oYSh0aGlzLmN1cnJlbnRGb3JtKS5zdWJtaXQoKSx0aGlzLnN1Ym1pdEJ1dHRvbiYmYShcImlucHV0OmhpZGRlbltuYW1lPSdcIit0aGlzLnN1Ym1pdEJ1dHRvbi5uYW1lK1wiJ11cIix0aGlzLmN1cnJlbnRGb3JtKS5yZW1vdmUoKSx0aGlzLmZvcm1TdWJtaXR0ZWQ9ITEpOiFjJiYwPT09dGhpcy5wZW5kaW5nUmVxdWVzdCYmdGhpcy5mb3JtU3VibWl0dGVkJiYoYSh0aGlzLmN1cnJlbnRGb3JtKS50cmlnZ2VySGFuZGxlcihcImludmFsaWQtZm9ybVwiLFt0aGlzXSksdGhpcy5mb3JtU3VibWl0dGVkPSExKX0scHJldmlvdXNWYWx1ZTpmdW5jdGlvbihiLGMpe3JldHVybiBjPVwic3RyaW5nXCI9PXR5cGVvZiBjJiZjfHxcInJlbW90ZVwiLGEuZGF0YShiLFwicHJldmlvdXNWYWx1ZVwiKXx8YS5kYXRhKGIsXCJwcmV2aW91c1ZhbHVlXCIse29sZDpudWxsLHZhbGlkOiEwLG1lc3NhZ2U6dGhpcy5kZWZhdWx0TWVzc2FnZShiLHttZXRob2Q6Y30pfSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnJlc2V0Rm9ybSgpLGEodGhpcy5jdXJyZW50Rm9ybSkub2ZmKFwiLnZhbGlkYXRlXCIpLnJlbW92ZURhdGEoXCJ2YWxpZGF0b3JcIikuZmluZChcIi52YWxpZGF0ZS1lcXVhbFRvLWJsdXJcIikub2ZmKFwiLnZhbGlkYXRlLWVxdWFsVG9cIikucmVtb3ZlQ2xhc3MoXCJ2YWxpZGF0ZS1lcXVhbFRvLWJsdXJcIikuZmluZChcIi52YWxpZGF0ZS1sZXNzVGhhbi1ibHVyXCIpLm9mZihcIi52YWxpZGF0ZS1sZXNzVGhhblwiKS5yZW1vdmVDbGFzcyhcInZhbGlkYXRlLWxlc3NUaGFuLWJsdXJcIikuZmluZChcIi52YWxpZGF0ZS1sZXNzVGhhbkVxdWFsLWJsdXJcIikub2ZmKFwiLnZhbGlkYXRlLWxlc3NUaGFuRXF1YWxcIikucmVtb3ZlQ2xhc3MoXCJ2YWxpZGF0ZS1sZXNzVGhhbkVxdWFsLWJsdXJcIikuZmluZChcIi52YWxpZGF0ZS1ncmVhdGVyVGhhbkVxdWFsLWJsdXJcIikub2ZmKFwiLnZhbGlkYXRlLWdyZWF0ZXJUaGFuRXF1YWxcIikucmVtb3ZlQ2xhc3MoXCJ2YWxpZGF0ZS1ncmVhdGVyVGhhbkVxdWFsLWJsdXJcIikuZmluZChcIi52YWxpZGF0ZS1ncmVhdGVyVGhhbi1ibHVyXCIpLm9mZihcIi52YWxpZGF0ZS1ncmVhdGVyVGhhblwiKS5yZW1vdmVDbGFzcyhcInZhbGlkYXRlLWdyZWF0ZXJUaGFuLWJsdXJcIil9fSxjbGFzc1J1bGVTZXR0aW5nczp7cmVxdWlyZWQ6e3JlcXVpcmVkOiEwfSxlbWFpbDp7ZW1haWw6ITB9LHVybDp7dXJsOiEwfSxkYXRlOntkYXRlOiEwfSxkYXRlSVNPOntkYXRlSVNPOiEwfSxudW1iZXI6e251bWJlcjohMH0sZGlnaXRzOntkaWdpdHM6ITB9LGNyZWRpdGNhcmQ6e2NyZWRpdGNhcmQ6ITB9fSxhZGRDbGFzc1J1bGVzOmZ1bmN0aW9uKGIsYyl7Yi5jb25zdHJ1Y3Rvcj09PVN0cmluZz90aGlzLmNsYXNzUnVsZVNldHRpbmdzW2JdPWM6YS5leHRlbmQodGhpcy5jbGFzc1J1bGVTZXR0aW5ncyxiKX0sY2xhc3NSdWxlczpmdW5jdGlvbihiKXt2YXIgYz17fSxkPWEoYikuYXR0cihcImNsYXNzXCIpO3JldHVybiBkJiZhLmVhY2goZC5zcGxpdChcIiBcIiksZnVuY3Rpb24oKXt0aGlzIGluIGEudmFsaWRhdG9yLmNsYXNzUnVsZVNldHRpbmdzJiZhLmV4dGVuZChjLGEudmFsaWRhdG9yLmNsYXNzUnVsZVNldHRpbmdzW3RoaXNdKX0pLGN9LG5vcm1hbGl6ZUF0dHJpYnV0ZVJ1bGU6ZnVuY3Rpb24oYSxiLGMsZCl7L21pbnxtYXh8c3RlcC8udGVzdChjKSYmKG51bGw9PT1ifHwvbnVtYmVyfHJhbmdlfHRleHQvLnRlc3QoYikpJiYoZD1OdW1iZXIoZCksaXNOYU4oZCkmJihkPXZvaWQgMCkpLGR8fDA9PT1kP2FbY109ZDpiPT09YyYmXCJyYW5nZVwiIT09YiYmKGFbY109ITApfSxhdHRyaWJ1dGVSdWxlczpmdW5jdGlvbihiKXt2YXIgYyxkLGU9e30sZj1hKGIpLGc9Yi5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpO2ZvcihjIGluIGEudmFsaWRhdG9yLm1ldGhvZHMpXCJyZXF1aXJlZFwiPT09Yz8oZD1iLmdldEF0dHJpYnV0ZShjKSxcIlwiPT09ZCYmKGQ9ITApLGQ9ISFkKTpkPWYuYXR0cihjKSx0aGlzLm5vcm1hbGl6ZUF0dHJpYnV0ZVJ1bGUoZSxnLGMsZCk7cmV0dXJuIGUubWF4bGVuZ3RoJiYvLTF8MjE0NzQ4MzY0N3w1MjQyODgvLnRlc3QoZS5tYXhsZW5ndGgpJiZkZWxldGUgZS5tYXhsZW5ndGgsZX0sZGF0YVJ1bGVzOmZ1bmN0aW9uKGIpe3ZhciBjLGQsZT17fSxmPWEoYiksZz1iLmdldEF0dHJpYnV0ZShcInR5cGVcIik7Zm9yKGMgaW4gYS52YWxpZGF0b3IubWV0aG9kcylkPWYuZGF0YShcInJ1bGVcIitjLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Muc3Vic3RyaW5nKDEpLnRvTG93ZXJDYXNlKCkpLFwiXCI9PT1kJiYoZD0hMCksdGhpcy5ub3JtYWxpemVBdHRyaWJ1dGVSdWxlKGUsZyxjLGQpO3JldHVybiBlfSxzdGF0aWNSdWxlczpmdW5jdGlvbihiKXt2YXIgYz17fSxkPWEuZGF0YShiLmZvcm0sXCJ2YWxpZGF0b3JcIik7cmV0dXJuIGQuc2V0dGluZ3MucnVsZXMmJihjPWEudmFsaWRhdG9yLm5vcm1hbGl6ZVJ1bGUoZC5zZXR0aW5ncy5ydWxlc1tiLm5hbWVdKXx8e30pLGN9LG5vcm1hbGl6ZVJ1bGVzOmZ1bmN0aW9uKGIsYyl7cmV0dXJuIGEuZWFjaChiLGZ1bmN0aW9uKGQsZSl7aWYoZT09PSExKXJldHVybiB2b2lkIGRlbGV0ZSBiW2RdO2lmKGUucGFyYW18fGUuZGVwZW5kcyl7dmFyIGY9ITA7c3dpdGNoKHR5cGVvZiBlLmRlcGVuZHMpe2Nhc2VcInN0cmluZ1wiOmY9ISFhKGUuZGVwZW5kcyxjLmZvcm0pLmxlbmd0aDticmVhaztjYXNlXCJmdW5jdGlvblwiOmY9ZS5kZXBlbmRzLmNhbGwoYyxjKX1mP2JbZF09dm9pZCAwPT09ZS5wYXJhbXx8ZS5wYXJhbTooYS5kYXRhKGMuZm9ybSxcInZhbGlkYXRvclwiKS5yZXNldEVsZW1lbnRzKGEoYykpLGRlbGV0ZSBiW2RdKX19KSxhLmVhY2goYixmdW5jdGlvbihkLGUpe2JbZF09YS5pc0Z1bmN0aW9uKGUpJiZcIm5vcm1hbGl6ZXJcIiE9PWQ/ZShjKTplfSksYS5lYWNoKFtcIm1pbmxlbmd0aFwiLFwibWF4bGVuZ3RoXCJdLGZ1bmN0aW9uKCl7Ylt0aGlzXSYmKGJbdGhpc109TnVtYmVyKGJbdGhpc10pKX0pLGEuZWFjaChbXCJyYW5nZWxlbmd0aFwiLFwicmFuZ2VcIl0sZnVuY3Rpb24oKXt2YXIgYztiW3RoaXNdJiYoYS5pc0FycmF5KGJbdGhpc10pP2JbdGhpc109W051bWJlcihiW3RoaXNdWzBdKSxOdW1iZXIoYlt0aGlzXVsxXSldOlwic3RyaW5nXCI9PXR5cGVvZiBiW3RoaXNdJiYoYz1iW3RoaXNdLnJlcGxhY2UoL1tcXFtcXF1dL2csXCJcIikuc3BsaXQoL1tcXHMsXSsvKSxiW3RoaXNdPVtOdW1iZXIoY1swXSksTnVtYmVyKGNbMV0pXSkpfSksYS52YWxpZGF0b3IuYXV0b0NyZWF0ZVJhbmdlcyYmKG51bGwhPWIubWluJiZudWxsIT1iLm1heCYmKGIucmFuZ2U9W2IubWluLGIubWF4XSxkZWxldGUgYi5taW4sZGVsZXRlIGIubWF4KSxudWxsIT1iLm1pbmxlbmd0aCYmbnVsbCE9Yi5tYXhsZW5ndGgmJihiLnJhbmdlbGVuZ3RoPVtiLm1pbmxlbmd0aCxiLm1heGxlbmd0aF0sZGVsZXRlIGIubWlubGVuZ3RoLGRlbGV0ZSBiLm1heGxlbmd0aCkpLGJ9LG5vcm1hbGl6ZVJ1bGU6ZnVuY3Rpb24oYil7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGIpe3ZhciBjPXt9O2EuZWFjaChiLnNwbGl0KC9cXHMvKSxmdW5jdGlvbigpe2NbdGhpc109ITB9KSxiPWN9cmV0dXJuIGJ9LGFkZE1ldGhvZDpmdW5jdGlvbihiLGMsZCl7YS52YWxpZGF0b3IubWV0aG9kc1tiXT1jLGEudmFsaWRhdG9yLm1lc3NhZ2VzW2JdPXZvaWQgMCE9PWQ/ZDphLnZhbGlkYXRvci5tZXNzYWdlc1tiXSxjLmxlbmd0aDwzJiZhLnZhbGlkYXRvci5hZGRDbGFzc1J1bGVzKGIsYS52YWxpZGF0b3Iubm9ybWFsaXplUnVsZShiKSl9LG1ldGhvZHM6e3JlcXVpcmVkOmZ1bmN0aW9uKGIsYyxkKXtpZighdGhpcy5kZXBlbmQoZCxjKSlyZXR1cm5cImRlcGVuZGVuY3ktbWlzbWF0Y2hcIjtpZihcInNlbGVjdFwiPT09Yy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXt2YXIgZT1hKGMpLnZhbCgpO3JldHVybiBlJiZlLmxlbmd0aD4wfXJldHVybiB0aGlzLmNoZWNrYWJsZShjKT90aGlzLmdldExlbmd0aChiLGMpPjA6dm9pZCAwIT09YiYmbnVsbCE9PWImJmIubGVuZ3RoPjB9LGVtYWlsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub3B0aW9uYWwoYil8fC9eW2EtekEtWjAtOS4hIyQlJicqK1xcLz0/Xl9ge3x9fi1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvLnRlc3QoYSl9LHVybDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9wdGlvbmFsKGIpfHwvXig/Oig/Oig/Omh0dHBzP3xmdHApOik/XFwvXFwvKSg/OlxcUysoPzo6XFxTKik/QCk/KD86KD8hKD86MTB8MTI3KSg/OlxcLlxcZHsxLDN9KXszfSkoPyEoPzoxNjlcXC4yNTR8MTkyXFwuMTY4KSg/OlxcLlxcZHsxLDN9KXsyfSkoPyExNzJcXC4oPzoxWzYtOV18MlxcZHwzWzAtMV0pKD86XFwuXFxkezEsM30pezJ9KSg/OlsxLTldXFxkP3wxXFxkXFxkfDJbMDFdXFxkfDIyWzAtM10pKD86XFwuKD86MT9cXGR7MSwyfXwyWzAtNF1cXGR8MjVbMC01XSkpezJ9KD86XFwuKD86WzEtOV1cXGQ/fDFcXGRcXGR8MlswLTRdXFxkfDI1WzAtNF0pKXwoPzooPzpbYS16XFx1MDBhMS1cXHVmZmZmMC05XS0qKSpbYS16XFx1MDBhMS1cXHVmZmZmMC05XSspKD86XFwuKD86W2EtelxcdTAwYTEtXFx1ZmZmZjAtOV0tKikqW2EtelxcdTAwYTEtXFx1ZmZmZjAtOV0rKSooPzpcXC4oPzpbYS16XFx1MDBhMS1cXHVmZmZmXXsyLH0pKS4/KSg/OjpcXGR7Miw1fSk/KD86W1xcLz8jXVxcUyopPyQvaS50ZXN0KGEpfSxkYXRlOmZ1bmN0aW9uKCl7dmFyIGE9ITE7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGF8fChhPSEwLHRoaXMuc2V0dGluZ3MuZGVidWcmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLndhcm4oXCJUaGUgYGRhdGVgIG1ldGhvZCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdmVyc2lvbiAnMi4wLjAnLlxcblBsZWFzZSBkb24ndCB1c2UgaXQsIHNpbmNlIGl0IHJlbGllcyBvbiB0aGUgRGF0ZSBjb25zdHJ1Y3Rvciwgd2hpY2hcXG5iZWhhdmVzIHZlcnkgZGlmZmVyZW50bHkgYWNyb3NzIGJyb3dzZXJzIGFuZCBsb2NhbGVzLiBVc2UgYGRhdGVJU09gXFxuaW5zdGVhZCBvciBvbmUgb2YgdGhlIGxvY2FsZSBzcGVjaWZpYyBtZXRob2RzIGluIGBsb2NhbGl6YXRpb25zL2BcXG5hbmQgYGFkZGl0aW9uYWwtbWV0aG9kcy5qc2AuXCIpKSx0aGlzLm9wdGlvbmFsKGMpfHwhL0ludmFsaWR8TmFOLy50ZXN0KG5ldyBEYXRlKGIpLnRvU3RyaW5nKCkpfX0oKSxkYXRlSVNPOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub3B0aW9uYWwoYil8fC9eXFxkezR9W1xcL1xcLV0oMD9bMS05XXwxWzAxMl0pW1xcL1xcLV0oMD9bMS05XXxbMTJdWzAtOV18M1swMV0pJC8udGVzdChhKX0sbnVtYmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMub3B0aW9uYWwoYil8fC9eKD86LT9cXGQrfC0/XFxkezEsM30oPzosXFxkezN9KSspPyg/OlxcLlxcZCspPyQvLnRlc3QoYSl9LGRpZ2l0czpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9wdGlvbmFsKGIpfHwvXlxcZCskLy50ZXN0KGEpfSxtaW5sZW5ndGg6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEuaXNBcnJheShiKT9iLmxlbmd0aDp0aGlzLmdldExlbmd0aChiLGMpO3JldHVybiB0aGlzLm9wdGlvbmFsKGMpfHxlPj1kfSxtYXhsZW5ndGg6ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEuaXNBcnJheShiKT9iLmxlbmd0aDp0aGlzLmdldExlbmd0aChiLGMpO3JldHVybiB0aGlzLm9wdGlvbmFsKGMpfHxlPD1kfSxyYW5nZWxlbmd0aDpmdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5pc0FycmF5KGIpP2IubGVuZ3RoOnRoaXMuZ2V0TGVuZ3RoKGIsYyk7cmV0dXJuIHRoaXMub3B0aW9uYWwoYyl8fGU+PWRbMF0mJmU8PWRbMV19LG1pbjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub3B0aW9uYWwoYil8fGE+PWN9LG1heDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub3B0aW9uYWwoYil8fGE8PWN9LHJhbmdlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5vcHRpb25hbChiKXx8YT49Y1swXSYmYTw9Y1sxXX0sc3RlcDpmdW5jdGlvbihiLGMsZCl7dmFyIGUsZj1hKGMpLmF0dHIoXCJ0eXBlXCIpLGc9XCJTdGVwIGF0dHJpYnV0ZSBvbiBpbnB1dCB0eXBlIFwiK2YrXCIgaXMgbm90IHN1cHBvcnRlZC5cIixoPVtcInRleHRcIixcIm51bWJlclwiLFwicmFuZ2VcIl0saT1uZXcgUmVnRXhwKFwiXFxcXGJcIitmK1wiXFxcXGJcIiksaj1mJiYhaS50ZXN0KGguam9pbigpKSxrPWZ1bmN0aW9uKGEpe3ZhciBiPShcIlwiK2EpLm1hdGNoKC8oPzpcXC4oXFxkKykpPyQvKTtyZXR1cm4gYiYmYlsxXT9iWzFdLmxlbmd0aDowfSxsPWZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKGEqTWF0aC5wb3coMTAsZSkpfSxtPSEwO2lmKGopdGhyb3cgbmV3IEVycm9yKGcpO3JldHVybiBlPWsoZCksKGsoYik+ZXx8bChiKSVsKGQpIT09MCkmJihtPSExKSx0aGlzLm9wdGlvbmFsKGMpfHxtfSxlcXVhbFRvOmZ1bmN0aW9uKGIsYyxkKXt2YXIgZT1hKGQpO3JldHVybiB0aGlzLnNldHRpbmdzLm9uZm9jdXNvdXQmJmUubm90KFwiLnZhbGlkYXRlLWVxdWFsVG8tYmx1clwiKS5sZW5ndGgmJmUuYWRkQ2xhc3MoXCJ2YWxpZGF0ZS1lcXVhbFRvLWJsdXJcIikub24oXCJibHVyLnZhbGlkYXRlLWVxdWFsVG9cIixmdW5jdGlvbigpe2EoYykudmFsaWQoKX0pLGI9PT1lLnZhbCgpfSxyZW1vdGU6ZnVuY3Rpb24oYixjLGQsZSl7aWYodGhpcy5vcHRpb25hbChjKSlyZXR1cm5cImRlcGVuZGVuY3ktbWlzbWF0Y2hcIjtlPVwic3RyaW5nXCI9PXR5cGVvZiBlJiZlfHxcInJlbW90ZVwiO3ZhciBmLGcsaCxpPXRoaXMucHJldmlvdXNWYWx1ZShjLGUpO3JldHVybiB0aGlzLnNldHRpbmdzLm1lc3NhZ2VzW2MubmFtZV18fCh0aGlzLnNldHRpbmdzLm1lc3NhZ2VzW2MubmFtZV09e30pLGkub3JpZ2luYWxNZXNzYWdlPWkub3JpZ2luYWxNZXNzYWdlfHx0aGlzLnNldHRpbmdzLm1lc3NhZ2VzW2MubmFtZV1bZV0sdGhpcy5zZXR0aW5ncy5tZXNzYWdlc1tjLm5hbWVdW2VdPWkubWVzc2FnZSxkPVwic3RyaW5nXCI9PXR5cGVvZiBkJiZ7dXJsOmR9fHxkLGg9YS5wYXJhbShhLmV4dGVuZCh7ZGF0YTpifSxkLmRhdGEpKSxpLm9sZD09PWg/aS52YWxpZDooaS5vbGQ9aCxmPXRoaXMsdGhpcy5zdGFydFJlcXVlc3QoYyksZz17fSxnW2MubmFtZV09YixhLmFqYXgoYS5leHRlbmQoITAse21vZGU6XCJhYm9ydFwiLHBvcnQ6XCJ2YWxpZGF0ZVwiK2MubmFtZSxkYXRhVHlwZTpcImpzb25cIixkYXRhOmcsY29udGV4dDpmLmN1cnJlbnRGb3JtLHN1Y2Nlc3M6ZnVuY3Rpb24oYSl7dmFyIGQsZyxoLGo9YT09PSEwfHxcInRydWVcIj09PWE7Zi5zZXR0aW5ncy5tZXNzYWdlc1tjLm5hbWVdW2VdPWkub3JpZ2luYWxNZXNzYWdlLGo/KGg9Zi5mb3JtU3VibWl0dGVkLGYucmVzZXRJbnRlcm5hbHMoKSxmLnRvSGlkZT1mLmVycm9yc0ZvcihjKSxmLmZvcm1TdWJtaXR0ZWQ9aCxmLnN1Y2Nlc3NMaXN0LnB1c2goYyksZi5pbnZhbGlkW2MubmFtZV09ITEsZi5zaG93RXJyb3JzKCkpOihkPXt9LGc9YXx8Zi5kZWZhdWx0TWVzc2FnZShjLHttZXRob2Q6ZSxwYXJhbWV0ZXJzOmJ9KSxkW2MubmFtZV09aS5tZXNzYWdlPWcsZi5pbnZhbGlkW2MubmFtZV09ITAsZi5zaG93RXJyb3JzKGQpKSxpLnZhbGlkPWosZi5zdG9wUmVxdWVzdChjLGopfX0sZCkpLFwicGVuZGluZ1wiKX19fSk7dmFyIGIsYz17fTtyZXR1cm4gYS5hamF4UHJlZmlsdGVyP2EuYWpheFByZWZpbHRlcihmdW5jdGlvbihhLGIsZCl7dmFyIGU9YS5wb3J0O1wiYWJvcnRcIj09PWEubW9kZSYmKGNbZV0mJmNbZV0uYWJvcnQoKSxjW2VdPWQpfSk6KGI9YS5hamF4LGEuYWpheD1mdW5jdGlvbihkKXt2YXIgZT0oXCJtb2RlXCJpbiBkP2Q6YS5hamF4U2V0dGluZ3MpLm1vZGUsZj0oXCJwb3J0XCJpbiBkP2Q6YS5hamF4U2V0dGluZ3MpLnBvcnQ7cmV0dXJuXCJhYm9ydFwiPT09ZT8oY1tmXSYmY1tmXS5hYm9ydCgpLGNbZl09Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyksY1tmXSk6Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxhfSk7XHJcbi8qKiFcclxuXHJcbiBAbGljZW5zZVxyXG4gaGFuZGxlYmFycyB2NC4wLjEyXHJcblxyXG5Db3B5cmlnaHQgKEMpIDIwMTEtMjAxNyBieSBZZWh1ZGEgS2F0elxyXG5cclxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxyXG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXHJcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcclxudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxyXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcclxuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcclxuXHJcblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXHJcbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxyXG5USEUgU09GVFdBUkUuXHJcblxyXG4qL1xyXG4hZnVuY3Rpb24oYSxiKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1iKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSxiKTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzLkhhbmRsZWJhcnM9YigpOmEuSGFuZGxlYmFycz1iKCl9KHRoaXMsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihkKXtpZihjW2RdKXJldHVybiBjW2RdLmV4cG9ydHM7dmFyIGU9Y1tkXT17ZXhwb3J0czp7fSxpZDpkLGxvYWRlZDohMX07cmV0dXJuIGFbZF0uY2FsbChlLmV4cG9ydHMsZSxlLmV4cG9ydHMsYiksZS5sb2FkZWQ9ITAsZS5leHBvcnRzfXZhciBjPXt9O3JldHVybiBiLm09YSxiLmM9YyxiLnA9XCJcIixiKDApfShbZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGQoKXt2YXIgYT1yKCk7cmV0dXJuIGEuY29tcGlsZT1mdW5jdGlvbihiLGMpe3JldHVybiBrLmNvbXBpbGUoYixjLGEpfSxhLnByZWNvbXBpbGU9ZnVuY3Rpb24oYixjKXtyZXR1cm4gay5wcmVjb21waWxlKGIsYyxhKX0sYS5BU1Q9aVtcImRlZmF1bHRcIl0sYS5Db21waWxlcj1rLkNvbXBpbGVyLGEuSmF2YVNjcmlwdENvbXBpbGVyPW1bXCJkZWZhdWx0XCJdLGEuUGFyc2VyPWoucGFyc2VyLGEucGFyc2U9ai5wYXJzZSxhfXZhciBlPWMoMSlbXCJkZWZhdWx0XCJdO2IuX19lc01vZHVsZT0hMDt2YXIgZj1jKDIpLGc9ZShmKSxoPWMoMzUpLGk9ZShoKSxqPWMoMzYpLGs9Yyg0MSksbD1jKDQyKSxtPWUobCksbj1jKDM5KSxvPWUobikscD1jKDM0KSxxPWUocCkscj1nW1wiZGVmYXVsdFwiXS5jcmVhdGUscz1kKCk7cy5jcmVhdGU9ZCxxW1wiZGVmYXVsdFwiXShzKSxzLlZpc2l0b3I9b1tcImRlZmF1bHRcIl0sc1tcImRlZmF1bHRcIl09cyxiW1wiZGVmYXVsdFwiXT1zLGEuZXhwb3J0cz1iW1wiZGVmYXVsdFwiXX0sZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjtiW1wiZGVmYXVsdFwiXT1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5fX2VzTW9kdWxlP2E6e1wiZGVmYXVsdFwiOmF9fSxiLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkKCl7dmFyIGE9bmV3IGguSGFuZGxlYmFyc0Vudmlyb25tZW50O3JldHVybiBuLmV4dGVuZChhLGgpLGEuU2FmZVN0cmluZz1qW1wiZGVmYXVsdFwiXSxhLkV4Y2VwdGlvbj1sW1wiZGVmYXVsdFwiXSxhLlV0aWxzPW4sYS5lc2NhcGVFeHByZXNzaW9uPW4uZXNjYXBlRXhwcmVzc2lvbixhLlZNPXAsYS50ZW1wbGF0ZT1mdW5jdGlvbihiKXtyZXR1cm4gcC50ZW1wbGF0ZShiLGEpfSxhfXZhciBlPWMoMylbXCJkZWZhdWx0XCJdLGY9YygxKVtcImRlZmF1bHRcIl07Yi5fX2VzTW9kdWxlPSEwO3ZhciBnPWMoNCksaD1lKGcpLGk9YygyMSksaj1mKGkpLGs9Yyg2KSxsPWYoayksbT1jKDUpLG49ZShtKSxvPWMoMjIpLHA9ZShvKSxxPWMoMzQpLHI9ZihxKSxzPWQoKTtzLmNyZWF0ZT1kLHJbXCJkZWZhdWx0XCJdKHMpLHNbXCJkZWZhdWx0XCJdPXMsYltcImRlZmF1bHRcIl09cyxhLmV4cG9ydHM9YltcImRlZmF1bHRcIl19LGZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7YltcImRlZmF1bHRcIl09ZnVuY3Rpb24oYSl7aWYoYSYmYS5fX2VzTW9kdWxlKXJldHVybiBhO3ZhciBiPXt9O2lmKG51bGwhPWEpZm9yKHZhciBjIGluIGEpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYykmJihiW2NdPWFbY10pO3JldHVybiBiW1wiZGVmYXVsdFwiXT1hLGJ9LGIuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGQoYSxiLGMpe3RoaXMuaGVscGVycz1hfHx7fSx0aGlzLnBhcnRpYWxzPWJ8fHt9LHRoaXMuZGVjb3JhdG9ycz1jfHx7fSxpLnJlZ2lzdGVyRGVmYXVsdEhlbHBlcnModGhpcyksai5yZWdpc3RlckRlZmF1bHREZWNvcmF0b3JzKHRoaXMpfXZhciBlPWMoMSlbXCJkZWZhdWx0XCJdO2IuX19lc01vZHVsZT0hMCxiLkhhbmRsZWJhcnNFbnZpcm9ubWVudD1kO3ZhciBmPWMoNSksZz1jKDYpLGg9ZShnKSxpPWMoMTApLGo9YygxOCksaz1jKDIwKSxsPWUoayksbT1cIjQuMC4xMlwiO2IuVkVSU0lPTj1tO3ZhciBuPTc7Yi5DT01QSUxFUl9SRVZJU0lPTj1uO3ZhciBvPXsxOlwiPD0gMS4wLnJjLjJcIiwyOlwiPT0gMS4wLjAtcmMuM1wiLDM6XCI9PSAxLjAuMC1yYy40XCIsNDpcIj09IDEueC54XCIsNTpcIj09IDIuMC4wLWFscGhhLnhcIiw2OlwiPj0gMi4wLjAtYmV0YS4xXCIsNzpcIj49IDQuMC4wXCJ9O2IuUkVWSVNJT05fQ0hBTkdFUz1vO3ZhciBwPVwiW29iamVjdCBPYmplY3RdXCI7ZC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmQsbG9nZ2VyOmxbXCJkZWZhdWx0XCJdLGxvZzpsW1wiZGVmYXVsdFwiXS5sb2cscmVnaXN0ZXJIZWxwZXI6ZnVuY3Rpb24oYSxiKXtpZihmLnRvU3RyaW5nLmNhbGwoYSk9PT1wKXtpZihiKXRocm93IG5ldyBoW1wiZGVmYXVsdFwiXShcIkFyZyBub3Qgc3VwcG9ydGVkIHdpdGggbXVsdGlwbGUgaGVscGVyc1wiKTtmLmV4dGVuZCh0aGlzLmhlbHBlcnMsYSl9ZWxzZSB0aGlzLmhlbHBlcnNbYV09Yn0sdW5yZWdpc3RlckhlbHBlcjpmdW5jdGlvbihhKXtkZWxldGUgdGhpcy5oZWxwZXJzW2FdfSxyZWdpc3RlclBhcnRpYWw6ZnVuY3Rpb24oYSxiKXtpZihmLnRvU3RyaW5nLmNhbGwoYSk9PT1wKWYuZXh0ZW5kKHRoaXMucGFydGlhbHMsYSk7ZWxzZXtpZihcInVuZGVmaW5lZFwiPT10eXBlb2YgYil0aHJvdyBuZXcgaFtcImRlZmF1bHRcIl0oJ0F0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgYSBwYXJ0aWFsIGNhbGxlZCBcIicrYSsnXCIgYXMgdW5kZWZpbmVkJyk7dGhpcy5wYXJ0aWFsc1thXT1ifX0sdW5yZWdpc3RlclBhcnRpYWw6ZnVuY3Rpb24oYSl7ZGVsZXRlIHRoaXMucGFydGlhbHNbYV19LHJlZ2lzdGVyRGVjb3JhdG9yOmZ1bmN0aW9uKGEsYil7aWYoZi50b1N0cmluZy5jYWxsKGEpPT09cCl7aWYoYil0aHJvdyBuZXcgaFtcImRlZmF1bHRcIl0oXCJBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGRlY29yYXRvcnNcIik7Zi5leHRlbmQodGhpcy5kZWNvcmF0b3JzLGEpfWVsc2UgdGhpcy5kZWNvcmF0b3JzW2FdPWJ9LHVucmVnaXN0ZXJEZWNvcmF0b3I6ZnVuY3Rpb24oYSl7ZGVsZXRlIHRoaXMuZGVjb3JhdG9yc1thXX19O3ZhciBxPWxbXCJkZWZhdWx0XCJdLmxvZztiLmxvZz1xLGIuY3JlYXRlRnJhbWU9Zi5jcmVhdGVGcmFtZSxiLmxvZ2dlcj1sW1wiZGVmYXVsdFwiXX0sZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjKGEpe3JldHVybiBrW2FdfWZ1bmN0aW9uIGQoYSl7Zm9yKHZhciBiPTE7Yjxhcmd1bWVudHMubGVuZ3RoO2IrKylmb3IodmFyIGMgaW4gYXJndW1lbnRzW2JdKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbYl0sYykmJihhW2NdPWFyZ3VtZW50c1tiXVtjXSk7cmV0dXJuIGF9ZnVuY3Rpb24gZShhLGIpe2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKylpZihhW2NdPT09YilyZXR1cm4gYztyZXR1cm4tMX1mdW5jdGlvbiBmKGEpe2lmKFwic3RyaW5nXCIhPXR5cGVvZiBhKXtpZihhJiZhLnRvSFRNTClyZXR1cm4gYS50b0hUTUwoKTtpZihudWxsPT1hKXJldHVyblwiXCI7aWYoIWEpcmV0dXJuIGErXCJcIjthPVwiXCIrYX1yZXR1cm4gbS50ZXN0KGEpP2EucmVwbGFjZShsLGMpOmF9ZnVuY3Rpb24gZyhhKXtyZXR1cm4hYSYmMCE9PWF8fCEoIXAoYSl8fDAhPT1hLmxlbmd0aCl9ZnVuY3Rpb24gaChhKXt2YXIgYj1kKHt9LGEpO3JldHVybiBiLl9wYXJlbnQ9YSxifWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gYS5wYXRoPWIsYX1mdW5jdGlvbiBqKGEsYil7cmV0dXJuKGE/YStcIi5cIjpcIlwiKStifWIuX19lc01vZHVsZT0hMCxiLmV4dGVuZD1kLGIuaW5kZXhPZj1lLGIuZXNjYXBlRXhwcmVzc2lvbj1mLGIuaXNFbXB0eT1nLGIuY3JlYXRlRnJhbWU9aCxiLmJsb2NrUGFyYW1zPWksYi5hcHBlbmRDb250ZXh0UGF0aD1qO3ZhciBrPXtcIiZcIjpcIiZhbXA7XCIsXCI8XCI6XCImbHQ7XCIsXCI+XCI6XCImZ3Q7XCIsJ1wiJzpcIiZxdW90O1wiLFwiJ1wiOlwiJiN4Mjc7XCIsXCJgXCI6XCImI3g2MDtcIixcIj1cIjpcIiYjeDNEO1wifSxsPS9bJjw+XCInYD1dL2csbT0vWyY8PlwiJ2A9XS8sbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2IudG9TdHJpbmc9bjt2YXIgbz1mdW5jdGlvbihhKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBhfTtvKC94LykmJihiLmlzRnVuY3Rpb249bz1mdW5jdGlvbihhKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBhJiZcIltvYmplY3QgRnVuY3Rpb25dXCI9PT1uLmNhbGwoYSl9KSxiLmlzRnVuY3Rpb249bzt2YXIgcD1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4hKCFhfHxcIm9iamVjdFwiIT10eXBlb2YgYSkmJlwiW29iamVjdCBBcnJheV1cIj09PW4uY2FsbChhKX07Yi5pc0FycmF5PXB9LGZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkKGEsYil7dmFyIGM9YiYmYi5sb2MsZz12b2lkIDAsaD12b2lkIDA7YyYmKGc9Yy5zdGFydC5saW5lLGg9Yy5zdGFydC5jb2x1bW4sYSs9XCIgLSBcIitnK1wiOlwiK2gpO2Zvcih2YXIgaT1FcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IuY2FsbCh0aGlzLGEpLGo9MDtqPGYubGVuZ3RoO2orKyl0aGlzW2Zbal1dPWlbZltqXV07RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UmJkVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsZCk7dHJ5e2MmJih0aGlzLmxpbmVOdW1iZXI9ZyxlP09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFwiY29sdW1uXCIse3ZhbHVlOmgsZW51bWVyYWJsZTohMH0pOnRoaXMuY29sdW1uPWgpfWNhdGNoKGspe319dmFyIGU9Yyg3KVtcImRlZmF1bHRcIl07Yi5fX2VzTW9kdWxlPSEwO3ZhciBmPVtcImRlc2NyaXB0aW9uXCIsXCJmaWxlTmFtZVwiLFwibGluZU51bWJlclwiLFwibWVzc2FnZVwiLFwibmFtZVwiLFwibnVtYmVyXCIsXCJzdGFja1wiXTtkLnByb3RvdHlwZT1uZXcgRXJyb3IsYltcImRlZmF1bHRcIl09ZCxhLmV4cG9ydHM9YltcImRlZmF1bHRcIl19LGZ1bmN0aW9uKGEsYixjKXthLmV4cG9ydHM9e1wiZGVmYXVsdFwiOmMoOCksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKGEsYixjKXt2YXIgZD1jKDkpO2EuZXhwb3J0cz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGQuc2V0RGVzYyhhLGIsYyl9fSxmdW5jdGlvbihhLGIpe3ZhciBjPU9iamVjdDthLmV4cG9ydHM9e2NyZWF0ZTpjLmNyZWF0ZSxnZXRQcm90bzpjLmdldFByb3RvdHlwZU9mLGlzRW51bTp7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxnZXREZXNjOmMuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHNldERlc2M6Yy5kZWZpbmVQcm9wZXJ0eSxzZXREZXNjczpjLmRlZmluZVByb3BlcnRpZXMsZ2V0S2V5czpjLmtleXMsZ2V0TmFtZXM6Yy5nZXRPd25Qcm9wZXJ0eU5hbWVzLGdldFN5bWJvbHM6Yy5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsZWFjaDpbXS5mb3JFYWNofX0sZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGQoYSl7Z1tcImRlZmF1bHRcIl0oYSksaVtcImRlZmF1bHRcIl0oYSksa1tcImRlZmF1bHRcIl0oYSksbVtcImRlZmF1bHRcIl0oYSksb1tcImRlZmF1bHRcIl0oYSkscVtcImRlZmF1bHRcIl0oYSksc1tcImRlZmF1bHRcIl0oYSl9dmFyIGU9YygxKVtcImRlZmF1bHRcIl07Yi5fX2VzTW9kdWxlPSEwLGIucmVnaXN0ZXJEZWZhdWx0SGVscGVycz1kO3ZhciBmPWMoMTEpLGc9ZShmKSxoPWMoMTIpLGk9ZShoKSxqPWMoMTMpLGs9ZShqKSxsPWMoMTQpLG09ZShsKSxuPWMoMTUpLG89ZShuKSxwPWMoMTYpLHE9ZShwKSxyPWMoMTcpLHM9ZShyKX0sZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO2IuX19lc01vZHVsZT0hMDt2YXIgZD1jKDUpO2JbXCJkZWZhdWx0XCJdPWZ1bmN0aW9uKGEpe2EucmVnaXN0ZXJIZWxwZXIoXCJibG9ja0hlbHBlck1pc3NpbmdcIixmdW5jdGlvbihiLGMpe3ZhciBlPWMuaW52ZXJzZSxmPWMuZm47aWYoYj09PSEwKXJldHVybiBmKHRoaXMpO2lmKGI9PT0hMXx8bnVsbD09YilyZXR1cm4gZSh0aGlzKTtpZihkLmlzQXJyYXkoYikpcmV0dXJuIGIubGVuZ3RoPjA/KGMuaWRzJiYoYy5pZHM9W2MubmFtZV0pLGEuaGVscGVycy5lYWNoKGIsYykpOmUodGhpcyk7aWYoYy5kYXRhJiZjLmlkcyl7dmFyIGc9ZC5jcmVhdGVGcmFtZShjLmRhdGEpO2cuY29udGV4dFBhdGg9ZC5hcHBlbmRDb250ZXh0UGF0aChjLmRhdGEuY29udGV4dFBhdGgsYy5uYW1lKSxjPXtkYXRhOmd9fXJldHVybiBmKGIsYyl9KX0sYS5leHBvcnRzPWJbXCJkZWZhdWx0XCJdfSxmdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGQ9YygxKVtcImRlZmF1bHRcIl07Yi5fX2VzTW9kdWxlPSEwO3ZhciBlPWMoNSksZj1jKDYpLGc9ZChmKTtiW1wiZGVmYXVsdFwiXT1mdW5jdGlvbihhKXthLnJlZ2lzdGVySGVscGVyKFwiZWFjaFwiLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhiLGMsZil7aiYmKGoua2V5PWIsai5pbmRleD1jLGouZmlyc3Q9MD09PWMsai5sYXN0PSEhZixrJiYoai5jb250ZXh0UGF0aD1rK2IpKSxpKz1kKGFbYl0se2RhdGE6aixibG9ja1BhcmFtczplLmJsb2NrUGFyYW1zKFthW2JdLGJdLFtrK2IsbnVsbF0pfSl9aWYoIWIpdGhyb3cgbmV3IGdbXCJkZWZhdWx0XCJdKFwiTXVzdCBwYXNzIGl0ZXJhdG9yIHRvICNlYWNoXCIpO3ZhciBkPWIuZm4sZj1iLmludmVyc2UsaD0wLGk9XCJcIixqPXZvaWQgMCxrPXZvaWQgMDtpZihiLmRhdGEmJmIuaWRzJiYoaz1lLmFwcGVuZENvbnRleHRQYXRoKGIuZGF0YS5jb250ZXh0UGF0aCxiLmlkc1swXSkrXCIuXCIpLGUuaXNGdW5jdGlvbihhKSYmKGE9YS5jYWxsKHRoaXMpKSxiLmRhdGEmJihqPWUuY3JlYXRlRnJhbWUoYi5kYXRhKSksYSYmXCJvYmplY3RcIj09dHlwZW9mIGEpaWYoZS5pc0FycmF5KGEpKWZvcih2YXIgbD1hLmxlbmd0aDtoPGw7aCsrKWggaW4gYSYmYyhoLGgsaD09PWEubGVuZ3RoLTEpO2Vsc2V7dmFyIG09dm9pZCAwO2Zvcih2YXIgbiBpbiBhKWEuaGFzT3duUHJvcGVydHkobikmJih2b2lkIDAhPT1tJiZjKG0saC0xKSxtPW4saCsrKTt2b2lkIDAhPT1tJiZjKG0saC0xLCEwKX1yZXR1cm4gMD09PWgmJihpPWYodGhpcykpLGl9KX0sYS5leHBvcnRzPWJbXCJkZWZhdWx0XCJdfSxmdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGQ9YygxKVtcImRlZmF1bHRcIl07Yi5fX2VzTW9kdWxlPSEwO3ZhciBlPWMoNiksZj1kKGUpO2JbXCJkZWZhdWx0XCJdPWZ1bmN0aW9uKGEpe2EucmVnaXN0ZXJIZWxwZXIoXCJoZWxwZXJNaXNzaW5nXCIsZnVuY3Rpb24oKXtpZigxIT09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgZltcImRlZmF1bHRcIl0oJ01pc3NpbmcgaGVscGVyOiBcIicrYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV0ubmFtZSsnXCInKX0pfSxhLmV4cG9ydHM9YltcImRlZmF1bHRcIl19LGZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjtiLl9fZXNNb2R1bGU9ITA7dmFyIGQ9Yyg1KTtiW1wiZGVmYXVsdFwiXT1mdW5jdGlvbihhKXthLnJlZ2lzdGVySGVscGVyKFwiaWZcIixmdW5jdGlvbihhLGIpe3JldHVybiBkLmlzRnVuY3Rpb24oYSkmJihhPWEuY2FsbCh0aGlzKSksIWIuaGFzaC5pbmNsdWRlWmVybyYmIWF8fGQuaXNFbXB0eShhKT9iLmludmVyc2UodGhpcyk6Yi5mbih0aGlzKX0pLGEucmVnaXN0ZXJIZWxwZXIoXCJ1bmxlc3NcIixmdW5jdGlvbihiLGMpe3JldHVybiBhLmhlbHBlcnNbXCJpZlwiXS5jYWxsKHRoaXMsYix7Zm46Yy5pbnZlcnNlLGludmVyc2U6Yy5mbixoYXNoOmMuaGFzaH0pfSl9LGEuZXhwb3J0cz1iW1wiZGVmYXVsdFwiXX0sZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjtiLl9fZXNNb2R1bGU9ITAsYltcImRlZmF1bHRcIl09ZnVuY3Rpb24oYSl7YS5yZWdpc3RlckhlbHBlcihcImxvZ1wiLGZ1bmN0aW9uKCl7Zm9yKHZhciBiPVt2b2lkIDBdLGM9YXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV0sZD0wO2Q8YXJndW1lbnRzLmxlbmd0aC0xO2QrKyliLnB1c2goYXJndW1lbnRzW2RdKTt2YXIgZT0xO251bGwhPWMuaGFzaC5sZXZlbD9lPWMuaGFzaC5sZXZlbDpjLmRhdGEmJm51bGwhPWMuZGF0YS5sZXZlbCYmKGU9Yy5kYXRhLmxldmVsKSxiWzBdPWUsYS5sb2cuYXBwbHkoYSxiKX0pfSxhLmV4cG9ydHM9YltcImRlZmF1bHRcIl19LGZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7Yi5fX2VzTW9kdWxlPSEwLGJbXCJkZWZhdWx0XCJdPWZ1bmN0aW9uKGEpe2EucmVnaXN0ZXJIZWxwZXIoXCJsb29rdXBcIixmdW5jdGlvbihhLGIpe3JldHVybiBhJiZhW2JdfSl9LGEuZXhwb3J0cz1iW1wiZGVmYXVsdFwiXX0sZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO2IuX19lc01vZHVsZT0hMDt2YXIgZD1jKDUpO2JbXCJkZWZhdWx0XCJdPWZ1bmN0aW9uKGEpe2EucmVnaXN0ZXJIZWxwZXIoXCJ3aXRoXCIsZnVuY3Rpb24oYSxiKXtkLmlzRnVuY3Rpb24oYSkmJihhPWEuY2FsbCh0aGlzKSk7dmFyIGM9Yi5mbjtpZihkLmlzRW1wdHkoYSkpcmV0dXJuIGIuaW52ZXJzZSh0aGlzKTt2YXIgZT1iLmRhdGE7cmV0dXJuIGIuZGF0YSYmYi5pZHMmJihlPWQuY3JlYXRlRnJhbWUoYi5kYXRhKSxlLmNvbnRleHRQYXRoPWQuYXBwZW5kQ29udGV4dFBhdGgoYi5kYXRhLmNvbnRleHRQYXRoLGIuaWRzWzBdKSksYyhhLHtkYXRhOmUsYmxvY2tQYXJhbXM6ZC5ibG9ja1BhcmFtcyhbYV0sW2UmJmUuY29udGV4dFBhdGhdKX0pfSl9LGEuZXhwb3J0cz1iW1wiZGVmYXVsdFwiXX0sZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGQoYSl7Z1tcImRlZmF1bHRcIl0oYSl9dmFyIGU9YygxKVtcImRlZmF1bHRcIl07Yi5fX2VzTW9kdWxlPSEwLGIucmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycz1kO3ZhciBmPWMoMTkpLGc9ZShmKX0sZnVuY3Rpb24oYSxiLGMpe1widXNlIHN0cmljdFwiO2IuX19lc01vZHVsZT0hMDt2YXIgZD1jKDUpO2JbXCJkZWZhdWx0XCJdPWZ1bmN0aW9uKGEpe2EucmVnaXN0ZXJEZWNvcmF0b3IoXCJpbmxpbmVcIixmdW5jdGlvbihhLGIsYyxlKXt2YXIgZj1hO3JldHVybiBiLnBhcnRpYWxzfHwoYi5wYXJ0aWFscz17fSxmPWZ1bmN0aW9uKGUsZil7dmFyIGc9Yy5wYXJ0aWFscztjLnBhcnRpYWxzPWQuZXh0ZW5kKHt9LGcsYi5wYXJ0aWFscyk7dmFyIGg9YShlLGYpO3JldHVybiBjLnBhcnRpYWxzPWcsaH0pLGIucGFydGlhbHNbZS5hcmdzWzBdXT1lLmZuLGZ9KX0sYS5leHBvcnRzPWJbXCJkZWZhdWx0XCJdfSxmdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7Yi5fX2VzTW9kdWxlPSEwO3ZhciBkPWMoNSksZT17bWV0aG9kTWFwOltcImRlYnVnXCIsXCJpbmZvXCIsXCJ3YXJuXCIsXCJlcnJvclwiXSxsZXZlbDpcImluZm9cIixsb29rdXBMZXZlbDpmdW5jdGlvbihhKXtpZihcInN0cmluZ1wiPT10eXBlb2YgYSl7dmFyIGI9ZC5pbmRleE9mKGUubWV0aG9kTWFwLGEudG9Mb3dlckNhc2UoKSk7YT1iPj0wP2I6cGFyc2VJbnQoYSwxMCl9cmV0dXJuIGF9LGxvZzpmdW5jdGlvbihhKXtpZihhPWUubG9va3VwTGV2ZWwoYSksXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGNvbnNvbGUmJmUubG9va3VwTGV2ZWwoZS5sZXZlbCk8PWEpe3ZhciBiPWUubWV0aG9kTWFwW2FdO2NvbnNvbGVbYl18fChiPVwibG9nXCIpO2Zvcih2YXIgYz1hcmd1bWVudHMubGVuZ3RoLGQ9QXJyYXkoYz4xP2MtMTowKSxmPTE7ZjxjO2YrKylkW2YtMV09YXJndW1lbnRzW2ZdO2NvbnNvbGVbYl0uYXBwbHkoY29uc29sZSxkKX19fTtiW1wiZGVmYXVsdFwiXT1lLGEuZXhwb3J0cz1iW1wiZGVmYXVsdFwiXX0sZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBjKGEpe3RoaXMuc3RyaW5nPWF9Yi5fX2VzTW9kdWxlPSEwLGMucHJvdG90eXBlLnRvU3RyaW5nPWMucHJvdG90eXBlLnRvSFRNTD1mdW5jdGlvbigpe3JldHVyblwiXCIrdGhpcy5zdHJpbmd9LGJbXCJkZWZhdWx0XCJdPWMsYS5leHBvcnRzPWJbXCJkZWZhdWx0XCJdfSxmdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZChhKXt2YXIgYj1hJiZhWzBdfHwxLGM9cy5DT01QSUxFUl9SRVZJU0lPTjtpZihiIT09Yyl7aWYoYjxjKXt2YXIgZD1zLlJFVklTSU9OX0NIQU5HRVNbY10sZT1zLlJFVklTSU9OX0NIQU5HRVNbYl07dGhyb3cgbmV3IHJbXCJkZWZhdWx0XCJdKFwiVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYW4gb2xkZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gUGxlYXNlIHVwZGF0ZSB5b3VyIHByZWNvbXBpbGVyIHRvIGEgbmV3ZXIgdmVyc2lvbiAoXCIrZCtcIikgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uIChcIitlK1wiKS5cIil9dGhyb3cgbmV3IHJbXCJkZWZhdWx0XCJdKFwiVGVtcGxhdGUgd2FzIHByZWNvbXBpbGVkIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUgY3VycmVudCBydW50aW1lLiBQbGVhc2UgdXBkYXRlIHlvdXIgcnVudGltZSB0byBhIG5ld2VyIHZlcnNpb24gKFwiK2FbMV0rXCIpLlwiKX19ZnVuY3Rpb24gZShhLGIpe2Z1bmN0aW9uIGMoYyxkLGUpe2UuaGFzaCYmKGQ9cC5leHRlbmQoe30sZCxlLmhhc2gpLGUuaWRzJiYoZS5pZHNbMF09ITApKSxjPWIuVk0ucmVzb2x2ZVBhcnRpYWwuY2FsbCh0aGlzLGMsZCxlKTt2YXIgZj1iLlZNLmludm9rZVBhcnRpYWwuY2FsbCh0aGlzLGMsZCxlKTtpZihudWxsPT1mJiZiLmNvbXBpbGUmJihlLnBhcnRpYWxzW2UubmFtZV09Yi5jb21waWxlKGMsYS5jb21waWxlck9wdGlvbnMsYiksZj1lLnBhcnRpYWxzW2UubmFtZV0oZCxlKSksbnVsbCE9Zil7aWYoZS5pbmRlbnQpe2Zvcih2YXIgZz1mLnNwbGl0KFwiXFxuXCIpLGg9MCxpPWcubGVuZ3RoO2g8aSYmKGdbaF18fGgrMSE9PWkpO2grKylnW2hdPWUuaW5kZW50K2dbaF07Zj1nLmpvaW4oXCJcXG5cIil9cmV0dXJuIGZ9dGhyb3cgbmV3IHJbXCJkZWZhdWx0XCJdKFwiVGhlIHBhcnRpYWwgXCIrZS5uYW1lK1wiIGNvdWxkIG5vdCBiZSBjb21waWxlZCB3aGVuIHJ1bm5pbmcgaW4gcnVudGltZS1vbmx5IG1vZGVcIil9ZnVuY3Rpb24gZChiKXtmdW5jdGlvbiBjKGIpe3JldHVyblwiXCIrYS5tYWluKGUsYixlLmhlbHBlcnMsZS5wYXJ0aWFscyxnLGksaCl9dmFyIGY9YXJndW1lbnRzLmxlbmd0aDw9MXx8dm9pZCAwPT09YXJndW1lbnRzWzFdP3t9OmFyZ3VtZW50c1sxXSxnPWYuZGF0YTtkLl9zZXR1cChmKSwhZi5wYXJ0aWFsJiZhLnVzZURhdGEmJihnPWooYixnKSk7dmFyIGg9dm9pZCAwLGk9YS51c2VCbG9ja1BhcmFtcz9bXTp2b2lkIDA7cmV0dXJuIGEudXNlRGVwdGhzJiYoaD1mLmRlcHRocz9iIT1mLmRlcHRoc1swXT9bYl0uY29uY2F0KGYuZGVwdGhzKTpmLmRlcHRoczpbYl0pLChjPWsoYS5tYWluLGMsZSxmLmRlcHRoc3x8W10sZyxpKSkoYixmKX1pZighYil0aHJvdyBuZXcgcltcImRlZmF1bHRcIl0oXCJObyBlbnZpcm9ubWVudCBwYXNzZWQgdG8gdGVtcGxhdGVcIik7aWYoIWF8fCFhLm1haW4pdGhyb3cgbmV3IHJbXCJkZWZhdWx0XCJdKFwiVW5rbm93biB0ZW1wbGF0ZSBvYmplY3Q6IFwiK3R5cGVvZiBhKTthLm1haW4uZGVjb3JhdG9yPWEubWFpbl9kLGIuVk0uY2hlY2tSZXZpc2lvbihhLmNvbXBpbGVyKTt2YXIgZT17c3RyaWN0OmZ1bmN0aW9uKGEsYil7aWYoIShiIGluIGEpKXRocm93IG5ldyByW1wiZGVmYXVsdFwiXSgnXCInK2IrJ1wiIG5vdCBkZWZpbmVkIGluICcrYSk7cmV0dXJuIGFbYl19LGxvb2t1cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKylpZihhW2RdJiZudWxsIT1hW2RdW2JdKXJldHVybiBhW2RdW2JdfSxsYW1iZGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiBhP2EuY2FsbChiKTphfSxlc2NhcGVFeHByZXNzaW9uOnAuZXNjYXBlRXhwcmVzc2lvbixpbnZva2VQYXJ0aWFsOmMsZm46ZnVuY3Rpb24oYil7dmFyIGM9YVtiXTtyZXR1cm4gYy5kZWNvcmF0b3I9YVtiK1wiX2RcIl0sY30scHJvZ3JhbXM6W10scHJvZ3JhbTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBnPXRoaXMucHJvZ3JhbXNbYV0saD10aGlzLmZuKGEpO3JldHVybiBifHxlfHxkfHxjP2c9Zih0aGlzLGEsaCxiLGMsZCxlKTpnfHwoZz10aGlzLnByb2dyYW1zW2FdPWYodGhpcyxhLGgpKSxnfSxkYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKDthJiZiLS07KWE9YS5fcGFyZW50O3JldHVybiBhfSxtZXJnZTpmdW5jdGlvbihhLGIpe3ZhciBjPWF8fGI7cmV0dXJuIGEmJmImJmEhPT1iJiYoYz1wLmV4dGVuZCh7fSxiLGEpKSxjfSxudWxsQ29udGV4dDpsKHt9KSxub29wOmIuVk0ubm9vcCxjb21waWxlckluZm86YS5jb21waWxlcn07cmV0dXJuIGQuaXNUb3A9ITAsZC5fc2V0dXA9ZnVuY3Rpb24oYyl7Yy5wYXJ0aWFsPyhlLmhlbHBlcnM9Yy5oZWxwZXJzLGUucGFydGlhbHM9Yy5wYXJ0aWFscyxlLmRlY29yYXRvcnM9Yy5kZWNvcmF0b3JzKTooZS5oZWxwZXJzPWUubWVyZ2UoYy5oZWxwZXJzLGIuaGVscGVycyksYS51c2VQYXJ0aWFsJiYoZS5wYXJ0aWFscz1lLm1lcmdlKGMucGFydGlhbHMsYi5wYXJ0aWFscykpLChhLnVzZVBhcnRpYWx8fGEudXNlRGVjb3JhdG9ycykmJihlLmRlY29yYXRvcnM9ZS5tZXJnZShjLmRlY29yYXRvcnMsYi5kZWNvcmF0b3JzKSkpfSxkLl9jaGlsZD1mdW5jdGlvbihiLGMsZCxnKXtpZihhLnVzZUJsb2NrUGFyYW1zJiYhZCl0aHJvdyBuZXcgcltcImRlZmF1bHRcIl0oXCJtdXN0IHBhc3MgYmxvY2sgcGFyYW1zXCIpO2lmKGEudXNlRGVwdGhzJiYhZyl0aHJvdyBuZXcgcltcImRlZmF1bHRcIl0oXCJtdXN0IHBhc3MgcGFyZW50IGRlcHRoc1wiKTtyZXR1cm4gZihlLGIsYVtiXSxjLDAsZCxnKX0sZH1mdW5jdGlvbiBmKGEsYixjLGQsZSxmLGcpe2Z1bmN0aW9uIGgoYil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aDw9MXx8dm9pZCAwPT09YXJndW1lbnRzWzFdP3t9OmFyZ3VtZW50c1sxXSxoPWc7cmV0dXJuIWd8fGI9PWdbMF18fGI9PT1hLm51bGxDb250ZXh0JiZudWxsPT09Z1swXXx8KGg9W2JdLmNvbmNhdChnKSksYyhhLGIsYS5oZWxwZXJzLGEucGFydGlhbHMsZS5kYXRhfHxkLGYmJltlLmJsb2NrUGFyYW1zXS5jb25jYXQoZiksaCl9cmV0dXJuIGg9ayhjLGgsYSxnLGQsZiksaC5wcm9ncmFtPWIsaC5kZXB0aD1nP2cubGVuZ3RoOjAsaC5ibG9ja1BhcmFtcz1lfHwwLGh9ZnVuY3Rpb24gZyhhLGIsYyl7cmV0dXJuIGE/YS5jYWxsfHxjLm5hbWV8fChjLm5hbWU9YSxhPWMucGFydGlhbHNbYV0pOmE9XCJAcGFydGlhbC1ibG9ja1wiPT09Yy5uYW1lP2MuZGF0YVtcInBhcnRpYWwtYmxvY2tcIl06Yy5wYXJ0aWFsc1tjLm5hbWVdLGF9ZnVuY3Rpb24gaChhLGIsYyl7dmFyIGQ9Yy5kYXRhJiZjLmRhdGFbXCJwYXJ0aWFsLWJsb2NrXCJdO2MucGFydGlhbD0hMCxjLmlkcyYmKGMuZGF0YS5jb250ZXh0UGF0aD1jLmlkc1swXXx8Yy5kYXRhLmNvbnRleHRQYXRoKTt2YXIgZT12b2lkIDA7aWYoYy5mbiYmYy5mbiE9PWkmJiFmdW5jdGlvbigpe2MuZGF0YT1zLmNyZWF0ZUZyYW1lKGMuZGF0YSk7dmFyIGE9Yy5mbjtlPWMuZGF0YVtcInBhcnRpYWwtYmxvY2tcIl09ZnVuY3Rpb24oYil7dmFyIGM9YXJndW1lbnRzLmxlbmd0aDw9MXx8dm9pZCAwPT09YXJndW1lbnRzWzFdP3t9OmFyZ3VtZW50c1sxXTtyZXR1cm4gYy5kYXRhPXMuY3JlYXRlRnJhbWUoYy5kYXRhKSxjLmRhdGFbXCJwYXJ0aWFsLWJsb2NrXCJdPWQsYShiLGMpfSxhLnBhcnRpYWxzJiYoYy5wYXJ0aWFscz1wLmV4dGVuZCh7fSxjLnBhcnRpYWxzLGEucGFydGlhbHMpKX0oKSx2b2lkIDA9PT1hJiZlJiYoYT1lKSx2b2lkIDA9PT1hKXRocm93IG5ldyByW1wiZGVmYXVsdFwiXShcIlRoZSBwYXJ0aWFsIFwiK2MubmFtZStcIiBjb3VsZCBub3QgYmUgZm91bmRcIik7aWYoYSBpbnN0YW5jZW9mIEZ1bmN0aW9uKXJldHVybiBhKGIsYyl9ZnVuY3Rpb24gaSgpe3JldHVyblwiXCJ9ZnVuY3Rpb24gaihhLGIpe3JldHVybiBiJiZcInJvb3RcImluIGJ8fChiPWI/cy5jcmVhdGVGcmFtZShiKTp7fSxiLnJvb3Q9YSksYn1mdW5jdGlvbiBrKGEsYixjLGQsZSxmKXtpZihhLmRlY29yYXRvcil7dmFyIGc9e307Yj1hLmRlY29yYXRvcihiLGcsYyxkJiZkWzBdLGUsZixkKSxwLmV4dGVuZChiLGcpfXJldHVybiBifXZhciBsPWMoMjMpW1wiZGVmYXVsdFwiXSxtPWMoMylbXCJkZWZhdWx0XCJdLG49YygxKVtcImRlZmF1bHRcIl07Yi5fX2VzTW9kdWxlPSEwLGIuY2hlY2tSZXZpc2lvbj1kLGIudGVtcGxhdGU9ZSxiLndyYXBQcm9ncmFtPWYsYi5yZXNvbHZlUGFydGlhbD1nLGIuaW52b2tlUGFydGlhbD1oLGIubm9vcD1pO3ZhciBvPWMoNSkscD1tKG8pLHE9Yyg2KSxyPW4ocSkscz1jKDQpfSxmdW5jdGlvbihhLGIsYyl7YS5leHBvcnRzPXtcImRlZmF1bHRcIjpjKDI0KSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24oYSxiLGMpe2MoMjUpLGEuZXhwb3J0cz1jKDMwKS5PYmplY3Quc2VhbH0sZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWMoMjYpO2MoMjcpKFwic2VhbFwiLGZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbihiKXtyZXR1cm4gYSYmZChiKT9hKGIpOmJ9fSl9LGZ1bmN0aW9uKGEsYil7YS5leHBvcnRzPWZ1bmN0aW9uKGEpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiBhP251bGwhPT1hOlwiZnVuY3Rpb25cIj09dHlwZW9mIGF9fSxmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YygyOCksZT1jKDMwKSxmPWMoMzMpO2EuZXhwb3J0cz1mdW5jdGlvbihhLGIpe3ZhciBjPShlLk9iamVjdHx8e30pW2FdfHxPYmplY3RbYV0sZz17fTtnW2FdPWIoYyksZChkLlMrZC5GKmYoZnVuY3Rpb24oKXtjKDEpfSksXCJPYmplY3RcIixnKX19LGZ1bmN0aW9uKGEsYixjKXt2YXIgZD1jKDI5KSxlPWMoMzApLGY9YygzMSksZz1cInByb3RvdHlwZVwiLGg9ZnVuY3Rpb24oYSxiLGMpe3ZhciBpLGosayxsPWEmaC5GLG09YSZoLkcsbj1hJmguUyxvPWEmaC5QLHA9YSZoLkIscT1hJmguVyxyPW0/ZTplW2JdfHwoZVtiXT17fSkscz1tP2Q6bj9kW2JdOihkW2JdfHx7fSlbZ107bSYmKGM9Yik7Zm9yKGkgaW4gYylqPSFsJiZzJiZpIGluIHMsaiYmaSBpbiByfHwoaz1qP3NbaV06Y1tpXSxyW2ldPW0mJlwiZnVuY3Rpb25cIiE9dHlwZW9mIHNbaV0/Y1tpXTpwJiZqP2YoayxkKTpxJiZzW2ldPT1rP2Z1bmN0aW9uKGEpe3ZhciBiPWZ1bmN0aW9uKGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgYT9uZXcgYShiKTphKGIpfTtyZXR1cm4gYltnXT1hW2ddLGJ9KGspOm8mJlwiZnVuY3Rpb25cIj09dHlwZW9mIGs/ZihGdW5jdGlvbi5jYWxsLGspOmssbyYmKChyW2ddfHwocltnXT17fSkpW2ldPWspKX07aC5GPTEsaC5HPTIsaC5TPTQsaC5QPTgsaC5CPTE2LGguVz0zMixhLmV4cG9ydHM9aH0sZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmV4cG9ydHM9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lk1hdGg9PU1hdGg/d2luZG93OlwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmJiZzZWxmLk1hdGg9PU1hdGg/c2VsZjpGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XCJudW1iZXJcIj09dHlwZW9mIF9fZyYmKF9fZz1jKX0sZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmV4cG9ydHM9e3ZlcnNpb246XCIxLjIuNlwifTtcIm51bWJlclwiPT10eXBlb2YgX19lJiYoX19lPWMpfSxmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YygzMik7YS5leHBvcnRzPWZ1bmN0aW9uKGEsYixjKXtpZihkKGEpLHZvaWQgMD09PWIpcmV0dXJuIGE7c3dpdGNoKGMpe2Nhc2UgMTpyZXR1cm4gZnVuY3Rpb24oYyl7cmV0dXJuIGEuY2FsbChiLGMpfTtjYXNlIDI6cmV0dXJuIGZ1bmN0aW9uKGMsZCl7cmV0dXJuIGEuY2FsbChiLGMsZCl9O2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24oYyxkLGUpe3JldHVybiBhLmNhbGwoYixjLGQsZSl9fXJldHVybiBmdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGIsYXJndW1lbnRzKX19fSxmdW5jdGlvbihhLGIpe2EuZXhwb3J0cz1mdW5jdGlvbihhKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBhKXRocm93IFR5cGVFcnJvcihhK1wiIGlzIG5vdCBhIGZ1bmN0aW9uIVwiKTtyZXR1cm4gYX19LGZ1bmN0aW9uKGEsYil7YS5leHBvcnRzPWZ1bmN0aW9uKGEpe3RyeXtyZXR1cm4hIWEoKX1jYXRjaChiKXtyZXR1cm4hMH19fSxmdW5jdGlvbihhLGIpeyhmdW5jdGlvbihjKXtcInVzZSBzdHJpY3RcIjtiLl9fZXNNb2R1bGU9ITAsYltcImRlZmF1bHRcIl09ZnVuY3Rpb24oYSl7dmFyIGI9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGM/Yzp3aW5kb3csZD1iLkhhbmRsZWJhcnM7YS5ub0NvbmZsaWN0PWZ1bmN0aW9uKCl7cmV0dXJuIGIuSGFuZGxlYmFycz09PWEmJihiLkhhbmRsZWJhcnM9ZCksYX19LGEuZXhwb3J0cz1iW1wiZGVmYXVsdFwiXX0pLmNhbGwoYixmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpKX0sZnVuY3Rpb24oYSxiKXtcInVzZSBzdHJpY3RcIjtiLl9fZXNNb2R1bGU9ITA7dmFyIGM9e2hlbHBlcnM6e2hlbHBlckV4cHJlc3Npb246ZnVuY3Rpb24oYSl7cmV0dXJuXCJTdWJFeHByZXNzaW9uXCI9PT1hLnR5cGV8fChcIk11c3RhY2hlU3RhdGVtZW50XCI9PT1hLnR5cGV8fFwiQmxvY2tTdGF0ZW1lbnRcIj09PWEudHlwZSkmJiEhKGEucGFyYW1zJiZhLnBhcmFtcy5sZW5ndGh8fGEuaGFzaCl9LHNjb3BlZElkOmZ1bmN0aW9uKGEpe3JldHVybi9eXFwufHRoaXNcXGIvLnRlc3QoYS5vcmlnaW5hbCl9LHNpbXBsZUlkOmZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5wYXJ0cy5sZW5ndGgmJiFjLmhlbHBlcnMuc2NvcGVkSWQoYSkmJiFhLmRlcHRofX19O2JbXCJkZWZhdWx0XCJdPWMsYS5leHBvcnRzPWJbXCJkZWZhdWx0XCJdfSxmdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZChhLGIpe2lmKFwiUHJvZ3JhbVwiPT09YS50eXBlKXJldHVybiBhO2hbXCJkZWZhdWx0XCJdLnl5PW4sbi5sb2NJbmZvPWZ1bmN0aW9uKGEpe3JldHVybiBuZXcgbi5Tb3VyY2VMb2NhdGlvbihiJiZiLnNyY05hbWUsYSl9O3ZhciBjPW5ldyBqW1wiZGVmYXVsdFwiXShiKTtyZXR1cm4gYy5hY2NlcHQoaFtcImRlZmF1bHRcIl0ucGFyc2UoYSkpfXZhciBlPWMoMSlbXCJkZWZhdWx0XCJdLGY9YygzKVtcImRlZmF1bHRcIl07Yi5fX2VzTW9kdWxlPSEwLGIucGFyc2U9ZDt2YXIgZz1jKDM3KSxoPWUoZyksaT1jKDM4KSxqPWUoaSksaz1jKDQwKSxsPWYoayksbT1jKDUpO2IucGFyc2VyPWhbXCJkZWZhdWx0XCJdO3ZhciBuPXt9O20uZXh0ZW5kKG4sbCl9LGZ1bmN0aW9uKGEsYil7XCJ1c2Ugc3RyaWN0XCI7Yi5fX2VzTW9kdWxlPSEwO3ZhciBjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3RoaXMueXk9e319dmFyIGI9e3RyYWNlOmZ1bmN0aW9uKCl7fSx5eTp7fSxzeW1ib2xzXzp7ZXJyb3I6Mixyb290OjMscHJvZ3JhbTo0LEVPRjo1LHByb2dyYW1fcmVwZXRpdGlvbjA6NixzdGF0ZW1lbnQ6NyxtdXN0YWNoZTo4LGJsb2NrOjkscmF3QmxvY2s6MTAscGFydGlhbDoxMSxwYXJ0aWFsQmxvY2s6MTIsY29udGVudDoxMyxDT01NRU5UOjE0LENPTlRFTlQ6MTUsb3BlblJhd0Jsb2NrOjE2LHJhd0Jsb2NrX3JlcGV0aXRpb25fcGx1czA6MTcsRU5EX1JBV19CTE9DSzoxOCxPUEVOX1JBV19CTE9DSzoxOSxoZWxwZXJOYW1lOjIwLG9wZW5SYXdCbG9ja19yZXBldGl0aW9uMDoyMSxvcGVuUmF3QmxvY2tfb3B0aW9uMDoyMixDTE9TRV9SQVdfQkxPQ0s6MjMsb3BlbkJsb2NrOjI0LGJsb2NrX29wdGlvbjA6MjUsY2xvc2VCbG9jazoyNixvcGVuSW52ZXJzZToyNyxibG9ja19vcHRpb24xOjI4LE9QRU5fQkxPQ0s6Mjksb3BlbkJsb2NrX3JlcGV0aXRpb24wOjMwLG9wZW5CbG9ja19vcHRpb24wOjMxLG9wZW5CbG9ja19vcHRpb24xOjMyLENMT1NFOjMzLE9QRU5fSU5WRVJTRTozNCxvcGVuSW52ZXJzZV9yZXBldGl0aW9uMDozNSxvcGVuSW52ZXJzZV9vcHRpb24wOjM2LG9wZW5JbnZlcnNlX29wdGlvbjE6Mzcsb3BlbkludmVyc2VDaGFpbjozOCxPUEVOX0lOVkVSU0VfQ0hBSU46Mzksb3BlbkludmVyc2VDaGFpbl9yZXBldGl0aW9uMDo0MCxvcGVuSW52ZXJzZUNoYWluX29wdGlvbjA6NDEsb3BlbkludmVyc2VDaGFpbl9vcHRpb24xOjQyLGludmVyc2VBbmRQcm9ncmFtOjQzLElOVkVSU0U6NDQsaW52ZXJzZUNoYWluOjQ1LGludmVyc2VDaGFpbl9vcHRpb24wOjQ2LE9QRU5fRU5EQkxPQ0s6NDcsT1BFTjo0OCxtdXN0YWNoZV9yZXBldGl0aW9uMDo0OSxtdXN0YWNoZV9vcHRpb24wOjUwLE9QRU5fVU5FU0NBUEVEOjUxLG11c3RhY2hlX3JlcGV0aXRpb24xOjUyLG11c3RhY2hlX29wdGlvbjE6NTMsQ0xPU0VfVU5FU0NBUEVEOjU0LE9QRU5fUEFSVElBTDo1NSxwYXJ0aWFsTmFtZTo1NixwYXJ0aWFsX3JlcGV0aXRpb24wOjU3LHBhcnRpYWxfb3B0aW9uMDo1OCxvcGVuUGFydGlhbEJsb2NrOjU5LE9QRU5fUEFSVElBTF9CTE9DSzo2MCxvcGVuUGFydGlhbEJsb2NrX3JlcGV0aXRpb24wOjYxLG9wZW5QYXJ0aWFsQmxvY2tfb3B0aW9uMDo2MixwYXJhbTo2MyxzZXhwcjo2NCxPUEVOX1NFWFBSOjY1LHNleHByX3JlcGV0aXRpb24wOjY2LHNleHByX29wdGlvbjA6NjcsQ0xPU0VfU0VYUFI6NjgsaGFzaDo2OSxoYXNoX3JlcGV0aXRpb25fcGx1czA6NzAsaGFzaFNlZ21lbnQ6NzEsSUQ6NzIsRVFVQUxTOjczLGJsb2NrUGFyYW1zOjc0LE9QRU5fQkxPQ0tfUEFSQU1TOjc1LGJsb2NrUGFyYW1zX3JlcGV0aXRpb25fcGx1czA6NzYsQ0xPU0VfQkxPQ0tfUEFSQU1TOjc3LHBhdGg6NzgsZGF0YU5hbWU6NzksU1RSSU5HOjgwLE5VTUJFUjo4MSxCT09MRUFOOjgyLFVOREVGSU5FRDo4MyxOVUxMOjg0LERBVEE6ODUscGF0aFNlZ21lbnRzOjg2LFNFUDo4NywkYWNjZXB0OjAsJGVuZDoxfSx0ZXJtaW5hbHNfOnsyOlwiZXJyb3JcIiw1OlwiRU9GXCIsMTQ6XCJDT01NRU5UXCIsMTU6XCJDT05URU5UXCIsMTg6XCJFTkRfUkFXX0JMT0NLXCIsMTk6XCJPUEVOX1JBV19CTE9DS1wiLDIzOlwiQ0xPU0VfUkFXX0JMT0NLXCIsMjk6XCJPUEVOX0JMT0NLXCIsMzM6XCJDTE9TRVwiLDM0OlwiT1BFTl9JTlZFUlNFXCIsMzk6XCJPUEVOX0lOVkVSU0VfQ0hBSU5cIiw0NDpcIklOVkVSU0VcIiw0NzpcIk9QRU5fRU5EQkxPQ0tcIiw0ODpcIk9QRU5cIiw1MTpcIk9QRU5fVU5FU0NBUEVEXCIsNTQ6XCJDTE9TRV9VTkVTQ0FQRURcIiw1NTpcIk9QRU5fUEFSVElBTFwiLDYwOlwiT1BFTl9QQVJUSUFMX0JMT0NLXCIsNjU6XCJPUEVOX1NFWFBSXCIsNjg6XCJDTE9TRV9TRVhQUlwiLDcyOlwiSURcIiw3MzpcIkVRVUFMU1wiLDc1OlwiT1BFTl9CTE9DS19QQVJBTVNcIiw3NzpcIkNMT1NFX0JMT0NLX1BBUkFNU1wiLDgwOlwiU1RSSU5HXCIsODE6XCJOVU1CRVJcIiw4MjpcIkJPT0xFQU5cIiw4MzpcIlVOREVGSU5FRFwiLDg0OlwiTlVMTFwiLDg1OlwiREFUQVwiLDg3OlwiU0VQXCJ9LHByb2R1Y3Rpb25zXzpbMCxbMywyXSxbNCwxXSxbNywxXSxbNywxXSxbNywxXSxbNywxXSxbNywxXSxbNywxXSxbNywxXSxbMTMsMV0sWzEwLDNdLFsxNiw1XSxbOSw0XSxbOSw0XSxbMjQsNl0sWzI3LDZdLFszOCw2XSxbNDMsMl0sWzQ1LDNdLFs0NSwxXSxbMjYsM10sWzgsNV0sWzgsNV0sWzExLDVdLFsxMiwzXSxbNTksNV0sWzYzLDFdLFs2MywxXSxbNjQsNV0sWzY5LDFdLFs3MSwzXSxbNzQsM10sWzIwLDFdLFsyMCwxXSxbMjAsMV0sWzIwLDFdLFsyMCwxXSxbMjAsMV0sWzIwLDFdLFs1NiwxXSxbNTYsMV0sWzc5LDJdLFs3OCwxXSxbODYsM10sWzg2LDFdLFs2LDBdLFs2LDJdLFsxNywxXSxbMTcsMl0sWzIxLDBdLFsyMSwyXSxbMjIsMF0sWzIyLDFdLFsyNSwwXSxbMjUsMV0sWzI4LDBdLFsyOCwxXSxbMzAsMF0sWzMwLDJdLFszMSwwXSxbMzEsMV0sWzMyLDBdLFszMiwxXSxbMzUsMF0sWzM1LDJdLFszNiwwXSxbMzYsMV0sWzM3LDBdLFszNywxXSxbNDAsMF0sWzQwLDJdLFs0MSwwXSxbNDEsMV0sWzQyLDBdLFs0MiwxXSxbNDYsMF0sWzQ2LDFdLFs0OSwwXSxbNDksMl0sWzUwLDBdLFs1MCwxXSxbNTIsMF0sWzUyLDJdLFs1MywwXSxbNTMsMV0sWzU3LDBdLFs1NywyXSxbNTgsMF0sWzU4LDFdLFs2MSwwXSxbNjEsMl0sWzYyLDBdLFs2MiwxXSxbNjYsMF0sWzY2LDJdLFs2NywwXSxbNjcsMV0sWzcwLDFdLFs3MCwyXSxbNzYsMV0sWzc2LDJdXSxwZXJmb3JtQWN0aW9uOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPWYubGVuZ3RoLTE7c3dpdGNoKGUpe2Nhc2UgMTpyZXR1cm4gZltoLTFdO2Nhc2UgMjp0aGlzLiQ9ZC5wcmVwYXJlUHJvZ3JhbShmW2hdKTticmVhaztjYXNlIDM6dGhpcy4kPWZbaF07YnJlYWs7Y2FzZSA0OnRoaXMuJD1mW2hdO2JyZWFrO2Nhc2UgNTp0aGlzLiQ9ZltoXTticmVhaztjYXNlIDY6dGhpcy4kPWZbaF07YnJlYWs7Y2FzZSA3OnRoaXMuJD1mW2hdO2JyZWFrO2Nhc2UgODp0aGlzLiQ9ZltoXTticmVhaztjYXNlIDk6dGhpcy4kPXt0eXBlOlwiQ29tbWVudFN0YXRlbWVudFwiLHZhbHVlOmQuc3RyaXBDb21tZW50KGZbaF0pLHN0cmlwOmQuc3RyaXBGbGFncyhmW2hdLGZbaF0pLGxvYzpkLmxvY0luZm8odGhpcy5fJCl9O2JyZWFrO2Nhc2UgMTA6dGhpcy4kPXt0eXBlOlwiQ29udGVudFN0YXRlbWVudFwiLG9yaWdpbmFsOmZbaF0sdmFsdWU6ZltoXSxsb2M6ZC5sb2NJbmZvKHRoaXMuXyQpfTticmVhaztjYXNlIDExOnRoaXMuJD1kLnByZXBhcmVSYXdCbG9jayhmW2gtMl0sZltoLTFdLGZbaF0sdGhpcy5fJCk7YnJlYWs7Y2FzZSAxMjp0aGlzLiQ9e3BhdGg6ZltoLTNdLHBhcmFtczpmW2gtMl0saGFzaDpmW2gtMV19O2JyZWFrO2Nhc2UgMTM6dGhpcy4kPWQucHJlcGFyZUJsb2NrKGZbaC0zXSxmW2gtMl0sZltoLTFdLGZbaF0sITEsdGhpcy5fJCk7YnJlYWs7Y2FzZSAxNDp0aGlzLiQ9ZC5wcmVwYXJlQmxvY2soZltoLTNdLGZbaC0yXSxmW2gtMV0sZltoXSwhMCx0aGlzLl8kKTticmVhaztjYXNlIDE1OnRoaXMuJD17b3BlbjpmW2gtNV0scGF0aDpmW2gtNF0scGFyYW1zOmZbaC0zXSxoYXNoOmZbaC0yXSxibG9ja1BhcmFtczpmW2gtMV0sc3RyaXA6ZC5zdHJpcEZsYWdzKGZbaC01XSxmW2hdKX07YnJlYWs7Y2FzZSAxNjp0aGlzLiQ9e3BhdGg6ZltoLTRdLHBhcmFtczpmW2gtM10saGFzaDpmW2gtMl0sYmxvY2tQYXJhbXM6ZltoLTFdLHN0cmlwOmQuc3RyaXBGbGFncyhmW2gtNV0sZltoXSl9O2JyZWFrO2Nhc2UgMTc6dGhpcy4kPXtwYXRoOmZbaC00XSxwYXJhbXM6ZltoLTNdLGhhc2g6ZltoLTJdLGJsb2NrUGFyYW1zOmZbaC0xXSxzdHJpcDpkLnN0cmlwRmxhZ3MoZltoLTVdLGZbaF0pfTticmVhaztjYXNlIDE4OnRoaXMuJD17c3RyaXA6ZC5zdHJpcEZsYWdzKGZbaC0xXSxmW2gtMV0pLHByb2dyYW06ZltoXX07YnJlYWs7Y2FzZSAxOTp2YXIgaT1kLnByZXBhcmVCbG9jayhmW2gtMl0sZltoLTFdLGZbaF0sZltoXSwhMSx0aGlzLl8kKSxqPWQucHJlcGFyZVByb2dyYW0oW2ldLGZbaC0xXS5sb2MpO2ouY2hhaW5lZD0hMCx0aGlzLiQ9e3N0cmlwOmZbaC0yXS5zdHJpcCxwcm9ncmFtOmosY2hhaW46ITB9O2JyZWFrO2Nhc2UgMjA6dGhpcy4kPWZbaF07YnJlYWs7Y2FzZSAyMTp0aGlzLiQ9e3BhdGg6ZltoLTFdLHN0cmlwOmQuc3RyaXBGbGFncyhmW2gtMl0sZltoXSl9O2JyZWFrO2Nhc2UgMjI6dGhpcy4kPWQucHJlcGFyZU11c3RhY2hlKGZbaC0zXSxmW2gtMl0sZltoLTFdLGZbaC00XSxkLnN0cmlwRmxhZ3MoZltoLTRdLGZbaF0pLHRoaXMuXyQpO2JyZWFrO2Nhc2UgMjM6dGhpcy4kPWQucHJlcGFyZU11c3RhY2hlKGZbaC0zXSxmW2gtMl0sZltoLTFdLGZbaC00XSxkLnN0cmlwRmxhZ3MoZltoLTRdLGZbaF0pLHRoaXMuXyQpO2JyZWFrO2Nhc2UgMjQ6dGhpcy4kPXt0eXBlOlwiUGFydGlhbFN0YXRlbWVudFwiLG5hbWU6ZltoLTNdLHBhcmFtczpmW2gtMl0saGFzaDpmW2gtMV0saW5kZW50OlwiXCIsc3RyaXA6ZC5zdHJpcEZsYWdzKGZbaC00XSxmW2hdKSxsb2M6ZC5sb2NJbmZvKHRoaXMuXyQpfTticmVhaztjYXNlIDI1OnRoaXMuJD1kLnByZXBhcmVQYXJ0aWFsQmxvY2soZltoLTJdLGZbaC0xXSxmW2hdLHRoaXMuXyQpO2JyZWFrO2Nhc2UgMjY6dGhpcy4kPXtwYXRoOmZbaC0zXSxwYXJhbXM6ZltoLTJdLGhhc2g6ZltoLTFdLHN0cmlwOmQuc3RyaXBGbGFncyhmW2gtNF0sZltoXSl9O2JyZWFrO2Nhc2UgMjc6dGhpcy4kPWZbaF07YnJlYWs7Y2FzZSAyODp0aGlzLiQ9ZltoXTticmVhaztjYXNlIDI5OnRoaXMuJD17dHlwZTpcIlN1YkV4cHJlc3Npb25cIixwYXRoOmZbaC0zXSxwYXJhbXM6ZltoLTJdLGhhc2g6ZltoLTFdLGxvYzpkLmxvY0luZm8odGhpcy5fJCl9O2JyZWFrO2Nhc2UgMzA6dGhpcy4kPXt0eXBlOlwiSGFzaFwiLHBhaXJzOmZbaF0sbG9jOmQubG9jSW5mbyh0aGlzLl8kKX07YnJlYWs7Y2FzZSAzMTp0aGlzLiQ9e3R5cGU6XCJIYXNoUGFpclwiLGtleTpkLmlkKGZbaC0yXSksdmFsdWU6ZltoXSxsb2M6ZC5sb2NJbmZvKHRoaXMuXyQpfTticmVhaztjYXNlIDMyOnRoaXMuJD1kLmlkKGZbaC0xXSk7YnJlYWs7Y2FzZSAzMzp0aGlzLiQ9ZltoXTticmVhaztjYXNlIDM0OnRoaXMuJD1mW2hdO2JyZWFrO2Nhc2UgMzU6dGhpcy4kPXt0eXBlOlwiU3RyaW5nTGl0ZXJhbFwiLHZhbHVlOmZbaF0sb3JpZ2luYWw6ZltoXSxsb2M6ZC5sb2NJbmZvKHRoaXMuXyQpfTticmVhaztjYXNlIDM2OnRoaXMuJD17dHlwZTpcIk51bWJlckxpdGVyYWxcIix2YWx1ZTpOdW1iZXIoZltoXSksb3JpZ2luYWw6TnVtYmVyKGZbaF0pLGxvYzpkLmxvY0luZm8odGhpcy5fJCl9O2JyZWFrO2Nhc2UgMzc6dGhpcy4kPXt0eXBlOlwiQm9vbGVhbkxpdGVyYWxcIix2YWx1ZTpcInRydWVcIj09PWZbaF0sb3JpZ2luYWw6XCJ0cnVlXCI9PT1mW2hdLGxvYzpkLmxvY0luZm8odGhpcy5fJCl9O2JyZWFrO2Nhc2UgMzg6dGhpcy4kPXt0eXBlOlwiVW5kZWZpbmVkTGl0ZXJhbFwiLG9yaWdpbmFsOnZvaWQgMCx2YWx1ZTp2b2lkIDAsbG9jOmQubG9jSW5mbyh0aGlzLl8kKX07YnJlYWs7Y2FzZSAzOTp0aGlzLiQ9e3R5cGU6XCJOdWxsTGl0ZXJhbFwiLG9yaWdpbmFsOm51bGwsdmFsdWU6bnVsbCxsb2M6ZC5sb2NJbmZvKHRoaXMuXyQpfTticmVhaztjYXNlIDQwOnRoaXMuJD1mW2hdO2JyZWFrO2Nhc2UgNDE6dGhpcy4kPWZbaF07YnJlYWs7Y2FzZSA0Mjp0aGlzLiQ9ZC5wcmVwYXJlUGF0aCghMCxmW2hdLHRoaXMuXyQpO2JyZWFrO2Nhc2UgNDM6dGhpcy4kPWQucHJlcGFyZVBhdGgoITEsZltoXSx0aGlzLl8kKTticmVhaztjYXNlIDQ0OmZbaC0yXS5wdXNoKHtwYXJ0OmQuaWQoZltoXSksb3JpZ2luYWw6ZltoXSxzZXBhcmF0b3I6ZltoLTFdfSksdGhpcy4kPWZbaC0yXTticmVhaztjYXNlIDQ1OnRoaXMuJD1be3BhcnQ6ZC5pZChmW2hdKSxvcmlnaW5hbDpmW2hdfV07YnJlYWs7Y2FzZSA0Njp0aGlzLiQ9W107YnJlYWs7Y2FzZSA0NzpmW2gtMV0ucHVzaChmW2hdKTticmVhaztjYXNlIDQ4OnRoaXMuJD1bZltoXV07YnJlYWs7Y2FzZSA0OTpmW2gtMV0ucHVzaChmW2hdKTticmVhaztjYXNlIDUwOnRoaXMuJD1bXTticmVhaztjYXNlIDUxOmZbaC0xXS5wdXNoKGZbaF0pO2JyZWFrO2Nhc2UgNTg6dGhpcy4kPVtdO2JyZWFrO2Nhc2UgNTk6ZltoLTFdLnB1c2goZltoXSk7YnJlYWs7Y2FzZSA2NDp0aGlzLiQ9W107YnJlYWs7Y2FzZSA2NTpmW2gtMV0ucHVzaChmW2hdKTticmVhaztjYXNlIDcwOnRoaXMuJD1bXTticmVhaztjYXNlIDcxOmZbaC0xXS5wdXNoKGZbaF0pO2JyZWFrO2Nhc2UgNzg6dGhpcy4kPVtdO2JyZWFrO2Nhc2UgNzk6ZltoLTFdLnB1c2goZltoXSk7YnJlYWs7Y2FzZSA4Mjp0aGlzLiQ9W107YnJlYWs7Y2FzZSA4MzpmW2gtMV0ucHVzaChmW2hdKTticmVhaztjYXNlIDg2OnRoaXMuJD1bXTticmVhaztjYXNlIDg3OmZbaC0xXS5wdXNoKGZbaF0pO2JyZWFrO2Nhc2UgOTA6dGhpcy4kPVtdO2JyZWFrO2Nhc2UgOTE6ZltoLTFdLnB1c2goZltoXSk7YnJlYWs7Y2FzZSA5NDp0aGlzLiQ9W107YnJlYWs7Y2FzZSA5NTpmW2gtMV0ucHVzaChmW2hdKTticmVhaztjYXNlIDk4OnRoaXMuJD1bZltoXV07YnJlYWs7Y2FzZSA5OTpmW2gtMV0ucHVzaChmW2hdKTticmVhaztjYXNlIDEwMDp0aGlzLiQ9W2ZbaF1dO2JyZWFrO2Nhc2UgMTAxOmZbaC0xXS5wdXNoKGZbaF0pfX0sdGFibGU6W3szOjEsNDoyLDU6WzIsNDZdLDY6MywxNDpbMiw0Nl0sMTU6WzIsNDZdLDE5OlsyLDQ2XSwyOTpbMiw0Nl0sMzQ6WzIsNDZdLDQ4OlsyLDQ2XSw1MTpbMiw0Nl0sNTU6WzIsNDZdLDYwOlsyLDQ2XX0sezE6WzNdfSx7NTpbMSw0XX0sezU6WzIsMl0sNzo1LDg6Niw5OjcsMTA6OCwxMTo5LDEyOjEwLDEzOjExLDE0OlsxLDEyXSwxNTpbMSwyMF0sMTY6MTcsMTk6WzEsMjNdLDI0OjE1LDI3OjE2LDI5OlsxLDIxXSwzNDpbMSwyMl0sMzk6WzIsMl0sNDQ6WzIsMl0sNDc6WzIsMl0sNDg6WzEsMTNdLDUxOlsxLDE0XSw1NTpbMSwxOF0sNTk6MTksNjA6WzEsMjRdfSx7MTpbMiwxXX0sezU6WzIsNDddLDE0OlsyLDQ3XSwxNTpbMiw0N10sMTk6WzIsNDddLDI5OlsyLDQ3XSwzNDpbMiw0N10sMzk6WzIsNDddLDQ0OlsyLDQ3XSw0NzpbMiw0N10sNDg6WzIsNDddLDUxOlsyLDQ3XSw1NTpbMiw0N10sNjA6WzIsNDddfSx7NTpbMiwzXSwxNDpbMiwzXSwxNTpbMiwzXSwxOTpbMiwzXSwyOTpbMiwzXSwzNDpbMiwzXSwzOTpbMiwzXSw0NDpbMiwzXSw0NzpbMiwzXSw0ODpbMiwzXSw1MTpbMiwzXSw1NTpbMiwzXSw2MDpbMiwzXX0sezU6WzIsNF0sMTQ6WzIsNF0sMTU6WzIsNF0sMTk6WzIsNF0sMjk6WzIsNF0sMzQ6WzIsNF0sMzk6WzIsNF0sNDQ6WzIsNF0sNDc6WzIsNF0sNDg6WzIsNF0sNTE6WzIsNF0sNTU6WzIsNF0sNjA6WzIsNF19LHs1OlsyLDVdLDE0OlsyLDVdLDE1OlsyLDVdLDE5OlsyLDVdLDI5OlsyLDVdLDM0OlsyLDVdLDM5OlsyLDVdLDQ0OlsyLDVdLDQ3OlsyLDVdLDQ4OlsyLDVdLDUxOlsyLDVdLDU1OlsyLDVdLDYwOlsyLDVdfSx7NTpbMiw2XSwxNDpbMiw2XSwxNTpbMiw2XSwxOTpbMiw2XSwyOTpbMiw2XSwzNDpbMiw2XSwzOTpbMiw2XSw0NDpbMiw2XSw0NzpbMiw2XSw0ODpbMiw2XSw1MTpbMiw2XSw1NTpbMiw2XSw2MDpbMiw2XX0sezU6WzIsN10sMTQ6WzIsN10sMTU6WzIsN10sMTk6WzIsN10sMjk6WzIsN10sMzQ6WzIsN10sMzk6WzIsN10sNDQ6WzIsN10sNDc6WzIsN10sNDg6WzIsN10sNTE6WzIsN10sNTU6WzIsN10sNjA6WzIsN119LHs1OlsyLDhdLDE0OlsyLDhdLDE1OlsyLDhdLDE5OlsyLDhdLDI5OlsyLDhdLDM0OlsyLDhdLDM5OlsyLDhdLDQ0OlsyLDhdLDQ3OlsyLDhdLDQ4OlsyLDhdLDUxOlsyLDhdLDU1OlsyLDhdLDYwOlsyLDhdfSx7NTpbMiw5XSwxNDpbMiw5XSwxNTpbMiw5XSwxOTpbMiw5XSwyOTpbMiw5XSwzNDpbMiw5XSwzOTpbMiw5XSw0NDpbMiw5XSw0NzpbMiw5XSw0ODpbMiw5XSw1MTpbMiw5XSw1NTpbMiw5XSw2MDpbMiw5XX0sezIwOjI1LDcyOlsxLDM1XSw3ODoyNiw3OToyNyw4MDpbMSwyOF0sODE6WzEsMjldLDgyOlsxLDMwXSw4MzpbMSwzMV0sODQ6WzEsMzJdLDg1OlsxLDM0XSw4NjozM30sezIwOjM2LDcyOlsxLDM1XSw3ODoyNiw3OToyNyw4MDpbMSwyOF0sODE6WzEsMjldLDgyOlsxLDMwXSw4MzpbMSwzMV0sODQ6WzEsMzJdLDg1OlsxLDM0XSw4NjozM30sezQ6MzcsNjozLDE0OlsyLDQ2XSwxNTpbMiw0Nl0sMTk6WzIsNDZdLDI5OlsyLDQ2XSwzNDpbMiw0Nl0sMzk6WzIsNDZdLDQ0OlsyLDQ2XSw0NzpbMiw0Nl0sNDg6WzIsNDZdLDUxOlsyLDQ2XSw1NTpbMiw0Nl0sNjA6WzIsNDZdfSx7NDozOCw2OjMsMTQ6WzIsNDZdLDE1OlsyLDQ2XSwxOTpbMiw0Nl0sMjk6WzIsNDZdLDM0OlsyLDQ2XSw0NDpbMiw0Nl0sNDc6WzIsNDZdLDQ4OlsyLDQ2XSw1MTpbMiw0Nl0sNTU6WzIsNDZdLDYwOlsyLDQ2XX0sezEzOjQwLDE1OlsxLDIwXSwxNzozOX0sezIwOjQyLDU2OjQxLDY0OjQzLDY1OlsxLDQ0XSw3MjpbMSwzNV0sNzg6MjYsNzk6MjcsODA6WzEsMjhdLDgxOlsxLDI5XSw4MjpbMSwzMF0sODM6WzEsMzFdLDg0OlsxLDMyXSw4NTpbMSwzNF0sODY6MzN9LHs0OjQ1LDY6MywxNDpbMiw0Nl0sMTU6WzIsNDZdLDE5OlsyLDQ2XSwyOTpbMiw0Nl0sMzQ6WzIsNDZdLDQ3OlsyLDQ2XSw0ODpbMiw0Nl0sNTE6WzIsNDZdLDU1OlsyLDQ2XSw2MDpbMiw0Nl19LHs1OlsyLDEwXSwxNDpbMiwxMF0sMTU6WzIsMTBdLDE4OlsyLDEwXSwxOTpbMiwxMF0sMjk6WzIsMTBdLDM0OlsyLDEwXSwzOTpbMiwxMF0sNDQ6WzIsMTBdLDQ3OlsyLDEwXSw0ODpbMiwxMF0sNTE6WzIsMTBdLDU1OlsyLDEwXSw2MDpbMiwxMF19LHsyMDo0Niw3MjpbMSwzNV0sNzg6MjYsNzk6MjcsODA6WzEsMjhdLDgxOlsxLDI5XSw4MjpbMSwzMF0sODM6WzEsMzFdLDg0OlsxLDMyXSw4NTpbMSwzNF0sODY6MzN9LHsyMDo0Nyw3MjpbMSwzNV0sNzg6MjYsNzk6MjcsODA6WzEsMjhdLDgxOlsxLDI5XSw4MjpbMSwzMF0sODM6WzEsMzFdLDg0OlsxLDMyXSw4NTpbMSwzNF0sODY6MzN9LHsyMDo0OCw3MjpbMSwzNV0sNzg6MjYsNzk6MjcsODA6WzEsMjhdLDgxOlsxLDI5XSw4MjpbMSwzMF0sODM6WzEsMzFdLDg0OlsxLDMyXSw4NTpbMSwzNF0sODY6MzN9LHsyMDo0Miw1Njo0OSw2NDo0Myw2NTpbMSw0NF0sNzI6WzEsMzVdLDc4OjI2LDc5OjI3LDgwOlsxLDI4XSw4MTpbMSwyOV0sODI6WzEsMzBdLDgzOlsxLDMxXSw4NDpbMSwzMl0sODU6WzEsMzRdLDg2OjMzfSx7MzM6WzIsNzhdLDQ5OjUwLDY1OlsyLDc4XSw3MjpbMiw3OF0sODA6WzIsNzhdLDgxOlsyLDc4XSw4MjpbMiw3OF0sODM6WzIsNzhdLDg0OlsyLDc4XSw4NTpbMiw3OF19LHsyMzpbMiwzM10sMzM6WzIsMzNdLDU0OlsyLDMzXSw2NTpbMiwzM10sNjg6WzIsMzNdLDcyOlsyLDMzXSw3NTpbMiwzM10sODA6WzIsMzNdLDgxOlsyLDMzXSw4MjpbMiwzM10sODM6WzIsMzNdLDg0OlsyLDMzXSw4NTpbMiwzM119LHsyMzpbMiwzNF0sMzM6WzIsMzRdLDU0OlsyLDM0XSw2NTpbMiwzNF0sNjg6WzIsMzRdLDcyOlsyLDM0XSw3NTpbMiwzNF0sODA6WzIsMzRdLDgxOlsyLDM0XSw4MjpbMiwzNF0sODM6WzIsMzRdLDg0OlsyLDM0XSw4NTpbMiwzNF19LHsyMzpbMiwzNV0sMzM6WzIsMzVdLDU0OlsyLDM1XSw2NTpbMiwzNV0sNjg6WzIsMzVdLDcyOlsyLDM1XSw3NTpbMiwzNV0sODA6WzIsMzVdLDgxOlsyLDM1XSw4MjpbMiwzNV0sODM6WzIsMzVdLDg0OlsyLDM1XSw4NTpbMiwzNV19LHsyMzpbMiwzNl0sMzM6WzIsMzZdLDU0OlsyLDM2XSw2NTpbMiwzNl0sNjg6WzIsMzZdLDcyOlsyLDM2XSw3NTpbMiwzNl0sODA6WzIsMzZdLDgxOlsyLDM2XSw4MjpbMiwzNl0sODM6WzIsMzZdLDg0OlsyLDM2XSw4NTpbMiwzNl19LHsyMzpbMiwzN10sMzM6WzIsMzddLDU0OlsyLDM3XSw2NTpbMiwzN10sNjg6WzIsMzddLDcyOlsyLDM3XSw3NTpbMiwzN10sODA6WzIsMzddLDgxOlsyLDM3XSw4MjpbMiwzN10sODM6WzIsMzddLDg0OlsyLDM3XSw4NTpbMiwzN119LHsyMzpbMiwzOF0sMzM6WzIsMzhdLDU0OlsyLDM4XSw2NTpbMiwzOF0sNjg6WzIsMzhdLDcyOlsyLDM4XSw3NTpbMiwzOF0sODA6WzIsMzhdLDgxOlsyLDM4XSw4MjpbMiwzOF0sODM6WzIsMzhdLDg0OlsyLDM4XSw4NTpbMiwzOF19LHsyMzpbMiwzOV0sMzM6WzIsMzldLDU0OlsyLDM5XSw2NTpbMiwzOV0sNjg6WzIsMzldLDcyOlsyLDM5XSw3NTpbMiwzOV0sODA6WzIsMzldLDgxOlsyLDM5XSw4MjpbMiwzOV0sODM6WzIsMzldLDg0OlsyLDM5XSw4NTpbMiwzOV19LHsyMzpbMiw0M10sMzM6WzIsNDNdLDU0OlsyLDQzXSw2NTpbMiw0M10sNjg6WzIsNDNdLDcyOlsyLDQzXSw3NTpbMiw0M10sODA6WzIsNDNdLDgxOlsyLDQzXSw4MjpbMiw0M10sODM6WzIsNDNdLDg0OlsyLDQzXSw4NTpbMiw0M10sODc6WzEsNTFdfSx7NzI6WzEsMzVdLDg2OjUyfSx7MjM6WzIsNDVdLDMzOlsyLDQ1XSw1NDpbMiw0NV0sNjU6WzIsNDVdLDY4OlsyLDQ1XSw3MjpbMiw0NV0sNzU6WzIsNDVdLDgwOlsyLDQ1XSw4MTpbMiw0NV0sODI6WzIsNDVdLDgzOlsyLDQ1XSw4NDpbMiw0NV0sODU6WzIsNDVdLDg3OlsyLDQ1XX0sezUyOjUzLDU0OlsyLDgyXSw2NTpbMiw4Ml0sNzI6WzIsODJdLDgwOlsyLDgyXSw4MTpbMiw4Ml0sODI6WzIsODJdLDgzOlsyLDgyXSw4NDpbMiw4Ml0sODU6WzIsODJdfSx7MjU6NTQsMzg6NTYsMzk6WzEsNThdLDQzOjU3LDQ0OlsxLDU5XSw0NTo1NSw0NzpbMiw1NF19LHsyODo2MCw0Mzo2MSw0NDpbMSw1OV0sNDc6WzIsNTZdfSx7MTM6NjMsMTU6WzEsMjBdLDE4OlsxLDYyXX0sezE1OlsyLDQ4XSwxODpbMiw0OF19LHszMzpbMiw4Nl0sNTc6NjQsNjU6WzIsODZdLDcyOlsyLDg2XSw4MDpbMiw4Nl0sODE6WzIsODZdLDgyOlsyLDg2XSw4MzpbMiw4Nl0sODQ6WzIsODZdLDg1OlsyLDg2XX0sezMzOlsyLDQwXSw2NTpbMiw0MF0sNzI6WzIsNDBdLDgwOlsyLDQwXSw4MTpbMiw0MF0sODI6WzIsNDBdLDgzOlsyLDQwXSw4NDpbMiw0MF0sODU6WzIsNDBdfSx7MzM6WzIsNDFdLDY1OlsyLDQxXSw3MjpbMiw0MV0sODA6WzIsNDFdLDgxOlsyLDQxXSw4MjpbMiw0MV0sODM6WzIsNDFdLDg0OlsyLDQxXSw4NTpbMiw0MV19LHsyMDo2NSw3MjpbMSwzNV0sNzg6MjYsNzk6MjcsODA6WzEsMjhdLDgxOlsxLDI5XSw4MjpbMSwzMF0sODM6WzEsMzFdLDg0OlsxLDMyXSw4NTpbMSwzNF0sODY6MzN9LHsyNjo2Niw0NzpbMSw2N119LHszMDo2OCwzMzpbMiw1OF0sNjU6WzIsNThdLDcyOlsyLDU4XSw3NTpbMiw1OF0sODA6WzIsNThdLDgxOlsyLDU4XSw4MjpbMiw1OF0sODM6WzIsNThdLDg0OlsyLDU4XSw4NTpbMiw1OF19LHszMzpbMiw2NF0sMzU6NjksNjU6WzIsNjRdLDcyOlsyLDY0XSw3NTpbMiw2NF0sODA6WzIsNjRdLDgxOlsyLDY0XSw4MjpbMiw2NF0sODM6WzIsNjRdLDg0OlsyLDY0XSw4NTpbMiw2NF19LHsyMTo3MCwyMzpbMiw1MF0sNjU6WzIsNTBdLDcyOlsyLDUwXSw4MDpbMiw1MF0sODE6WzIsNTBdLDgyOlsyLDUwXSw4MzpbMiw1MF0sODQ6WzIsNTBdLDg1OlsyLDUwXX0sezMzOlsyLDkwXSw2MTo3MSw2NTpbMiw5MF0sNzI6WzIsOTBdLDgwOlsyLDkwXSw4MTpbMiw5MF0sODI6WzIsOTBdLDgzOlsyLDkwXSw4NDpbMiw5MF0sODU6WzIsOTBdfSx7MjA6NzUsMzM6WzIsODBdLDUwOjcyLDYzOjczLDY0Ojc2LDY1OlsxLDQ0XSw2OTo3NCw3MDo3Nyw3MTo3OCw3MjpbMSw3OV0sNzg6MjYsNzk6MjcsODA6WzEsMjhdLDgxOlsxLDI5XSw4MjpbMSwzMF0sODM6WzEsMzFdLDg0OlsxLDMyXSw4NTpbMSwzNF0sODY6MzN9LHs3MjpbMSw4MF19LHsyMzpbMiw0Ml0sMzM6WzIsNDJdLDU0OlsyLDQyXSw2NTpbMiw0Ml0sNjg6WzIsNDJdLDcyOlsyLDQyXSw3NTpbMiw0Ml0sODA6WzIsNDJdLDgxOlsyLDQyXSw4MjpbMiw0Ml0sODM6WzIsNDJdLDg0OlsyLDQyXSw4NTpbMiw0Ml0sODc6WzEsNTFdfSx7MjA6NzUsNTM6ODEsNTQ6WzIsODRdLDYzOjgyLDY0Ojc2LDY1OlsxLDQ0XSw2OTo4Myw3MDo3Nyw3MTo3OCw3MjpbMSw3OV0sNzg6MjYsNzk6MjcsODA6WzEsMjhdLDgxOlsxLDI5XSw4MjpbMSwzMF0sODM6WzEsMzFdLDg0OlsxLDMyXSw4NTpbMSwzNF0sODY6MzN9LHsyNjo4NCw0NzpbMSw2N119LHs0NzpbMiw1NV19LHs0Ojg1LDY6MywxNDpbMiw0Nl0sMTU6WzIsNDZdLDE5OlsyLDQ2XSwyOTpbMiw0Nl0sMzQ6WzIsNDZdLDM5OlsyLDQ2XSw0NDpbMiw0Nl0sNDc6WzIsNDZdLDQ4OlsyLDQ2XSw1MTpbMiw0Nl0sNTU6WzIsNDZdLDYwOlsyLDQ2XX0sezQ3OlsyLDIwXX0sezIwOjg2LDcyOlsxLDM1XSw3ODoyNiw3OToyNyw4MDpbMSwyOF0sODE6WzEsMjldLDgyOlsxLDMwXSw4MzpbMSwzMV0sODQ6WzEsMzJdLDg1OlsxLDM0XSw4NjozM30sezQ6ODcsNjozLDE0OlsyLDQ2XSwxNTpbMiw0Nl0sMTk6WzIsNDZdLDI5OlsyLDQ2XSwzNDpbMiw0Nl0sNDc6WzIsNDZdLDQ4OlsyLDQ2XSw1MTpbMiw0Nl0sNTU6WzIsNDZdLDYwOlsyLDQ2XX0sezI2Ojg4LDQ3OlsxLDY3XX0sezQ3OlsyLDU3XX0sezU6WzIsMTFdLDE0OlsyLDExXSwxNTpbMiwxMV0sMTk6WzIsMTFdLDI5OlsyLDExXSwzNDpbMiwxMV0sMzk6WzIsMTFdLDQ0OlsyLDExXSw0NzpbMiwxMV0sNDg6WzIsMTFdLDUxOlsyLDExXSw1NTpbMiwxMV0sNjA6WzIsMTFdfSx7MTU6WzIsNDldLDE4OlsyLDQ5XX0sezIwOjc1LDMzOlsyLDg4XSw1ODo4OSw2Mzo5MCw2NDo3Niw2NTpbMSw0NF0sNjk6OTEsNzA6NzcsNzE6NzgsNzI6WzEsNzldLDc4OjI2LDc5OjI3LDgwOlsxLDI4XSw4MTpbMSwyOV0sODI6WzEsMzBdLDgzOlsxLDMxXSw4NDpbMSwzMl0sODU6WzEsMzRdLDg2OjMzfSx7NjU6WzIsOTRdLDY2OjkyLDY4OlsyLDk0XSw3MjpbMiw5NF0sODA6WzIsOTRdLDgxOlsyLDk0XSw4MjpbMiw5NF0sODM6WzIsOTRdLDg0OlsyLDk0XSw4NTpbMiw5NF19LHs1OlsyLDI1XSwxNDpbMiwyNV0sMTU6WzIsMjVdLDE5OlsyLDI1XSwyOTpbMiwyNV0sMzQ6WzIsMjVdLDM5OlsyLDI1XSw0NDpbMiwyNV0sNDc6WzIsMjVdLDQ4OlsyLDI1XSw1MTpbMiwyNV0sNTU6WzIsMjVdLDYwOlsyLDI1XX0sezIwOjkzLDcyOlsxLDM1XSw3ODoyNiw3OToyNyw4MDpbMSwyOF0sODE6WzEsMjldLDgyOlsxLDMwXSw4MzpbMSwzMV0sODQ6WzEsMzJdLDg1OlsxLDM0XSw4NjozM30sezIwOjc1LDMxOjk0LDMzOlsyLDYwXSw2Mzo5NSw2NDo3Niw2NTpbMSw0NF0sNjk6OTYsNzA6NzcsNzE6NzgsNzI6WzEsNzldLDc1OlsyLDYwXSw3ODoyNiw3OToyNyw4MDpbMSwyOF0sODE6WzEsMjldLDgyOlsxLDMwXSw4MzpbMSwzMV0sODQ6WzEsMzJdLDg1OlsxLDM0XSw4NjozM30sezIwOjc1LDMzOlsyLDY2XSwzNjo5Nyw2Mzo5OCw2NDo3Niw2NTpbMSw0NF0sNjk6OTksNzA6NzcsNzE6NzgsNzI6WzEsNzldLDc1OlsyLDY2XSw3ODoyNiw3OToyNyw4MDpbMSwyOF0sODE6WzEsMjldLDgyOlsxLDMwXSw4MzpbMSwzMV0sODQ6WzEsMzJdLDg1OlsxLDM0XSw4NjozM30sezIwOjc1LDIyOjEwMCwyMzpbMiw1Ml0sNjM6MTAxLDY0Ojc2LDY1OlsxLDQ0XSw2OToxMDIsNzA6NzcsNzE6NzgsNzI6WzEsNzldLDc4OjI2LDc5OjI3LDgwOlsxLDI4XSw4MTpbMSwyOV0sODI6WzEsMzBdLDgzOlsxLDMxXSw4NDpbMSwzMl0sODU6WzEsMzRdLDg2OjMzfSx7MjA6NzUsMzM6WzIsOTJdLDYyOjEwMyw2MzoxMDQsNjQ6NzYsNjU6WzEsNDRdLDY5OjEwNSw3MDo3Nyw3MTo3OCw3MjpbMSw3OV0sNzg6MjYsNzk6MjcsODA6WzEsMjhdLDgxOlsxLDI5XSw4MjpbMSwzMF0sODM6WzEsMzFdLDg0OlsxLDMyXSw4NTpbMSwzNF0sODY6MzN9LHszMzpbMSwxMDZdfSx7MzM6WzIsNzldLDY1OlsyLDc5XSw3MjpbMiw3OV0sODA6WzIsNzldLDgxOlsyLDc5XSw4MjpbMiw3OV0sODM6WzIsNzldLDg0OlsyLDc5XSw4NTpbMiw3OV19LHszMzpbMiw4MV19LHsyMzpbMiwyN10sMzM6WzIsMjddLDU0OlsyLDI3XSw2NTpbMiwyN10sNjg6WzIsMjddLDcyOlsyLDI3XSw3NTpbMiwyN10sODA6WzIsMjddLDgxOlsyLDI3XSw4MjpbMiwyN10sODM6WzIsMjddLDg0OlsyLDI3XSw4NTpbMiwyN119LHsyMzpbMiwyOF0sMzM6WzIsMjhdLDU0OlsyLDI4XSw2NTpbMiwyOF0sNjg6WzIsMjhdLDcyOlsyLDI4XSw3NTpbMiwyOF0sODA6WzIsMjhdLDgxOlsyLDI4XSw4MjpbMiwyOF0sODM6WzIsMjhdLDg0OlsyLDI4XSw4NTpbMiwyOF19LHsyMzpbMiwzMF0sMzM6WzIsMzBdLDU0OlsyLDMwXSw2ODpbMiwzMF0sNzE6MTA3LDcyOlsxLDEwOF0sNzU6WzIsMzBdfSx7MjM6WzIsOThdLDMzOlsyLDk4XSw1NDpbMiw5OF0sNjg6WzIsOThdLDcyOlsyLDk4XSw3NTpbMiw5OF19LHsyMzpbMiw0NV0sMzM6WzIsNDVdLDU0OlsyLDQ1XSw2NTpbMiw0NV0sNjg6WzIsNDVdLDcyOlsyLDQ1XSw3MzpbMSwxMDldLDc1OlsyLDQ1XSw4MDpbMiw0NV0sODE6WzIsNDVdLDgyOlsyLDQ1XSw4MzpbMiw0NV0sODQ6WzIsNDVdLDg1OlsyLDQ1XSw4NzpbMiw0NV19LHsyMzpbMiw0NF0sMzM6WzIsNDRdLDU0OlsyLDQ0XSw2NTpbMiw0NF0sNjg6WzIsNDRdLDcyOlsyLDQ0XSw3NTpbMiw0NF0sODA6WzIsNDRdLDgxOlsyLDQ0XSw4MjpbMiw0NF0sODM6WzIsNDRdLDg0OlsyLDQ0XSw4NTpbMiw0NF0sODc6WzIsNDRdfSx7NTQ6WzEsMTEwXX0sezU0OlsyLDgzXSw2NTpbMiw4M10sNzI6WzIsODNdLDgwOlsyLDgzXSw4MTpbMiw4M10sODI6WzIsODNdLDgzOlsyLDgzXSw4NDpbMiw4M10sODU6WzIsODNdfSx7NTQ6WzIsODVdfSx7NTpbMiwxM10sMTQ6WzIsMTNdLDE1OlsyLDEzXSwxOTpbMiwxM10sMjk6WzIsMTNdLDM0OlsyLDEzXSwzOTpbMiwxM10sNDQ6WzIsMTNdLDQ3OlsyLDEzXSw0ODpbMiwxM10sNTE6WzIsMTNdLDU1OlsyLDEzXSw2MDpbMiwxM119LHszODo1NiwzOTpbMSw1OF0sNDM6NTcsNDQ6WzEsNTldLDQ1OjExMiw0NjoxMTEsNDc6WzIsNzZdfSx7MzM6WzIsNzBdLDQwOjExMyw2NTpbMiw3MF0sNzI6WzIsNzBdLDc1OlsyLDcwXSw4MDpbMiw3MF0sODE6WzIsNzBdLDgyOlsyLDcwXSw4MzpbMiw3MF0sODQ6WzIsNzBdLDg1OlsyLDcwXX0sezQ3OlsyLDE4XX0sezU6WzIsMTRdLDE0OlsyLDE0XSwxNTpbMiwxNF0sMTk6WzIsMTRdLDI5OlsyLDE0XSwzNDpbMiwxNF0sMzk6WzIsMTRdLDQ0OlsyLDE0XSw0NzpbMiwxNF0sNDg6WzIsMTRdLDUxOlsyLDE0XSw1NTpbMiwxNF0sNjA6WzIsMTRdfSx7MzM6WzEsMTE0XX0sezMzOlsyLDg3XSw2NTpbMiw4N10sNzI6WzIsODddLDgwOlsyLDg3XSw4MTpbMiw4N10sODI6WzIsODddLDgzOlsyLDg3XSw4NDpbMiw4N10sXHJcbjg1OlsyLDg3XX0sezMzOlsyLDg5XX0sezIwOjc1LDYzOjExNiw2NDo3Niw2NTpbMSw0NF0sNjc6MTE1LDY4OlsyLDk2XSw2OToxMTcsNzA6NzcsNzE6NzgsNzI6WzEsNzldLDc4OjI2LDc5OjI3LDgwOlsxLDI4XSw4MTpbMSwyOV0sODI6WzEsMzBdLDgzOlsxLDMxXSw4NDpbMSwzMl0sODU6WzEsMzRdLDg2OjMzfSx7MzM6WzEsMTE4XX0sezMyOjExOSwzMzpbMiw2Ml0sNzQ6MTIwLDc1OlsxLDEyMV19LHszMzpbMiw1OV0sNjU6WzIsNTldLDcyOlsyLDU5XSw3NTpbMiw1OV0sODA6WzIsNTldLDgxOlsyLDU5XSw4MjpbMiw1OV0sODM6WzIsNTldLDg0OlsyLDU5XSw4NTpbMiw1OV19LHszMzpbMiw2MV0sNzU6WzIsNjFdfSx7MzM6WzIsNjhdLDM3OjEyMiw3NDoxMjMsNzU6WzEsMTIxXX0sezMzOlsyLDY1XSw2NTpbMiw2NV0sNzI6WzIsNjVdLDc1OlsyLDY1XSw4MDpbMiw2NV0sODE6WzIsNjVdLDgyOlsyLDY1XSw4MzpbMiw2NV0sODQ6WzIsNjVdLDg1OlsyLDY1XX0sezMzOlsyLDY3XSw3NTpbMiw2N119LHsyMzpbMSwxMjRdfSx7MjM6WzIsNTFdLDY1OlsyLDUxXSw3MjpbMiw1MV0sODA6WzIsNTFdLDgxOlsyLDUxXSw4MjpbMiw1MV0sODM6WzIsNTFdLDg0OlsyLDUxXSw4NTpbMiw1MV19LHsyMzpbMiw1M119LHszMzpbMSwxMjVdfSx7MzM6WzIsOTFdLDY1OlsyLDkxXSw3MjpbMiw5MV0sODA6WzIsOTFdLDgxOlsyLDkxXSw4MjpbMiw5MV0sODM6WzIsOTFdLDg0OlsyLDkxXSw4NTpbMiw5MV19LHszMzpbMiw5M119LHs1OlsyLDIyXSwxNDpbMiwyMl0sMTU6WzIsMjJdLDE5OlsyLDIyXSwyOTpbMiwyMl0sMzQ6WzIsMjJdLDM5OlsyLDIyXSw0NDpbMiwyMl0sNDc6WzIsMjJdLDQ4OlsyLDIyXSw1MTpbMiwyMl0sNTU6WzIsMjJdLDYwOlsyLDIyXX0sezIzOlsyLDk5XSwzMzpbMiw5OV0sNTQ6WzIsOTldLDY4OlsyLDk5XSw3MjpbMiw5OV0sNzU6WzIsOTldfSx7NzM6WzEsMTA5XX0sezIwOjc1LDYzOjEyNiw2NDo3Niw2NTpbMSw0NF0sNzI6WzEsMzVdLDc4OjI2LDc5OjI3LDgwOlsxLDI4XSw4MTpbMSwyOV0sODI6WzEsMzBdLDgzOlsxLDMxXSw4NDpbMSwzMl0sODU6WzEsMzRdLDg2OjMzfSx7NTpbMiwyM10sMTQ6WzIsMjNdLDE1OlsyLDIzXSwxOTpbMiwyM10sMjk6WzIsMjNdLDM0OlsyLDIzXSwzOTpbMiwyM10sNDQ6WzIsMjNdLDQ3OlsyLDIzXSw0ODpbMiwyM10sNTE6WzIsMjNdLDU1OlsyLDIzXSw2MDpbMiwyM119LHs0NzpbMiwxOV19LHs0NzpbMiw3N119LHsyMDo3NSwzMzpbMiw3Ml0sNDE6MTI3LDYzOjEyOCw2NDo3Niw2NTpbMSw0NF0sNjk6MTI5LDcwOjc3LDcxOjc4LDcyOlsxLDc5XSw3NTpbMiw3Ml0sNzg6MjYsNzk6MjcsODA6WzEsMjhdLDgxOlsxLDI5XSw4MjpbMSwzMF0sODM6WzEsMzFdLDg0OlsxLDMyXSw4NTpbMSwzNF0sODY6MzN9LHs1OlsyLDI0XSwxNDpbMiwyNF0sMTU6WzIsMjRdLDE5OlsyLDI0XSwyOTpbMiwyNF0sMzQ6WzIsMjRdLDM5OlsyLDI0XSw0NDpbMiwyNF0sNDc6WzIsMjRdLDQ4OlsyLDI0XSw1MTpbMiwyNF0sNTU6WzIsMjRdLDYwOlsyLDI0XX0sezY4OlsxLDEzMF19LHs2NTpbMiw5NV0sNjg6WzIsOTVdLDcyOlsyLDk1XSw4MDpbMiw5NV0sODE6WzIsOTVdLDgyOlsyLDk1XSw4MzpbMiw5NV0sODQ6WzIsOTVdLDg1OlsyLDk1XX0sezY4OlsyLDk3XX0sezU6WzIsMjFdLDE0OlsyLDIxXSwxNTpbMiwyMV0sMTk6WzIsMjFdLDI5OlsyLDIxXSwzNDpbMiwyMV0sMzk6WzIsMjFdLDQ0OlsyLDIxXSw0NzpbMiwyMV0sNDg6WzIsMjFdLDUxOlsyLDIxXSw1NTpbMiwyMV0sNjA6WzIsMjFdfSx7MzM6WzEsMTMxXX0sezMzOlsyLDYzXX0sezcyOlsxLDEzM10sNzY6MTMyfSx7MzM6WzEsMTM0XX0sezMzOlsyLDY5XX0sezE1OlsyLDEyXX0sezE0OlsyLDI2XSwxNTpbMiwyNl0sMTk6WzIsMjZdLDI5OlsyLDI2XSwzNDpbMiwyNl0sNDc6WzIsMjZdLDQ4OlsyLDI2XSw1MTpbMiwyNl0sNTU6WzIsMjZdLDYwOlsyLDI2XX0sezIzOlsyLDMxXSwzMzpbMiwzMV0sNTQ6WzIsMzFdLDY4OlsyLDMxXSw3MjpbMiwzMV0sNzU6WzIsMzFdfSx7MzM6WzIsNzRdLDQyOjEzNSw3NDoxMzYsNzU6WzEsMTIxXX0sezMzOlsyLDcxXSw2NTpbMiw3MV0sNzI6WzIsNzFdLDc1OlsyLDcxXSw4MDpbMiw3MV0sODE6WzIsNzFdLDgyOlsyLDcxXSw4MzpbMiw3MV0sODQ6WzIsNzFdLDg1OlsyLDcxXX0sezMzOlsyLDczXSw3NTpbMiw3M119LHsyMzpbMiwyOV0sMzM6WzIsMjldLDU0OlsyLDI5XSw2NTpbMiwyOV0sNjg6WzIsMjldLDcyOlsyLDI5XSw3NTpbMiwyOV0sODA6WzIsMjldLDgxOlsyLDI5XSw4MjpbMiwyOV0sODM6WzIsMjldLDg0OlsyLDI5XSw4NTpbMiwyOV19LHsxNDpbMiwxNV0sMTU6WzIsMTVdLDE5OlsyLDE1XSwyOTpbMiwxNV0sMzQ6WzIsMTVdLDM5OlsyLDE1XSw0NDpbMiwxNV0sNDc6WzIsMTVdLDQ4OlsyLDE1XSw1MTpbMiwxNV0sNTU6WzIsMTVdLDYwOlsyLDE1XX0sezcyOlsxLDEzOF0sNzc6WzEsMTM3XX0sezcyOlsyLDEwMF0sNzc6WzIsMTAwXX0sezE0OlsyLDE2XSwxNTpbMiwxNl0sMTk6WzIsMTZdLDI5OlsyLDE2XSwzNDpbMiwxNl0sNDQ6WzIsMTZdLDQ3OlsyLDE2XSw0ODpbMiwxNl0sNTE6WzIsMTZdLDU1OlsyLDE2XSw2MDpbMiwxNl19LHszMzpbMSwxMzldfSx7MzM6WzIsNzVdfSx7MzM6WzIsMzJdfSx7NzI6WzIsMTAxXSw3NzpbMiwxMDFdfSx7MTQ6WzIsMTddLDE1OlsyLDE3XSwxOTpbMiwxN10sMjk6WzIsMTddLDM0OlsyLDE3XSwzOTpbMiwxN10sNDQ6WzIsMTddLDQ3OlsyLDE3XSw0ODpbMiwxN10sNTE6WzIsMTddLDU1OlsyLDE3XSw2MDpbMiwxN119XSxkZWZhdWx0QWN0aW9uczp7NDpbMiwxXSw1NTpbMiw1NV0sNTc6WzIsMjBdLDYxOlsyLDU3XSw3NDpbMiw4MV0sODM6WzIsODVdLDg3OlsyLDE4XSw5MTpbMiw4OV0sMTAyOlsyLDUzXSwxMDU6WzIsOTNdLDExMTpbMiwxOV0sMTEyOlsyLDc3XSwxMTc6WzIsOTddLDEyMDpbMiw2M10sMTIzOlsyLDY5XSwxMjQ6WzIsMTJdLDEzNjpbMiw3NV0sMTM3OlsyLDMyXX0scGFyc2VFcnJvcjpmdW5jdGlvbihhLGIpe3Rocm93IG5ldyBFcnJvcihhKX0scGFyc2U6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe3ZhciBhO3JldHVybiBhPWMubGV4ZXIubGV4KCl8fDEsXCJudW1iZXJcIiE9dHlwZW9mIGEmJihhPWMuc3ltYm9sc19bYV18fGEpLGF9dmFyIGM9dGhpcyxkPVswXSxlPVtudWxsXSxmPVtdLGc9dGhpcy50YWJsZSxoPVwiXCIsaT0wLGo9MCxrPTA7dGhpcy5sZXhlci5zZXRJbnB1dChhKSx0aGlzLmxleGVyLnl5PXRoaXMueXksdGhpcy55eS5sZXhlcj10aGlzLmxleGVyLHRoaXMueXkucGFyc2VyPXRoaXMsXCJ1bmRlZmluZWRcIj09dHlwZW9mIHRoaXMubGV4ZXIueXlsbG9jJiYodGhpcy5sZXhlci55eWxsb2M9e30pO3ZhciBsPXRoaXMubGV4ZXIueXlsbG9jO2YucHVzaChsKTt2YXIgbT10aGlzLmxleGVyLm9wdGlvbnMmJnRoaXMubGV4ZXIub3B0aW9ucy5yYW5nZXM7XCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy55eS5wYXJzZUVycm9yJiYodGhpcy5wYXJzZUVycm9yPXRoaXMueXkucGFyc2VFcnJvcik7Zm9yKHZhciBuLG8scCxxLHIscyx0LHUsdix3PXt9Ozspe2lmKHA9ZFtkLmxlbmd0aC0xXSx0aGlzLmRlZmF1bHRBY3Rpb25zW3BdP3E9dGhpcy5kZWZhdWx0QWN0aW9uc1twXToobnVsbCE9PW4mJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBufHwobj1iKCkpLHE9Z1twXSYmZ1twXVtuXSksXCJ1bmRlZmluZWRcIj09dHlwZW9mIHF8fCFxLmxlbmd0aHx8IXFbMF0pe3ZhciB4PVwiXCI7aWYoIWspe3Y9W107Zm9yKHMgaW4gZ1twXSl0aGlzLnRlcm1pbmFsc19bc10mJnM+MiYmdi5wdXNoKFwiJ1wiK3RoaXMudGVybWluYWxzX1tzXStcIidcIik7eD10aGlzLmxleGVyLnNob3dQb3NpdGlvbj9cIlBhcnNlIGVycm9yIG9uIGxpbmUgXCIrKGkrMSkrXCI6XFxuXCIrdGhpcy5sZXhlci5zaG93UG9zaXRpb24oKStcIlxcbkV4cGVjdGluZyBcIit2LmpvaW4oXCIsIFwiKStcIiwgZ290ICdcIisodGhpcy50ZXJtaW5hbHNfW25dfHxuKStcIidcIjpcIlBhcnNlIGVycm9yIG9uIGxpbmUgXCIrKGkrMSkrXCI6IFVuZXhwZWN0ZWQgXCIrKDE9PW4/XCJlbmQgb2YgaW5wdXRcIjpcIidcIisodGhpcy50ZXJtaW5hbHNfW25dfHxuKStcIidcIiksdGhpcy5wYXJzZUVycm9yKHgse3RleHQ6dGhpcy5sZXhlci5tYXRjaCx0b2tlbjp0aGlzLnRlcm1pbmFsc19bbl18fG4sbGluZTp0aGlzLmxleGVyLnl5bGluZW5vLGxvYzpsLGV4cGVjdGVkOnZ9KX19aWYocVswXWluc3RhbmNlb2YgQXJyYXkmJnEubGVuZ3RoPjEpdGhyb3cgbmV3IEVycm9yKFwiUGFyc2UgRXJyb3I6IG11bHRpcGxlIGFjdGlvbnMgcG9zc2libGUgYXQgc3RhdGU6IFwiK3ArXCIsIHRva2VuOiBcIituKTtzd2l0Y2gocVswXSl7Y2FzZSAxOmQucHVzaChuKSxlLnB1c2godGhpcy5sZXhlci55eXRleHQpLGYucHVzaCh0aGlzLmxleGVyLnl5bGxvYyksZC5wdXNoKHFbMV0pLG49bnVsbCxvPyhuPW8sbz1udWxsKTooaj10aGlzLmxleGVyLnl5bGVuZyxoPXRoaXMubGV4ZXIueXl0ZXh0LGk9dGhpcy5sZXhlci55eWxpbmVubyxsPXRoaXMubGV4ZXIueXlsbG9jLGs+MCYmay0tKTticmVhaztjYXNlIDI6aWYodD10aGlzLnByb2R1Y3Rpb25zX1txWzFdXVsxXSx3LiQ9ZVtlLmxlbmd0aC10XSx3Ll8kPXtmaXJzdF9saW5lOmZbZi5sZW5ndGgtKHR8fDEpXS5maXJzdF9saW5lLGxhc3RfbGluZTpmW2YubGVuZ3RoLTFdLmxhc3RfbGluZSxmaXJzdF9jb2x1bW46ZltmLmxlbmd0aC0odHx8MSldLmZpcnN0X2NvbHVtbixsYXN0X2NvbHVtbjpmW2YubGVuZ3RoLTFdLmxhc3RfY29sdW1ufSxtJiYody5fJC5yYW5nZT1bZltmLmxlbmd0aC0odHx8MSldLnJhbmdlWzBdLGZbZi5sZW5ndGgtMV0ucmFuZ2VbMV1dKSxyPXRoaXMucGVyZm9ybUFjdGlvbi5jYWxsKHcsaCxqLGksdGhpcy55eSxxWzFdLGUsZiksXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHIpcmV0dXJuIHI7dCYmKGQ9ZC5zbGljZSgwLC0xKnQqMiksZT1lLnNsaWNlKDAsLTEqdCksZj1mLnNsaWNlKDAsLTEqdCkpLGQucHVzaCh0aGlzLnByb2R1Y3Rpb25zX1txWzFdXVswXSksZS5wdXNoKHcuJCksZi5wdXNoKHcuXyQpLHU9Z1tkW2QubGVuZ3RoLTJdXVtkW2QubGVuZ3RoLTFdXSxkLnB1c2godSk7YnJlYWs7Y2FzZSAzOnJldHVybiEwfX1yZXR1cm4hMH19LGM9ZnVuY3Rpb24oKXt2YXIgYT17RU9GOjEscGFyc2VFcnJvcjpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLnl5LnBhcnNlcil0aHJvdyBuZXcgRXJyb3IoYSk7dGhpcy55eS5wYXJzZXIucGFyc2VFcnJvcihhLGIpfSxzZXRJbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5faW5wdXQ9YSx0aGlzLl9tb3JlPXRoaXMuX2xlc3M9dGhpcy5kb25lPSExLHRoaXMueXlsaW5lbm89dGhpcy55eWxlbmc9MCx0aGlzLnl5dGV4dD10aGlzLm1hdGNoZWQ9dGhpcy5tYXRjaD1cIlwiLHRoaXMuY29uZGl0aW9uU3RhY2s9W1wiSU5JVElBTFwiXSx0aGlzLnl5bGxvYz17Zmlyc3RfbGluZToxLGZpcnN0X2NvbHVtbjowLGxhc3RfbGluZToxLGxhc3RfY29sdW1uOjB9LHRoaXMub3B0aW9ucy5yYW5nZXMmJih0aGlzLnl5bGxvYy5yYW5nZT1bMCwwXSksdGhpcy5vZmZzZXQ9MCx0aGlzfSxpbnB1dDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2lucHV0WzBdO3RoaXMueXl0ZXh0Kz1hLHRoaXMueXlsZW5nKyssdGhpcy5vZmZzZXQrKyx0aGlzLm1hdGNoKz1hLHRoaXMubWF0Y2hlZCs9YTt2YXIgYj1hLm1hdGNoKC8oPzpcXHJcXG4/fFxcbikuKi9nKTtyZXR1cm4gYj8odGhpcy55eWxpbmVubysrLHRoaXMueXlsbG9jLmxhc3RfbGluZSsrKTp0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbisrLHRoaXMub3B0aW9ucy5yYW5nZXMmJnRoaXMueXlsbG9jLnJhbmdlWzFdKyssdGhpcy5faW5wdXQ9dGhpcy5faW5wdXQuc2xpY2UoMSksYX0sdW5wdXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5sZW5ndGgsYz1hLnNwbGl0KC8oPzpcXHJcXG4/fFxcbikvZyk7dGhpcy5faW5wdXQ9YSt0aGlzLl9pbnB1dCx0aGlzLnl5dGV4dD10aGlzLnl5dGV4dC5zdWJzdHIoMCx0aGlzLnl5dGV4dC5sZW5ndGgtYi0xKSx0aGlzLm9mZnNldC09Yjt2YXIgZD10aGlzLm1hdGNoLnNwbGl0KC8oPzpcXHJcXG4/fFxcbikvZyk7dGhpcy5tYXRjaD10aGlzLm1hdGNoLnN1YnN0cigwLHRoaXMubWF0Y2gubGVuZ3RoLTEpLHRoaXMubWF0Y2hlZD10aGlzLm1hdGNoZWQuc3Vic3RyKDAsdGhpcy5tYXRjaGVkLmxlbmd0aC0xKSxjLmxlbmd0aC0xJiYodGhpcy55eWxpbmVuby09Yy5sZW5ndGgtMSk7dmFyIGU9dGhpcy55eWxsb2MucmFuZ2U7cmV0dXJuIHRoaXMueXlsbG9jPXtmaXJzdF9saW5lOnRoaXMueXlsbG9jLmZpcnN0X2xpbmUsbGFzdF9saW5lOnRoaXMueXlsaW5lbm8rMSxmaXJzdF9jb2x1bW46dGhpcy55eWxsb2MuZmlyc3RfY29sdW1uLGxhc3RfY29sdW1uOmM/KGMubGVuZ3RoPT09ZC5sZW5ndGg/dGhpcy55eWxsb2MuZmlyc3RfY29sdW1uOjApK2RbZC5sZW5ndGgtYy5sZW5ndGhdLmxlbmd0aC1jWzBdLmxlbmd0aDp0aGlzLnl5bGxvYy5maXJzdF9jb2x1bW4tYn0sdGhpcy5vcHRpb25zLnJhbmdlcyYmKHRoaXMueXlsbG9jLnJhbmdlPVtlWzBdLGVbMF0rdGhpcy55eWxlbmctYl0pLHRoaXN9LG1vcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbW9yZT0hMCx0aGlzfSxsZXNzOmZ1bmN0aW9uKGEpe3RoaXMudW5wdXQodGhpcy5tYXRjaC5zbGljZShhKSl9LHBhc3RJbnB1dDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubWF0Y2hlZC5zdWJzdHIoMCx0aGlzLm1hdGNoZWQubGVuZ3RoLXRoaXMubWF0Y2gubGVuZ3RoKTtyZXR1cm4oYS5sZW5ndGg+MjA/XCIuLi5cIjpcIlwiKSthLnN1YnN0cigtMjApLnJlcGxhY2UoL1xcbi9nLFwiXCIpfSx1cGNvbWluZ0lucHV0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5tYXRjaDtyZXR1cm4gYS5sZW5ndGg8MjAmJihhKz10aGlzLl9pbnB1dC5zdWJzdHIoMCwyMC1hLmxlbmd0aCkpLChhLnN1YnN0cigwLDIwKSsoYS5sZW5ndGg+MjA/XCIuLi5cIjpcIlwiKSkucmVwbGFjZSgvXFxuL2csXCJcIil9LHNob3dQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGFzdElucHV0KCksYj1uZXcgQXJyYXkoYS5sZW5ndGgrMSkuam9pbihcIi1cIik7cmV0dXJuIGErdGhpcy51cGNvbWluZ0lucHV0KCkrXCJcXG5cIitiK1wiXlwifSxuZXh0OmZ1bmN0aW9uKCl7aWYodGhpcy5kb25lKXJldHVybiB0aGlzLkVPRjt0aGlzLl9pbnB1dHx8KHRoaXMuZG9uZT0hMCk7dmFyIGEsYixjLGQsZTt0aGlzLl9tb3JlfHwodGhpcy55eXRleHQ9XCJcIix0aGlzLm1hdGNoPVwiXCIpO2Zvcih2YXIgZj10aGlzLl9jdXJyZW50UnVsZXMoKSxnPTA7ZzxmLmxlbmd0aCYmKGM9dGhpcy5faW5wdXQubWF0Y2godGhpcy5ydWxlc1tmW2ddXSksIWN8fGImJiEoY1swXS5sZW5ndGg+YlswXS5sZW5ndGgpfHwoYj1jLGQ9Zyx0aGlzLm9wdGlvbnMuZmxleCkpO2crKyk7cmV0dXJuIGI/KGU9YlswXS5tYXRjaCgvKD86XFxyXFxuP3xcXG4pLiovZyksZSYmKHRoaXMueXlsaW5lbm8rPWUubGVuZ3RoKSx0aGlzLnl5bGxvYz17Zmlyc3RfbGluZTp0aGlzLnl5bGxvYy5sYXN0X2xpbmUsbGFzdF9saW5lOnRoaXMueXlsaW5lbm8rMSxmaXJzdF9jb2x1bW46dGhpcy55eWxsb2MubGFzdF9jb2x1bW4sbGFzdF9jb2x1bW46ZT9lW2UubGVuZ3RoLTFdLmxlbmd0aC1lW2UubGVuZ3RoLTFdLm1hdGNoKC9cXHI/XFxuPy8pWzBdLmxlbmd0aDp0aGlzLnl5bGxvYy5sYXN0X2NvbHVtbitiWzBdLmxlbmd0aH0sdGhpcy55eXRleHQrPWJbMF0sdGhpcy5tYXRjaCs9YlswXSx0aGlzLm1hdGNoZXM9Yix0aGlzLnl5bGVuZz10aGlzLnl5dGV4dC5sZW5ndGgsdGhpcy5vcHRpb25zLnJhbmdlcyYmKHRoaXMueXlsbG9jLnJhbmdlPVt0aGlzLm9mZnNldCx0aGlzLm9mZnNldCs9dGhpcy55eWxlbmddKSx0aGlzLl9tb3JlPSExLHRoaXMuX2lucHV0PXRoaXMuX2lucHV0LnNsaWNlKGJbMF0ubGVuZ3RoKSx0aGlzLm1hdGNoZWQrPWJbMF0sYT10aGlzLnBlcmZvcm1BY3Rpb24uY2FsbCh0aGlzLHRoaXMueXksdGhpcyxmW2RdLHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGgtMV0pLHRoaXMuZG9uZSYmdGhpcy5faW5wdXQmJih0aGlzLmRvbmU9ITEpLGE/YTp2b2lkIDApOlwiXCI9PT10aGlzLl9pbnB1dD90aGlzLkVPRjp0aGlzLnBhcnNlRXJyb3IoXCJMZXhpY2FsIGVycm9yIG9uIGxpbmUgXCIrKHRoaXMueXlsaW5lbm8rMSkrXCIuIFVucmVjb2duaXplZCB0ZXh0LlxcblwiK3RoaXMuc2hvd1Bvc2l0aW9uKCkse3RleHQ6XCJcIix0b2tlbjpudWxsLGxpbmU6dGhpcy55eWxpbmVub30pfSxsZXg6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm5leHQoKTtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2YgYT9hOnRoaXMubGV4KCl9LGJlZ2luOmZ1bmN0aW9uKGEpe3RoaXMuY29uZGl0aW9uU3RhY2sucHVzaChhKX0scG9wU3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25kaXRpb25TdGFjay5wb3AoKX0sX2N1cnJlbnRSdWxlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbmRpdGlvbnNbdGhpcy5jb25kaXRpb25TdGFja1t0aGlzLmNvbmRpdGlvblN0YWNrLmxlbmd0aC0xXV0ucnVsZXN9LHRvcFN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29uZGl0aW9uU3RhY2tbdGhpcy5jb25kaXRpb25TdGFjay5sZW5ndGgtMl19LHB1c2hTdGF0ZTpmdW5jdGlvbihhKXt0aGlzLmJlZ2luKGEpfX07cmV0dXJuIGEub3B0aW9ucz17fSxhLnBlcmZvcm1BY3Rpb249ZnVuY3Rpb24oYSxiLGMsZCl7ZnVuY3Rpb24gZShhLGMpe3JldHVybiBiLnl5dGV4dD1iLnl5dGV4dC5zdWJzdHIoYSxiLnl5bGVuZy1jKX1zd2l0Y2goYyl7Y2FzZSAwOmlmKFwiXFxcXFxcXFxcIj09PWIueXl0ZXh0LnNsaWNlKC0yKT8oZSgwLDEpLHRoaXMuYmVnaW4oXCJtdVwiKSk6XCJcXFxcXCI9PT1iLnl5dGV4dC5zbGljZSgtMSk/KGUoMCwxKSx0aGlzLmJlZ2luKFwiZW11XCIpKTp0aGlzLmJlZ2luKFwibXVcIiksYi55eXRleHQpcmV0dXJuIDE1O2JyZWFrO2Nhc2UgMTpyZXR1cm4gMTU7Y2FzZSAyOnJldHVybiB0aGlzLnBvcFN0YXRlKCksMTU7Y2FzZSAzOnJldHVybiB0aGlzLmJlZ2luKFwicmF3XCIpLDE1O2Nhc2UgNDpyZXR1cm4gdGhpcy5wb3BTdGF0ZSgpLFwicmF3XCI9PT10aGlzLmNvbmRpdGlvblN0YWNrW3RoaXMuY29uZGl0aW9uU3RhY2subGVuZ3RoLTFdPzE1OihiLnl5dGV4dD1iLnl5dGV4dC5zdWJzdHIoNSxiLnl5bGVuZy05KSxcIkVORF9SQVdfQkxPQ0tcIik7Y2FzZSA1OnJldHVybiAxNTtjYXNlIDY6cmV0dXJuIHRoaXMucG9wU3RhdGUoKSwxNDtjYXNlIDc6cmV0dXJuIDY1O2Nhc2UgODpyZXR1cm4gNjg7Y2FzZSA5OnJldHVybiAxOTtjYXNlIDEwOnJldHVybiB0aGlzLnBvcFN0YXRlKCksdGhpcy5iZWdpbihcInJhd1wiKSwyMztjYXNlIDExOnJldHVybiA1NTtjYXNlIDEyOnJldHVybiA2MDtjYXNlIDEzOnJldHVybiAyOTtjYXNlIDE0OnJldHVybiA0NztjYXNlIDE1OnJldHVybiB0aGlzLnBvcFN0YXRlKCksNDQ7Y2FzZSAxNjpyZXR1cm4gdGhpcy5wb3BTdGF0ZSgpLDQ0O2Nhc2UgMTc6cmV0dXJuIDM0O2Nhc2UgMTg6cmV0dXJuIDM5O2Nhc2UgMTk6cmV0dXJuIDUxO2Nhc2UgMjA6cmV0dXJuIDQ4O2Nhc2UgMjE6dGhpcy51bnB1dChiLnl5dGV4dCksdGhpcy5wb3BTdGF0ZSgpLHRoaXMuYmVnaW4oXCJjb21cIik7YnJlYWs7Y2FzZSAyMjpyZXR1cm4gdGhpcy5wb3BTdGF0ZSgpLDE0O2Nhc2UgMjM6cmV0dXJuIDQ4O2Nhc2UgMjQ6cmV0dXJuIDczO2Nhc2UgMjU6cmV0dXJuIDcyO2Nhc2UgMjY6cmV0dXJuIDcyO2Nhc2UgMjc6cmV0dXJuIDg3O2Nhc2UgMjg6YnJlYWs7Y2FzZSAyOTpyZXR1cm4gdGhpcy5wb3BTdGF0ZSgpLDU0O2Nhc2UgMzA6cmV0dXJuIHRoaXMucG9wU3RhdGUoKSwzMztjYXNlIDMxOnJldHVybiBiLnl5dGV4dD1lKDEsMikucmVwbGFjZSgvXFxcXFwiL2csJ1wiJyksODA7Y2FzZSAzMjpyZXR1cm4gYi55eXRleHQ9ZSgxLDIpLnJlcGxhY2UoL1xcXFwnL2csXCInXCIpLDgwO2Nhc2UgMzM6cmV0dXJuIDg1O2Nhc2UgMzQ6cmV0dXJuIDgyO2Nhc2UgMzU6cmV0dXJuIDgyO2Nhc2UgMzY6cmV0dXJuIDgzO2Nhc2UgMzc6cmV0dXJuIDg0O2Nhc2UgMzg6cmV0dXJuIDgxO2Nhc2UgMzk6cmV0dXJuIDc1O2Nhc2UgNDA6cmV0dXJuIDc3O2Nhc2UgNDE6cmV0dXJuIDcyO2Nhc2UgNDI6cmV0dXJuIGIueXl0ZXh0PWIueXl0ZXh0LnJlcGxhY2UoL1xcXFwoW1xcXFxcXF1dKS9nLFwiJDFcIiksNzI7Y2FzZSA0MzpyZXR1cm5cIklOVkFMSURcIjtjYXNlIDQ0OnJldHVybiA1fX0sYS5ydWxlcz1bL14oPzpbXlxceDAwXSo/KD89KFxce1xceykpKS8sL14oPzpbXlxceDAwXSspLywvXig/OlteXFx4MDBdezIsfT8oPz0oXFx7XFx7fFxcXFxcXHtcXHt8XFxcXFxcXFxcXHtcXHt8JCkpKS8sL14oPzpcXHtcXHtcXHtcXHsoPz1bXlxcL10pKS8sL14oPzpcXHtcXHtcXHtcXHtcXC9bXlxccyFcIiMlLSxcXC5cXC87LT5AXFxbLVxcXmBcXHstfl0rKD89Wz19XFxzXFwvLl0pXFx9XFx9XFx9XFx9KS8sL14oPzpbXlxceDAwXSo/KD89KFxce1xce1xce1xceykpKS8sL14oPzpbXFxzXFxTXSo/LS0ofik/XFx9XFx9KS8sL14oPzpcXCgpLywvXig/OlxcKSkvLC9eKD86XFx7XFx7XFx7XFx7KS8sL14oPzpcXH1cXH1cXH1cXH0pLywvXig/Olxce1xceyh+KT8+KS8sL14oPzpcXHtcXHsofik/Iz4pLywvXig/Olxce1xceyh+KT8jXFwqPykvLC9eKD86XFx7XFx7KH4pP1xcLykvLC9eKD86XFx7XFx7KH4pP1xcXlxccyoofik/XFx9XFx9KS8sL14oPzpcXHtcXHsofik/XFxzKmVsc2VcXHMqKH4pP1xcfVxcfSkvLC9eKD86XFx7XFx7KH4pP1xcXikvLC9eKD86XFx7XFx7KH4pP1xccyplbHNlXFxiKS8sL14oPzpcXHtcXHsofik/XFx7KS8sL14oPzpcXHtcXHsofik/JikvLC9eKD86XFx7XFx7KH4pPyEtLSkvLC9eKD86XFx7XFx7KH4pPyFbXFxzXFxTXSo/XFx9XFx9KS8sL14oPzpcXHtcXHsofik/XFwqPykvLC9eKD86PSkvLC9eKD86XFwuXFwuKS8sL14oPzpcXC4oPz0oWz1+fVxcc1xcLy4pfF0pKSkvLC9eKD86W1xcLy5dKS8sL14oPzpcXHMrKS8sL14oPzpcXH0ofik/XFx9XFx9KS8sL14oPzoofik/XFx9XFx9KS8sL14oPzpcIihcXFxcW1wiXXxbXlwiXSkqXCIpLywvXig/OicoXFxcXFsnXXxbXiddKSonKS8sL14oPzpAKS8sL14oPzp0cnVlKD89KFt+fVxccyldKSkpLywvXig/OmZhbHNlKD89KFt+fVxccyldKSkpLywvXig/OnVuZGVmaW5lZCg/PShbfn1cXHMpXSkpKS8sL14oPzpudWxsKD89KFt+fVxccyldKSkpLywvXig/Oi0/WzAtOV0rKD86XFwuWzAtOV0rKT8oPz0oW359XFxzKV0pKSkvLC9eKD86YXNcXHMrXFx8KS8sL14oPzpcXHwpLywvXig/OihbXlxccyFcIiMlLSxcXC5cXC87LT5AXFxbLVxcXmBcXHstfl0rKD89KFs9fn1cXHNcXC8uKXxdKSkpKS8sL14oPzpcXFsoXFxcXFxcXXxbXlxcXV0pKlxcXSkvLC9eKD86LikvLC9eKD86JCkvXSxhLmNvbmRpdGlvbnM9e211OntydWxlczpbNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAsMjEsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMjksMzAsMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAsNDEsNDIsNDMsNDRdLGluY2x1c2l2ZTohMX0sZW11OntydWxlczpbMl0saW5jbHVzaXZlOiExfSxjb206e3J1bGVzOls2XSxpbmNsdXNpdmU6ITF9LHJhdzp7cnVsZXM6WzMsNCw1XSxpbmNsdXNpdmU6ITF9LElOSVRJQUw6e3J1bGVzOlswLDEsNDRdLGluY2x1c2l2ZTohMH19LGF9KCk7cmV0dXJuIGIubGV4ZXI9YyxhLnByb3RvdHlwZT1iLGIuUGFyc2VyPWEsbmV3IGF9KCk7YltcImRlZmF1bHRcIl09YyxhLmV4cG9ydHM9YltcImRlZmF1bHRcIl19LGZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkKCl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aDw9MHx8dm9pZCAwPT09YXJndW1lbnRzWzBdP3t9OmFyZ3VtZW50c1swXTt0aGlzLm9wdGlvbnM9YX1mdW5jdGlvbiBlKGEsYixjKXt2b2lkIDA9PT1iJiYoYj1hLmxlbmd0aCk7dmFyIGQ9YVtiLTFdLGU9YVtiLTJdO3JldHVybiBkP1wiQ29udGVudFN0YXRlbWVudFwiPT09ZC50eXBlPyhlfHwhYz8vXFxyP1xcblxccyo/JC86LyhefFxccj9cXG4pXFxzKj8kLykudGVzdChkLm9yaWdpbmFsKTp2b2lkIDA6Y31mdW5jdGlvbiBmKGEsYixjKXt2b2lkIDA9PT1iJiYoYj0tMSk7dmFyIGQ9YVtiKzFdLGU9YVtiKzJdO3JldHVybiBkP1wiQ29udGVudFN0YXRlbWVudFwiPT09ZC50eXBlPyhlfHwhYz8vXlxccyo/XFxyP1xcbi86L15cXHMqPyhcXHI/XFxufCQpLykudGVzdChkLm9yaWdpbmFsKTp2b2lkIDA6Y31mdW5jdGlvbiBnKGEsYixjKXt2YXIgZD1hW251bGw9PWI/MDpiKzFdO2lmKGQmJlwiQ29udGVudFN0YXRlbWVudFwiPT09ZC50eXBlJiYoY3x8IWQucmlnaHRTdHJpcHBlZCkpe3ZhciBlPWQudmFsdWU7ZC52YWx1ZT1kLnZhbHVlLnJlcGxhY2UoYz8vXlxccysvOi9eWyBcXHRdKlxccj9cXG4/LyxcIlwiKSxkLnJpZ2h0U3RyaXBwZWQ9ZC52YWx1ZSE9PWV9fWZ1bmN0aW9uIGgoYSxiLGMpe3ZhciBkPWFbbnVsbD09Yj9hLmxlbmd0aC0xOmItMV07aWYoZCYmXCJDb250ZW50U3RhdGVtZW50XCI9PT1kLnR5cGUmJihjfHwhZC5sZWZ0U3RyaXBwZWQpKXt2YXIgZT1kLnZhbHVlO3JldHVybiBkLnZhbHVlPWQudmFsdWUucmVwbGFjZShjPy9cXHMrJC86L1sgXFx0XSskLyxcIlwiKSxkLmxlZnRTdHJpcHBlZD1kLnZhbHVlIT09ZSxkLmxlZnRTdHJpcHBlZH19dmFyIGk9YygxKVtcImRlZmF1bHRcIl07Yi5fX2VzTW9kdWxlPSEwO3ZhciBqPWMoMzkpLGs9aShqKTtkLnByb3RvdHlwZT1uZXcga1tcImRlZmF1bHRcIl0sZC5wcm90b3R5cGUuUHJvZ3JhbT1mdW5jdGlvbihhKXt2YXIgYj0hdGhpcy5vcHRpb25zLmlnbm9yZVN0YW5kYWxvbmUsYz0hdGhpcy5pc1Jvb3RTZWVuO3RoaXMuaXNSb290U2Vlbj0hMDtmb3IodmFyIGQ9YS5ib2R5LGk9MCxqPWQubGVuZ3RoO2k8ajtpKyspe3ZhciBrPWRbaV0sbD10aGlzLmFjY2VwdChrKTtpZihsKXt2YXIgbT1lKGQsaSxjKSxuPWYoZCxpLGMpLG89bC5vcGVuU3RhbmRhbG9uZSYmbSxwPWwuY2xvc2VTdGFuZGFsb25lJiZuLHE9bC5pbmxpbmVTdGFuZGFsb25lJiZtJiZuO2wuY2xvc2UmJmcoZCxpLCEwKSxsLm9wZW4mJmgoZCxpLCEwKSxiJiZxJiYoZyhkLGkpLGgoZCxpKSYmXCJQYXJ0aWFsU3RhdGVtZW50XCI9PT1rLnR5cGUmJihrLmluZGVudD0vKFsgXFx0XSskKS8uZXhlYyhkW2ktMV0ub3JpZ2luYWwpWzFdKSksYiYmbyYmKGcoKGsucHJvZ3JhbXx8ay5pbnZlcnNlKS5ib2R5KSxoKGQsaSkpLGImJnAmJihnKGQsaSksaCgoay5pbnZlcnNlfHxrLnByb2dyYW0pLmJvZHkpKX19cmV0dXJuIGF9LGQucHJvdG90eXBlLkJsb2NrU3RhdGVtZW50PWQucHJvdG90eXBlLkRlY29yYXRvckJsb2NrPWQucHJvdG90eXBlLlBhcnRpYWxCbG9ja1N0YXRlbWVudD1mdW5jdGlvbihhKXt0aGlzLmFjY2VwdChhLnByb2dyYW0pLHRoaXMuYWNjZXB0KGEuaW52ZXJzZSk7dmFyIGI9YS5wcm9ncmFtfHxhLmludmVyc2UsYz1hLnByb2dyYW0mJmEuaW52ZXJzZSxkPWMsaT1jO2lmKGMmJmMuY2hhaW5lZClmb3IoZD1jLmJvZHlbMF0ucHJvZ3JhbTtpLmNoYWluZWQ7KWk9aS5ib2R5W2kuYm9keS5sZW5ndGgtMV0ucHJvZ3JhbTt2YXIgaj17b3BlbjphLm9wZW5TdHJpcC5vcGVuLGNsb3NlOmEuY2xvc2VTdHJpcC5jbG9zZSxvcGVuU3RhbmRhbG9uZTpmKGIuYm9keSksY2xvc2VTdGFuZGFsb25lOmUoKGR8fGIpLmJvZHkpfTtpZihhLm9wZW5TdHJpcC5jbG9zZSYmZyhiLmJvZHksbnVsbCwhMCksYyl7dmFyIGs9YS5pbnZlcnNlU3RyaXA7ay5vcGVuJiZoKGIuYm9keSxudWxsLCEwKSxrLmNsb3NlJiZnKGQuYm9keSxudWxsLCEwKSxhLmNsb3NlU3RyaXAub3BlbiYmaChpLmJvZHksbnVsbCwhMCksIXRoaXMub3B0aW9ucy5pZ25vcmVTdGFuZGFsb25lJiZlKGIuYm9keSkmJmYoZC5ib2R5KSYmKGgoYi5ib2R5KSxnKGQuYm9keSkpfWVsc2UgYS5jbG9zZVN0cmlwLm9wZW4mJmgoYi5ib2R5LG51bGwsITApO3JldHVybiBqfSxkLnByb3RvdHlwZS5EZWNvcmF0b3I9ZC5wcm90b3R5cGUuTXVzdGFjaGVTdGF0ZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuc3RyaXB9LGQucHJvdG90eXBlLlBhcnRpYWxTdGF0ZW1lbnQ9ZC5wcm90b3R5cGUuQ29tbWVudFN0YXRlbWVudD1mdW5jdGlvbihhKXt2YXIgYj1hLnN0cmlwfHx7fTtyZXR1cm57aW5saW5lU3RhbmRhbG9uZTohMCxvcGVuOmIub3BlbixjbG9zZTpiLmNsb3NlfX0sYltcImRlZmF1bHRcIl09ZCxhLmV4cG9ydHM9YltcImRlZmF1bHRcIl19LGZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkKCl7dGhpcy5wYXJlbnRzPVtdfWZ1bmN0aW9uIGUoYSl7dGhpcy5hY2NlcHRSZXF1aXJlZChhLFwicGF0aFwiKSx0aGlzLmFjY2VwdEFycmF5KGEucGFyYW1zKSx0aGlzLmFjY2VwdEtleShhLFwiaGFzaFwiKX1mdW5jdGlvbiBmKGEpe2UuY2FsbCh0aGlzLGEpLHRoaXMuYWNjZXB0S2V5KGEsXCJwcm9ncmFtXCIpLHRoaXMuYWNjZXB0S2V5KGEsXCJpbnZlcnNlXCIpfWZ1bmN0aW9uIGcoYSl7dGhpcy5hY2NlcHRSZXF1aXJlZChhLFwibmFtZVwiKSx0aGlzLmFjY2VwdEFycmF5KGEucGFyYW1zKSx0aGlzLmFjY2VwdEtleShhLFwiaGFzaFwiKX12YXIgaD1jKDEpW1wiZGVmYXVsdFwiXTtiLl9fZXNNb2R1bGU9ITA7dmFyIGk9Yyg2KSxqPWgoaSk7ZC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmQsbXV0YXRpbmc6ITEsYWNjZXB0S2V5OmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5hY2NlcHQoYVtiXSk7aWYodGhpcy5tdXRhdGluZyl7aWYoYyYmIWQucHJvdG90eXBlW2MudHlwZV0pdGhyb3cgbmV3IGpbXCJkZWZhdWx0XCJdKCdVbmV4cGVjdGVkIG5vZGUgdHlwZSBcIicrYy50eXBlKydcIiBmb3VuZCB3aGVuIGFjY2VwdGluZyAnK2IrXCIgb24gXCIrYS50eXBlKTthW2JdPWN9fSxhY2NlcHRSZXF1aXJlZDpmdW5jdGlvbihhLGIpe2lmKHRoaXMuYWNjZXB0S2V5KGEsYiksIWFbYl0pdGhyb3cgbmV3IGpbXCJkZWZhdWx0XCJdKGEudHlwZStcIiByZXF1aXJlcyBcIitiKX0sYWNjZXB0QXJyYXk6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aDtiPGM7YisrKXRoaXMuYWNjZXB0S2V5KGEsYiksYVtiXXx8KGEuc3BsaWNlKGIsMSksYi0tLGMtLSl9LGFjY2VwdDpmdW5jdGlvbihhKXtpZihhKXtpZighdGhpc1thLnR5cGVdKXRocm93IG5ldyBqW1wiZGVmYXVsdFwiXShcIlVua25vd24gdHlwZTogXCIrYS50eXBlLGEpO3RoaXMuY3VycmVudCYmdGhpcy5wYXJlbnRzLnVuc2hpZnQodGhpcy5jdXJyZW50KSx0aGlzLmN1cnJlbnQ9YTt2YXIgYj10aGlzW2EudHlwZV0oYSk7cmV0dXJuIHRoaXMuY3VycmVudD10aGlzLnBhcmVudHMuc2hpZnQoKSwhdGhpcy5tdXRhdGluZ3x8Yj9iOmIhPT0hMT9hOnZvaWQgMH19LFByb2dyYW06ZnVuY3Rpb24oYSl7dGhpcy5hY2NlcHRBcnJheShhLmJvZHkpfSxNdXN0YWNoZVN0YXRlbWVudDplLERlY29yYXRvcjplLEJsb2NrU3RhdGVtZW50OmYsRGVjb3JhdG9yQmxvY2s6ZixQYXJ0aWFsU3RhdGVtZW50OmcsUGFydGlhbEJsb2NrU3RhdGVtZW50OmZ1bmN0aW9uKGEpe2cuY2FsbCh0aGlzLGEpLHRoaXMuYWNjZXB0S2V5KGEsXCJwcm9ncmFtXCIpfSxDb250ZW50U3RhdGVtZW50OmZ1bmN0aW9uKCl7fSxDb21tZW50U3RhdGVtZW50OmZ1bmN0aW9uKCl7fSxTdWJFeHByZXNzaW9uOmUsUGF0aEV4cHJlc3Npb246ZnVuY3Rpb24oKXt9LFN0cmluZ0xpdGVyYWw6ZnVuY3Rpb24oKXt9LE51bWJlckxpdGVyYWw6ZnVuY3Rpb24oKXt9LEJvb2xlYW5MaXRlcmFsOmZ1bmN0aW9uKCl7fSxVbmRlZmluZWRMaXRlcmFsOmZ1bmN0aW9uKCl7fSxOdWxsTGl0ZXJhbDpmdW5jdGlvbigpe30sSGFzaDpmdW5jdGlvbihhKXt0aGlzLmFjY2VwdEFycmF5KGEucGFpcnMpfSxIYXNoUGFpcjpmdW5jdGlvbihhKXt0aGlzLmFjY2VwdFJlcXVpcmVkKGEsXCJ2YWx1ZVwiKX19LGJbXCJkZWZhdWx0XCJdPWQsYS5leHBvcnRzPWJbXCJkZWZhdWx0XCJdfSxmdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZChhLGIpe2lmKGI9Yi5wYXRoP2IucGF0aC5vcmlnaW5hbDpiLGEucGF0aC5vcmlnaW5hbCE9PWIpe3ZhciBjPXtsb2M6YS5wYXRoLmxvY307dGhyb3cgbmV3IHFbXCJkZWZhdWx0XCJdKGEucGF0aC5vcmlnaW5hbCtcIiBkb2Vzbid0IG1hdGNoIFwiK2IsYyl9fWZ1bmN0aW9uIGUoYSxiKXt0aGlzLnNvdXJjZT1hLHRoaXMuc3RhcnQ9e2xpbmU6Yi5maXJzdF9saW5lLGNvbHVtbjpiLmZpcnN0X2NvbHVtbn0sdGhpcy5lbmQ9e2xpbmU6Yi5sYXN0X2xpbmUsY29sdW1uOmIubGFzdF9jb2x1bW59fWZ1bmN0aW9uIGYoYSl7cmV0dXJuL15cXFsuKlxcXSQvLnRlc3QoYSk/YS5zdWJzdHIoMSxhLmxlbmd0aC0yKTphfWZ1bmN0aW9uIGcoYSxiKXtyZXR1cm57b3BlbjpcIn5cIj09PWEuY2hhckF0KDIpLGNsb3NlOlwiflwiPT09Yi5jaGFyQXQoYi5sZW5ndGgtMyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGEucmVwbGFjZSgvXlxce1xce34/IS0/LT8vLFwiXCIpLnJlcGxhY2UoLy0/LT9+P1xcfVxcfSQvLFwiXCIpfWZ1bmN0aW9uIGkoYSxiLGMpe2M9dGhpcy5sb2NJbmZvKGMpO2Zvcih2YXIgZD1hP1wiQFwiOlwiXCIsZT1bXSxmPTAsZz0wLGg9Yi5sZW5ndGg7ZzxoO2crKyl7dmFyIGk9YltnXS5wYXJ0LGo9YltnXS5vcmlnaW5hbCE9PWk7aWYoZCs9KGJbZ10uc2VwYXJhdG9yfHxcIlwiKStpLGp8fFwiLi5cIiE9PWkmJlwiLlwiIT09aSYmXCJ0aGlzXCIhPT1pKWUucHVzaChpKTtlbHNle2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IHFbXCJkZWZhdWx0XCJdKFwiSW52YWxpZCBwYXRoOiBcIitkLHtsb2M6Y30pO1wiLi5cIj09PWkmJmYrK319cmV0dXJue3R5cGU6XCJQYXRoRXhwcmVzc2lvblwiLGRhdGE6YSxkZXB0aDpmLHBhcnRzOmUsb3JpZ2luYWw6ZCxsb2M6Y319ZnVuY3Rpb24gaihhLGIsYyxkLGUsZil7dmFyIGc9ZC5jaGFyQXQoMyl8fGQuY2hhckF0KDIpLGg9XCJ7XCIhPT1nJiZcIiZcIiE9PWcsaT0vXFwqLy50ZXN0KGQpO3JldHVybnt0eXBlOmk/XCJEZWNvcmF0b3JcIjpcIk11c3RhY2hlU3RhdGVtZW50XCIscGF0aDphLHBhcmFtczpiLGhhc2g6Yyxlc2NhcGVkOmgsc3RyaXA6ZSxsb2M6dGhpcy5sb2NJbmZvKGYpfX1mdW5jdGlvbiBrKGEsYixjLGUpe2QoYSxjKSxlPXRoaXMubG9jSW5mbyhlKTt2YXIgZj17dHlwZTpcIlByb2dyYW1cIixib2R5OmIsc3RyaXA6e30sbG9jOmV9O3JldHVybnt0eXBlOlwiQmxvY2tTdGF0ZW1lbnRcIixwYXRoOmEucGF0aCxwYXJhbXM6YS5wYXJhbXMsaGFzaDphLmhhc2gscHJvZ3JhbTpmLG9wZW5TdHJpcDp7fSxpbnZlcnNlU3RyaXA6e30sY2xvc2VTdHJpcDp7fSxsb2M6ZX19ZnVuY3Rpb24gbChhLGIsYyxlLGYsZyl7ZSYmZS5wYXRoJiZkKGEsZSk7dmFyIGg9L1xcKi8udGVzdChhLm9wZW4pO2IuYmxvY2tQYXJhbXM9YS5ibG9ja1BhcmFtczt2YXIgaT12b2lkIDAsaj12b2lkIDA7aWYoYyl7aWYoaCl0aHJvdyBuZXcgcVtcImRlZmF1bHRcIl0oXCJVbmV4cGVjdGVkIGludmVyc2UgYmxvY2sgb24gZGVjb3JhdG9yXCIsYyk7Yy5jaGFpbiYmKGMucHJvZ3JhbS5ib2R5WzBdLmNsb3NlU3RyaXA9ZS5zdHJpcCksaj1jLnN0cmlwLGk9Yy5wcm9ncmFtfXJldHVybiBmJiYoZj1pLGk9YixiPWYpLHt0eXBlOmg/XCJEZWNvcmF0b3JCbG9ja1wiOlwiQmxvY2tTdGF0ZW1lbnRcIixwYXRoOmEucGF0aCxwYXJhbXM6YS5wYXJhbXMsaGFzaDphLmhhc2gscHJvZ3JhbTpiLGludmVyc2U6aSxvcGVuU3RyaXA6YS5zdHJpcCxpbnZlcnNlU3RyaXA6aixjbG9zZVN0cmlwOmUmJmUuc3RyaXAsbG9jOnRoaXMubG9jSW5mbyhnKX19ZnVuY3Rpb24gbShhLGIpe2lmKCFiJiZhLmxlbmd0aCl7dmFyIGM9YVswXS5sb2MsZD1hW2EubGVuZ3RoLTFdLmxvYztjJiZkJiYoYj17c291cmNlOmMuc291cmNlLHN0YXJ0OntsaW5lOmMuc3RhcnQubGluZSxjb2x1bW46Yy5zdGFydC5jb2x1bW59LGVuZDp7bGluZTpkLmVuZC5saW5lLGNvbHVtbjpkLmVuZC5jb2x1bW59fSl9cmV0dXJue3R5cGU6XCJQcm9ncmFtXCIsYm9keTphLHN0cmlwOnt9LGxvYzpifX1mdW5jdGlvbiBuKGEsYixjLGUpe3JldHVybiBkKGEsYykse3R5cGU6XCJQYXJ0aWFsQmxvY2tTdGF0ZW1lbnRcIixuYW1lOmEucGF0aCxwYXJhbXM6YS5wYXJhbXMsaGFzaDphLmhhc2gscHJvZ3JhbTpiLG9wZW5TdHJpcDphLnN0cmlwLGNsb3NlU3RyaXA6YyYmYy5zdHJpcCxsb2M6dGhpcy5sb2NJbmZvKGUpfX12YXIgbz1jKDEpW1wiZGVmYXVsdFwiXTtiLl9fZXNNb2R1bGU9ITAsYi5Tb3VyY2VMb2NhdGlvbj1lLGIuaWQ9ZixiLnN0cmlwRmxhZ3M9ZyxiLnN0cmlwQ29tbWVudD1oLGIucHJlcGFyZVBhdGg9aSxiLnByZXBhcmVNdXN0YWNoZT1qLGIucHJlcGFyZVJhd0Jsb2NrPWssYi5wcmVwYXJlQmxvY2s9bCxiLnByZXBhcmVQcm9ncmFtPW0sYi5wcmVwYXJlUGFydGlhbEJsb2NrPW47dmFyIHA9Yyg2KSxxPW8ocCl9LGZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkKCl7fWZ1bmN0aW9uIGUoYSxiLGMpe2lmKG51bGw9PWF8fFwic3RyaW5nXCIhPXR5cGVvZiBhJiZcIlByb2dyYW1cIiE9PWEudHlwZSl0aHJvdyBuZXcga1tcImRlZmF1bHRcIl0oXCJZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMucHJlY29tcGlsZS4gWW91IHBhc3NlZCBcIithKTtiPWJ8fHt9LFwiZGF0YVwiaW4gYnx8KGIuZGF0YT0hMCksYi5jb21wYXQmJihiLnVzZURlcHRocz0hMCk7dmFyIGQ9Yy5wYXJzZShhLGIpLGU9KG5ldyBjLkNvbXBpbGVyKS5jb21waWxlKGQsYik7cmV0dXJuKG5ldyBjLkphdmFTY3JpcHRDb21waWxlcikuY29tcGlsZShlLGIpfWZ1bmN0aW9uIGYoYSxiLGMpe2Z1bmN0aW9uIGQoKXt2YXIgZD1jLnBhcnNlKGEsYiksZT0obmV3IGMuQ29tcGlsZXIpLmNvbXBpbGUoZCxiKSxmPShuZXcgYy5KYXZhU2NyaXB0Q29tcGlsZXIpLmNvbXBpbGUoZSxiLHZvaWQgMCwhMCk7cmV0dXJuIGMudGVtcGxhdGUoZil9ZnVuY3Rpb24gZShhLGIpe3JldHVybiBmfHwoZj1kKCkpLGYuY2FsbCh0aGlzLGEsYil9aWYodm9pZCAwPT09YiYmKGI9e30pLG51bGw9PWF8fFwic3RyaW5nXCIhPXR5cGVvZiBhJiZcIlByb2dyYW1cIiE9PWEudHlwZSl0aHJvdyBuZXcga1tcImRlZmF1bHRcIl0oXCJZb3UgbXVzdCBwYXNzIGEgc3RyaW5nIG9yIEhhbmRsZWJhcnMgQVNUIHRvIEhhbmRsZWJhcnMuY29tcGlsZS4gWW91IHBhc3NlZCBcIithKTtiPWwuZXh0ZW5kKHt9LGIpLFwiZGF0YVwiaW4gYnx8KGIuZGF0YT0hMCksYi5jb21wYXQmJihiLnVzZURlcHRocz0hMCk7dmFyIGY9dm9pZCAwO3JldHVybiBlLl9zZXR1cD1mdW5jdGlvbihhKXtyZXR1cm4gZnx8KGY9ZCgpKSxmLl9zZXR1cChhKX0sZS5fY2hpbGQ9ZnVuY3Rpb24oYSxiLGMsZSl7cmV0dXJuIGZ8fChmPWQoKSksZi5fY2hpbGQoYSxiLGMsZSl9LGV9ZnVuY3Rpb24gZyhhLGIpe2lmKGE9PT1iKXJldHVybiEwO2lmKGwuaXNBcnJheShhKSYmbC5pc0FycmF5KGIpJiZhLmxlbmd0aD09PWIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylpZighZyhhW2NdLGJbY10pKXJldHVybiExO3JldHVybiEwfX1mdW5jdGlvbiBoKGEpe2lmKCFhLnBhdGgucGFydHMpe3ZhciBiPWEucGF0aDthLnBhdGg9e3R5cGU6XCJQYXRoRXhwcmVzc2lvblwiLGRhdGE6ITEsZGVwdGg6MCxwYXJ0czpbYi5vcmlnaW5hbCtcIlwiXSxvcmlnaW5hbDpiLm9yaWdpbmFsK1wiXCIsbG9jOmIubG9jfX19dmFyIGk9YygxKVtcImRlZmF1bHRcIl07Yi5fX2VzTW9kdWxlPSEwLGIuQ29tcGlsZXI9ZCxiLnByZWNvbXBpbGU9ZSxiLmNvbXBpbGU9Zjt2YXIgaj1jKDYpLGs9aShqKSxsPWMoNSksbT1jKDM1KSxuPWkobSksbz1bXS5zbGljZTtkLnByb3RvdHlwZT17Y29tcGlsZXI6ZCxlcXVhbHM6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcGNvZGVzLmxlbmd0aDtpZihhLm9wY29kZXMubGVuZ3RoIT09YilyZXR1cm4hMTtmb3IodmFyIGM9MDtjPGI7YysrKXt2YXIgZD10aGlzLm9wY29kZXNbY10sZT1hLm9wY29kZXNbY107aWYoZC5vcGNvZGUhPT1lLm9wY29kZXx8IWcoZC5hcmdzLGUuYXJncykpcmV0dXJuITF9Yj10aGlzLmNoaWxkcmVuLmxlbmd0aDtmb3IodmFyIGM9MDtjPGI7YysrKWlmKCF0aGlzLmNoaWxkcmVuW2NdLmVxdWFscyhhLmNoaWxkcmVuW2NdKSlyZXR1cm4hMTtyZXR1cm4hMH0sZ3VpZDowLGNvbXBpbGU6ZnVuY3Rpb24oYSxiKXt0aGlzLnNvdXJjZU5vZGU9W10sdGhpcy5vcGNvZGVzPVtdLHRoaXMuY2hpbGRyZW49W10sdGhpcy5vcHRpb25zPWIsdGhpcy5zdHJpbmdQYXJhbXM9Yi5zdHJpbmdQYXJhbXMsdGhpcy50cmFja0lkcz1iLnRyYWNrSWRzLGIuYmxvY2tQYXJhbXM9Yi5ibG9ja1BhcmFtc3x8W107dmFyIGM9Yi5rbm93bkhlbHBlcnM7aWYoYi5rbm93bkhlbHBlcnM9e2hlbHBlck1pc3Npbmc6ITAsYmxvY2tIZWxwZXJNaXNzaW5nOiEwLGVhY2g6ITAsXCJpZlwiOiEwLHVubGVzczohMCxcIndpdGhcIjohMCxsb2c6ITAsbG9va3VwOiEwfSxjKWZvcih2YXIgZCBpbiBjKXRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNbZF09Y1tkXTtyZXR1cm4gdGhpcy5hY2NlcHQoYSl9LGNvbXBpbGVQcm9ncmFtOmZ1bmN0aW9uKGEpe3ZhciBiPW5ldyB0aGlzLmNvbXBpbGVyLGM9Yi5jb21waWxlKGEsdGhpcy5vcHRpb25zKSxkPXRoaXMuZ3VpZCsrO3JldHVybiB0aGlzLnVzZVBhcnRpYWw9dGhpcy51c2VQYXJ0aWFsfHxjLnVzZVBhcnRpYWwsdGhpcy5jaGlsZHJlbltkXT1jLHRoaXMudXNlRGVwdGhzPXRoaXMudXNlRGVwdGhzfHxjLnVzZURlcHRocyxkfSxhY2NlcHQ6ZnVuY3Rpb24oYSl7aWYoIXRoaXNbYS50eXBlXSl0aHJvdyBuZXcga1tcImRlZmF1bHRcIl0oXCJVbmtub3duIHR5cGU6IFwiK2EudHlwZSxhKTt0aGlzLnNvdXJjZU5vZGUudW5zaGlmdChhKTt2YXIgYj10aGlzW2EudHlwZV0oYSk7cmV0dXJuIHRoaXMuc291cmNlTm9kZS5zaGlmdCgpLGJ9LFByb2dyYW06ZnVuY3Rpb24oYSl7dGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLnVuc2hpZnQoYS5ibG9ja1BhcmFtcyk7Zm9yKHZhciBiPWEuYm9keSxjPWIubGVuZ3RoLGQ9MDtkPGM7ZCsrKXRoaXMuYWNjZXB0KGJbZF0pO3JldHVybiB0aGlzLm9wdGlvbnMuYmxvY2tQYXJhbXMuc2hpZnQoKSx0aGlzLmlzU2ltcGxlPTE9PT1jLHRoaXMuYmxvY2tQYXJhbXM9YS5ibG9ja1BhcmFtcz9hLmJsb2NrUGFyYW1zLmxlbmd0aDowLHRoaXN9LEJsb2NrU3RhdGVtZW50OmZ1bmN0aW9uKGEpe2goYSk7dmFyIGI9YS5wcm9ncmFtLGM9YS5pbnZlcnNlO2I9YiYmdGhpcy5jb21waWxlUHJvZ3JhbShiKSxjPWMmJnRoaXMuY29tcGlsZVByb2dyYW0oYyk7dmFyIGQ9dGhpcy5jbGFzc2lmeVNleHByKGEpO1wiaGVscGVyXCI9PT1kP3RoaXMuaGVscGVyU2V4cHIoYSxiLGMpOlwic2ltcGxlXCI9PT1kPyh0aGlzLnNpbXBsZVNleHByKGEpLHRoaXMub3Bjb2RlKFwicHVzaFByb2dyYW1cIixiKSx0aGlzLm9wY29kZShcInB1c2hQcm9ncmFtXCIsYyksdGhpcy5vcGNvZGUoXCJlbXB0eUhhc2hcIiksdGhpcy5vcGNvZGUoXCJibG9ja1ZhbHVlXCIsYS5wYXRoLm9yaWdpbmFsKSk6KHRoaXMuYW1iaWd1b3VzU2V4cHIoYSxiLGMpLHRoaXMub3Bjb2RlKFwicHVzaFByb2dyYW1cIixiKSx0aGlzLm9wY29kZShcInB1c2hQcm9ncmFtXCIsYyksdGhpcy5vcGNvZGUoXCJlbXB0eUhhc2hcIiksdGhpcy5vcGNvZGUoXCJhbWJpZ3VvdXNCbG9ja1ZhbHVlXCIpKSx0aGlzLm9wY29kZShcImFwcGVuZFwiKX0sRGVjb3JhdG9yQmxvY2s6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wcm9ncmFtJiZ0aGlzLmNvbXBpbGVQcm9ncmFtKGEucHJvZ3JhbSksYz10aGlzLnNldHVwRnVsbE11c3RhY2hlUGFyYW1zKGEsYix2b2lkIDApLGQ9YS5wYXRoO3RoaXMudXNlRGVjb3JhdG9ycz0hMCx0aGlzLm9wY29kZShcInJlZ2lzdGVyRGVjb3JhdG9yXCIsYy5sZW5ndGgsZC5vcmlnaW5hbCl9LFBhcnRpYWxTdGF0ZW1lbnQ6ZnVuY3Rpb24oYSl7dGhpcy51c2VQYXJ0aWFsPSEwO3ZhciBiPWEucHJvZ3JhbTtiJiYoYj10aGlzLmNvbXBpbGVQcm9ncmFtKGEucHJvZ3JhbSkpO3ZhciBjPWEucGFyYW1zO2lmKGMubGVuZ3RoPjEpdGhyb3cgbmV3IGtbXCJkZWZhdWx0XCJdKFwiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHBhcnRpYWwgYXJndW1lbnRzOiBcIitjLmxlbmd0aCxhKTtjLmxlbmd0aHx8KHRoaXMub3B0aW9ucy5leHBsaWNpdFBhcnRpYWxDb250ZXh0P3RoaXMub3Bjb2RlKFwicHVzaExpdGVyYWxcIixcInVuZGVmaW5lZFwiKTpjLnB1c2goe3R5cGU6XCJQYXRoRXhwcmVzc2lvblwiLHBhcnRzOltdLGRlcHRoOjB9KSk7dmFyIGQ9YS5uYW1lLm9yaWdpbmFsLGU9XCJTdWJFeHByZXNzaW9uXCI9PT1hLm5hbWUudHlwZTtlJiZ0aGlzLmFjY2VwdChhLm5hbWUpLHRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoYSxiLHZvaWQgMCwhMCk7dmFyIGY9YS5pbmRlbnR8fFwiXCI7dGhpcy5vcHRpb25zLnByZXZlbnRJbmRlbnQmJmYmJih0aGlzLm9wY29kZShcImFwcGVuZENvbnRlbnRcIixmKSxmPVwiXCIpLHRoaXMub3Bjb2RlKFwiaW52b2tlUGFydGlhbFwiLGUsZCxmKSx0aGlzLm9wY29kZShcImFwcGVuZFwiKX0sUGFydGlhbEJsb2NrU3RhdGVtZW50OmZ1bmN0aW9uKGEpe3RoaXMuUGFydGlhbFN0YXRlbWVudChhKX0sTXVzdGFjaGVTdGF0ZW1lbnQ6ZnVuY3Rpb24oYSl7dGhpcy5TdWJFeHByZXNzaW9uKGEpLGEuZXNjYXBlZCYmIXRoaXMub3B0aW9ucy5ub0VzY2FwZT90aGlzLm9wY29kZShcImFwcGVuZEVzY2FwZWRcIik6dGhpcy5vcGNvZGUoXCJhcHBlbmRcIil9LERlY29yYXRvcjpmdW5jdGlvbihhKXt0aGlzLkRlY29yYXRvckJsb2NrKGEpfSxDb250ZW50U3RhdGVtZW50OmZ1bmN0aW9uKGEpe2EudmFsdWUmJnRoaXMub3Bjb2RlKFwiYXBwZW5kQ29udGVudFwiLGEudmFsdWUpfSxDb21tZW50U3RhdGVtZW50OmZ1bmN0aW9uKCl7fSxTdWJFeHByZXNzaW9uOmZ1bmN0aW9uKGEpe2goYSk7dmFyIGI9dGhpcy5jbGFzc2lmeVNleHByKGEpO1wic2ltcGxlXCI9PT1iP3RoaXMuc2ltcGxlU2V4cHIoYSk6XCJoZWxwZXJcIj09PWI/dGhpcy5oZWxwZXJTZXhwcihhKTp0aGlzLmFtYmlndW91c1NleHByKGEpfSxhbWJpZ3VvdXNTZXhwcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5wYXRoLGU9ZC5wYXJ0c1swXSxmPW51bGwhPWJ8fG51bGwhPWM7dGhpcy5vcGNvZGUoXCJnZXRDb250ZXh0XCIsZC5kZXB0aCksdGhpcy5vcGNvZGUoXCJwdXNoUHJvZ3JhbVwiLGIpLHRoaXMub3Bjb2RlKFwicHVzaFByb2dyYW1cIixjKSxkLnN0cmljdD0hMCx0aGlzLmFjY2VwdChkKSx0aGlzLm9wY29kZShcImludm9rZUFtYmlndW91c1wiLGUsZil9LHNpbXBsZVNleHByOmZ1bmN0aW9uKGEpe3ZhciBiPWEucGF0aDtiLnN0cmljdD0hMCx0aGlzLmFjY2VwdChiKSx0aGlzLm9wY29kZShcInJlc29sdmVQb3NzaWJsZUxhbWJkYVwiKX0saGVscGVyU2V4cHI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXMoYSxiLGMpLGU9YS5wYXRoLGY9ZS5wYXJ0c1swXTtpZih0aGlzLm9wdGlvbnMua25vd25IZWxwZXJzW2ZdKXRoaXMub3Bjb2RlKFwiaW52b2tlS25vd25IZWxwZXJcIixkLmxlbmd0aCxmKTtlbHNle2lmKHRoaXMub3B0aW9ucy5rbm93bkhlbHBlcnNPbmx5KXRocm93IG5ldyBrW1wiZGVmYXVsdFwiXShcIllvdSBzcGVjaWZpZWQga25vd25IZWxwZXJzT25seSwgYnV0IHVzZWQgdGhlIHVua25vd24gaGVscGVyIFwiK2YsYSk7ZS5zdHJpY3Q9ITAsZS5mYWxzeT0hMCx0aGlzLmFjY2VwdChlKSx0aGlzLm9wY29kZShcImludm9rZUhlbHBlclwiLGQubGVuZ3RoLGUub3JpZ2luYWwsbltcImRlZmF1bHRcIl0uaGVscGVycy5zaW1wbGVJZChlKSl9fSxQYXRoRXhwcmVzc2lvbjpmdW5jdGlvbihhKXt0aGlzLmFkZERlcHRoKGEuZGVwdGgpLHRoaXMub3Bjb2RlKFwiZ2V0Q29udGV4dFwiLGEuZGVwdGgpO3ZhciBiPWEucGFydHNbMF0sYz1uW1wiZGVmYXVsdFwiXS5oZWxwZXJzLnNjb3BlZElkKGEpLGQ9IWEuZGVwdGgmJiFjJiZ0aGlzLmJsb2NrUGFyYW1JbmRleChiKTtkP3RoaXMub3Bjb2RlKFwibG9va3VwQmxvY2tQYXJhbVwiLGQsYS5wYXJ0cyk6Yj9hLmRhdGE/KHRoaXMub3B0aW9ucy5kYXRhPSEwLHRoaXMub3Bjb2RlKFwibG9va3VwRGF0YVwiLGEuZGVwdGgsYS5wYXJ0cyxhLnN0cmljdCkpOnRoaXMub3Bjb2RlKFwibG9va3VwT25Db250ZXh0XCIsYS5wYXJ0cyxhLmZhbHN5LGEuc3RyaWN0LGMpOnRoaXMub3Bjb2RlKFwicHVzaENvbnRleHRcIil9LFN0cmluZ0xpdGVyYWw6ZnVuY3Rpb24oYSl7dGhpcy5vcGNvZGUoXCJwdXNoU3RyaW5nXCIsYS52YWx1ZSl9LE51bWJlckxpdGVyYWw6ZnVuY3Rpb24oYSl7dGhpcy5vcGNvZGUoXCJwdXNoTGl0ZXJhbFwiLGEudmFsdWUpfSxCb29sZWFuTGl0ZXJhbDpmdW5jdGlvbihhKXt0aGlzLm9wY29kZShcInB1c2hMaXRlcmFsXCIsYS52YWx1ZSl9LFVuZGVmaW5lZExpdGVyYWw6ZnVuY3Rpb24oKXt0aGlzLm9wY29kZShcInB1c2hMaXRlcmFsXCIsXCJ1bmRlZmluZWRcIil9LE51bGxMaXRlcmFsOmZ1bmN0aW9uKCl7dGhpcy5vcGNvZGUoXCJwdXNoTGl0ZXJhbFwiLFwibnVsbFwiKX0sSGFzaDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhaXJzLGM9MCxkPWIubGVuZ3RoO2Zvcih0aGlzLm9wY29kZShcInB1c2hIYXNoXCIpO2M8ZDtjKyspdGhpcy5wdXNoUGFyYW0oYltjXS52YWx1ZSk7Zm9yKDtjLS07KXRoaXMub3Bjb2RlKFwiYXNzaWduVG9IYXNoXCIsYltjXS5rZXkpO3RoaXMub3Bjb2RlKFwicG9wSGFzaFwiKX0sb3Bjb2RlOmZ1bmN0aW9uKGEpe3RoaXMub3Bjb2Rlcy5wdXNoKHtvcGNvZGU6YSxhcmdzOm8uY2FsbChhcmd1bWVudHMsMSksbG9jOnRoaXMuc291cmNlTm9kZVswXS5sb2N9KX0sYWRkRGVwdGg6ZnVuY3Rpb24oYSl7YSYmKHRoaXMudXNlRGVwdGhzPSEwKX0sY2xhc3NpZnlTZXhwcjpmdW5jdGlvbihhKXt2YXIgYj1uW1wiZGVmYXVsdFwiXS5oZWxwZXJzLnNpbXBsZUlkKGEucGF0aCksYz1iJiYhIXRoaXMuYmxvY2tQYXJhbUluZGV4KGEucGF0aC5wYXJ0c1swXSksZD0hYyYmbltcImRlZmF1bHRcIl0uaGVscGVycy5oZWxwZXJFeHByZXNzaW9uKGEpLGU9IWMmJihkfHxiKTtpZihlJiYhZCl7dmFyIGY9YS5wYXRoLnBhcnRzWzBdLGc9dGhpcy5vcHRpb25zO2cua25vd25IZWxwZXJzW2ZdP2Q9ITA6Zy5rbm93bkhlbHBlcnNPbmx5JiYoZT0hMSl9cmV0dXJuIGQ/XCJoZWxwZXJcIjplP1wiYW1iaWd1b3VzXCI6XCJzaW1wbGVcIn0scHVzaFBhcmFtczpmdW5jdGlvbihhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoO2I8YztiKyspdGhpcy5wdXNoUGFyYW0oYVtiXSl9LHB1c2hQYXJhbTpmdW5jdGlvbihhKXt2YXIgYj1udWxsIT1hLnZhbHVlP2EudmFsdWU6YS5vcmlnaW5hbHx8XCJcIjtpZih0aGlzLnN0cmluZ1BhcmFtcyliLnJlcGxhY2UmJihiPWIucmVwbGFjZSgvXihcXC4/XFwuXFwvKSovZyxcIlwiKS5yZXBsYWNlKC9cXC8vZyxcIi5cIikpLGEuZGVwdGgmJnRoaXMuYWRkRGVwdGgoYS5kZXB0aCksdGhpcy5vcGNvZGUoXCJnZXRDb250ZXh0XCIsYS5kZXB0aHx8MCksdGhpcy5vcGNvZGUoXCJwdXNoU3RyaW5nUGFyYW1cIixiLGEudHlwZSksXCJTdWJFeHByZXNzaW9uXCI9PT1hLnR5cGUmJnRoaXMuYWNjZXB0KGEpO2Vsc2V7aWYodGhpcy50cmFja0lkcyl7dmFyIGM9dm9pZCAwO2lmKCFhLnBhcnRzfHxuW1wiZGVmYXVsdFwiXS5oZWxwZXJzLnNjb3BlZElkKGEpfHxhLmRlcHRofHwoYz10aGlzLmJsb2NrUGFyYW1JbmRleChhLnBhcnRzWzBdKSksYyl7dmFyIGQ9YS5wYXJ0cy5zbGljZSgxKS5qb2luKFwiLlwiKTt0aGlzLm9wY29kZShcInB1c2hJZFwiLFwiQmxvY2tQYXJhbVwiLGMsZCl9ZWxzZSBiPWEub3JpZ2luYWx8fGIsYi5yZXBsYWNlJiYoYj1iLnJlcGxhY2UoL150aGlzKD86XFwufCQpLyxcIlwiKS5yZXBsYWNlKC9eXFwuXFwvLyxcIlwiKS5yZXBsYWNlKC9eXFwuJC8sXCJcIikpLHRoaXMub3Bjb2RlKFwicHVzaElkXCIsYS50eXBlLGIpfXRoaXMuYWNjZXB0KGEpfX0sc2V0dXBGdWxsTXVzdGFjaGVQYXJhbXM6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YS5wYXJhbXM7cmV0dXJuIHRoaXMucHVzaFBhcmFtcyhlKSx0aGlzLm9wY29kZShcInB1c2hQcm9ncmFtXCIsYiksdGhpcy5vcGNvZGUoXCJwdXNoUHJvZ3JhbVwiLGMpLGEuaGFzaD90aGlzLmFjY2VwdChhLmhhc2gpOnRoaXMub3Bjb2RlKFwiZW1wdHlIYXNoXCIsZCksZX0sYmxvY2tQYXJhbUluZGV4OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9dGhpcy5vcHRpb25zLmJsb2NrUGFyYW1zLmxlbmd0aDtiPGM7YisrKXt2YXIgZD10aGlzLm9wdGlvbnMuYmxvY2tQYXJhbXNbYl0sZT1kJiZsLmluZGV4T2YoZCxhKTtpZihkJiZlPj0wKXJldHVybltiLGVdfX19fSxmdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZChhKXt0aGlzLnZhbHVlPWF9ZnVuY3Rpb24gZSgpe31mdW5jdGlvbiBmKGEsYixjLGQpe3ZhciBlPWIucG9wU3RhY2soKSxmPTAsZz1jLmxlbmd0aDtmb3IoYSYmZy0tO2Y8ZztmKyspZT1iLm5hbWVMb29rdXAoZSxjW2ZdLGQpO3JldHVybiBhP1tiLmFsaWFzYWJsZShcImNvbnRhaW5lci5zdHJpY3RcIiksXCIoXCIsZSxcIiwgXCIsYi5xdW90ZWRTdHJpbmcoY1tmXSksXCIpXCJdOmV9dmFyIGc9YygxKVtcImRlZmF1bHRcIl07Yi5fX2VzTW9kdWxlPSEwO3ZhciBoPWMoNCksaT1jKDYpLGo9ZyhpKSxrPWMoNSksbD1jKDQzKSxtPWcobCk7ZS5wcm90b3R5cGU9e25hbWVMb29rdXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZS5pc1ZhbGlkSmF2YVNjcmlwdFZhcmlhYmxlTmFtZShiKT9bYSxcIi5cIixiXTpbYSxcIltcIixKU09OLnN0cmluZ2lmeShiKSxcIl1cIl19LGRlcHRoZWRMb29rdXA6ZnVuY3Rpb24oYSl7cmV0dXJuW3RoaXMuYWxpYXNhYmxlKFwiY29udGFpbmVyLmxvb2t1cFwiKSwnKGRlcHRocywgXCInLGEsJ1wiKSddfSxjb21waWxlckluZm86ZnVuY3Rpb24oKXt2YXIgYT1oLkNPTVBJTEVSX1JFVklTSU9OLGI9aC5SRVZJU0lPTl9DSEFOR0VTW2FdO3JldHVyblthLGJdfSxhcHBlbmRUb0J1ZmZlcjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGsuaXNBcnJheShhKXx8KGE9W2FdKSxhPXRoaXMuc291cmNlLndyYXAoYSxiKSx0aGlzLmVudmlyb25tZW50LmlzU2ltcGxlP1tcInJldHVybiBcIixhLFwiO1wiXTpjP1tcImJ1ZmZlciArPSBcIixhLFwiO1wiXTooYS5hcHBlbmRUb0J1ZmZlcj0hMCxhKX0saW5pdGlhbGl6ZUJ1ZmZlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1b3RlZFN0cmluZyhcIlwiKX0sY29tcGlsZTpmdW5jdGlvbihhLGIsYyxkKXt0aGlzLmVudmlyb25tZW50PWEsdGhpcy5vcHRpb25zPWIsdGhpcy5zdHJpbmdQYXJhbXM9dGhpcy5vcHRpb25zLnN0cmluZ1BhcmFtcyx0aGlzLnRyYWNrSWRzPXRoaXMub3B0aW9ucy50cmFja0lkcyx0aGlzLnByZWNvbXBpbGU9IWQsdGhpcy5uYW1lPXRoaXMuZW52aXJvbm1lbnQubmFtZSx0aGlzLmlzQ2hpbGQ9ISFjLHRoaXMuY29udGV4dD1jfHx7ZGVjb3JhdG9yczpbXSxwcm9ncmFtczpbXSxlbnZpcm9ubWVudHM6W119LHRoaXMucHJlYW1ibGUoKSx0aGlzLnN0YWNrU2xvdD0wLHRoaXMuc3RhY2tWYXJzPVtdLHRoaXMuYWxpYXNlcz17fSx0aGlzLnJlZ2lzdGVycz17bGlzdDpbXX0sdGhpcy5oYXNoZXM9W10sdGhpcy5jb21waWxlU3RhY2s9W10sdGhpcy5pbmxpbmVTdGFjaz1bXSx0aGlzLmJsb2NrUGFyYW1zPVtdLHRoaXMuY29tcGlsZUNoaWxkcmVuKGEsYiksdGhpcy51c2VEZXB0aHM9dGhpcy51c2VEZXB0aHN8fGEudXNlRGVwdGhzfHxhLnVzZURlY29yYXRvcnN8fHRoaXMub3B0aW9ucy5jb21wYXQsdGhpcy51c2VCbG9ja1BhcmFtcz10aGlzLnVzZUJsb2NrUGFyYW1zfHxhLnVzZUJsb2NrUGFyYW1zO3ZhciBlPWEub3Bjb2RlcyxmPXZvaWQgMCxnPXZvaWQgMCxoPXZvaWQgMCxpPXZvaWQgMDtmb3IoaD0wLGk9ZS5sZW5ndGg7aDxpO2grKylmPWVbaF0sdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uPWYubG9jLGc9Z3x8Zi5sb2MsdGhpc1tmLm9wY29kZV0uYXBwbHkodGhpcyxmLmFyZ3MpO2lmKHRoaXMuc291cmNlLmN1cnJlbnRMb2NhdGlvbj1nLHRoaXMucHVzaFNvdXJjZShcIlwiKSx0aGlzLnN0YWNrU2xvdHx8dGhpcy5pbmxpbmVTdGFjay5sZW5ndGh8fHRoaXMuY29tcGlsZVN0YWNrLmxlbmd0aCl0aHJvdyBuZXcgaltcImRlZmF1bHRcIl0oXCJDb21waWxlIGNvbXBsZXRlZCB3aXRoIGNvbnRlbnQgbGVmdCBvbiBzdGFja1wiKTt0aGlzLmRlY29yYXRvcnMuaXNFbXB0eSgpP3RoaXMuZGVjb3JhdG9ycz12b2lkIDA6KHRoaXMudXNlRGVjb3JhdG9ycz0hMCx0aGlzLmRlY29yYXRvcnMucHJlcGVuZChcInZhciBkZWNvcmF0b3JzID0gY29udGFpbmVyLmRlY29yYXRvcnM7XFxuXCIpLHRoaXMuZGVjb3JhdG9ycy5wdXNoKFwicmV0dXJuIGZuO1wiKSxkP3RoaXMuZGVjb3JhdG9ycz1GdW5jdGlvbi5hcHBseSh0aGlzLFtcImZuXCIsXCJwcm9wc1wiLFwiY29udGFpbmVyXCIsXCJkZXB0aDBcIixcImRhdGFcIixcImJsb2NrUGFyYW1zXCIsXCJkZXB0aHNcIix0aGlzLmRlY29yYXRvcnMubWVyZ2UoKV0pOih0aGlzLmRlY29yYXRvcnMucHJlcGVuZChcImZ1bmN0aW9uKGZuLCBwcm9wcywgY29udGFpbmVyLCBkZXB0aDAsIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcXG5cIiksdGhpcy5kZWNvcmF0b3JzLnB1c2goXCJ9XFxuXCIpLHRoaXMuZGVjb3JhdG9ycz10aGlzLmRlY29yYXRvcnMubWVyZ2UoKSkpO3ZhciBrPXRoaXMuY3JlYXRlRnVuY3Rpb25Db250ZXh0KGQpO2lmKHRoaXMuaXNDaGlsZClyZXR1cm4gazt2YXIgbD17Y29tcGlsZXI6dGhpcy5jb21waWxlckluZm8oKSxtYWluOmt9O3RoaXMuZGVjb3JhdG9ycyYmKGwubWFpbl9kPXRoaXMuZGVjb3JhdG9ycyxsLnVzZURlY29yYXRvcnM9ITApO3ZhciBtPXRoaXMuY29udGV4dCxuPW0ucHJvZ3JhbXMsbz1tLmRlY29yYXRvcnM7Zm9yKGg9MCxpPW4ubGVuZ3RoO2g8aTtoKyspbltoXSYmKGxbaF09bltoXSxvW2hdJiYobFtoK1wiX2RcIl09b1toXSxsLnVzZURlY29yYXRvcnM9ITApKTtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudC51c2VQYXJ0aWFsJiYobC51c2VQYXJ0aWFsPSEwKSx0aGlzLm9wdGlvbnMuZGF0YSYmKGwudXNlRGF0YT0hMCksdGhpcy51c2VEZXB0aHMmJihsLnVzZURlcHRocz0hMCksdGhpcy51c2VCbG9ja1BhcmFtcyYmKGwudXNlQmxvY2tQYXJhbXM9ITApLHRoaXMub3B0aW9ucy5jb21wYXQmJihsLmNvbXBhdD0hMCksZD9sLmNvbXBpbGVyT3B0aW9ucz10aGlzLm9wdGlvbnM6KGwuY29tcGlsZXI9SlNPTi5zdHJpbmdpZnkobC5jb21waWxlciksdGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uPXtzdGFydDp7bGluZToxLGNvbHVtbjowfX0sbD10aGlzLm9iamVjdExpdGVyYWwobCksYi5zcmNOYW1lPyhsPWwudG9TdHJpbmdXaXRoU291cmNlTWFwKHtmaWxlOmIuZGVzdE5hbWV9KSxsLm1hcD1sLm1hcCYmbC5tYXAudG9TdHJpbmcoKSk6bD1sLnRvU3RyaW5nKCkpLGx9LHByZWFtYmxlOmZ1bmN0aW9uKCl7dGhpcy5sYXN0Q29udGV4dD0wLHRoaXMuc291cmNlPW5ldyBtW1wiZGVmYXVsdFwiXSh0aGlzLm9wdGlvbnMuc3JjTmFtZSksdGhpcy5kZWNvcmF0b3JzPW5ldyBtW1wiZGVmYXVsdFwiXSh0aGlzLm9wdGlvbnMuc3JjTmFtZSl9LGNyZWF0ZUZ1bmN0aW9uQ29udGV4dDpmdW5jdGlvbihhKXt2YXIgYj1cIlwiLGM9dGhpcy5zdGFja1ZhcnMuY29uY2F0KHRoaXMucmVnaXN0ZXJzLmxpc3QpO2MubGVuZ3RoPjAmJihiKz1cIiwgXCIrYy5qb2luKFwiLCBcIikpO3ZhciBkPTA7Zm9yKHZhciBlIGluIHRoaXMuYWxpYXNlcyl7dmFyIGY9dGhpcy5hbGlhc2VzW2VdO3RoaXMuYWxpYXNlcy5oYXNPd25Qcm9wZXJ0eShlKSYmZi5jaGlsZHJlbiYmZi5yZWZlcmVuY2VDb3VudD4xJiYoYis9XCIsIGFsaWFzXCIrICsrZCtcIj1cIitlLGYuY2hpbGRyZW5bMF09XCJhbGlhc1wiK2QpfXZhciBnPVtcImNvbnRhaW5lclwiLFwiZGVwdGgwXCIsXCJoZWxwZXJzXCIsXCJwYXJ0aWFsc1wiLFwiZGF0YVwiXTsodGhpcy51c2VCbG9ja1BhcmFtc3x8dGhpcy51c2VEZXB0aHMpJiZnLnB1c2goXCJibG9ja1BhcmFtc1wiKSx0aGlzLnVzZURlcHRocyYmZy5wdXNoKFwiZGVwdGhzXCIpO3ZhciBoPXRoaXMubWVyZ2VTb3VyY2UoYik7cmV0dXJuIGE/KGcucHVzaChoKSxGdW5jdGlvbi5hcHBseSh0aGlzLGcpKTp0aGlzLnNvdXJjZS53cmFwKFtcImZ1bmN0aW9uKFwiLGcuam9pbihcIixcIiksXCIpIHtcXG4gIFwiLGgsXCJ9XCJdKX0sbWVyZ2VTb3VyY2U6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5lbnZpcm9ubWVudC5pc1NpbXBsZSxjPSF0aGlzLmZvcmNlQnVmZmVyLGQ9dm9pZCAwLGU9dm9pZCAwLGY9dm9pZCAwLGc9dm9pZCAwO3JldHVybiB0aGlzLnNvdXJjZS5lYWNoKGZ1bmN0aW9uKGEpe2EuYXBwZW5kVG9CdWZmZXI/KGY/YS5wcmVwZW5kKFwiICArIFwiKTpmPWEsZz1hKTooZiYmKGU/Zi5wcmVwZW5kKFwiYnVmZmVyICs9IFwiKTpkPSEwLGcuYWRkKFwiO1wiKSxmPWc9dm9pZCAwKSxlPSEwLGJ8fChjPSExKSl9KSxjP2Y/KGYucHJlcGVuZChcInJldHVybiBcIiksZy5hZGQoXCI7XCIpKTplfHx0aGlzLnNvdXJjZS5wdXNoKCdyZXR1cm4gXCJcIjsnKTooYSs9XCIsIGJ1ZmZlciA9IFwiKyhkP1wiXCI6dGhpcy5pbml0aWFsaXplQnVmZmVyKCkpLGY/KGYucHJlcGVuZChcInJldHVybiBidWZmZXIgKyBcIiksZy5hZGQoXCI7XCIpKTp0aGlzLnNvdXJjZS5wdXNoKFwicmV0dXJuIGJ1ZmZlcjtcIikpLGEmJnRoaXMuc291cmNlLnByZXBlbmQoXCJ2YXIgXCIrYS5zdWJzdHJpbmcoMikrKGQ/XCJcIjpcIjtcXG5cIikpLHRoaXMuc291cmNlLm1lcmdlKCl9LGJsb2NrVmFsdWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hbGlhc2FibGUoXCJoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZ1wiKSxjPVt0aGlzLmNvbnRleHROYW1lKDApXTt0aGlzLnNldHVwSGVscGVyQXJncyhhLDAsYyk7dmFyIGQ9dGhpcy5wb3BTdGFjaygpO2Muc3BsaWNlKDEsMCxkKSx0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGIsXCJjYWxsXCIsYykpfSxhbWJpZ3VvdXNCbG9ja1ZhbHVlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hbGlhc2FibGUoXCJoZWxwZXJzLmJsb2NrSGVscGVyTWlzc2luZ1wiKSxiPVt0aGlzLmNvbnRleHROYW1lKDApXTt0aGlzLnNldHVwSGVscGVyQXJncyhcIlwiLDAsYiwhMCksdGhpcy5mbHVzaElubGluZSgpO3ZhciBjPXRoaXMudG9wU3RhY2soKTtiLnNwbGljZSgxLDAsYyksdGhpcy5wdXNoU291cmNlKFtcImlmICghXCIsdGhpcy5sYXN0SGVscGVyLFwiKSB7IFwiLGMsXCIgPSBcIix0aGlzLnNvdXJjZS5mdW5jdGlvbkNhbGwoYSxcImNhbGxcIixiKSxcIn1cIl0pfSxhcHBlbmRDb250ZW50OmZ1bmN0aW9uKGEpe3RoaXMucGVuZGluZ0NvbnRlbnQ/YT10aGlzLnBlbmRpbmdDb250ZW50K2E6dGhpcy5wZW5kaW5nTG9jYXRpb249dGhpcy5zb3VyY2UuY3VycmVudExvY2F0aW9uLHRoaXMucGVuZGluZ0NvbnRlbnQ9YX0sYXBwZW5kOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0lubGluZSgpKXRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uKGEpe3JldHVybltcIiAhPSBudWxsID8gXCIsYSwnIDogXCJcIiddfSksdGhpcy5wdXNoU291cmNlKHRoaXMuYXBwZW5kVG9CdWZmZXIodGhpcy5wb3BTdGFjaygpKSk7ZWxzZXt2YXIgYT10aGlzLnBvcFN0YWNrKCk7dGhpcy5wdXNoU291cmNlKFtcImlmIChcIixhLFwiICE9IG51bGwpIHsgXCIsdGhpcy5hcHBlbmRUb0J1ZmZlcihhLHZvaWQgMCwhMCksXCIgfVwiXSksdGhpcy5lbnZpcm9ubWVudC5pc1NpbXBsZSYmdGhpcy5wdXNoU291cmNlKFtcImVsc2UgeyBcIix0aGlzLmFwcGVuZFRvQnVmZmVyKFwiJydcIix2b2lkIDAsITApLFwiIH1cIl0pfX0sYXBwZW5kRXNjYXBlZDpmdW5jdGlvbigpe3RoaXMucHVzaFNvdXJjZSh0aGlzLmFwcGVuZFRvQnVmZmVyKFt0aGlzLmFsaWFzYWJsZShcImNvbnRhaW5lci5lc2NhcGVFeHByZXNzaW9uXCIpLFwiKFwiLHRoaXMucG9wU3RhY2soKSxcIilcIl0pKX0sZ2V0Q29udGV4dDpmdW5jdGlvbihhKXt0aGlzLmxhc3RDb250ZXh0PWF9LHB1c2hDb250ZXh0OmZ1bmN0aW9uKCl7dGhpcy5wdXNoU3RhY2tMaXRlcmFsKHRoaXMuY29udGV4dE5hbWUodGhpcy5sYXN0Q29udGV4dCkpfSxsb29rdXBPbkNvbnRleHQ6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9MDtkfHwhdGhpcy5vcHRpb25zLmNvbXBhdHx8dGhpcy5sYXN0Q29udGV4dD90aGlzLnB1c2hDb250ZXh0KCk6dGhpcy5wdXNoKHRoaXMuZGVwdGhlZExvb2t1cChhW2UrK10pKSx0aGlzLnJlc29sdmVQYXRoKFwiY29udGV4dFwiLGEsZSxiLGMpfSxsb29rdXBCbG9ja1BhcmFtOmZ1bmN0aW9uKGEsYil7dGhpcy51c2VCbG9ja1BhcmFtcz0hMCx0aGlzLnB1c2goW1wiYmxvY2tQYXJhbXNbXCIsYVswXSxcIl1bXCIsYVsxXSxcIl1cIl0pLHRoaXMucmVzb2x2ZVBhdGgoXCJjb250ZXh0XCIsYiwxKX0sbG9va3VwRGF0YTpmdW5jdGlvbihhLGIsYyl7YT90aGlzLnB1c2hTdGFja0xpdGVyYWwoXCJjb250YWluZXIuZGF0YShkYXRhLCBcIithK1wiKVwiKTp0aGlzLnB1c2hTdGFja0xpdGVyYWwoXCJkYXRhXCIpLHRoaXMucmVzb2x2ZVBhdGgoXCJkYXRhXCIsYiwwLCEwLGMpfSxyZXNvbHZlUGF0aDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBnPXRoaXM7aWYodGhpcy5vcHRpb25zLnN0cmljdHx8dGhpcy5vcHRpb25zLmFzc3VtZU9iamVjdHMpcmV0dXJuIHZvaWQgdGhpcy5wdXNoKGYodGhpcy5vcHRpb25zLnN0cmljdCYmZSx0aGlzLGIsYSkpO2Zvcih2YXIgaD1iLmxlbmd0aDtjPGg7YysrKXRoaXMucmVwbGFjZVN0YWNrKGZ1bmN0aW9uKGUpe3ZhciBmPWcubmFtZUxvb2t1cChlLGJbY10sYSk7XHJcbnJldHVybiBkP1tcIiAmJiBcIixmXTpbXCIgIT0gbnVsbCA/IFwiLGYsXCIgOiBcIixlXX0pfSxyZXNvbHZlUG9zc2libGVMYW1iZGE6ZnVuY3Rpb24oKXt0aGlzLnB1c2goW3RoaXMuYWxpYXNhYmxlKFwiY29udGFpbmVyLmxhbWJkYVwiKSxcIihcIix0aGlzLnBvcFN0YWNrKCksXCIsIFwiLHRoaXMuY29udGV4dE5hbWUoMCksXCIpXCJdKX0scHVzaFN0cmluZ1BhcmFtOmZ1bmN0aW9uKGEsYil7dGhpcy5wdXNoQ29udGV4dCgpLHRoaXMucHVzaFN0cmluZyhiKSxcIlN1YkV4cHJlc3Npb25cIiE9PWImJihcInN0cmluZ1wiPT10eXBlb2YgYT90aGlzLnB1c2hTdHJpbmcoYSk6dGhpcy5wdXNoU3RhY2tMaXRlcmFsKGEpKX0sZW1wdHlIYXNoOmZ1bmN0aW9uKGEpe3RoaXMudHJhY2tJZHMmJnRoaXMucHVzaChcInt9XCIpLHRoaXMuc3RyaW5nUGFyYW1zJiYodGhpcy5wdXNoKFwie31cIiksdGhpcy5wdXNoKFwie31cIikpLHRoaXMucHVzaFN0YWNrTGl0ZXJhbChhP1widW5kZWZpbmVkXCI6XCJ7fVwiKX0scHVzaEhhc2g6ZnVuY3Rpb24oKXt0aGlzLmhhc2gmJnRoaXMuaGFzaGVzLnB1c2godGhpcy5oYXNoKSx0aGlzLmhhc2g9e3ZhbHVlczpbXSx0eXBlczpbXSxjb250ZXh0czpbXSxpZHM6W119fSxwb3BIYXNoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5oYXNoO3RoaXMuaGFzaD10aGlzLmhhc2hlcy5wb3AoKSx0aGlzLnRyYWNrSWRzJiZ0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGEuaWRzKSksdGhpcy5zdHJpbmdQYXJhbXMmJih0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGEuY29udGV4dHMpKSx0aGlzLnB1c2godGhpcy5vYmplY3RMaXRlcmFsKGEudHlwZXMpKSksdGhpcy5wdXNoKHRoaXMub2JqZWN0TGl0ZXJhbChhLnZhbHVlcykpfSxwdXNoU3RyaW5nOmZ1bmN0aW9uKGEpe3RoaXMucHVzaFN0YWNrTGl0ZXJhbCh0aGlzLnF1b3RlZFN0cmluZyhhKSl9LHB1c2hMaXRlcmFsOmZ1bmN0aW9uKGEpe3RoaXMucHVzaFN0YWNrTGl0ZXJhbChhKX0scHVzaFByb2dyYW06ZnVuY3Rpb24oYSl7bnVsbCE9YT90aGlzLnB1c2hTdGFja0xpdGVyYWwodGhpcy5wcm9ncmFtRXhwcmVzc2lvbihhKSk6dGhpcy5wdXNoU3RhY2tMaXRlcmFsKG51bGwpfSxyZWdpc3RlckRlY29yYXRvcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMubmFtZUxvb2t1cChcImRlY29yYXRvcnNcIixiLFwiZGVjb3JhdG9yXCIpLGQ9dGhpcy5zZXR1cEhlbHBlckFyZ3MoYixhKTt0aGlzLmRlY29yYXRvcnMucHVzaChbXCJmbiA9IFwiLHRoaXMuZGVjb3JhdG9ycy5mdW5jdGlvbkNhbGwoYyxcIlwiLFtcImZuXCIsXCJwcm9wc1wiLFwiY29udGFpbmVyXCIsZF0pLFwiIHx8IGZuO1wiXSl9LGludm9rZUhlbHBlcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5wb3BTdGFjaygpLGU9dGhpcy5zZXR1cEhlbHBlcihhLGIpLGY9Yz9bZS5uYW1lLFwiIHx8IFwiXTpcIlwiLGc9W1wiKFwiXS5jb25jYXQoZixkKTt0aGlzLm9wdGlvbnMuc3RyaWN0fHxnLnB1c2goXCIgfHwgXCIsdGhpcy5hbGlhc2FibGUoXCJoZWxwZXJzLmhlbHBlck1pc3NpbmdcIikpLGcucHVzaChcIilcIiksdGhpcy5wdXNoKHRoaXMuc291cmNlLmZ1bmN0aW9uQ2FsbChnLFwiY2FsbFwiLGUuY2FsbFBhcmFtcykpfSxpbnZva2VLbm93bkhlbHBlcjpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuc2V0dXBIZWxwZXIoYSxiKTt0aGlzLnB1c2godGhpcy5zb3VyY2UuZnVuY3Rpb25DYWxsKGMubmFtZSxcImNhbGxcIixjLmNhbGxQYXJhbXMpKX0saW52b2tlQW1iaWd1b3VzOmZ1bmN0aW9uKGEsYil7dGhpcy51c2VSZWdpc3RlcihcImhlbHBlclwiKTt2YXIgYz10aGlzLnBvcFN0YWNrKCk7dGhpcy5lbXB0eUhhc2goKTt2YXIgZD10aGlzLnNldHVwSGVscGVyKDAsYSxiKSxlPXRoaXMubGFzdEhlbHBlcj10aGlzLm5hbWVMb29rdXAoXCJoZWxwZXJzXCIsYSxcImhlbHBlclwiKSxmPVtcIihcIixcIihoZWxwZXIgPSBcIixlLFwiIHx8IFwiLGMsXCIpXCJdO3RoaXMub3B0aW9ucy5zdHJpY3R8fChmWzBdPVwiKGhlbHBlciA9IFwiLGYucHVzaChcIiAhPSBudWxsID8gaGVscGVyIDogXCIsdGhpcy5hbGlhc2FibGUoXCJoZWxwZXJzLmhlbHBlck1pc3NpbmdcIikpKSx0aGlzLnB1c2goW1wiKFwiLGYsZC5wYXJhbXNJbml0P1tcIiksKFwiLGQucGFyYW1zSW5pdF06W10sXCIpLFwiLFwiKHR5cGVvZiBoZWxwZXIgPT09IFwiLHRoaXMuYWxpYXNhYmxlKCdcImZ1bmN0aW9uXCInKSxcIiA/IFwiLHRoaXMuc291cmNlLmZ1bmN0aW9uQ2FsbChcImhlbHBlclwiLFwiY2FsbFwiLGQuY2FsbFBhcmFtcyksXCIgOiBoZWxwZXIpKVwiXSl9LGludm9rZVBhcnRpYWw6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU9dGhpcy5zZXR1cFBhcmFtcyhiLDEsZCk7YSYmKGI9dGhpcy5wb3BTdGFjaygpLGRlbGV0ZSBlLm5hbWUpLGMmJihlLmluZGVudD1KU09OLnN0cmluZ2lmeShjKSksZS5oZWxwZXJzPVwiaGVscGVyc1wiLGUucGFydGlhbHM9XCJwYXJ0aWFsc1wiLGUuZGVjb3JhdG9ycz1cImNvbnRhaW5lci5kZWNvcmF0b3JzXCIsYT9kLnVuc2hpZnQoYik6ZC51bnNoaWZ0KHRoaXMubmFtZUxvb2t1cChcInBhcnRpYWxzXCIsYixcInBhcnRpYWxcIikpLHRoaXMub3B0aW9ucy5jb21wYXQmJihlLmRlcHRocz1cImRlcHRoc1wiKSxlPXRoaXMub2JqZWN0TGl0ZXJhbChlKSxkLnB1c2goZSksdGhpcy5wdXNoKHRoaXMuc291cmNlLmZ1bmN0aW9uQ2FsbChcImNvbnRhaW5lci5pbnZva2VQYXJ0aWFsXCIsXCJcIixkKSl9LGFzc2lnblRvSGFzaDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBvcFN0YWNrKCksYz12b2lkIDAsZD12b2lkIDAsZT12b2lkIDA7dGhpcy50cmFja0lkcyYmKGU9dGhpcy5wb3BTdGFjaygpKSx0aGlzLnN0cmluZ1BhcmFtcyYmKGQ9dGhpcy5wb3BTdGFjaygpLGM9dGhpcy5wb3BTdGFjaygpKTt2YXIgZj10aGlzLmhhc2g7YyYmKGYuY29udGV4dHNbYV09YyksZCYmKGYudHlwZXNbYV09ZCksZSYmKGYuaWRzW2FdPWUpLGYudmFsdWVzW2FdPWJ9LHB1c2hJZDpmdW5jdGlvbihhLGIsYyl7XCJCbG9ja1BhcmFtXCI9PT1hP3RoaXMucHVzaFN0YWNrTGl0ZXJhbChcImJsb2NrUGFyYW1zW1wiK2JbMF0rXCJdLnBhdGhbXCIrYlsxXStcIl1cIisoYz9cIiArIFwiK0pTT04uc3RyaW5naWZ5KFwiLlwiK2MpOlwiXCIpKTpcIlBhdGhFeHByZXNzaW9uXCI9PT1hP3RoaXMucHVzaFN0cmluZyhiKTpcIlN1YkV4cHJlc3Npb25cIj09PWE/dGhpcy5wdXNoU3RhY2tMaXRlcmFsKFwidHJ1ZVwiKTp0aGlzLnB1c2hTdGFja0xpdGVyYWwoXCJudWxsXCIpfSxjb21waWxlcjplLGNvbXBpbGVDaGlsZHJlbjpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1hLmNoaWxkcmVuLGQ9dm9pZCAwLGU9dm9pZCAwLGY9MCxnPWMubGVuZ3RoO2Y8ZztmKyspe2Q9Y1tmXSxlPW5ldyB0aGlzLmNvbXBpbGVyO3ZhciBoPXRoaXMubWF0Y2hFeGlzdGluZ1Byb2dyYW0oZCk7aWYobnVsbD09aCl7dGhpcy5jb250ZXh0LnByb2dyYW1zLnB1c2goXCJcIik7dmFyIGk9dGhpcy5jb250ZXh0LnByb2dyYW1zLmxlbmd0aDtkLmluZGV4PWksZC5uYW1lPVwicHJvZ3JhbVwiK2ksdGhpcy5jb250ZXh0LnByb2dyYW1zW2ldPWUuY29tcGlsZShkLGIsdGhpcy5jb250ZXh0LCF0aGlzLnByZWNvbXBpbGUpLHRoaXMuY29udGV4dC5kZWNvcmF0b3JzW2ldPWUuZGVjb3JhdG9ycyx0aGlzLmNvbnRleHQuZW52aXJvbm1lbnRzW2ldPWQsdGhpcy51c2VEZXB0aHM9dGhpcy51c2VEZXB0aHN8fGUudXNlRGVwdGhzLHRoaXMudXNlQmxvY2tQYXJhbXM9dGhpcy51c2VCbG9ja1BhcmFtc3x8ZS51c2VCbG9ja1BhcmFtcyxkLnVzZURlcHRocz10aGlzLnVzZURlcHRocyxkLnVzZUJsb2NrUGFyYW1zPXRoaXMudXNlQmxvY2tQYXJhbXN9ZWxzZSBkLmluZGV4PWguaW5kZXgsZC5uYW1lPVwicHJvZ3JhbVwiK2guaW5kZXgsdGhpcy51c2VEZXB0aHM9dGhpcy51c2VEZXB0aHN8fGgudXNlRGVwdGhzLHRoaXMudXNlQmxvY2tQYXJhbXM9dGhpcy51c2VCbG9ja1BhcmFtc3x8aC51c2VCbG9ja1BhcmFtc319LG1hdGNoRXhpc3RpbmdQcm9ncmFtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9dGhpcy5jb250ZXh0LmVudmlyb25tZW50cy5sZW5ndGg7YjxjO2IrKyl7dmFyIGQ9dGhpcy5jb250ZXh0LmVudmlyb25tZW50c1tiXTtpZihkJiZkLmVxdWFscyhhKSlyZXR1cm4gZH19LHByb2dyYW1FeHByZXNzaW9uOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZW52aXJvbm1lbnQuY2hpbGRyZW5bYV0sYz1bYi5pbmRleCxcImRhdGFcIixiLmJsb2NrUGFyYW1zXTtyZXR1cm4odGhpcy51c2VCbG9ja1BhcmFtc3x8dGhpcy51c2VEZXB0aHMpJiZjLnB1c2goXCJibG9ja1BhcmFtc1wiKSx0aGlzLnVzZURlcHRocyYmYy5wdXNoKFwiZGVwdGhzXCIpLFwiY29udGFpbmVyLnByb2dyYW0oXCIrYy5qb2luKFwiLCBcIikrXCIpXCJ9LHVzZVJlZ2lzdGVyOmZ1bmN0aW9uKGEpe3RoaXMucmVnaXN0ZXJzW2FdfHwodGhpcy5yZWdpc3RlcnNbYV09ITAsdGhpcy5yZWdpc3RlcnMubGlzdC5wdXNoKGEpKX0scHVzaDpmdW5jdGlvbihhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIGR8fChhPXRoaXMuc291cmNlLndyYXAoYSkpLHRoaXMuaW5saW5lU3RhY2sucHVzaChhKSxhfSxwdXNoU3RhY2tMaXRlcmFsOmZ1bmN0aW9uKGEpe3RoaXMucHVzaChuZXcgZChhKSl9LHB1c2hTb3VyY2U6ZnVuY3Rpb24oYSl7dGhpcy5wZW5kaW5nQ29udGVudCYmKHRoaXMuc291cmNlLnB1c2godGhpcy5hcHBlbmRUb0J1ZmZlcih0aGlzLnNvdXJjZS5xdW90ZWRTdHJpbmcodGhpcy5wZW5kaW5nQ29udGVudCksdGhpcy5wZW5kaW5nTG9jYXRpb24pKSx0aGlzLnBlbmRpbmdDb250ZW50PXZvaWQgMCksYSYmdGhpcy5zb3VyY2UucHVzaChhKX0scmVwbGFjZVN0YWNrOmZ1bmN0aW9uKGEpe3ZhciBiPVtcIihcIl0sYz12b2lkIDAsZT12b2lkIDAsZj12b2lkIDA7aWYoIXRoaXMuaXNJbmxpbmUoKSl0aHJvdyBuZXcgaltcImRlZmF1bHRcIl0oXCJyZXBsYWNlU3RhY2sgb24gbm9uLWlubGluZVwiKTt2YXIgZz10aGlzLnBvcFN0YWNrKCEwKTtpZihnIGluc3RhbmNlb2YgZCljPVtnLnZhbHVlXSxiPVtcIihcIixjXSxmPSEwO2Vsc2V7ZT0hMDt2YXIgaD10aGlzLmluY3JTdGFjaygpO2I9W1wiKChcIix0aGlzLnB1c2goaCksXCIgPSBcIixnLFwiKVwiXSxjPXRoaXMudG9wU3RhY2soKX12YXIgaT1hLmNhbGwodGhpcyxjKTtmfHx0aGlzLnBvcFN0YWNrKCksZSYmdGhpcy5zdGFja1Nsb3QtLSx0aGlzLnB1c2goYi5jb25jYXQoaSxcIilcIikpfSxpbmNyU3RhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFja1Nsb3QrKyx0aGlzLnN0YWNrU2xvdD50aGlzLnN0YWNrVmFycy5sZW5ndGgmJnRoaXMuc3RhY2tWYXJzLnB1c2goXCJzdGFja1wiK3RoaXMuc3RhY2tTbG90KSx0aGlzLnRvcFN0YWNrTmFtZSgpfSx0b3BTdGFja05hbWU6ZnVuY3Rpb24oKXtyZXR1cm5cInN0YWNrXCIrdGhpcy5zdGFja1Nsb3R9LGZsdXNoSW5saW5lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5pbmxpbmVTdGFjazt0aGlzLmlubGluZVN0YWNrPVtdO2Zvcih2YXIgYj0wLGM9YS5sZW5ndGg7YjxjO2IrKyl7dmFyIGU9YVtiXTtpZihlIGluc3RhbmNlb2YgZCl0aGlzLmNvbXBpbGVTdGFjay5wdXNoKGUpO2Vsc2V7dmFyIGY9dGhpcy5pbmNyU3RhY2soKTt0aGlzLnB1c2hTb3VyY2UoW2YsXCIgPSBcIixlLFwiO1wiXSksdGhpcy5jb21waWxlU3RhY2sucHVzaChmKX19fSxpc0lubGluZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlubGluZVN0YWNrLmxlbmd0aH0scG9wU3RhY2s6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5pc0lubGluZSgpLGM9KGI/dGhpcy5pbmxpbmVTdGFjazp0aGlzLmNvbXBpbGVTdGFjaykucG9wKCk7aWYoIWEmJmMgaW5zdGFuY2VvZiBkKXJldHVybiBjLnZhbHVlO2lmKCFiKXtpZighdGhpcy5zdGFja1Nsb3QpdGhyb3cgbmV3IGpbXCJkZWZhdWx0XCJdKFwiSW52YWxpZCBzdGFjayBwb3BcIik7dGhpcy5zdGFja1Nsb3QtLX1yZXR1cm4gY30sdG9wU3RhY2s6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmlzSW5saW5lKCk/dGhpcy5pbmxpbmVTdGFjazp0aGlzLmNvbXBpbGVTdGFjayxiPWFbYS5sZW5ndGgtMV07cmV0dXJuIGIgaW5zdGFuY2VvZiBkP2IudmFsdWU6Yn0sY29udGV4dE5hbWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudXNlRGVwdGhzJiZhP1wiZGVwdGhzW1wiK2ErXCJdXCI6XCJkZXB0aFwiK2F9LHF1b3RlZFN0cmluZzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zb3VyY2UucXVvdGVkU3RyaW5nKGEpfSxvYmplY3RMaXRlcmFsOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNvdXJjZS5vYmplY3RMaXRlcmFsKGEpfSxhbGlhc2FibGU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5hbGlhc2VzW2FdO3JldHVybiBiPyhiLnJlZmVyZW5jZUNvdW50KyssYik6KGI9dGhpcy5hbGlhc2VzW2FdPXRoaXMuc291cmNlLndyYXAoYSksYi5hbGlhc2FibGU9ITAsYi5yZWZlcmVuY2VDb3VudD0xLGIpfSxzZXR1cEhlbHBlcjpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9W10sZT10aGlzLnNldHVwSGVscGVyQXJncyhiLGEsZCxjKSxmPXRoaXMubmFtZUxvb2t1cChcImhlbHBlcnNcIixiLFwiaGVscGVyXCIpLGc9dGhpcy5hbGlhc2FibGUodGhpcy5jb250ZXh0TmFtZSgwKStcIiAhPSBudWxsID8gXCIrdGhpcy5jb250ZXh0TmFtZSgwKStcIiA6IChjb250YWluZXIubnVsbENvbnRleHQgfHwge30pXCIpO3JldHVybntwYXJhbXM6ZCxwYXJhbXNJbml0OmUsbmFtZTpmLGNhbGxQYXJhbXM6W2ddLmNvbmNhdChkKX19LHNldHVwUGFyYW1zOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD17fSxlPVtdLGY9W10sZz1bXSxoPSFjLGk9dm9pZCAwO2gmJihjPVtdKSxkLm5hbWU9dGhpcy5xdW90ZWRTdHJpbmcoYSksZC5oYXNoPXRoaXMucG9wU3RhY2soKSx0aGlzLnRyYWNrSWRzJiYoZC5oYXNoSWRzPXRoaXMucG9wU3RhY2soKSksdGhpcy5zdHJpbmdQYXJhbXMmJihkLmhhc2hUeXBlcz10aGlzLnBvcFN0YWNrKCksZC5oYXNoQ29udGV4dHM9dGhpcy5wb3BTdGFjaygpKTt2YXIgaj10aGlzLnBvcFN0YWNrKCksaz10aGlzLnBvcFN0YWNrKCk7KGt8fGopJiYoZC5mbj1rfHxcImNvbnRhaW5lci5ub29wXCIsZC5pbnZlcnNlPWp8fFwiY29udGFpbmVyLm5vb3BcIik7Zm9yKHZhciBsPWI7bC0tOylpPXRoaXMucG9wU3RhY2soKSxjW2xdPWksdGhpcy50cmFja0lkcyYmKGdbbF09dGhpcy5wb3BTdGFjaygpKSx0aGlzLnN0cmluZ1BhcmFtcyYmKGZbbF09dGhpcy5wb3BTdGFjaygpLGVbbF09dGhpcy5wb3BTdGFjaygpKTtyZXR1cm4gaCYmKGQuYXJncz10aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGMpKSx0aGlzLnRyYWNrSWRzJiYoZC5pZHM9dGhpcy5zb3VyY2UuZ2VuZXJhdGVBcnJheShnKSksdGhpcy5zdHJpbmdQYXJhbXMmJihkLnR5cGVzPXRoaXMuc291cmNlLmdlbmVyYXRlQXJyYXkoZiksZC5jb250ZXh0cz10aGlzLnNvdXJjZS5nZW5lcmF0ZUFycmF5KGUpKSx0aGlzLm9wdGlvbnMuZGF0YSYmKGQuZGF0YT1cImRhdGFcIiksdGhpcy51c2VCbG9ja1BhcmFtcyYmKGQuYmxvY2tQYXJhbXM9XCJibG9ja1BhcmFtc1wiKSxkfSxzZXR1cEhlbHBlckFyZ3M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9dGhpcy5zZXR1cFBhcmFtcyhhLGIsYyk7cmV0dXJuIGU9dGhpcy5vYmplY3RMaXRlcmFsKGUpLGQ/KHRoaXMudXNlUmVnaXN0ZXIoXCJvcHRpb25zXCIpLGMucHVzaChcIm9wdGlvbnNcIiksW1wib3B0aW9ucz1cIixlXSk6Yz8oYy5wdXNoKGUpLFwiXCIpOmV9fSxmdW5jdGlvbigpe2Zvcih2YXIgYT1cImJyZWFrIGVsc2UgbmV3IHZhciBjYXNlIGZpbmFsbHkgcmV0dXJuIHZvaWQgY2F0Y2ggZm9yIHN3aXRjaCB3aGlsZSBjb250aW51ZSBmdW5jdGlvbiB0aGlzIHdpdGggZGVmYXVsdCBpZiB0aHJvdyBkZWxldGUgaW4gdHJ5IGRvIGluc3RhbmNlb2YgdHlwZW9mIGFic3RyYWN0IGVudW0gaW50IHNob3J0IGJvb2xlYW4gZXhwb3J0IGludGVyZmFjZSBzdGF0aWMgYnl0ZSBleHRlbmRzIGxvbmcgc3VwZXIgY2hhciBmaW5hbCBuYXRpdmUgc3luY2hyb25pemVkIGNsYXNzIGZsb2F0IHBhY2thZ2UgdGhyb3dzIGNvbnN0IGdvdG8gcHJpdmF0ZSB0cmFuc2llbnQgZGVidWdnZXIgaW1wbGVtZW50cyBwcm90ZWN0ZWQgdm9sYXRpbGUgZG91YmxlIGltcG9ydCBwdWJsaWMgbGV0IHlpZWxkIGF3YWl0IG51bGwgdHJ1ZSBmYWxzZVwiLnNwbGl0KFwiIFwiKSxiPWUuUkVTRVJWRURfV09SRFM9e30sYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyliW2FbY11dPSEwfSgpLGUuaXNWYWxpZEphdmFTY3JpcHRWYXJpYWJsZU5hbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIWUuUkVTRVJWRURfV09SRFNbYV0mJi9eW2EtekEtWl8kXVswLTlhLXpBLVpfJF0qJC8udGVzdChhKX0sYltcImRlZmF1bHRcIl09ZSxhLmV4cG9ydHM9YltcImRlZmF1bHRcIl19LGZ1bmN0aW9uKGEsYixjKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBkKGEsYixjKXtpZihmLmlzQXJyYXkoYSkpe2Zvcih2YXIgZD1bXSxlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKWQucHVzaChiLndyYXAoYVtlXSxjKSk7cmV0dXJuIGR9cmV0dXJuXCJib29sZWFuXCI9PXR5cGVvZiBhfHxcIm51bWJlclwiPT10eXBlb2YgYT9hK1wiXCI6YX1mdW5jdGlvbiBlKGEpe3RoaXMuc3JjRmlsZT1hLHRoaXMuc291cmNlPVtdfWIuX19lc01vZHVsZT0hMDt2YXIgZj1jKDUpLGc9dm9pZCAwO3RyeXt9Y2F0Y2goaCl7fWd8fChnPWZ1bmN0aW9uKGEsYixjLGQpe3RoaXMuc3JjPVwiXCIsZCYmdGhpcy5hZGQoZCl9LGcucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24oYSl7Zi5pc0FycmF5KGEpJiYoYT1hLmpvaW4oXCJcIikpLHRoaXMuc3JjKz1hfSxwcmVwZW5kOmZ1bmN0aW9uKGEpe2YuaXNBcnJheShhKSYmKGE9YS5qb2luKFwiXCIpKSx0aGlzLnNyYz1hK3RoaXMuc3JjfSx0b1N0cmluZ1dpdGhTb3VyY2VNYXA6ZnVuY3Rpb24oKXtyZXR1cm57Y29kZTp0aGlzLnRvU3RyaW5nKCl9fSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNyY319KSxlLnByb3RvdHlwZT17aXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiF0aGlzLnNvdXJjZS5sZW5ndGh9LHByZXBlbmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLnNvdXJjZS51bnNoaWZ0KHRoaXMud3JhcChhLGIpKX0scHVzaDpmdW5jdGlvbihhLGIpe3RoaXMuc291cmNlLnB1c2godGhpcy53cmFwKGEsYikpfSxtZXJnZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZW1wdHkoKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2EuYWRkKFtcIiAgXCIsYixcIlxcblwiXSl9KSxhfSxlYWNoOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wLGM9dGhpcy5zb3VyY2UubGVuZ3RoO2I8YztiKyspYSh0aGlzLnNvdXJjZVtiXSl9LGVtcHR5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5jdXJyZW50TG9jYXRpb258fHtzdGFydDp7fX07cmV0dXJuIG5ldyBnKGEuc3RhcnQubGluZSxhLnN0YXJ0LmNvbHVtbix0aGlzLnNyY0ZpbGUpfSx3cmFwOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cy5sZW5ndGg8PTF8fHZvaWQgMD09PWFyZ3VtZW50c1sxXT90aGlzLmN1cnJlbnRMb2NhdGlvbnx8e3N0YXJ0Ont9fTphcmd1bWVudHNbMV07cmV0dXJuIGEgaW5zdGFuY2VvZiBnP2E6KGE9ZChhLHRoaXMsYiksbmV3IGcoYi5zdGFydC5saW5lLGIuc3RhcnQuY29sdW1uLHRoaXMuc3JjRmlsZSxhKSl9LGZ1bmN0aW9uQ2FsbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM9dGhpcy5nZW5lcmF0ZUxpc3QoYyksdGhpcy53cmFwKFthLGI/XCIuXCIrYitcIihcIjpcIihcIixjLFwiKVwiXSl9LHF1b3RlZFN0cmluZzpmdW5jdGlvbihhKXtyZXR1cm4nXCInKyhhK1wiXCIpLnJlcGxhY2UoL1xcXFwvZyxcIlxcXFxcXFxcXCIpLnJlcGxhY2UoL1wiL2csJ1xcXFxcIicpLnJlcGxhY2UoL1xcbi9nLFwiXFxcXG5cIikucmVwbGFjZSgvXFxyL2csXCJcXFxcclwiKS5yZXBsYWNlKC9cXHUyMDI4L2csXCJcXFxcdTIwMjhcIikucmVwbGFjZSgvXFx1MjAyOS9nLFwiXFxcXHUyMDI5XCIpKydcIid9LG9iamVjdExpdGVyYWw6ZnVuY3Rpb24oYSl7dmFyIGI9W107Zm9yKHZhciBjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7dmFyIGU9ZChhW2NdLHRoaXMpO1widW5kZWZpbmVkXCIhPT1lJiZiLnB1c2goW3RoaXMucXVvdGVkU3RyaW5nKGMpLFwiOlwiLGVdKX12YXIgZj10aGlzLmdlbmVyYXRlTGlzdChiKTtyZXR1cm4gZi5wcmVwZW5kKFwie1wiKSxmLmFkZChcIn1cIiksZn0sZ2VuZXJhdGVMaXN0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmVtcHR5KCksYz0wLGU9YS5sZW5ndGg7YzxlO2MrKyljJiZiLmFkZChcIixcIiksYi5hZGQoZChhW2NdLHRoaXMpKTtyZXR1cm4gYn0sZ2VuZXJhdGVBcnJheTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdlbmVyYXRlTGlzdChhKTtyZXR1cm4gYi5wcmVwZW5kKFwiW1wiKSxiLmFkZChcIl1cIiksYn19LGJbXCJkZWZhdWx0XCJdPWUsYS5leHBvcnRzPWJbXCJkZWZhdWx0XCJdfV0pfSk7XHJcbi8qIVxyXG4gKiBCb290c3RyYXAgdjMuMy43IChodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbSlcclxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxyXG4gKi9cclxuXHJcbmlmICh0eXBlb2YgalF1ZXJ5ID09PSAndW5kZWZpbmVkJykge1xyXG4gIHRocm93IG5ldyBFcnJvcignQm9vdHN0cmFwXFwncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGpRdWVyeScpXHJcbn1cclxuXHJcbitmdW5jdGlvbiAoJCkge1xyXG4gICd1c2Ugc3RyaWN0JztcclxuICB2YXIgdmVyc2lvbiA9ICQuZm4uanF1ZXJ5LnNwbGl0KCcgJylbMF0uc3BsaXQoJy4nKVxyXG4gIGlmICgodmVyc2lvblswXSA8IDIgJiYgdmVyc2lvblsxXSA8IDkpIHx8ICh2ZXJzaW9uWzBdID09IDEgJiYgdmVyc2lvblsxXSA9PSA5ICYmIHZlcnNpb25bMl0gPCAxKSB8fCAodmVyc2lvblswXSA+IDMpKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jvb3RzdHJhcFxcJ3MgSmF2YVNjcmlwdCByZXF1aXJlcyBqUXVlcnkgdmVyc2lvbiAxLjkuMSBvciBoaWdoZXIsIGJ1dCBsb3dlciB0aGFuIHZlcnNpb24gNCcpXHJcbiAgfVxyXG59KGpRdWVyeSk7XHJcblxyXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQm9vdHN0cmFwOiB0cmFuc2l0aW9uLmpzIHYzLjMuN1xyXG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyN0cmFuc2l0aW9uc1xyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuXHJcbitmdW5jdGlvbiAoJCkge1xyXG4gICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgLy8gQ1NTIFRSQU5TSVRJT04gU1VQUE9SVCAoU2hvdXRvdXQ6IGh0dHA6Ly93d3cubW9kZXJuaXpyLmNvbS8pXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIGZ1bmN0aW9uIHRyYW5zaXRpb25FbmQoKSB7XHJcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib290c3RyYXAnKVxyXG5cclxuICAgIHZhciB0cmFuc0VuZEV2ZW50TmFtZXMgPSB7XHJcbiAgICAgIFdlYmtpdFRyYW5zaXRpb24gOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsXHJcbiAgICAgIE1velRyYW5zaXRpb24gICAgOiAndHJhbnNpdGlvbmVuZCcsXHJcbiAgICAgIE9UcmFuc2l0aW9uICAgICAgOiAnb1RyYW5zaXRpb25FbmQgb3RyYW5zaXRpb25lbmQnLFxyXG4gICAgICB0cmFuc2l0aW9uICAgICAgIDogJ3RyYW5zaXRpb25lbmQnXHJcbiAgICB9XHJcblxyXG4gICAgZm9yICh2YXIgbmFtZSBpbiB0cmFuc0VuZEV2ZW50TmFtZXMpIHtcclxuICAgICAgaWYgKGVsLnN0eWxlW25hbWVdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4geyBlbmQ6IHRyYW5zRW5kRXZlbnROYW1lc1tuYW1lXSB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2UgLy8gZXhwbGljaXQgZm9yIGllOCAoICAuXy4pXHJcbiAgfVxyXG5cclxuICAvLyBodHRwOi8vYmxvZy5hbGV4bWFjY2F3LmNvbS9jc3MtdHJhbnNpdGlvbnNcclxuICAkLmZuLmVtdWxhdGVUcmFuc2l0aW9uRW5kID0gZnVuY3Rpb24gKGR1cmF0aW9uKSB7XHJcbiAgICB2YXIgY2FsbGVkID0gZmFsc2VcclxuICAgIHZhciAkZWwgPSB0aGlzXHJcbiAgICAkKHRoaXMpLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgZnVuY3Rpb24gKCkgeyBjYWxsZWQgPSB0cnVlIH0pXHJcbiAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7IGlmICghY2FsbGVkKSAkKCRlbCkudHJpZ2dlcigkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQpIH1cclxuICAgIHNldFRpbWVvdXQoY2FsbGJhY2ssIGR1cmF0aW9uKVxyXG4gICAgcmV0dXJuIHRoaXNcclxuICB9XHJcblxyXG4gICQoZnVuY3Rpb24gKCkge1xyXG4gICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uRW5kKClcclxuXHJcbiAgICBpZiAoISQuc3VwcG9ydC50cmFuc2l0aW9uKSByZXR1cm5cclxuXHJcbiAgICAkLmV2ZW50LnNwZWNpYWwuYnNUcmFuc2l0aW9uRW5kID0ge1xyXG4gICAgICBiaW5kVHlwZTogJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLFxyXG4gICAgICBkZWxlZ2F0ZVR5cGU6ICQuc3VwcG9ydC50cmFuc2l0aW9uLmVuZCxcclxuICAgICAgaGFuZGxlOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGlmICgkKGUudGFyZ2V0KS5pcyh0aGlzKSkgcmV0dXJuIGUuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbn0oalF1ZXJ5KTtcclxuXHJcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBCb290c3RyYXA6IGFsZXJ0LmpzIHYzLjMuN1xyXG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNhbGVydHNcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIENvcHlyaWdodCAyMDExLTIwMTYgVHdpdHRlciwgSW5jLlxyXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcblxyXG4rZnVuY3Rpb24gKCQpIHtcclxuICAndXNlIHN0cmljdCc7XHJcblxyXG4gIC8vIEFMRVJUIENMQVNTIERFRklOSVRJT05cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIHZhciBkaXNtaXNzID0gJ1tkYXRhLWRpc21pc3M9XCJhbGVydFwiXSdcclxuICB2YXIgQWxlcnQgICA9IGZ1bmN0aW9uIChlbCkge1xyXG4gICAgJChlbCkub24oJ2NsaWNrJywgZGlzbWlzcywgdGhpcy5jbG9zZSlcclxuICB9XHJcblxyXG4gIEFsZXJ0LlZFUlNJT04gPSAnMy4zLjcnXHJcblxyXG4gIEFsZXJ0LlRSQU5TSVRJT05fRFVSQVRJT04gPSAxNTBcclxuXHJcbiAgQWxlcnQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24gKGUpIHtcclxuICAgIHZhciAkdGhpcyAgICA9ICQodGhpcylcclxuICAgIHZhciBzZWxlY3RvciA9ICR0aGlzLmF0dHIoJ2RhdGEtdGFyZ2V0JylcclxuXHJcbiAgICBpZiAoIXNlbGVjdG9yKSB7XHJcbiAgICAgIHNlbGVjdG9yID0gJHRoaXMuYXR0cignaHJlZicpXHJcbiAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IgJiYgc2VsZWN0b3IucmVwbGFjZSgvLiooPz0jW15cXHNdKiQpLywgJycpIC8vIHN0cmlwIGZvciBpZTdcclxuICAgIH1cclxuXHJcbiAgICB2YXIgJHBhcmVudCA9ICQoc2VsZWN0b3IgPT09ICcjJyA/IFtdIDogc2VsZWN0b3IpXHJcblxyXG4gICAgaWYgKGUpIGUucHJldmVudERlZmF1bHQoKVxyXG5cclxuICAgIGlmICghJHBhcmVudC5sZW5ndGgpIHtcclxuICAgICAgJHBhcmVudCA9ICR0aGlzLmNsb3Nlc3QoJy5hbGVydCcpXHJcbiAgICB9XHJcblxyXG4gICAgJHBhcmVudC50cmlnZ2VyKGUgPSAkLkV2ZW50KCdjbG9zZS5icy5hbGVydCcpKVxyXG5cclxuICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cclxuXHJcbiAgICAkcGFyZW50LnJlbW92ZUNsYXNzKCdpbicpXHJcblxyXG4gICAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudCgpIHtcclxuICAgICAgLy8gZGV0YWNoIGZyb20gcGFyZW50LCBmaXJlIGV2ZW50IHRoZW4gY2xlYW4gdXAgZGF0YVxyXG4gICAgICAkcGFyZW50LmRldGFjaCgpLnRyaWdnZXIoJ2Nsb3NlZC5icy5hbGVydCcpLnJlbW92ZSgpXHJcbiAgICB9XHJcblxyXG4gICAgJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgJHBhcmVudC5oYXNDbGFzcygnZmFkZScpID9cclxuICAgICAgJHBhcmVudFxyXG4gICAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsIHJlbW92ZUVsZW1lbnQpXHJcbiAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKEFsZXJ0LlRSQU5TSVRJT05fRFVSQVRJT04pIDpcclxuICAgICAgcmVtb3ZlRWxlbWVudCgpXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gQUxFUlQgUExVR0lOIERFRklOSVRJT05cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aGlzID0gJCh0aGlzKVxyXG4gICAgICB2YXIgZGF0YSAgPSAkdGhpcy5kYXRhKCdicy5hbGVydCcpXHJcblxyXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLmFsZXJ0JywgKGRhdGEgPSBuZXcgQWxlcnQodGhpcykpKVxyXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dLmNhbGwoJHRoaXMpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdmFyIG9sZCA9ICQuZm4uYWxlcnRcclxuXHJcbiAgJC5mbi5hbGVydCAgICAgICAgICAgICA9IFBsdWdpblxyXG4gICQuZm4uYWxlcnQuQ29uc3RydWN0b3IgPSBBbGVydFxyXG5cclxuXHJcbiAgLy8gQUxFUlQgTk8gQ09ORkxJQ1RcclxuICAvLyA9PT09PT09PT09PT09PT09PVxyXG5cclxuICAkLmZuLmFsZXJ0Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAkLmZuLmFsZXJ0ID0gb2xkXHJcbiAgICByZXR1cm4gdGhpc1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIEFMRVJUIERBVEEtQVBJXHJcbiAgLy8gPT09PT09PT09PT09PT1cclxuXHJcbiAgJChkb2N1bWVudCkub24oJ2NsaWNrLmJzLmFsZXJ0LmRhdGEtYXBpJywgZGlzbWlzcywgQWxlcnQucHJvdG90eXBlLmNsb3NlKVxyXG5cclxufShqUXVlcnkpO1xyXG5cclxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIEJvb3RzdHJhcDogYnV0dG9uLmpzIHYzLjMuN1xyXG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNidXR0b25zXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cclxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG5cclxuK2Z1bmN0aW9uICgkKSB7XHJcbiAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAvLyBCVVRUT04gUFVCTElDIENMQVNTIERFRklOSVRJT05cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgdmFyIEJ1dHRvbiA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICB0aGlzLiRlbGVtZW50ICA9ICQoZWxlbWVudClcclxuICAgIHRoaXMub3B0aW9ucyAgID0gJC5leHRlbmQoe30sIEJ1dHRvbi5ERUZBVUxUUywgb3B0aW9ucylcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcclxuICB9XHJcblxyXG4gIEJ1dHRvbi5WRVJTSU9OICA9ICczLjMuNydcclxuXHJcbiAgQnV0dG9uLkRFRkFVTFRTID0ge1xyXG4gICAgbG9hZGluZ1RleHQ6ICdsb2FkaW5nLi4uJ1xyXG4gIH1cclxuXHJcbiAgQnV0dG9uLnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xyXG4gICAgdmFyIGQgICAgPSAnZGlzYWJsZWQnXHJcbiAgICB2YXIgJGVsICA9IHRoaXMuJGVsZW1lbnRcclxuICAgIHZhciB2YWwgID0gJGVsLmlzKCdpbnB1dCcpID8gJ3ZhbCcgOiAnaHRtbCdcclxuICAgIHZhciBkYXRhID0gJGVsLmRhdGEoKVxyXG5cclxuICAgIHN0YXRlICs9ICdUZXh0J1xyXG5cclxuICAgIGlmIChkYXRhLnJlc2V0VGV4dCA9PSBudWxsKSAkZWwuZGF0YSgncmVzZXRUZXh0JywgJGVsW3ZhbF0oKSlcclxuXHJcbiAgICAvLyBwdXNoIHRvIGV2ZW50IGxvb3AgdG8gYWxsb3cgZm9ybXMgdG8gc3VibWl0XHJcbiAgICBzZXRUaW1lb3V0KCQucHJveHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAkZWxbdmFsXShkYXRhW3N0YXRlXSA9PSBudWxsID8gdGhpcy5vcHRpb25zW3N0YXRlXSA6IGRhdGFbc3RhdGVdKVxyXG5cclxuICAgICAgaWYgKHN0YXRlID09ICdsb2FkaW5nVGV4dCcpIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWVcclxuICAgICAgICAkZWwuYWRkQ2xhc3MoZCkuYXR0cihkLCBkKS5wcm9wKGQsIHRydWUpXHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0xvYWRpbmcpIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXHJcbiAgICAgICAgJGVsLnJlbW92ZUNsYXNzKGQpLnJlbW92ZUF0dHIoZCkucHJvcChkLCBmYWxzZSlcclxuICAgICAgfVxyXG4gICAgfSwgdGhpcyksIDApXHJcbiAgfVxyXG5cclxuICBCdXR0b24ucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBjaGFuZ2VkID0gdHJ1ZVxyXG4gICAgdmFyICRwYXJlbnQgPSB0aGlzLiRlbGVtZW50LmNsb3Nlc3QoJ1tkYXRhLXRvZ2dsZT1cImJ1dHRvbnNcIl0nKVxyXG5cclxuICAgIGlmICgkcGFyZW50Lmxlbmd0aCkge1xyXG4gICAgICB2YXIgJGlucHV0ID0gdGhpcy4kZWxlbWVudC5maW5kKCdpbnB1dCcpXHJcbiAgICAgIGlmICgkaW5wdXQucHJvcCgndHlwZScpID09ICdyYWRpbycpIHtcclxuICAgICAgICBpZiAoJGlucHV0LnByb3AoJ2NoZWNrZWQnKSkgY2hhbmdlZCA9IGZhbHNlXHJcbiAgICAgICAgJHBhcmVudC5maW5kKCcuYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5hZGRDbGFzcygnYWN0aXZlJylcclxuICAgICAgfSBlbHNlIGlmICgkaW5wdXQucHJvcCgndHlwZScpID09ICdjaGVja2JveCcpIHtcclxuICAgICAgICBpZiAoKCRpbnB1dC5wcm9wKCdjaGVja2VkJykpICE9PSB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdhY3RpdmUnKSkgY2hhbmdlZCA9IGZhbHNlXHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC50b2dnbGVDbGFzcygnYWN0aXZlJylcclxuICAgICAgfVxyXG4gICAgICAkaW5wdXQucHJvcCgnY2hlY2tlZCcsIHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2FjdGl2ZScpKVxyXG4gICAgICBpZiAoY2hhbmdlZCkgJGlucHV0LnRyaWdnZXIoJ2NoYW5nZScpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLiRlbGVtZW50LmF0dHIoJ2FyaWEtcHJlc3NlZCcsICF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdhY3RpdmUnKSlcclxuICAgICAgdGhpcy4kZWxlbWVudC50b2dnbGVDbGFzcygnYWN0aXZlJylcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvLyBCVVRUT04gUExVR0lOIERFRklOSVRJT05cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgZnVuY3Rpb24gUGx1Z2luKG9wdGlvbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyAgID0gJCh0aGlzKVxyXG4gICAgICB2YXIgZGF0YSAgICA9ICR0aGlzLmRhdGEoJ2JzLmJ1dHRvbicpXHJcbiAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb25cclxuXHJcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMuYnV0dG9uJywgKGRhdGEgPSBuZXcgQnV0dG9uKHRoaXMsIG9wdGlvbnMpKSlcclxuXHJcbiAgICAgIGlmIChvcHRpb24gPT0gJ3RvZ2dsZScpIGRhdGEudG9nZ2xlKClcclxuICAgICAgZWxzZSBpZiAob3B0aW9uKSBkYXRhLnNldFN0YXRlKG9wdGlvbilcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB2YXIgb2xkID0gJC5mbi5idXR0b25cclxuXHJcbiAgJC5mbi5idXR0b24gICAgICAgICAgICAgPSBQbHVnaW5cclxuICAkLmZuLmJ1dHRvbi5Db25zdHJ1Y3RvciA9IEJ1dHRvblxyXG5cclxuXHJcbiAgLy8gQlVUVE9OIE5PIENPTkZMSUNUXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09XHJcblxyXG4gICQuZm4uYnV0dG9uLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAkLmZuLmJ1dHRvbiA9IG9sZFxyXG4gICAgcmV0dXJuIHRoaXNcclxuICB9XHJcblxyXG5cclxuICAvLyBCVVRUT04gREFUQS1BUElcclxuICAvLyA9PT09PT09PT09PT09PT1cclxuXHJcbiAgJChkb2N1bWVudClcclxuICAgIC5vbignY2xpY2suYnMuYnV0dG9uLmRhdGEtYXBpJywgJ1tkYXRhLXRvZ2dsZV49XCJidXR0b25cIl0nLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICB2YXIgJGJ0biA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJy5idG4nKVxyXG4gICAgICBQbHVnaW4uY2FsbCgkYnRuLCAndG9nZ2xlJylcclxuICAgICAgaWYgKCEoJChlLnRhcmdldCkuaXMoJ2lucHV0W3R5cGU9XCJyYWRpb1wiXSwgaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdJykpKSB7XHJcbiAgICAgICAgLy8gUHJldmVudCBkb3VibGUgY2xpY2sgb24gcmFkaW9zLCBhbmQgdGhlIGRvdWJsZSBzZWxlY3Rpb25zIChzbyBjYW5jZWxsYXRpb24pIG9uIGNoZWNrYm94ZXNcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAvLyBUaGUgdGFyZ2V0IGNvbXBvbmVudCBzdGlsbCByZWNlaXZlIHRoZSBmb2N1c1xyXG4gICAgICAgIGlmICgkYnRuLmlzKCdpbnB1dCxidXR0b24nKSkgJGJ0bi50cmlnZ2VyKCdmb2N1cycpXHJcbiAgICAgICAgZWxzZSAkYnRuLmZpbmQoJ2lucHV0OnZpc2libGUsYnV0dG9uOnZpc2libGUnKS5maXJzdCgpLnRyaWdnZXIoJ2ZvY3VzJylcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIC5vbignZm9jdXMuYnMuYnV0dG9uLmRhdGEtYXBpIGJsdXIuYnMuYnV0dG9uLmRhdGEtYXBpJywgJ1tkYXRhLXRvZ2dsZV49XCJidXR0b25cIl0nLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAkKGUudGFyZ2V0KS5jbG9zZXN0KCcuYnRuJykudG9nZ2xlQ2xhc3MoJ2ZvY3VzJywgL15mb2N1cyhpbik/JC8udGVzdChlLnR5cGUpKVxyXG4gICAgfSlcclxuXHJcbn0oalF1ZXJ5KTtcclxuXHJcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBCb290c3RyYXA6IGNhcm91c2VsLmpzIHYzLjMuN1xyXG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNjYXJvdXNlbFxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuXHJcbitmdW5jdGlvbiAoJCkge1xyXG4gICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgLy8gQ0FST1VTRUwgQ0xBU1MgREVGSU5JVElPTlxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgdmFyIENhcm91c2VsID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGVsZW1lbnQgICAgPSAkKGVsZW1lbnQpXHJcbiAgICB0aGlzLiRpbmRpY2F0b3JzID0gdGhpcy4kZWxlbWVudC5maW5kKCcuY2Fyb3VzZWwtaW5kaWNhdG9ycycpXHJcbiAgICB0aGlzLm9wdGlvbnMgICAgID0gb3B0aW9uc1xyXG4gICAgdGhpcy5wYXVzZWQgICAgICA9IG51bGxcclxuICAgIHRoaXMuc2xpZGluZyAgICAgPSBudWxsXHJcbiAgICB0aGlzLmludGVydmFsICAgID0gbnVsbFxyXG4gICAgdGhpcy4kYWN0aXZlICAgICA9IG51bGxcclxuICAgIHRoaXMuJGl0ZW1zICAgICAgPSBudWxsXHJcblxyXG4gICAgdGhpcy5vcHRpb25zLmtleWJvYXJkICYmIHRoaXMuJGVsZW1lbnQub24oJ2tleWRvd24uYnMuY2Fyb3VzZWwnLCAkLnByb3h5KHRoaXMua2V5ZG93biwgdGhpcykpXHJcblxyXG4gICAgdGhpcy5vcHRpb25zLnBhdXNlID09ICdob3ZlcicgJiYgISgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpICYmIHRoaXMuJGVsZW1lbnRcclxuICAgICAgLm9uKCdtb3VzZWVudGVyLmJzLmNhcm91c2VsJywgJC5wcm94eSh0aGlzLnBhdXNlLCB0aGlzKSlcclxuICAgICAgLm9uKCdtb3VzZWxlYXZlLmJzLmNhcm91c2VsJywgJC5wcm94eSh0aGlzLmN5Y2xlLCB0aGlzKSlcclxuICB9XHJcblxyXG4gIENhcm91c2VsLlZFUlNJT04gID0gJzMuMy43J1xyXG5cclxuICBDYXJvdXNlbC5UUkFOU0lUSU9OX0RVUkFUSU9OID0gNjAwXHJcblxyXG4gIENhcm91c2VsLkRFRkFVTFRTID0ge1xyXG4gICAgaW50ZXJ2YWw6IDUwMDAsXHJcbiAgICBwYXVzZTogJ2hvdmVyJyxcclxuICAgIHdyYXA6IHRydWUsXHJcbiAgICBrZXlib2FyZDogdHJ1ZVxyXG4gIH1cclxuXHJcbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmtleWRvd24gPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgaWYgKC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZS50YXJnZXQudGFnTmFtZSkpIHJldHVyblxyXG4gICAgc3dpdGNoIChlLndoaWNoKSB7XHJcbiAgICAgIGNhc2UgMzc6IHRoaXMucHJldigpOyBicmVha1xyXG4gICAgICBjYXNlIDM5OiB0aGlzLm5leHQoKTsgYnJlYWtcclxuICAgICAgZGVmYXVsdDogcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgfVxyXG5cclxuICBDYXJvdXNlbC5wcm90b3R5cGUuY3ljbGUgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgZSB8fCAodGhpcy5wYXVzZWQgPSBmYWxzZSlcclxuXHJcbiAgICB0aGlzLmludGVydmFsICYmIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbClcclxuXHJcbiAgICB0aGlzLm9wdGlvbnMuaW50ZXJ2YWxcclxuICAgICAgJiYgIXRoaXMucGF1c2VkXHJcbiAgICAgICYmICh0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoJC5wcm94eSh0aGlzLm5leHQsIHRoaXMpLCB0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpKVxyXG5cclxuICAgIHJldHVybiB0aGlzXHJcbiAgfVxyXG5cclxuICBDYXJvdXNlbC5wcm90b3R5cGUuZ2V0SXRlbUluZGV4ID0gZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgIHRoaXMuJGl0ZW1zID0gaXRlbS5wYXJlbnQoKS5jaGlsZHJlbignLml0ZW0nKVxyXG4gICAgcmV0dXJuIHRoaXMuJGl0ZW1zLmluZGV4KGl0ZW0gfHwgdGhpcy4kYWN0aXZlKVxyXG4gIH1cclxuXHJcbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmdldEl0ZW1Gb3JEaXJlY3Rpb24gPSBmdW5jdGlvbiAoZGlyZWN0aW9uLCBhY3RpdmUpIHtcclxuICAgIHZhciBhY3RpdmVJbmRleCA9IHRoaXMuZ2V0SXRlbUluZGV4KGFjdGl2ZSlcclxuICAgIHZhciB3aWxsV3JhcCA9IChkaXJlY3Rpb24gPT0gJ3ByZXYnICYmIGFjdGl2ZUluZGV4ID09PSAwKVxyXG4gICAgICAgICAgICAgICAgfHwgKGRpcmVjdGlvbiA9PSAnbmV4dCcgJiYgYWN0aXZlSW5kZXggPT0gKHRoaXMuJGl0ZW1zLmxlbmd0aCAtIDEpKVxyXG4gICAgaWYgKHdpbGxXcmFwICYmICF0aGlzLm9wdGlvbnMud3JhcCkgcmV0dXJuIGFjdGl2ZVxyXG4gICAgdmFyIGRlbHRhID0gZGlyZWN0aW9uID09ICdwcmV2JyA/IC0xIDogMVxyXG4gICAgdmFyIGl0ZW1JbmRleCA9IChhY3RpdmVJbmRleCArIGRlbHRhKSAlIHRoaXMuJGl0ZW1zLmxlbmd0aFxyXG4gICAgcmV0dXJuIHRoaXMuJGl0ZW1zLmVxKGl0ZW1JbmRleClcclxuICB9XHJcblxyXG4gIENhcm91c2VsLnByb3RvdHlwZS50byA9IGZ1bmN0aW9uIChwb3MpIHtcclxuICAgIHZhciB0aGF0ICAgICAgICA9IHRoaXNcclxuICAgIHZhciBhY3RpdmVJbmRleCA9IHRoaXMuZ2V0SXRlbUluZGV4KHRoaXMuJGFjdGl2ZSA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLml0ZW0uYWN0aXZlJykpXHJcblxyXG4gICAgaWYgKHBvcyA+ICh0aGlzLiRpdGVtcy5sZW5ndGggLSAxKSB8fCBwb3MgPCAwKSByZXR1cm5cclxuXHJcbiAgICBpZiAodGhpcy5zbGlkaW5nKSAgICAgICByZXR1cm4gdGhpcy4kZWxlbWVudC5vbmUoJ3NsaWQuYnMuY2Fyb3VzZWwnLCBmdW5jdGlvbiAoKSB7IHRoYXQudG8ocG9zKSB9KSAvLyB5ZXMsIFwic2xpZFwiXHJcbiAgICBpZiAoYWN0aXZlSW5kZXggPT0gcG9zKSByZXR1cm4gdGhpcy5wYXVzZSgpLmN5Y2xlKClcclxuXHJcbiAgICByZXR1cm4gdGhpcy5zbGlkZShwb3MgPiBhY3RpdmVJbmRleCA/ICduZXh0JyA6ICdwcmV2JywgdGhpcy4kaXRlbXMuZXEocG9zKSlcclxuICB9XHJcblxyXG4gIENhcm91c2VsLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uIChlKSB7XHJcbiAgICBlIHx8ICh0aGlzLnBhdXNlZCA9IHRydWUpXHJcblxyXG4gICAgaWYgKHRoaXMuJGVsZW1lbnQuZmluZCgnLm5leHQsIC5wcmV2JykubGVuZ3RoICYmICQuc3VwcG9ydC50cmFuc2l0aW9uKSB7XHJcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcigkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQpXHJcbiAgICAgIHRoaXMuY3ljbGUodHJ1ZSlcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmludGVydmFsID0gY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKVxyXG5cclxuICAgIHJldHVybiB0aGlzXHJcbiAgfVxyXG5cclxuICBDYXJvdXNlbC5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICh0aGlzLnNsaWRpbmcpIHJldHVyblxyXG4gICAgcmV0dXJuIHRoaXMuc2xpZGUoJ25leHQnKVxyXG4gIH1cclxuXHJcbiAgQ2Fyb3VzZWwucHJvdG90eXBlLnByZXYgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodGhpcy5zbGlkaW5nKSByZXR1cm5cclxuICAgIHJldHVybiB0aGlzLnNsaWRlKCdwcmV2JylcclxuICB9XHJcblxyXG4gIENhcm91c2VsLnByb3RvdHlwZS5zbGlkZSA9IGZ1bmN0aW9uICh0eXBlLCBuZXh0KSB7XHJcbiAgICB2YXIgJGFjdGl2ZSAgID0gdGhpcy4kZWxlbWVudC5maW5kKCcuaXRlbS5hY3RpdmUnKVxyXG4gICAgdmFyICRuZXh0ICAgICA9IG5leHQgfHwgdGhpcy5nZXRJdGVtRm9yRGlyZWN0aW9uKHR5cGUsICRhY3RpdmUpXHJcbiAgICB2YXIgaXNDeWNsaW5nID0gdGhpcy5pbnRlcnZhbFxyXG4gICAgdmFyIGRpcmVjdGlvbiA9IHR5cGUgPT0gJ25leHQnID8gJ2xlZnQnIDogJ3JpZ2h0J1xyXG4gICAgdmFyIHRoYXQgICAgICA9IHRoaXNcclxuXHJcbiAgICBpZiAoJG5leHQuaGFzQ2xhc3MoJ2FjdGl2ZScpKSByZXR1cm4gKHRoaXMuc2xpZGluZyA9IGZhbHNlKVxyXG5cclxuICAgIHZhciByZWxhdGVkVGFyZ2V0ID0gJG5leHRbMF1cclxuICAgIHZhciBzbGlkZUV2ZW50ID0gJC5FdmVudCgnc2xpZGUuYnMuY2Fyb3VzZWwnLCB7XHJcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRUYXJnZXQsXHJcbiAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXHJcbiAgICB9KVxyXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKHNsaWRlRXZlbnQpXHJcbiAgICBpZiAoc2xpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXHJcblxyXG4gICAgdGhpcy5zbGlkaW5nID0gdHJ1ZVxyXG5cclxuICAgIGlzQ3ljbGluZyAmJiB0aGlzLnBhdXNlKClcclxuXHJcbiAgICBpZiAodGhpcy4kaW5kaWNhdG9ycy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy4kaW5kaWNhdG9ycy5maW5kKCcuYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpXHJcbiAgICAgIHZhciAkbmV4dEluZGljYXRvciA9ICQodGhpcy4kaW5kaWNhdG9ycy5jaGlsZHJlbigpW3RoaXMuZ2V0SXRlbUluZGV4KCRuZXh0KV0pXHJcbiAgICAgICRuZXh0SW5kaWNhdG9yICYmICRuZXh0SW5kaWNhdG9yLmFkZENsYXNzKCdhY3RpdmUnKVxyXG4gICAgfVxyXG5cclxuICAgIHZhciBzbGlkRXZlbnQgPSAkLkV2ZW50KCdzbGlkLmJzLmNhcm91c2VsJywgeyByZWxhdGVkVGFyZ2V0OiByZWxhdGVkVGFyZ2V0LCBkaXJlY3Rpb246IGRpcmVjdGlvbiB9KSAvLyB5ZXMsIFwic2xpZFwiXHJcbiAgICBpZiAoJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnc2xpZGUnKSkge1xyXG4gICAgICAkbmV4dC5hZGRDbGFzcyh0eXBlKVxyXG4gICAgICAkbmV4dFswXS5vZmZzZXRXaWR0aCAvLyBmb3JjZSByZWZsb3dcclxuICAgICAgJGFjdGl2ZS5hZGRDbGFzcyhkaXJlY3Rpb24pXHJcbiAgICAgICRuZXh0LmFkZENsYXNzKGRpcmVjdGlvbilcclxuICAgICAgJGFjdGl2ZVxyXG4gICAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICRuZXh0LnJlbW92ZUNsYXNzKFt0eXBlLCBkaXJlY3Rpb25dLmpvaW4oJyAnKSkuYWRkQ2xhc3MoJ2FjdGl2ZScpXHJcbiAgICAgICAgICAkYWN0aXZlLnJlbW92ZUNsYXNzKFsnYWN0aXZlJywgZGlyZWN0aW9uXS5qb2luKCcgJykpXHJcbiAgICAgICAgICB0aGF0LnNsaWRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHRoYXQuJGVsZW1lbnQudHJpZ2dlcihzbGlkRXZlbnQpXHJcbiAgICAgICAgICB9LCAwKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKENhcm91c2VsLlRSQU5TSVRJT05fRFVSQVRJT04pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAkYWN0aXZlLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxyXG4gICAgICAkbmV4dC5hZGRDbGFzcygnYWN0aXZlJylcclxuICAgICAgdGhpcy5zbGlkaW5nID0gZmFsc2VcclxuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKHNsaWRFdmVudClcclxuICAgIH1cclxuXHJcbiAgICBpc0N5Y2xpbmcgJiYgdGhpcy5jeWNsZSgpXHJcblxyXG4gICAgcmV0dXJuIHRoaXNcclxuICB9XHJcblxyXG5cclxuICAvLyBDQVJPVVNFTCBQTFVHSU4gREVGSU5JVElPTlxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIGZ1bmN0aW9uIFBsdWdpbihvcHRpb24pIHtcclxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcclxuICAgICAgdmFyIGRhdGEgICAgPSAkdGhpcy5kYXRhKCdicy5jYXJvdXNlbCcpXHJcbiAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIENhcm91c2VsLkRFRkFVTFRTLCAkdGhpcy5kYXRhKCksIHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uKVxyXG4gICAgICB2YXIgYWN0aW9uICA9IHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycgPyBvcHRpb24gOiBvcHRpb25zLnNsaWRlXHJcblxyXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLmNhcm91c2VsJywgKGRhdGEgPSBuZXcgQ2Fyb3VzZWwodGhpcywgb3B0aW9ucykpKVxyXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnbnVtYmVyJykgZGF0YS50byhvcHRpb24pXHJcbiAgICAgIGVsc2UgaWYgKGFjdGlvbikgZGF0YVthY3Rpb25dKClcclxuICAgICAgZWxzZSBpZiAob3B0aW9ucy5pbnRlcnZhbCkgZGF0YS5wYXVzZSgpLmN5Y2xlKClcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB2YXIgb2xkID0gJC5mbi5jYXJvdXNlbFxyXG5cclxuICAkLmZuLmNhcm91c2VsICAgICAgICAgICAgID0gUGx1Z2luXHJcbiAgJC5mbi5jYXJvdXNlbC5Db25zdHJ1Y3RvciA9IENhcm91c2VsXHJcblxyXG5cclxuICAvLyBDQVJPVVNFTCBOTyBDT05GTElDVFxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gICQuZm4uY2Fyb3VzZWwubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICQuZm4uY2Fyb3VzZWwgPSBvbGRcclxuICAgIHJldHVybiB0aGlzXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gQ0FST1VTRUwgREFUQS1BUElcclxuICAvLyA9PT09PT09PT09PT09PT09PVxyXG5cclxuICB2YXIgY2xpY2tIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcclxuICAgIHZhciBocmVmXHJcbiAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcclxuICAgIHZhciAkdGFyZ2V0ID0gJCgkdGhpcy5hdHRyKCdkYXRhLXRhcmdldCcpIHx8IChocmVmID0gJHRoaXMuYXR0cignaHJlZicpKSAmJiBocmVmLnJlcGxhY2UoLy4qKD89I1teXFxzXSskKS8sICcnKSkgLy8gc3RyaXAgZm9yIGllN1xyXG4gICAgaWYgKCEkdGFyZ2V0Lmhhc0NsYXNzKCdjYXJvdXNlbCcpKSByZXR1cm5cclxuICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sICR0YXJnZXQuZGF0YSgpLCAkdGhpcy5kYXRhKCkpXHJcbiAgICB2YXIgc2xpZGVJbmRleCA9ICR0aGlzLmF0dHIoJ2RhdGEtc2xpZGUtdG8nKVxyXG4gICAgaWYgKHNsaWRlSW5kZXgpIG9wdGlvbnMuaW50ZXJ2YWwgPSBmYWxzZVxyXG5cclxuICAgIFBsdWdpbi5jYWxsKCR0YXJnZXQsIG9wdGlvbnMpXHJcblxyXG4gICAgaWYgKHNsaWRlSW5kZXgpIHtcclxuICAgICAgJHRhcmdldC5kYXRhKCdicy5jYXJvdXNlbCcpLnRvKHNsaWRlSW5kZXgpXHJcbiAgICB9XHJcblxyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgfVxyXG5cclxuICAkKGRvY3VtZW50KVxyXG4gICAgLm9uKCdjbGljay5icy5jYXJvdXNlbC5kYXRhLWFwaScsICdbZGF0YS1zbGlkZV0nLCBjbGlja0hhbmRsZXIpXHJcbiAgICAub24oJ2NsaWNrLmJzLmNhcm91c2VsLmRhdGEtYXBpJywgJ1tkYXRhLXNsaWRlLXRvXScsIGNsaWNrSGFuZGxlcilcclxuXHJcbiAgJCh3aW5kb3cpLm9uKCdsb2FkJywgZnVuY3Rpb24gKCkge1xyXG4gICAgJCgnW2RhdGEtcmlkZT1cImNhcm91c2VsXCJdJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkY2Fyb3VzZWwgPSAkKHRoaXMpXHJcbiAgICAgIFBsdWdpbi5jYWxsKCRjYXJvdXNlbCwgJGNhcm91c2VsLmRhdGEoKSlcclxuICAgIH0pXHJcbiAgfSlcclxuXHJcbn0oalF1ZXJ5KTtcclxuXHJcbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBCb290c3RyYXA6IGNvbGxhcHNlLmpzIHYzLjMuN1xyXG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNjb2xsYXBzZVxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuLyoganNoaW50IGxhdGVkZWY6IGZhbHNlICovXHJcblxyXG4rZnVuY3Rpb24gKCQpIHtcclxuICAndXNlIHN0cmljdCc7XHJcblxyXG4gIC8vIENPTExBUFNFIFBVQkxJQyBDTEFTUyBERUZJTklUSU9OXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgdmFyIENvbGxhcHNlID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMuJGVsZW1lbnQgICAgICA9ICQoZWxlbWVudClcclxuICAgIHRoaXMub3B0aW9ucyAgICAgICA9ICQuZXh0ZW5kKHt9LCBDb2xsYXBzZS5ERUZBVUxUUywgb3B0aW9ucylcclxuICAgIHRoaXMuJHRyaWdnZXIgICAgICA9ICQoJ1tkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCJdW2hyZWY9XCIjJyArIGVsZW1lbnQuaWQgKyAnXCJdLCcgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl1bZGF0YS10YXJnZXQ9XCIjJyArIGVsZW1lbnQuaWQgKyAnXCJdJylcclxuICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IG51bGxcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLnBhcmVudCkge1xyXG4gICAgICB0aGlzLiRwYXJlbnQgPSB0aGlzLmdldFBhcmVudCgpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLiRlbGVtZW50LCB0aGlzLiR0cmlnZ2VyKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMudG9nZ2xlKSB0aGlzLnRvZ2dsZSgpXHJcbiAgfVxyXG5cclxuICBDb2xsYXBzZS5WRVJTSU9OICA9ICczLjMuNydcclxuXHJcbiAgQ29sbGFwc2UuVFJBTlNJVElPTl9EVVJBVElPTiA9IDM1MFxyXG5cclxuICBDb2xsYXBzZS5ERUZBVUxUUyA9IHtcclxuICAgIHRvZ2dsZTogdHJ1ZVxyXG4gIH1cclxuXHJcbiAgQ29sbGFwc2UucHJvdG90eXBlLmRpbWVuc2lvbiA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBoYXNXaWR0aCA9IHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ3dpZHRoJylcclxuICAgIHJldHVybiBoYXNXaWR0aCA/ICd3aWR0aCcgOiAnaGVpZ2h0J1xyXG4gIH1cclxuXHJcbiAgQ29sbGFwc2UucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodGhpcy50cmFuc2l0aW9uaW5nIHx8IHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2luJykpIHJldHVyblxyXG5cclxuICAgIHZhciBhY3RpdmVzRGF0YVxyXG4gICAgdmFyIGFjdGl2ZXMgPSB0aGlzLiRwYXJlbnQgJiYgdGhpcy4kcGFyZW50LmNoaWxkcmVuKCcucGFuZWwnKS5jaGlsZHJlbignLmluLCAuY29sbGFwc2luZycpXHJcblxyXG4gICAgaWYgKGFjdGl2ZXMgJiYgYWN0aXZlcy5sZW5ndGgpIHtcclxuICAgICAgYWN0aXZlc0RhdGEgPSBhY3RpdmVzLmRhdGEoJ2JzLmNvbGxhcHNlJylcclxuICAgICAgaWYgKGFjdGl2ZXNEYXRhICYmIGFjdGl2ZXNEYXRhLnRyYW5zaXRpb25pbmcpIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIHZhciBzdGFydEV2ZW50ID0gJC5FdmVudCgnc2hvdy5icy5jb2xsYXBzZScpXHJcbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoc3RhcnRFdmVudClcclxuICAgIGlmIChzdGFydEV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cclxuXHJcbiAgICBpZiAoYWN0aXZlcyAmJiBhY3RpdmVzLmxlbmd0aCkge1xyXG4gICAgICBQbHVnaW4uY2FsbChhY3RpdmVzLCAnaGlkZScpXHJcbiAgICAgIGFjdGl2ZXNEYXRhIHx8IGFjdGl2ZXMuZGF0YSgnYnMuY29sbGFwc2UnLCBudWxsKVxyXG4gICAgfVxyXG5cclxuICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLmRpbWVuc2lvbigpXHJcblxyXG4gICAgdGhpcy4kZWxlbWVudFxyXG4gICAgICAucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlJylcclxuICAgICAgLmFkZENsYXNzKCdjb2xsYXBzaW5nJylbZGltZW5zaW9uXSgwKVxyXG4gICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsIHRydWUpXHJcblxyXG4gICAgdGhpcy4kdHJpZ2dlclxyXG4gICAgICAucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlZCcpXHJcbiAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSlcclxuXHJcbiAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSAxXHJcblxyXG4gICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzLiRlbGVtZW50XHJcbiAgICAgICAgLnJlbW92ZUNsYXNzKCdjb2xsYXBzaW5nJylcclxuICAgICAgICAuYWRkQ2xhc3MoJ2NvbGxhcHNlIGluJylbZGltZW5zaW9uXSgnJylcclxuICAgICAgdGhpcy50cmFuc2l0aW9uaW5nID0gMFxyXG4gICAgICB0aGlzLiRlbGVtZW50XHJcbiAgICAgICAgLnRyaWdnZXIoJ3Nob3duLmJzLmNvbGxhcHNlJylcclxuICAgIH1cclxuXHJcbiAgICBpZiAoISQuc3VwcG9ydC50cmFuc2l0aW9uKSByZXR1cm4gY29tcGxldGUuY2FsbCh0aGlzKVxyXG5cclxuICAgIHZhciBzY3JvbGxTaXplID0gJC5jYW1lbENhc2UoWydzY3JvbGwnLCBkaW1lbnNpb25dLmpvaW4oJy0nKSlcclxuXHJcbiAgICB0aGlzLiRlbGVtZW50XHJcbiAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsICQucHJveHkoY29tcGxldGUsIHRoaXMpKVxyXG4gICAgICAuZW11bGF0ZVRyYW5zaXRpb25FbmQoQ29sbGFwc2UuVFJBTlNJVElPTl9EVVJBVElPTilbZGltZW5zaW9uXSh0aGlzLiRlbGVtZW50WzBdW3Njcm9sbFNpemVdKVxyXG4gIH1cclxuXHJcbiAgQ29sbGFwc2UucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAodGhpcy50cmFuc2l0aW9uaW5nIHx8ICF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdpbicpKSByZXR1cm5cclxuXHJcbiAgICB2YXIgc3RhcnRFdmVudCA9ICQuRXZlbnQoJ2hpZGUuYnMuY29sbGFwc2UnKVxyXG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKHN0YXJ0RXZlbnQpXHJcbiAgICBpZiAoc3RhcnRFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXHJcblxyXG4gICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuZGltZW5zaW9uKClcclxuXHJcbiAgICB0aGlzLiRlbGVtZW50W2RpbWVuc2lvbl0odGhpcy4kZWxlbWVudFtkaW1lbnNpb25dKCkpWzBdLm9mZnNldEhlaWdodFxyXG5cclxuICAgIHRoaXMuJGVsZW1lbnRcclxuICAgICAgLmFkZENsYXNzKCdjb2xsYXBzaW5nJylcclxuICAgICAgLnJlbW92ZUNsYXNzKCdjb2xsYXBzZSBpbicpXHJcbiAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpXHJcblxyXG4gICAgdGhpcy4kdHJpZ2dlclxyXG4gICAgICAuYWRkQ2xhc3MoJ2NvbGxhcHNlZCcpXHJcbiAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpXHJcblxyXG4gICAgdGhpcy50cmFuc2l0aW9uaW5nID0gMVxyXG5cclxuICAgIHZhciBjb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdGhpcy50cmFuc2l0aW9uaW5nID0gMFxyXG4gICAgICB0aGlzLiRlbGVtZW50XHJcbiAgICAgICAgLnJlbW92ZUNsYXNzKCdjb2xsYXBzaW5nJylcclxuICAgICAgICAuYWRkQ2xhc3MoJ2NvbGxhcHNlJylcclxuICAgICAgICAudHJpZ2dlcignaGlkZGVuLmJzLmNvbGxhcHNlJylcclxuICAgIH1cclxuXHJcbiAgICBpZiAoISQuc3VwcG9ydC50cmFuc2l0aW9uKSByZXR1cm4gY29tcGxldGUuY2FsbCh0aGlzKVxyXG5cclxuICAgIHRoaXMuJGVsZW1lbnRcclxuICAgICAgW2RpbWVuc2lvbl0oMClcclxuICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgJC5wcm94eShjb21wbGV0ZSwgdGhpcykpXHJcbiAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChDb2xsYXBzZS5UUkFOU0lUSU9OX0RVUkFUSU9OKVxyXG4gIH1cclxuXHJcbiAgQ29sbGFwc2UucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHRoaXNbdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnaW4nKSA/ICdoaWRlJyA6ICdzaG93J10oKVxyXG4gIH1cclxuXHJcbiAgQ29sbGFwc2UucHJvdG90eXBlLmdldFBhcmVudCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiAkKHRoaXMub3B0aW9ucy5wYXJlbnQpXHJcbiAgICAgIC5maW5kKCdbZGF0YS10b2dnbGU9XCJjb2xsYXBzZVwiXVtkYXRhLXBhcmVudD1cIicgKyB0aGlzLm9wdGlvbnMucGFyZW50ICsgJ1wiXScpXHJcbiAgICAgIC5lYWNoKCQucHJveHkoZnVuY3Rpb24gKGksIGVsZW1lbnQpIHtcclxuICAgICAgICB2YXIgJGVsZW1lbnQgPSAkKGVsZW1lbnQpXHJcbiAgICAgICAgdGhpcy5hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoZ2V0VGFyZ2V0RnJvbVRyaWdnZXIoJGVsZW1lbnQpLCAkZWxlbWVudClcclxuICAgICAgfSwgdGhpcykpXHJcbiAgICAgIC5lbmQoKVxyXG4gIH1cclxuXHJcbiAgQ29sbGFwc2UucHJvdG90eXBlLmFkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyA9IGZ1bmN0aW9uICgkZWxlbWVudCwgJHRyaWdnZXIpIHtcclxuICAgIHZhciBpc09wZW4gPSAkZWxlbWVudC5oYXNDbGFzcygnaW4nKVxyXG5cclxuICAgICRlbGVtZW50LmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBpc09wZW4pXHJcbiAgICAkdHJpZ2dlclxyXG4gICAgICAudG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZCcsICFpc09wZW4pXHJcbiAgICAgIC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgaXNPcGVuKVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gZ2V0VGFyZ2V0RnJvbVRyaWdnZXIoJHRyaWdnZXIpIHtcclxuICAgIHZhciBocmVmXHJcbiAgICB2YXIgdGFyZ2V0ID0gJHRyaWdnZXIuYXR0cignZGF0YS10YXJnZXQnKVxyXG4gICAgICB8fCAoaHJlZiA9ICR0cmlnZ2VyLmF0dHIoJ2hyZWYnKSkgJiYgaHJlZi5yZXBsYWNlKC8uKig/PSNbXlxcc10rJCkvLCAnJykgLy8gc3RyaXAgZm9yIGllN1xyXG5cclxuICAgIHJldHVybiAkKHRhcmdldClcclxuICB9XHJcblxyXG5cclxuICAvLyBDT0xMQVBTRSBQTFVHSU4gREVGSU5JVElPTlxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIGZ1bmN0aW9uIFBsdWdpbihvcHRpb24pIHtcclxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcclxuICAgICAgdmFyIGRhdGEgICAgPSAkdGhpcy5kYXRhKCdicy5jb2xsYXBzZScpXHJcbiAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sIENvbGxhcHNlLkRFRkFVTFRTLCAkdGhpcy5kYXRhKCksIHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uKVxyXG5cclxuICAgICAgaWYgKCFkYXRhICYmIG9wdGlvbnMudG9nZ2xlICYmIC9zaG93fGhpZGUvLnRlc3Qob3B0aW9uKSkgb3B0aW9ucy50b2dnbGUgPSBmYWxzZVxyXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLmNvbGxhcHNlJywgKGRhdGEgPSBuZXcgQ29sbGFwc2UodGhpcywgb3B0aW9ucykpKVxyXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dKClcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB2YXIgb2xkID0gJC5mbi5jb2xsYXBzZVxyXG5cclxuICAkLmZuLmNvbGxhcHNlICAgICAgICAgICAgID0gUGx1Z2luXHJcbiAgJC5mbi5jb2xsYXBzZS5Db25zdHJ1Y3RvciA9IENvbGxhcHNlXHJcblxyXG5cclxuICAvLyBDT0xMQVBTRSBOTyBDT05GTElDVFxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gICQuZm4uY29sbGFwc2Uubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICQuZm4uY29sbGFwc2UgPSBvbGRcclxuICAgIHJldHVybiB0aGlzXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gQ09MTEFQU0UgREFUQS1BUElcclxuICAvLyA9PT09PT09PT09PT09PT09PVxyXG5cclxuICAkKGRvY3VtZW50KS5vbignY2xpY2suYnMuY29sbGFwc2UuZGF0YS1hcGknLCAnW2RhdGEtdG9nZ2xlPVwiY29sbGFwc2VcIl0nLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXHJcblxyXG4gICAgaWYgKCEkdGhpcy5hdHRyKCdkYXRhLXRhcmdldCcpKSBlLnByZXZlbnREZWZhdWx0KClcclxuXHJcbiAgICB2YXIgJHRhcmdldCA9IGdldFRhcmdldEZyb21UcmlnZ2VyKCR0aGlzKVxyXG4gICAgdmFyIGRhdGEgICAgPSAkdGFyZ2V0LmRhdGEoJ2JzLmNvbGxhcHNlJylcclxuICAgIHZhciBvcHRpb24gID0gZGF0YSA/ICd0b2dnbGUnIDogJHRoaXMuZGF0YSgpXHJcblxyXG4gICAgUGx1Z2luLmNhbGwoJHRhcmdldCwgb3B0aW9uKVxyXG4gIH0pXHJcblxyXG59KGpRdWVyeSk7XHJcblxyXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQm9vdHN0cmFwOiBkcm9wZG93bi5qcyB2My4zLjdcclxuICogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vamF2YXNjcmlwdC8jZHJvcGRvd25zXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cclxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG5cclxuK2Z1bmN0aW9uICgkKSB7XHJcbiAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAvLyBEUk9QRE9XTiBDTEFTUyBERUZJTklUSU9OXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICB2YXIgYmFja2Ryb3AgPSAnLmRyb3Bkb3duLWJhY2tkcm9wJ1xyXG4gIHZhciB0b2dnbGUgICA9ICdbZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXSdcclxuICB2YXIgRHJvcGRvd24gPSBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgJChlbGVtZW50KS5vbignY2xpY2suYnMuZHJvcGRvd24nLCB0aGlzLnRvZ2dsZSlcclxuICB9XHJcblxyXG4gIERyb3Bkb3duLlZFUlNJT04gPSAnMy4zLjcnXHJcblxyXG4gIGZ1bmN0aW9uIGdldFBhcmVudCgkdGhpcykge1xyXG4gICAgdmFyIHNlbGVjdG9yID0gJHRoaXMuYXR0cignZGF0YS10YXJnZXQnKVxyXG5cclxuICAgIGlmICghc2VsZWN0b3IpIHtcclxuICAgICAgc2VsZWN0b3IgPSAkdGhpcy5hdHRyKCdocmVmJylcclxuICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvciAmJiAvI1tBLVphLXpdLy50ZXN0KHNlbGVjdG9yKSAmJiBzZWxlY3Rvci5yZXBsYWNlKC8uKig/PSNbXlxcc10qJCkvLCAnJykgLy8gc3RyaXAgZm9yIGllN1xyXG4gICAgfVxyXG5cclxuICAgIHZhciAkcGFyZW50ID0gc2VsZWN0b3IgJiYgJChzZWxlY3RvcilcclxuXHJcbiAgICByZXR1cm4gJHBhcmVudCAmJiAkcGFyZW50Lmxlbmd0aCA/ICRwYXJlbnQgOiAkdGhpcy5wYXJlbnQoKVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gY2xlYXJNZW51cyhlKSB7XHJcbiAgICBpZiAoZSAmJiBlLndoaWNoID09PSAzKSByZXR1cm5cclxuICAgICQoYmFja2Ryb3ApLnJlbW92ZSgpXHJcbiAgICAkKHRvZ2dsZSkuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyAgICAgICAgID0gJCh0aGlzKVxyXG4gICAgICB2YXIgJHBhcmVudCAgICAgICA9IGdldFBhcmVudCgkdGhpcylcclxuICAgICAgdmFyIHJlbGF0ZWRUYXJnZXQgPSB7IHJlbGF0ZWRUYXJnZXQ6IHRoaXMgfVxyXG5cclxuICAgICAgaWYgKCEkcGFyZW50Lmhhc0NsYXNzKCdvcGVuJykpIHJldHVyblxyXG5cclxuICAgICAgaWYgKGUgJiYgZS50eXBlID09ICdjbGljaycgJiYgL2lucHV0fHRleHRhcmVhL2kudGVzdChlLnRhcmdldC50YWdOYW1lKSAmJiAkLmNvbnRhaW5zKCRwYXJlbnRbMF0sIGUudGFyZ2V0KSkgcmV0dXJuXHJcblxyXG4gICAgICAkcGFyZW50LnRyaWdnZXIoZSA9ICQuRXZlbnQoJ2hpZGUuYnMuZHJvcGRvd24nLCByZWxhdGVkVGFyZ2V0KSlcclxuXHJcbiAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cclxuXHJcbiAgICAgICR0aGlzLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKVxyXG4gICAgICAkcGFyZW50LnJlbW92ZUNsYXNzKCdvcGVuJykudHJpZ2dlcigkLkV2ZW50KCdoaWRkZW4uYnMuZHJvcGRvd24nLCByZWxhdGVkVGFyZ2V0KSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBEcm9wZG93bi5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKGUpIHtcclxuICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuXHJcbiAgICBpZiAoJHRoaXMuaXMoJy5kaXNhYmxlZCwgOmRpc2FibGVkJykpIHJldHVyblxyXG5cclxuICAgIHZhciAkcGFyZW50ICA9IGdldFBhcmVudCgkdGhpcylcclxuICAgIHZhciBpc0FjdGl2ZSA9ICRwYXJlbnQuaGFzQ2xhc3MoJ29wZW4nKVxyXG5cclxuICAgIGNsZWFyTWVudXMoKVxyXG5cclxuICAgIGlmICghaXNBY3RpdmUpIHtcclxuICAgICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiAhJHBhcmVudC5jbG9zZXN0KCcubmF2YmFyLW5hdicpLmxlbmd0aCkge1xyXG4gICAgICAgIC8vIGlmIG1vYmlsZSB3ZSB1c2UgYSBiYWNrZHJvcCBiZWNhdXNlIGNsaWNrIGV2ZW50cyBkb24ndCBkZWxlZ2F0ZVxyXG4gICAgICAgICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpXHJcbiAgICAgICAgICAuYWRkQ2xhc3MoJ2Ryb3Bkb3duLWJhY2tkcm9wJylcclxuICAgICAgICAgIC5pbnNlcnRBZnRlcigkKHRoaXMpKVxyXG4gICAgICAgICAgLm9uKCdjbGljaycsIGNsZWFyTWVudXMpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciByZWxhdGVkVGFyZ2V0ID0geyByZWxhdGVkVGFyZ2V0OiB0aGlzIH1cclxuICAgICAgJHBhcmVudC50cmlnZ2VyKGUgPSAkLkV2ZW50KCdzaG93LmJzLmRyb3Bkb3duJywgcmVsYXRlZFRhcmdldCkpXHJcblxyXG4gICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXHJcblxyXG4gICAgICAkdGhpc1xyXG4gICAgICAgIC50cmlnZ2VyKCdmb2N1cycpXHJcbiAgICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpXHJcblxyXG4gICAgICAkcGFyZW50XHJcbiAgICAgICAgLnRvZ2dsZUNsYXNzKCdvcGVuJylcclxuICAgICAgICAudHJpZ2dlcigkLkV2ZW50KCdzaG93bi5icy5kcm9wZG93bicsIHJlbGF0ZWRUYXJnZXQpKVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuXHJcbiAgRHJvcGRvd24ucHJvdG90eXBlLmtleWRvd24gPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgaWYgKCEvKDM4fDQwfDI3fDMyKS8udGVzdChlLndoaWNoKSB8fCAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGUudGFyZ2V0LnRhZ05hbWUpKSByZXR1cm5cclxuXHJcbiAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXHJcblxyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXHJcblxyXG4gICAgaWYgKCR0aGlzLmlzKCcuZGlzYWJsZWQsIDpkaXNhYmxlZCcpKSByZXR1cm5cclxuXHJcbiAgICB2YXIgJHBhcmVudCAgPSBnZXRQYXJlbnQoJHRoaXMpXHJcbiAgICB2YXIgaXNBY3RpdmUgPSAkcGFyZW50Lmhhc0NsYXNzKCdvcGVuJylcclxuXHJcbiAgICBpZiAoIWlzQWN0aXZlICYmIGUud2hpY2ggIT0gMjcgfHwgaXNBY3RpdmUgJiYgZS53aGljaCA9PSAyNykge1xyXG4gICAgICBpZiAoZS53aGljaCA9PSAyNykgJHBhcmVudC5maW5kKHRvZ2dsZSkudHJpZ2dlcignZm9jdXMnKVxyXG4gICAgICByZXR1cm4gJHRoaXMudHJpZ2dlcignY2xpY2snKVxyXG4gICAgfVxyXG5cclxuICAgIHZhciBkZXNjID0gJyBsaTpub3QoLmRpc2FibGVkKTp2aXNpYmxlIGEnXHJcbiAgICB2YXIgJGl0ZW1zID0gJHBhcmVudC5maW5kKCcuZHJvcGRvd24tbWVudScgKyBkZXNjKVxyXG5cclxuICAgIGlmICghJGl0ZW1zLmxlbmd0aCkgcmV0dXJuXHJcblxyXG4gICAgdmFyIGluZGV4ID0gJGl0ZW1zLmluZGV4KGUudGFyZ2V0KVxyXG5cclxuICAgIGlmIChlLndoaWNoID09IDM4ICYmIGluZGV4ID4gMCkgICAgICAgICAgICAgICAgIGluZGV4LS0gICAgICAgICAvLyB1cFxyXG4gICAgaWYgKGUud2hpY2ggPT0gNDAgJiYgaW5kZXggPCAkaXRlbXMubGVuZ3RoIC0gMSkgaW5kZXgrKyAgICAgICAgIC8vIGRvd25cclxuICAgIGlmICghfmluZGV4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMFxyXG5cclxuICAgICRpdGVtcy5lcShpbmRleCkudHJpZ2dlcignZm9jdXMnKVxyXG4gIH1cclxuXHJcblxyXG4gIC8vIERST1BET1dOIFBMVUdJTiBERUZJTklUSU9OXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgZnVuY3Rpb24gUGx1Z2luKG9wdGlvbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcylcclxuICAgICAgdmFyIGRhdGEgID0gJHRoaXMuZGF0YSgnYnMuZHJvcGRvd24nKVxyXG5cclxuICAgICAgaWYgKCFkYXRhKSAkdGhpcy5kYXRhKCdicy5kcm9wZG93bicsIChkYXRhID0gbmV3IERyb3Bkb3duKHRoaXMpKSlcclxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXS5jYWxsKCR0aGlzKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHZhciBvbGQgPSAkLmZuLmRyb3Bkb3duXHJcblxyXG4gICQuZm4uZHJvcGRvd24gICAgICAgICAgICAgPSBQbHVnaW5cclxuICAkLmZuLmRyb3Bkb3duLkNvbnN0cnVjdG9yID0gRHJvcGRvd25cclxuXHJcblxyXG4gIC8vIERST1BET1dOIE5PIENPTkZMSUNUXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgJC5mbi5kcm9wZG93bi5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgJC5mbi5kcm9wZG93biA9IG9sZFxyXG4gICAgcmV0dXJuIHRoaXNcclxuICB9XHJcblxyXG5cclxuICAvLyBBUFBMWSBUTyBTVEFOREFSRCBEUk9QRE9XTiBFTEVNRU5UU1xyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gICQoZG9jdW1lbnQpXHJcbiAgICAub24oJ2NsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpJywgY2xlYXJNZW51cylcclxuICAgIC5vbignY2xpY2suYnMuZHJvcGRvd24uZGF0YS1hcGknLCAnLmRyb3Bkb3duIGZvcm0nLCBmdW5jdGlvbiAoZSkgeyBlLnN0b3BQcm9wYWdhdGlvbigpIH0pXHJcbiAgICAub24oJ2NsaWNrLmJzLmRyb3Bkb3duLmRhdGEtYXBpJywgdG9nZ2xlLCBEcm9wZG93bi5wcm90b3R5cGUudG9nZ2xlKVxyXG4gICAgLm9uKCdrZXlkb3duLmJzLmRyb3Bkb3duLmRhdGEtYXBpJywgdG9nZ2xlLCBEcm9wZG93bi5wcm90b3R5cGUua2V5ZG93bilcclxuICAgIC5vbigna2V5ZG93bi5icy5kcm9wZG93bi5kYXRhLWFwaScsICcuZHJvcGRvd24tbWVudScsIERyb3Bkb3duLnByb3RvdHlwZS5rZXlkb3duKVxyXG5cclxufShqUXVlcnkpO1xyXG5cclxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIEJvb3RzdHJhcDogbW9kYWwuanMgdjMuMy43XHJcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI21vZGFsc1xyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuXHJcbitmdW5jdGlvbiAoJCkge1xyXG4gICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgLy8gTU9EQUwgQ0xBU1MgREVGSU5JVElPTlxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgdmFyIE1vZGFsID0gZnVuY3Rpb24gKGVsZW1lbnQsIG9wdGlvbnMpIHtcclxuICAgIHRoaXMub3B0aW9ucyAgICAgICAgICAgICA9IG9wdGlvbnNcclxuICAgIHRoaXMuJGJvZHkgICAgICAgICAgICAgICA9ICQoZG9jdW1lbnQuYm9keSlcclxuICAgIHRoaXMuJGVsZW1lbnQgICAgICAgICAgICA9ICQoZWxlbWVudClcclxuICAgIHRoaXMuJGRpYWxvZyAgICAgICAgICAgICA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLm1vZGFsLWRpYWxvZycpXHJcbiAgICB0aGlzLiRiYWNrZHJvcCAgICAgICAgICAgPSBudWxsXHJcbiAgICB0aGlzLmlzU2hvd24gICAgICAgICAgICAgPSBudWxsXHJcbiAgICB0aGlzLm9yaWdpbmFsQm9keVBhZCAgICAgPSBudWxsXHJcbiAgICB0aGlzLnNjcm9sbGJhcldpZHRoICAgICAgPSAwXHJcbiAgICB0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2sgPSBmYWxzZVxyXG5cclxuICAgIGlmICh0aGlzLm9wdGlvbnMucmVtb3RlKSB7XHJcbiAgICAgIHRoaXMuJGVsZW1lbnRcclxuICAgICAgICAuZmluZCgnLm1vZGFsLWNvbnRlbnQnKVxyXG4gICAgICAgIC5sb2FkKHRoaXMub3B0aW9ucy5yZW1vdGUsICQucHJveHkoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCdsb2FkZWQuYnMubW9kYWwnKVxyXG4gICAgICAgIH0sIHRoaXMpKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgTW9kYWwuVkVSU0lPTiAgPSAnMy4zLjcnXHJcblxyXG4gIE1vZGFsLlRSQU5TSVRJT05fRFVSQVRJT04gPSAzMDBcclxuICBNb2RhbC5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwXHJcblxyXG4gIE1vZGFsLkRFRkFVTFRTID0ge1xyXG4gICAgYmFja2Ryb3A6IHRydWUsXHJcbiAgICBrZXlib2FyZDogdHJ1ZSxcclxuICAgIHNob3c6IHRydWVcclxuICB9XHJcblxyXG4gIE1vZGFsLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAoX3JlbGF0ZWRUYXJnZXQpIHtcclxuICAgIHJldHVybiB0aGlzLmlzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyhfcmVsYXRlZFRhcmdldClcclxuICB9XHJcblxyXG4gIE1vZGFsLnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24gKF9yZWxhdGVkVGFyZ2V0KSB7XHJcbiAgICB2YXIgdGhhdCA9IHRoaXNcclxuICAgIHZhciBlICAgID0gJC5FdmVudCgnc2hvdy5icy5tb2RhbCcsIHsgcmVsYXRlZFRhcmdldDogX3JlbGF0ZWRUYXJnZXQgfSlcclxuXHJcbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSlcclxuXHJcbiAgICBpZiAodGhpcy5pc1Nob3duIHx8IGUuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVyblxyXG5cclxuICAgIHRoaXMuaXNTaG93biA9IHRydWVcclxuXHJcbiAgICB0aGlzLmNoZWNrU2Nyb2xsYmFyKClcclxuICAgIHRoaXMuc2V0U2Nyb2xsYmFyKClcclxuICAgIHRoaXMuJGJvZHkuYWRkQ2xhc3MoJ21vZGFsLW9wZW4nKVxyXG5cclxuICAgIHRoaXMuZXNjYXBlKClcclxuICAgIHRoaXMucmVzaXplKClcclxuXHJcbiAgICB0aGlzLiRlbGVtZW50Lm9uKCdjbGljay5kaXNtaXNzLmJzLm1vZGFsJywgJ1tkYXRhLWRpc21pc3M9XCJtb2RhbFwiXScsICQucHJveHkodGhpcy5oaWRlLCB0aGlzKSlcclxuXHJcbiAgICB0aGlzLiRkaWFsb2cub24oJ21vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGF0LiRlbGVtZW50Lm9uZSgnbW91c2V1cC5kaXNtaXNzLmJzLm1vZGFsJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoJChlLnRhcmdldCkuaXModGhhdC4kZWxlbWVudCkpIHRoYXQuaWdub3JlQmFja2Ryb3BDbGljayA9IHRydWVcclxuICAgICAgfSlcclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5iYWNrZHJvcChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciB0cmFuc2l0aW9uID0gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgdGhhdC4kZWxlbWVudC5oYXNDbGFzcygnZmFkZScpXHJcblxyXG4gICAgICBpZiAoIXRoYXQuJGVsZW1lbnQucGFyZW50KCkubGVuZ3RoKSB7XHJcbiAgICAgICAgdGhhdC4kZWxlbWVudC5hcHBlbmRUbyh0aGF0LiRib2R5KSAvLyBkb24ndCBtb3ZlIG1vZGFscyBkb20gcG9zaXRpb25cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhhdC4kZWxlbWVudFxyXG4gICAgICAgIC5zaG93KClcclxuICAgICAgICAuc2Nyb2xsVG9wKDApXHJcblxyXG4gICAgICB0aGF0LmFkanVzdERpYWxvZygpXHJcblxyXG4gICAgICBpZiAodHJhbnNpdGlvbikge1xyXG4gICAgICAgIHRoYXQuJGVsZW1lbnRbMF0ub2Zmc2V0V2lkdGggLy8gZm9yY2UgcmVmbG93XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoYXQuJGVsZW1lbnQuYWRkQ2xhc3MoJ2luJylcclxuXHJcbiAgICAgIHRoYXQuZW5mb3JjZUZvY3VzKClcclxuXHJcbiAgICAgIHZhciBlID0gJC5FdmVudCgnc2hvd24uYnMubW9kYWwnLCB7IHJlbGF0ZWRUYXJnZXQ6IF9yZWxhdGVkVGFyZ2V0IH0pXHJcblxyXG4gICAgICB0cmFuc2l0aW9uID9cclxuICAgICAgICB0aGF0LiRkaWFsb2cgLy8gd2FpdCBmb3IgbW9kYWwgdG8gc2xpZGUgaW5cclxuICAgICAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdmb2N1cycpLnRyaWdnZXIoZSlcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAuZW11bGF0ZVRyYW5zaXRpb25FbmQoTW9kYWwuVFJBTlNJVElPTl9EVVJBVElPTikgOlxyXG4gICAgICAgIHRoYXQuJGVsZW1lbnQudHJpZ2dlcignZm9jdXMnKS50cmlnZ2VyKGUpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgTW9kYWwucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgaWYgKGUpIGUucHJldmVudERlZmF1bHQoKVxyXG5cclxuICAgIGUgPSAkLkV2ZW50KCdoaWRlLmJzLm1vZGFsJylcclxuXHJcbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSlcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNTaG93biB8fCBlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSByZXR1cm5cclxuXHJcbiAgICB0aGlzLmlzU2hvd24gPSBmYWxzZVxyXG5cclxuICAgIHRoaXMuZXNjYXBlKClcclxuICAgIHRoaXMucmVzaXplKClcclxuXHJcbiAgICAkKGRvY3VtZW50KS5vZmYoJ2ZvY3VzaW4uYnMubW9kYWwnKVxyXG5cclxuICAgIHRoaXMuJGVsZW1lbnRcclxuICAgICAgLnJlbW92ZUNsYXNzKCdpbicpXHJcbiAgICAgIC5vZmYoJ2NsaWNrLmRpc21pc3MuYnMubW9kYWwnKVxyXG4gICAgICAub2ZmKCdtb3VzZXVwLmRpc21pc3MuYnMubW9kYWwnKVxyXG5cclxuICAgIHRoaXMuJGRpYWxvZy5vZmYoJ21vdXNlZG93bi5kaXNtaXNzLmJzLm1vZGFsJylcclxuXHJcbiAgICAkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiB0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmYWRlJykgP1xyXG4gICAgICB0aGlzLiRlbGVtZW50XHJcbiAgICAgICAgLm9uZSgnYnNUcmFuc2l0aW9uRW5kJywgJC5wcm94eSh0aGlzLmhpZGVNb2RhbCwgdGhpcykpXHJcbiAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKE1vZGFsLlRSQU5TSVRJT05fRFVSQVRJT04pIDpcclxuICAgICAgdGhpcy5oaWRlTW9kYWwoKVxyXG4gIH1cclxuXHJcbiAgTW9kYWwucHJvdG90eXBlLmVuZm9yY2VGb2N1cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICQoZG9jdW1lbnQpXHJcbiAgICAgIC5vZmYoJ2ZvY3VzaW4uYnMubW9kYWwnKSAvLyBndWFyZCBhZ2FpbnN0IGluZmluaXRlIGZvY3VzIGxvb3BcclxuICAgICAgLm9uKCdmb2N1c2luLmJzLm1vZGFsJywgJC5wcm94eShmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGlmIChkb2N1bWVudCAhPT0gZS50YXJnZXQgJiZcclxuICAgICAgICAgICAgdGhpcy4kZWxlbWVudFswXSAhPT0gZS50YXJnZXQgJiZcclxuICAgICAgICAgICAgIXRoaXMuJGVsZW1lbnQuaGFzKGUudGFyZ2V0KS5sZW5ndGgpIHtcclxuICAgICAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcignZm9jdXMnKVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgdGhpcykpXHJcbiAgfVxyXG5cclxuICBNb2RhbC5wcm90b3R5cGUuZXNjYXBlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKHRoaXMuaXNTaG93biAmJiB0aGlzLm9wdGlvbnMua2V5Ym9hcmQpIHtcclxuICAgICAgdGhpcy4kZWxlbWVudC5vbigna2V5ZG93bi5kaXNtaXNzLmJzLm1vZGFsJywgJC5wcm94eShmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGUud2hpY2ggPT0gMjcgJiYgdGhpcy5oaWRlKClcclxuICAgICAgfSwgdGhpcykpXHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLmlzU2hvd24pIHtcclxuICAgICAgdGhpcy4kZWxlbWVudC5vZmYoJ2tleWRvd24uZGlzbWlzcy5icy5tb2RhbCcpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBNb2RhbC5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKHRoaXMuaXNTaG93bikge1xyXG4gICAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZS5icy5tb2RhbCcsICQucHJveHkodGhpcy5oYW5kbGVVcGRhdGUsIHRoaXMpKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgJCh3aW5kb3cpLm9mZigncmVzaXplLmJzLm1vZGFsJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIE1vZGFsLnByb3RvdHlwZS5oaWRlTW9kYWwgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgdGhhdCA9IHRoaXNcclxuICAgIHRoaXMuJGVsZW1lbnQuaGlkZSgpXHJcbiAgICB0aGlzLmJhY2tkcm9wKGZ1bmN0aW9uICgpIHtcclxuICAgICAgdGhhdC4kYm9keS5yZW1vdmVDbGFzcygnbW9kYWwtb3BlbicpXHJcbiAgICAgIHRoYXQucmVzZXRBZGp1c3RtZW50cygpXHJcbiAgICAgIHRoYXQucmVzZXRTY3JvbGxiYXIoKVxyXG4gICAgICB0aGF0LiRlbGVtZW50LnRyaWdnZXIoJ2hpZGRlbi5icy5tb2RhbCcpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgTW9kYWwucHJvdG90eXBlLnJlbW92ZUJhY2tkcm9wID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy4kYmFja2Ryb3AgJiYgdGhpcy4kYmFja2Ryb3AucmVtb3ZlKClcclxuICAgIHRoaXMuJGJhY2tkcm9wID0gbnVsbFxyXG4gIH1cclxuXHJcbiAgTW9kYWwucHJvdG90eXBlLmJhY2tkcm9wID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICB2YXIgdGhhdCA9IHRoaXNcclxuICAgIHZhciBhbmltYXRlID0gdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZmFkZScpID8gJ2ZhZGUnIDogJydcclxuXHJcbiAgICBpZiAodGhpcy5pc1Nob3duICYmIHRoaXMub3B0aW9ucy5iYWNrZHJvcCkge1xyXG4gICAgICB2YXIgZG9BbmltYXRlID0gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgYW5pbWF0ZVxyXG5cclxuICAgICAgdGhpcy4kYmFja2Ryb3AgPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKVxyXG4gICAgICAgIC5hZGRDbGFzcygnbW9kYWwtYmFja2Ryb3AgJyArIGFuaW1hdGUpXHJcbiAgICAgICAgLmFwcGVuZFRvKHRoaXMuJGJvZHkpXHJcblxyXG4gICAgICB0aGlzLiRlbGVtZW50Lm9uKCdjbGljay5kaXNtaXNzLmJzLm1vZGFsJywgJC5wcm94eShmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGlmICh0aGlzLmlnbm9yZUJhY2tkcm9wQ2xpY2spIHtcclxuICAgICAgICAgIHRoaXMuaWdub3JlQmFja2Ryb3BDbGljayA9IGZhbHNlXHJcbiAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGUudGFyZ2V0ICE9PSBlLmN1cnJlbnRUYXJnZXQpIHJldHVyblxyXG4gICAgICAgIHRoaXMub3B0aW9ucy5iYWNrZHJvcCA9PSAnc3RhdGljJ1xyXG4gICAgICAgICAgPyB0aGlzLiRlbGVtZW50WzBdLmZvY3VzKClcclxuICAgICAgICAgIDogdGhpcy5oaWRlKClcclxuICAgICAgfSwgdGhpcykpXHJcblxyXG4gICAgICBpZiAoZG9BbmltYXRlKSB0aGlzLiRiYWNrZHJvcFswXS5vZmZzZXRXaWR0aCAvLyBmb3JjZSByZWZsb3dcclxuXHJcbiAgICAgIHRoaXMuJGJhY2tkcm9wLmFkZENsYXNzKCdpbicpXHJcblxyXG4gICAgICBpZiAoIWNhbGxiYWNrKSByZXR1cm5cclxuXHJcbiAgICAgIGRvQW5pbWF0ZSA/XHJcbiAgICAgICAgdGhpcy4kYmFja2Ryb3BcclxuICAgICAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsIGNhbGxiYWNrKVxyXG4gICAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKE1vZGFsLkJBQ0tEUk9QX1RSQU5TSVRJT05fRFVSQVRJT04pIDpcclxuICAgICAgICBjYWxsYmFjaygpXHJcblxyXG4gICAgfSBlbHNlIGlmICghdGhpcy5pc1Nob3duICYmIHRoaXMuJGJhY2tkcm9wKSB7XHJcbiAgICAgIHRoaXMuJGJhY2tkcm9wLnJlbW92ZUNsYXNzKCdpbicpXHJcblxyXG4gICAgICB2YXIgY2FsbGJhY2tSZW1vdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhhdC5yZW1vdmVCYWNrZHJvcCgpXHJcbiAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxyXG4gICAgICB9XHJcbiAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2ZhZGUnKSA/XHJcbiAgICAgICAgdGhpcy4kYmFja2Ryb3BcclxuICAgICAgICAgIC5vbmUoJ2JzVHJhbnNpdGlvbkVuZCcsIGNhbGxiYWNrUmVtb3ZlKVxyXG4gICAgICAgICAgLmVtdWxhdGVUcmFuc2l0aW9uRW5kKE1vZGFsLkJBQ0tEUk9QX1RSQU5TSVRJT05fRFVSQVRJT04pIDpcclxuICAgICAgICBjYWxsYmFja1JlbW92ZSgpXHJcblxyXG4gICAgfSBlbHNlIGlmIChjYWxsYmFjaykge1xyXG4gICAgICBjYWxsYmFjaygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyB0aGVzZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBoYW5kbGUgb3ZlcmZsb3dpbmcgbW9kYWxzXHJcblxyXG4gIE1vZGFsLnByb3RvdHlwZS5oYW5kbGVVcGRhdGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmFkanVzdERpYWxvZygpXHJcbiAgfVxyXG5cclxuICBNb2RhbC5wcm90b3R5cGUuYWRqdXN0RGlhbG9nID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIG1vZGFsSXNPdmVyZmxvd2luZyA9IHRoaXMuJGVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodFxyXG5cclxuICAgIHRoaXMuJGVsZW1lbnQuY3NzKHtcclxuICAgICAgcGFkZGluZ0xlZnQ6ICAhdGhpcy5ib2R5SXNPdmVyZmxvd2luZyAmJiBtb2RhbElzT3ZlcmZsb3dpbmcgPyB0aGlzLnNjcm9sbGJhcldpZHRoIDogJycsXHJcbiAgICAgIHBhZGRpbmdSaWdodDogdGhpcy5ib2R5SXNPdmVyZmxvd2luZyAmJiAhbW9kYWxJc092ZXJmbG93aW5nID8gdGhpcy5zY3JvbGxiYXJXaWR0aCA6ICcnXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgTW9kYWwucHJvdG90eXBlLnJlc2V0QWRqdXN0bWVudHMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLiRlbGVtZW50LmNzcyh7XHJcbiAgICAgIHBhZGRpbmdMZWZ0OiAnJyxcclxuICAgICAgcGFkZGluZ1JpZ2h0OiAnJ1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIE1vZGFsLnByb3RvdHlwZS5jaGVja1Njcm9sbGJhciA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBmdWxsV2luZG93V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aFxyXG4gICAgaWYgKCFmdWxsV2luZG93V2lkdGgpIHsgLy8gd29ya2Fyb3VuZCBmb3IgbWlzc2luZyB3aW5kb3cuaW5uZXJXaWR0aCBpbiBJRThcclxuICAgICAgdmFyIGRvY3VtZW50RWxlbWVudFJlY3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcclxuICAgICAgZnVsbFdpbmRvd1dpZHRoID0gZG9jdW1lbnRFbGVtZW50UmVjdC5yaWdodCAtIE1hdGguYWJzKGRvY3VtZW50RWxlbWVudFJlY3QubGVmdClcclxuICAgIH1cclxuICAgIHRoaXMuYm9keUlzT3ZlcmZsb3dpbmcgPSBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoIDwgZnVsbFdpbmRvd1dpZHRoXHJcbiAgICB0aGlzLnNjcm9sbGJhcldpZHRoID0gdGhpcy5tZWFzdXJlU2Nyb2xsYmFyKClcclxuICB9XHJcblxyXG4gIE1vZGFsLnByb3RvdHlwZS5zZXRTY3JvbGxiYXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgYm9keVBhZCA9IHBhcnNlSW50KCh0aGlzLiRib2R5LmNzcygncGFkZGluZy1yaWdodCcpIHx8IDApLCAxMClcclxuICAgIHRoaXMub3JpZ2luYWxCb2R5UGFkID0gZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQgfHwgJydcclxuICAgIGlmICh0aGlzLmJvZHlJc092ZXJmbG93aW5nKSB0aGlzLiRib2R5LmNzcygncGFkZGluZy1yaWdodCcsIGJvZHlQYWQgKyB0aGlzLnNjcm9sbGJhcldpZHRoKVxyXG4gIH1cclxuXHJcbiAgTW9kYWwucHJvdG90eXBlLnJlc2V0U2Nyb2xsYmFyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy4kYm9keS5jc3MoJ3BhZGRpbmctcmlnaHQnLCB0aGlzLm9yaWdpbmFsQm9keVBhZClcclxuICB9XHJcblxyXG4gIE1vZGFsLnByb3RvdHlwZS5tZWFzdXJlU2Nyb2xsYmFyID0gZnVuY3Rpb24gKCkgeyAvLyB0aHggd2Fsc2hcclxuICAgIHZhciBzY3JvbGxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKVxyXG4gICAgc2Nyb2xsRGl2LmNsYXNzTmFtZSA9ICdtb2RhbC1zY3JvbGxiYXItbWVhc3VyZSdcclxuICAgIHRoaXMuJGJvZHkuYXBwZW5kKHNjcm9sbERpdilcclxuICAgIHZhciBzY3JvbGxiYXJXaWR0aCA9IHNjcm9sbERpdi5vZmZzZXRXaWR0aCAtIHNjcm9sbERpdi5jbGllbnRXaWR0aFxyXG4gICAgdGhpcy4kYm9keVswXS5yZW1vdmVDaGlsZChzY3JvbGxEaXYpXHJcbiAgICByZXR1cm4gc2Nyb2xsYmFyV2lkdGhcclxuICB9XHJcblxyXG5cclxuICAvLyBNT0RBTCBQTFVHSU4gREVGSU5JVElPTlxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIGZ1bmN0aW9uIFBsdWdpbihvcHRpb24sIF9yZWxhdGVkVGFyZ2V0KSB7XHJcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXHJcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnYnMubW9kYWwnKVxyXG4gICAgICB2YXIgb3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBNb2RhbC5ERUZBVUxUUywgJHRoaXMuZGF0YSgpLCB0eXBlb2Ygb3B0aW9uID09ICdvYmplY3QnICYmIG9wdGlvbilcclxuXHJcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMubW9kYWwnLCAoZGF0YSA9IG5ldyBNb2RhbCh0aGlzLCBvcHRpb25zKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oX3JlbGF0ZWRUYXJnZXQpXHJcbiAgICAgIGVsc2UgaWYgKG9wdGlvbnMuc2hvdykgZGF0YS5zaG93KF9yZWxhdGVkVGFyZ2V0KVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHZhciBvbGQgPSAkLmZuLm1vZGFsXHJcblxyXG4gICQuZm4ubW9kYWwgICAgICAgICAgICAgPSBQbHVnaW5cclxuICAkLmZuLm1vZGFsLkNvbnN0cnVjdG9yID0gTW9kYWxcclxuXHJcblxyXG4gIC8vIE1PREFMIE5PIENPTkZMSUNUXHJcbiAgLy8gPT09PT09PT09PT09PT09PT1cclxuXHJcbiAgJC5mbi5tb2RhbC5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgJC5mbi5tb2RhbCA9IG9sZFxyXG4gICAgcmV0dXJuIHRoaXNcclxuICB9XHJcblxyXG5cclxuICAvLyBNT0RBTCBEQVRBLUFQSVxyXG4gIC8vID09PT09PT09PT09PT09XHJcblxyXG4gICQoZG9jdW1lbnQpLm9uKCdjbGljay5icy5tb2RhbC5kYXRhLWFwaScsICdbZGF0YS10b2dnbGU9XCJtb2RhbFwiXScsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICB2YXIgJHRoaXMgICA9ICQodGhpcylcclxuICAgIHZhciBocmVmICAgID0gJHRoaXMuYXR0cignaHJlZicpXHJcbiAgICB2YXIgJHRhcmdldCA9ICQoJHRoaXMuYXR0cignZGF0YS10YXJnZXQnKSB8fCAoaHJlZiAmJiBocmVmLnJlcGxhY2UoLy4qKD89I1teXFxzXSskKS8sICcnKSkpIC8vIHN0cmlwIGZvciBpZTdcclxuICAgIHZhciBvcHRpb24gID0gJHRhcmdldC5kYXRhKCdicy5tb2RhbCcpID8gJ3RvZ2dsZScgOiAkLmV4dGVuZCh7IHJlbW90ZTogIS8jLy50ZXN0KGhyZWYpICYmIGhyZWYgfSwgJHRhcmdldC5kYXRhKCksICR0aGlzLmRhdGEoKSlcclxuXHJcbiAgICBpZiAoJHRoaXMuaXMoJ2EnKSkgZS5wcmV2ZW50RGVmYXVsdCgpXHJcblxyXG4gICAgJHRhcmdldC5vbmUoJ3Nob3cuYnMubW9kYWwnLCBmdW5jdGlvbiAoc2hvd0V2ZW50KSB7XHJcbiAgICAgIGlmIChzaG93RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHJldHVybiAvLyBvbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXHJcbiAgICAgICR0YXJnZXQub25lKCdoaWRkZW4uYnMubW9kYWwnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgJHRoaXMuaXMoJzp2aXNpYmxlJykgJiYgJHRoaXMudHJpZ2dlcignZm9jdXMnKVxyXG4gICAgICB9KVxyXG4gICAgfSlcclxuICAgIFBsdWdpbi5jYWxsKCR0YXJnZXQsIG9wdGlvbiwgdGhpcylcclxuICB9KVxyXG5cclxufShqUXVlcnkpO1xyXG5cclxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIEJvb3RzdHJhcDogdG9vbHRpcC5qcyB2My4zLjdcclxuICogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vamF2YXNjcmlwdC8jdG9vbHRpcFxyXG4gKiBJbnNwaXJlZCBieSB0aGUgb3JpZ2luYWwgalF1ZXJ5LnRpcHN5IGJ5IEphc29uIEZyYW1lXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cclxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG5cclxuK2Z1bmN0aW9uICgkKSB7XHJcbiAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAvLyBUT09MVElQIFBVQkxJQyBDTEFTUyBERUZJTklUSU9OXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICB2YXIgVG9vbHRpcCA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICB0aGlzLnR5cGUgICAgICAgPSBudWxsXHJcbiAgICB0aGlzLm9wdGlvbnMgICAgPSBudWxsXHJcbiAgICB0aGlzLmVuYWJsZWQgICAgPSBudWxsXHJcbiAgICB0aGlzLnRpbWVvdXQgICAgPSBudWxsXHJcbiAgICB0aGlzLmhvdmVyU3RhdGUgPSBudWxsXHJcbiAgICB0aGlzLiRlbGVtZW50ICAgPSBudWxsXHJcbiAgICB0aGlzLmluU3RhdGUgICAgPSBudWxsXHJcblxyXG4gICAgdGhpcy5pbml0KCd0b29sdGlwJywgZWxlbWVudCwgb3B0aW9ucylcclxuICB9XHJcblxyXG4gIFRvb2x0aXAuVkVSU0lPTiAgPSAnMy4zLjcnXHJcblxyXG4gIFRvb2x0aXAuVFJBTlNJVElPTl9EVVJBVElPTiA9IDE1MFxyXG5cclxuICBUb29sdGlwLkRFRkFVTFRTID0ge1xyXG4gICAgYW5pbWF0aW9uOiB0cnVlLFxyXG4gICAgcGxhY2VtZW50OiAndG9wJyxcclxuICAgIHNlbGVjdG9yOiBmYWxzZSxcclxuICAgIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPjxkaXYgY2xhc3M9XCJ0b29sdGlwLWFycm93XCI+PC9kaXY+PGRpdiBjbGFzcz1cInRvb2x0aXAtaW5uZXJcIj48L2Rpdj48L2Rpdj4nLFxyXG4gICAgdHJpZ2dlcjogJ2hvdmVyIGZvY3VzJyxcclxuICAgIHRpdGxlOiAnJyxcclxuICAgIGRlbGF5OiAwLFxyXG4gICAgaHRtbDogZmFsc2UsXHJcbiAgICBjb250YWluZXI6IGZhbHNlLFxyXG4gICAgdmlld3BvcnQ6IHtcclxuICAgICAgc2VsZWN0b3I6ICdib2R5JyxcclxuICAgICAgcGFkZGluZzogMFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgVG9vbHRpcC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICh0eXBlLCBlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICB0aGlzLmVuYWJsZWQgICA9IHRydWVcclxuICAgIHRoaXMudHlwZSAgICAgID0gdHlwZVxyXG4gICAgdGhpcy4kZWxlbWVudCAgPSAkKGVsZW1lbnQpXHJcbiAgICB0aGlzLm9wdGlvbnMgICA9IHRoaXMuZ2V0T3B0aW9ucyhvcHRpb25zKVxyXG4gICAgdGhpcy4kdmlld3BvcnQgPSB0aGlzLm9wdGlvbnMudmlld3BvcnQgJiYgJCgkLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnZpZXdwb3J0KSA/IHRoaXMub3B0aW9ucy52aWV3cG9ydC5jYWxsKHRoaXMsIHRoaXMuJGVsZW1lbnQpIDogKHRoaXMub3B0aW9ucy52aWV3cG9ydC5zZWxlY3RvciB8fCB0aGlzLm9wdGlvbnMudmlld3BvcnQpKVxyXG4gICAgdGhpcy5pblN0YXRlICAgPSB7IGNsaWNrOiBmYWxzZSwgaG92ZXI6IGZhbHNlLCBmb2N1czogZmFsc2UgfVxyXG5cclxuICAgIGlmICh0aGlzLiRlbGVtZW50WzBdIGluc3RhbmNlb2YgZG9jdW1lbnQuY29uc3RydWN0b3IgJiYgIXRoaXMub3B0aW9ucy5zZWxlY3Rvcikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2BzZWxlY3RvcmAgb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gaW5pdGlhbGl6aW5nICcgKyB0aGlzLnR5cGUgKyAnIG9uIHRoZSB3aW5kb3cuZG9jdW1lbnQgb2JqZWN0IScpXHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHRyaWdnZXJzID0gdGhpcy5vcHRpb25zLnRyaWdnZXIuc3BsaXQoJyAnKVxyXG5cclxuICAgIGZvciAodmFyIGkgPSB0cmlnZ2Vycy5sZW5ndGg7IGktLTspIHtcclxuICAgICAgdmFyIHRyaWdnZXIgPSB0cmlnZ2Vyc1tpXVxyXG5cclxuICAgICAgaWYgKHRyaWdnZXIgPT0gJ2NsaWNrJykge1xyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQub24oJ2NsaWNrLicgKyB0aGlzLnR5cGUsIHRoaXMub3B0aW9ucy5zZWxlY3RvciwgJC5wcm94eSh0aGlzLnRvZ2dsZSwgdGhpcykpXHJcbiAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAhPSAnbWFudWFsJykge1xyXG4gICAgICAgIHZhciBldmVudEluICA9IHRyaWdnZXIgPT0gJ2hvdmVyJyA/ICdtb3VzZWVudGVyJyA6ICdmb2N1c2luJ1xyXG4gICAgICAgIHZhciBldmVudE91dCA9IHRyaWdnZXIgPT0gJ2hvdmVyJyA/ICdtb3VzZWxlYXZlJyA6ICdmb2N1c291dCdcclxuXHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5vbihldmVudEluICArICcuJyArIHRoaXMudHlwZSwgdGhpcy5vcHRpb25zLnNlbGVjdG9yLCAkLnByb3h5KHRoaXMuZW50ZXIsIHRoaXMpKVxyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQub24oZXZlbnRPdXQgKyAnLicgKyB0aGlzLnR5cGUsIHRoaXMub3B0aW9ucy5zZWxlY3RvciwgJC5wcm94eSh0aGlzLmxlYXZlLCB0aGlzKSlcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3B0aW9ucy5zZWxlY3RvciA/XHJcbiAgICAgICh0aGlzLl9vcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgeyB0cmlnZ2VyOiAnbWFudWFsJywgc2VsZWN0b3I6ICcnIH0pKSA6XHJcbiAgICAgIHRoaXMuZml4VGl0bGUoKVxyXG4gIH1cclxuXHJcbiAgVG9vbHRpcC5wcm90b3R5cGUuZ2V0RGVmYXVsdHMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gVG9vbHRpcC5ERUZBVUxUU1xyXG4gIH1cclxuXHJcbiAgVG9vbHRpcC5wcm90b3R5cGUuZ2V0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XHJcbiAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHRoaXMuZ2V0RGVmYXVsdHMoKSwgdGhpcy4kZWxlbWVudC5kYXRhKCksIG9wdGlvbnMpXHJcblxyXG4gICAgaWYgKG9wdGlvbnMuZGVsYXkgJiYgdHlwZW9mIG9wdGlvbnMuZGVsYXkgPT0gJ251bWJlcicpIHtcclxuICAgICAgb3B0aW9ucy5kZWxheSA9IHtcclxuICAgICAgICBzaG93OiBvcHRpb25zLmRlbGF5LFxyXG4gICAgICAgIGhpZGU6IG9wdGlvbnMuZGVsYXlcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvcHRpb25zXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZS5nZXREZWxlZ2F0ZU9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgb3B0aW9ucyAgPSB7fVxyXG4gICAgdmFyIGRlZmF1bHRzID0gdGhpcy5nZXREZWZhdWx0cygpXHJcblxyXG4gICAgdGhpcy5fb3B0aW9ucyAmJiAkLmVhY2godGhpcy5fb3B0aW9ucywgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcclxuICAgICAgaWYgKGRlZmF1bHRzW2tleV0gIT0gdmFsdWUpIG9wdGlvbnNba2V5XSA9IHZhbHVlXHJcbiAgICB9KVxyXG5cclxuICAgIHJldHVybiBvcHRpb25zXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZS5lbnRlciA9IGZ1bmN0aW9uIChvYmopIHtcclxuICAgIHZhciBzZWxmID0gb2JqIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3RvciA/XHJcbiAgICAgIG9iaiA6ICQob2JqLmN1cnJlbnRUYXJnZXQpLmRhdGEoJ2JzLicgKyB0aGlzLnR5cGUpXHJcblxyXG4gICAgaWYgKCFzZWxmKSB7XHJcbiAgICAgIHNlbGYgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihvYmouY3VycmVudFRhcmdldCwgdGhpcy5nZXREZWxlZ2F0ZU9wdGlvbnMoKSlcclxuICAgICAgJChvYmouY3VycmVudFRhcmdldCkuZGF0YSgnYnMuJyArIHRoaXMudHlwZSwgc2VsZilcclxuICAgIH1cclxuXHJcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgJC5FdmVudCkge1xyXG4gICAgICBzZWxmLmluU3RhdGVbb2JqLnR5cGUgPT0gJ2ZvY3VzaW4nID8gJ2ZvY3VzJyA6ICdob3ZlciddID0gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWxmLnRpcCgpLmhhc0NsYXNzKCdpbicpIHx8IHNlbGYuaG92ZXJTdGF0ZSA9PSAnaW4nKSB7XHJcbiAgICAgIHNlbGYuaG92ZXJTdGF0ZSA9ICdpbidcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJUaW1lb3V0KHNlbGYudGltZW91dClcclxuXHJcbiAgICBzZWxmLmhvdmVyU3RhdGUgPSAnaW4nXHJcblxyXG4gICAgaWYgKCFzZWxmLm9wdGlvbnMuZGVsYXkgfHwgIXNlbGYub3B0aW9ucy5kZWxheS5zaG93KSByZXR1cm4gc2VsZi5zaG93KClcclxuXHJcbiAgICBzZWxmLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgaWYgKHNlbGYuaG92ZXJTdGF0ZSA9PSAnaW4nKSBzZWxmLnNob3coKVxyXG4gICAgfSwgc2VsZi5vcHRpb25zLmRlbGF5LnNob3cpXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZS5pc0luU3RhdGVUcnVlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuaW5TdGF0ZSkge1xyXG4gICAgICBpZiAodGhpcy5pblN0YXRlW2tleV0pIHJldHVybiB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZS5sZWF2ZSA9IGZ1bmN0aW9uIChvYmopIHtcclxuICAgIHZhciBzZWxmID0gb2JqIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3RvciA/XHJcbiAgICAgIG9iaiA6ICQob2JqLmN1cnJlbnRUYXJnZXQpLmRhdGEoJ2JzLicgKyB0aGlzLnR5cGUpXHJcblxyXG4gICAgaWYgKCFzZWxmKSB7XHJcbiAgICAgIHNlbGYgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihvYmouY3VycmVudFRhcmdldCwgdGhpcy5nZXREZWxlZ2F0ZU9wdGlvbnMoKSlcclxuICAgICAgJChvYmouY3VycmVudFRhcmdldCkuZGF0YSgnYnMuJyArIHRoaXMudHlwZSwgc2VsZilcclxuICAgIH1cclxuXHJcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgJC5FdmVudCkge1xyXG4gICAgICBzZWxmLmluU3RhdGVbb2JqLnR5cGUgPT0gJ2ZvY3Vzb3V0JyA/ICdmb2N1cycgOiAnaG92ZXInXSA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNlbGYuaXNJblN0YXRlVHJ1ZSgpKSByZXR1cm5cclxuXHJcbiAgICBjbGVhclRpbWVvdXQoc2VsZi50aW1lb3V0KVxyXG5cclxuICAgIHNlbGYuaG92ZXJTdGF0ZSA9ICdvdXQnXHJcblxyXG4gICAgaWYgKCFzZWxmLm9wdGlvbnMuZGVsYXkgfHwgIXNlbGYub3B0aW9ucy5kZWxheS5oaWRlKSByZXR1cm4gc2VsZi5oaWRlKClcclxuXHJcbiAgICBzZWxmLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgaWYgKHNlbGYuaG92ZXJTdGF0ZSA9PSAnb3V0Jykgc2VsZi5oaWRlKClcclxuICAgIH0sIHNlbGYub3B0aW9ucy5kZWxheS5oaWRlKVxyXG4gIH1cclxuXHJcbiAgVG9vbHRpcC5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBlID0gJC5FdmVudCgnc2hvdy5icy4nICsgdGhpcy50eXBlKVxyXG5cclxuICAgIGlmICh0aGlzLmhhc0NvbnRlbnQoKSAmJiB0aGlzLmVuYWJsZWQpIHtcclxuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKGUpXHJcblxyXG4gICAgICB2YXIgaW5Eb20gPSAkLmNvbnRhaW5zKHRoaXMuJGVsZW1lbnRbMF0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHRoaXMuJGVsZW1lbnRbMF0pXHJcbiAgICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpIHx8ICFpbkRvbSkgcmV0dXJuXHJcbiAgICAgIHZhciB0aGF0ID0gdGhpc1xyXG5cclxuICAgICAgdmFyICR0aXAgPSB0aGlzLnRpcCgpXHJcblxyXG4gICAgICB2YXIgdGlwSWQgPSB0aGlzLmdldFVJRCh0aGlzLnR5cGUpXHJcblxyXG4gICAgICB0aGlzLnNldENvbnRlbnQoKVxyXG4gICAgICAkdGlwLmF0dHIoJ2lkJywgdGlwSWQpXHJcbiAgICAgIHRoaXMuJGVsZW1lbnQuYXR0cignYXJpYS1kZXNjcmliZWRieScsIHRpcElkKVxyXG5cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRpb24pICR0aXAuYWRkQ2xhc3MoJ2ZhZGUnKVxyXG5cclxuICAgICAgdmFyIHBsYWNlbWVudCA9IHR5cGVvZiB0aGlzLm9wdGlvbnMucGxhY2VtZW50ID09ICdmdW5jdGlvbicgP1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy5wbGFjZW1lbnQuY2FsbCh0aGlzLCAkdGlwWzBdLCB0aGlzLiRlbGVtZW50WzBdKSA6XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLnBsYWNlbWVudFxyXG5cclxuICAgICAgdmFyIGF1dG9Ub2tlbiA9IC9cXHM/YXV0bz9cXHM/L2lcclxuICAgICAgdmFyIGF1dG9QbGFjZSA9IGF1dG9Ub2tlbi50ZXN0KHBsYWNlbWVudClcclxuICAgICAgaWYgKGF1dG9QbGFjZSkgcGxhY2VtZW50ID0gcGxhY2VtZW50LnJlcGxhY2UoYXV0b1Rva2VuLCAnJykgfHwgJ3RvcCdcclxuXHJcbiAgICAgICR0aXBcclxuICAgICAgICAuZGV0YWNoKClcclxuICAgICAgICAuY3NzKHsgdG9wOiAwLCBsZWZ0OiAwLCBkaXNwbGF5OiAnYmxvY2snIH0pXHJcbiAgICAgICAgLmFkZENsYXNzKHBsYWNlbWVudClcclxuICAgICAgICAuZGF0YSgnYnMuJyArIHRoaXMudHlwZSwgdGhpcylcclxuXHJcbiAgICAgIHRoaXMub3B0aW9ucy5jb250YWluZXIgPyAkdGlwLmFwcGVuZFRvKHRoaXMub3B0aW9ucy5jb250YWluZXIpIDogJHRpcC5pbnNlcnRBZnRlcih0aGlzLiRlbGVtZW50KVxyXG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ2luc2VydGVkLmJzLicgKyB0aGlzLnR5cGUpXHJcblxyXG4gICAgICB2YXIgcG9zICAgICAgICAgID0gdGhpcy5nZXRQb3NpdGlvbigpXHJcbiAgICAgIHZhciBhY3R1YWxXaWR0aCAgPSAkdGlwWzBdLm9mZnNldFdpZHRoXHJcbiAgICAgIHZhciBhY3R1YWxIZWlnaHQgPSAkdGlwWzBdLm9mZnNldEhlaWdodFxyXG5cclxuICAgICAgaWYgKGF1dG9QbGFjZSkge1xyXG4gICAgICAgIHZhciBvcmdQbGFjZW1lbnQgPSBwbGFjZW1lbnRcclxuICAgICAgICB2YXIgdmlld3BvcnREaW0gPSB0aGlzLmdldFBvc2l0aW9uKHRoaXMuJHZpZXdwb3J0KVxyXG5cclxuICAgICAgICBwbGFjZW1lbnQgPSBwbGFjZW1lbnQgPT0gJ2JvdHRvbScgJiYgcG9zLmJvdHRvbSArIGFjdHVhbEhlaWdodCA+IHZpZXdwb3J0RGltLmJvdHRvbSA/ICd0b3AnICAgIDpcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQgPT0gJ3RvcCcgICAgJiYgcG9zLnRvcCAgICAtIGFjdHVhbEhlaWdodCA8IHZpZXdwb3J0RGltLnRvcCAgICA/ICdib3R0b20nIDpcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQgPT0gJ3JpZ2h0JyAgJiYgcG9zLnJpZ2h0ICArIGFjdHVhbFdpZHRoICA+IHZpZXdwb3J0RGltLndpZHRoICA/ICdsZWZ0JyAgIDpcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQgPT0gJ2xlZnQnICAgJiYgcG9zLmxlZnQgICAtIGFjdHVhbFdpZHRoICA8IHZpZXdwb3J0RGltLmxlZnQgICA/ICdyaWdodCcgIDpcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnRcclxuXHJcbiAgICAgICAgJHRpcFxyXG4gICAgICAgICAgLnJlbW92ZUNsYXNzKG9yZ1BsYWNlbWVudClcclxuICAgICAgICAgIC5hZGRDbGFzcyhwbGFjZW1lbnQpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBjYWxjdWxhdGVkT2Zmc2V0ID0gdGhpcy5nZXRDYWxjdWxhdGVkT2Zmc2V0KHBsYWNlbWVudCwgcG9zLCBhY3R1YWxXaWR0aCwgYWN0dWFsSGVpZ2h0KVxyXG5cclxuICAgICAgdGhpcy5hcHBseVBsYWNlbWVudChjYWxjdWxhdGVkT2Zmc2V0LCBwbGFjZW1lbnQpXHJcblxyXG4gICAgICB2YXIgY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIHByZXZIb3ZlclN0YXRlID0gdGhhdC5ob3ZlclN0YXRlXHJcbiAgICAgICAgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdzaG93bi5icy4nICsgdGhhdC50eXBlKVxyXG4gICAgICAgIHRoYXQuaG92ZXJTdGF0ZSA9IG51bGxcclxuXHJcbiAgICAgICAgaWYgKHByZXZIb3ZlclN0YXRlID09ICdvdXQnKSB0aGF0LmxlYXZlKHRoYXQpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmIHRoaXMuJHRpcC5oYXNDbGFzcygnZmFkZScpID9cclxuICAgICAgICAkdGlwXHJcbiAgICAgICAgICAub25lKCdic1RyYW5zaXRpb25FbmQnLCBjb21wbGV0ZSlcclxuICAgICAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChUb29sdGlwLlRSQU5TSVRJT05fRFVSQVRJT04pIDpcclxuICAgICAgICBjb21wbGV0ZSgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZS5hcHBseVBsYWNlbWVudCA9IGZ1bmN0aW9uIChvZmZzZXQsIHBsYWNlbWVudCkge1xyXG4gICAgdmFyICR0aXAgICA9IHRoaXMudGlwKClcclxuICAgIHZhciB3aWR0aCAgPSAkdGlwWzBdLm9mZnNldFdpZHRoXHJcbiAgICB2YXIgaGVpZ2h0ID0gJHRpcFswXS5vZmZzZXRIZWlnaHRcclxuXHJcbiAgICAvLyBtYW51YWxseSByZWFkIG1hcmdpbnMgYmVjYXVzZSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaW5jbHVkZXMgZGlmZmVyZW5jZVxyXG4gICAgdmFyIG1hcmdpblRvcCA9IHBhcnNlSW50KCR0aXAuY3NzKCdtYXJnaW4tdG9wJyksIDEwKVxyXG4gICAgdmFyIG1hcmdpbkxlZnQgPSBwYXJzZUludCgkdGlwLmNzcygnbWFyZ2luLWxlZnQnKSwgMTApXHJcblxyXG4gICAgLy8gd2UgbXVzdCBjaGVjayBmb3IgTmFOIGZvciBpZSA4LzlcclxuICAgIGlmIChpc05hTihtYXJnaW5Ub3ApKSAgbWFyZ2luVG9wICA9IDBcclxuICAgIGlmIChpc05hTihtYXJnaW5MZWZ0KSkgbWFyZ2luTGVmdCA9IDBcclxuXHJcbiAgICBvZmZzZXQudG9wICArPSBtYXJnaW5Ub3BcclxuICAgIG9mZnNldC5sZWZ0ICs9IG1hcmdpbkxlZnRcclxuXHJcbiAgICAvLyAkLmZuLm9mZnNldCBkb2Vzbid0IHJvdW5kIHBpeGVsIHZhbHVlc1xyXG4gICAgLy8gc28gd2UgdXNlIHNldE9mZnNldCBkaXJlY3RseSB3aXRoIG91ciBvd24gZnVuY3Rpb24gQi0wXHJcbiAgICAkLm9mZnNldC5zZXRPZmZzZXQoJHRpcFswXSwgJC5leHRlbmQoe1xyXG4gICAgICB1c2luZzogZnVuY3Rpb24gKHByb3BzKSB7XHJcbiAgICAgICAgJHRpcC5jc3Moe1xyXG4gICAgICAgICAgdG9wOiBNYXRoLnJvdW5kKHByb3BzLnRvcCksXHJcbiAgICAgICAgICBsZWZ0OiBNYXRoLnJvdW5kKHByb3BzLmxlZnQpXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSwgb2Zmc2V0KSwgMClcclxuXHJcbiAgICAkdGlwLmFkZENsYXNzKCdpbicpXHJcblxyXG4gICAgLy8gY2hlY2sgdG8gc2VlIGlmIHBsYWNpbmcgdGlwIGluIG5ldyBvZmZzZXQgY2F1c2VkIHRoZSB0aXAgdG8gcmVzaXplIGl0c2VsZlxyXG4gICAgdmFyIGFjdHVhbFdpZHRoICA9ICR0aXBbMF0ub2Zmc2V0V2lkdGhcclxuICAgIHZhciBhY3R1YWxIZWlnaHQgPSAkdGlwWzBdLm9mZnNldEhlaWdodFxyXG5cclxuICAgIGlmIChwbGFjZW1lbnQgPT0gJ3RvcCcgJiYgYWN0dWFsSGVpZ2h0ICE9IGhlaWdodCkge1xyXG4gICAgICBvZmZzZXQudG9wID0gb2Zmc2V0LnRvcCArIGhlaWdodCAtIGFjdHVhbEhlaWdodFxyXG4gICAgfVxyXG5cclxuICAgIHZhciBkZWx0YSA9IHRoaXMuZ2V0Vmlld3BvcnRBZGp1c3RlZERlbHRhKHBsYWNlbWVudCwgb2Zmc2V0LCBhY3R1YWxXaWR0aCwgYWN0dWFsSGVpZ2h0KVxyXG5cclxuICAgIGlmIChkZWx0YS5sZWZ0KSBvZmZzZXQubGVmdCArPSBkZWx0YS5sZWZ0XHJcbiAgICBlbHNlIG9mZnNldC50b3AgKz0gZGVsdGEudG9wXHJcblxyXG4gICAgdmFyIGlzVmVydGljYWwgICAgICAgICAgPSAvdG9wfGJvdHRvbS8udGVzdChwbGFjZW1lbnQpXHJcbiAgICB2YXIgYXJyb3dEZWx0YSAgICAgICAgICA9IGlzVmVydGljYWwgPyBkZWx0YS5sZWZ0ICogMiAtIHdpZHRoICsgYWN0dWFsV2lkdGggOiBkZWx0YS50b3AgKiAyIC0gaGVpZ2h0ICsgYWN0dWFsSGVpZ2h0XHJcbiAgICB2YXIgYXJyb3dPZmZzZXRQb3NpdGlvbiA9IGlzVmVydGljYWwgPyAnb2Zmc2V0V2lkdGgnIDogJ29mZnNldEhlaWdodCdcclxuXHJcbiAgICAkdGlwLm9mZnNldChvZmZzZXQpXHJcbiAgICB0aGlzLnJlcGxhY2VBcnJvdyhhcnJvd0RlbHRhLCAkdGlwWzBdW2Fycm93T2Zmc2V0UG9zaXRpb25dLCBpc1ZlcnRpY2FsKVxyXG4gIH1cclxuXHJcbiAgVG9vbHRpcC5wcm90b3R5cGUucmVwbGFjZUFycm93ID0gZnVuY3Rpb24gKGRlbHRhLCBkaW1lbnNpb24sIGlzVmVydGljYWwpIHtcclxuICAgIHRoaXMuYXJyb3coKVxyXG4gICAgICAuY3NzKGlzVmVydGljYWwgPyAnbGVmdCcgOiAndG9wJywgNTAgKiAoMSAtIGRlbHRhIC8gZGltZW5zaW9uKSArICclJylcclxuICAgICAgLmNzcyhpc1ZlcnRpY2FsID8gJ3RvcCcgOiAnbGVmdCcsICcnKVxyXG4gIH1cclxuXHJcbiAgVG9vbHRpcC5wcm90b3R5cGUuc2V0Q29udGVudCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciAkdGlwICA9IHRoaXMudGlwKClcclxuICAgIHZhciB0aXRsZSA9IHRoaXMuZ2V0VGl0bGUoKVxyXG5cclxuICAgICR0aXAuZmluZCgnLnRvb2x0aXAtaW5uZXInKVt0aGlzLm9wdGlvbnMuaHRtbCA/ICdodG1sJyA6ICd0ZXh0J10odGl0bGUpXHJcbiAgICAkdGlwLnJlbW92ZUNsYXNzKCdmYWRlIGluIHRvcCBib3R0b20gbGVmdCByaWdodCcpXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XHJcbiAgICB2YXIgdGhhdCA9IHRoaXNcclxuICAgIHZhciAkdGlwID0gJCh0aGlzLiR0aXApXHJcbiAgICB2YXIgZSAgICA9ICQuRXZlbnQoJ2hpZGUuYnMuJyArIHRoaXMudHlwZSlcclxuXHJcbiAgICBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcclxuICAgICAgaWYgKHRoYXQuaG92ZXJTdGF0ZSAhPSAnaW4nKSAkdGlwLmRldGFjaCgpXHJcbiAgICAgIGlmICh0aGF0LiRlbGVtZW50KSB7IC8vIFRPRE86IENoZWNrIHdoZXRoZXIgZ3VhcmRpbmcgdGhpcyBjb2RlIHdpdGggdGhpcyBgaWZgIGlzIHJlYWxseSBuZWNlc3NhcnkuXHJcbiAgICAgICAgdGhhdC4kZWxlbWVudFxyXG4gICAgICAgICAgLnJlbW92ZUF0dHIoJ2FyaWEtZGVzY3JpYmVkYnknKVxyXG4gICAgICAgICAgLnRyaWdnZXIoJ2hpZGRlbi5icy4nICsgdGhhdC50eXBlKVxyXG4gICAgICB9XHJcbiAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSlcclxuXHJcbiAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXHJcblxyXG4gICAgJHRpcC5yZW1vdmVDbGFzcygnaW4nKVxyXG5cclxuICAgICQuc3VwcG9ydC50cmFuc2l0aW9uICYmICR0aXAuaGFzQ2xhc3MoJ2ZhZGUnKSA/XHJcbiAgICAgICR0aXBcclxuICAgICAgICAub25lKCdic1RyYW5zaXRpb25FbmQnLCBjb21wbGV0ZSlcclxuICAgICAgICAuZW11bGF0ZVRyYW5zaXRpb25FbmQoVG9vbHRpcC5UUkFOU0lUSU9OX0RVUkFUSU9OKSA6XHJcbiAgICAgIGNvbXBsZXRlKClcclxuXHJcbiAgICB0aGlzLmhvdmVyU3RhdGUgPSBudWxsXHJcblxyXG4gICAgcmV0dXJuIHRoaXNcclxuICB9XHJcblxyXG4gIFRvb2x0aXAucHJvdG90eXBlLmZpeFRpdGxlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyICRlID0gdGhpcy4kZWxlbWVudFxyXG4gICAgaWYgKCRlLmF0dHIoJ3RpdGxlJykgfHwgdHlwZW9mICRlLmF0dHIoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnKSAhPSAnc3RyaW5nJykge1xyXG4gICAgICAkZS5hdHRyKCdkYXRhLW9yaWdpbmFsLXRpdGxlJywgJGUuYXR0cigndGl0bGUnKSB8fCAnJykuYXR0cigndGl0bGUnLCAnJylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIFRvb2x0aXAucHJvdG90eXBlLmhhc0NvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRUaXRsZSgpXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZS5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgkZWxlbWVudCkge1xyXG4gICAgJGVsZW1lbnQgICA9ICRlbGVtZW50IHx8IHRoaXMuJGVsZW1lbnRcclxuXHJcbiAgICB2YXIgZWwgICAgID0gJGVsZW1lbnRbMF1cclxuICAgIHZhciBpc0JvZHkgPSBlbC50YWdOYW1lID09ICdCT0RZJ1xyXG5cclxuICAgIHZhciBlbFJlY3QgICAgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxyXG4gICAgaWYgKGVsUmVjdC53aWR0aCA9PSBudWxsKSB7XHJcbiAgICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgYXJlIG1pc3NpbmcgaW4gSUU4LCBzbyBjb21wdXRlIHRoZW0gbWFudWFsbHk7IHNlZSBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvaXNzdWVzLzE0MDkzXHJcbiAgICAgIGVsUmVjdCA9ICQuZXh0ZW5kKHt9LCBlbFJlY3QsIHsgd2lkdGg6IGVsUmVjdC5yaWdodCAtIGVsUmVjdC5sZWZ0LCBoZWlnaHQ6IGVsUmVjdC5ib3R0b20gLSBlbFJlY3QudG9wIH0pXHJcbiAgICB9XHJcbiAgICB2YXIgaXNTdmcgPSB3aW5kb3cuU1ZHRWxlbWVudCAmJiBlbCBpbnN0YW5jZW9mIHdpbmRvdy5TVkdFbGVtZW50XHJcbiAgICAvLyBBdm9pZCB1c2luZyAkLm9mZnNldCgpIG9uIFNWR3Mgc2luY2UgaXQgZ2l2ZXMgaW5jb3JyZWN0IHJlc3VsdHMgaW4galF1ZXJ5IDMuXHJcbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8yMDI4MFxyXG4gICAgdmFyIGVsT2Zmc2V0ICA9IGlzQm9keSA/IHsgdG9wOiAwLCBsZWZ0OiAwIH0gOiAoaXNTdmcgPyBudWxsIDogJGVsZW1lbnQub2Zmc2V0KCkpXHJcbiAgICB2YXIgc2Nyb2xsICAgID0geyBzY3JvbGw6IGlzQm9keSA/IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgOiAkZWxlbWVudC5zY3JvbGxUb3AoKSB9XHJcbiAgICB2YXIgb3V0ZXJEaW1zID0gaXNCb2R5ID8geyB3aWR0aDogJCh3aW5kb3cpLndpZHRoKCksIGhlaWdodDogJCh3aW5kb3cpLmhlaWdodCgpIH0gOiBudWxsXHJcblxyXG4gICAgcmV0dXJuICQuZXh0ZW5kKHt9LCBlbFJlY3QsIHNjcm9sbCwgb3V0ZXJEaW1zLCBlbE9mZnNldClcclxuICB9XHJcblxyXG4gIFRvb2x0aXAucHJvdG90eXBlLmdldENhbGN1bGF0ZWRPZmZzZXQgPSBmdW5jdGlvbiAocGxhY2VtZW50LCBwb3MsIGFjdHVhbFdpZHRoLCBhY3R1YWxIZWlnaHQpIHtcclxuICAgIHJldHVybiBwbGFjZW1lbnQgPT0gJ2JvdHRvbScgPyB7IHRvcDogcG9zLnRvcCArIHBvcy5oZWlnaHQsICAgbGVmdDogcG9zLmxlZnQgKyBwb3Mud2lkdGggLyAyIC0gYWN0dWFsV2lkdGggLyAyIH0gOlxyXG4gICAgICAgICAgIHBsYWNlbWVudCA9PSAndG9wJyAgICA/IHsgdG9wOiBwb3MudG9wIC0gYWN0dWFsSGVpZ2h0LCBsZWZ0OiBwb3MubGVmdCArIHBvcy53aWR0aCAvIDIgLSBhY3R1YWxXaWR0aCAvIDIgfSA6XHJcbiAgICAgICAgICAgcGxhY2VtZW50ID09ICdsZWZ0JyAgID8geyB0b3A6IHBvcy50b3AgKyBwb3MuaGVpZ2h0IC8gMiAtIGFjdHVhbEhlaWdodCAvIDIsIGxlZnQ6IHBvcy5sZWZ0IC0gYWN0dWFsV2lkdGggfSA6XHJcbiAgICAgICAgLyogcGxhY2VtZW50ID09ICdyaWdodCcgKi8geyB0b3A6IHBvcy50b3AgKyBwb3MuaGVpZ2h0IC8gMiAtIGFjdHVhbEhlaWdodCAvIDIsIGxlZnQ6IHBvcy5sZWZ0ICsgcG9zLndpZHRoIH1cclxuXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZS5nZXRWaWV3cG9ydEFkanVzdGVkRGVsdGEgPSBmdW5jdGlvbiAocGxhY2VtZW50LCBwb3MsIGFjdHVhbFdpZHRoLCBhY3R1YWxIZWlnaHQpIHtcclxuICAgIHZhciBkZWx0YSA9IHsgdG9wOiAwLCBsZWZ0OiAwIH1cclxuICAgIGlmICghdGhpcy4kdmlld3BvcnQpIHJldHVybiBkZWx0YVxyXG5cclxuICAgIHZhciB2aWV3cG9ydFBhZGRpbmcgPSB0aGlzLm9wdGlvbnMudmlld3BvcnQgJiYgdGhpcy5vcHRpb25zLnZpZXdwb3J0LnBhZGRpbmcgfHwgMFxyXG4gICAgdmFyIHZpZXdwb3J0RGltZW5zaW9ucyA9IHRoaXMuZ2V0UG9zaXRpb24odGhpcy4kdmlld3BvcnQpXHJcblxyXG4gICAgaWYgKC9yaWdodHxsZWZ0Ly50ZXN0KHBsYWNlbWVudCkpIHtcclxuICAgICAgdmFyIHRvcEVkZ2VPZmZzZXQgICAgPSBwb3MudG9wIC0gdmlld3BvcnRQYWRkaW5nIC0gdmlld3BvcnREaW1lbnNpb25zLnNjcm9sbFxyXG4gICAgICB2YXIgYm90dG9tRWRnZU9mZnNldCA9IHBvcy50b3AgKyB2aWV3cG9ydFBhZGRpbmcgLSB2aWV3cG9ydERpbWVuc2lvbnMuc2Nyb2xsICsgYWN0dWFsSGVpZ2h0XHJcbiAgICAgIGlmICh0b3BFZGdlT2Zmc2V0IDwgdmlld3BvcnREaW1lbnNpb25zLnRvcCkgeyAvLyB0b3Agb3ZlcmZsb3dcclxuICAgICAgICBkZWx0YS50b3AgPSB2aWV3cG9ydERpbWVuc2lvbnMudG9wIC0gdG9wRWRnZU9mZnNldFxyXG4gICAgICB9IGVsc2UgaWYgKGJvdHRvbUVkZ2VPZmZzZXQgPiB2aWV3cG9ydERpbWVuc2lvbnMudG9wICsgdmlld3BvcnREaW1lbnNpb25zLmhlaWdodCkgeyAvLyBib3R0b20gb3ZlcmZsb3dcclxuICAgICAgICBkZWx0YS50b3AgPSB2aWV3cG9ydERpbWVuc2lvbnMudG9wICsgdmlld3BvcnREaW1lbnNpb25zLmhlaWdodCAtIGJvdHRvbUVkZ2VPZmZzZXRcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdmFyIGxlZnRFZGdlT2Zmc2V0ICA9IHBvcy5sZWZ0IC0gdmlld3BvcnRQYWRkaW5nXHJcbiAgICAgIHZhciByaWdodEVkZ2VPZmZzZXQgPSBwb3MubGVmdCArIHZpZXdwb3J0UGFkZGluZyArIGFjdHVhbFdpZHRoXHJcbiAgICAgIGlmIChsZWZ0RWRnZU9mZnNldCA8IHZpZXdwb3J0RGltZW5zaW9ucy5sZWZ0KSB7IC8vIGxlZnQgb3ZlcmZsb3dcclxuICAgICAgICBkZWx0YS5sZWZ0ID0gdmlld3BvcnREaW1lbnNpb25zLmxlZnQgLSBsZWZ0RWRnZU9mZnNldFxyXG4gICAgICB9IGVsc2UgaWYgKHJpZ2h0RWRnZU9mZnNldCA+IHZpZXdwb3J0RGltZW5zaW9ucy5yaWdodCkgeyAvLyByaWdodCBvdmVyZmxvd1xyXG4gICAgICAgIGRlbHRhLmxlZnQgPSB2aWV3cG9ydERpbWVuc2lvbnMubGVmdCArIHZpZXdwb3J0RGltZW5zaW9ucy53aWR0aCAtIHJpZ2h0RWRnZU9mZnNldFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGRlbHRhXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZS5nZXRUaXRsZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciB0aXRsZVxyXG4gICAgdmFyICRlID0gdGhpcy4kZWxlbWVudFxyXG4gICAgdmFyIG8gID0gdGhpcy5vcHRpb25zXHJcblxyXG4gICAgdGl0bGUgPSAkZS5hdHRyKCdkYXRhLW9yaWdpbmFsLXRpdGxlJylcclxuICAgICAgfHwgKHR5cGVvZiBvLnRpdGxlID09ICdmdW5jdGlvbicgPyBvLnRpdGxlLmNhbGwoJGVbMF0pIDogIG8udGl0bGUpXHJcblxyXG4gICAgcmV0dXJuIHRpdGxlXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZS5nZXRVSUQgPSBmdW5jdGlvbiAocHJlZml4KSB7XHJcbiAgICBkbyBwcmVmaXggKz0gfn4oTWF0aC5yYW5kb20oKSAqIDEwMDAwMDApXHJcbiAgICB3aGlsZSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHJlZml4KSlcclxuICAgIHJldHVybiBwcmVmaXhcclxuICB9XHJcblxyXG4gIFRvb2x0aXAucHJvdG90eXBlLnRpcCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGlmICghdGhpcy4kdGlwKSB7XHJcbiAgICAgIHRoaXMuJHRpcCA9ICQodGhpcy5vcHRpb25zLnRlbXBsYXRlKVxyXG4gICAgICBpZiAodGhpcy4kdGlwLmxlbmd0aCAhPSAxKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMudHlwZSArICcgYHRlbXBsYXRlYCBvcHRpb24gbXVzdCBjb25zaXN0IG9mIGV4YWN0bHkgMSB0b3AtbGV2ZWwgZWxlbWVudCEnKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy4kdGlwXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZS5hcnJvdyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiAodGhpcy4kYXJyb3cgPSB0aGlzLiRhcnJvdyB8fCB0aGlzLnRpcCgpLmZpbmQoJy50b29sdGlwLWFycm93JykpXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmVuYWJsZWQgPSB0cnVlXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICB9XHJcblxyXG4gIFRvb2x0aXAucHJvdG90eXBlLnRvZ2dsZUVuYWJsZWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmVuYWJsZWQgPSAhdGhpcy5lbmFibGVkXHJcbiAgfVxyXG5cclxuICBUb29sdGlwLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgdmFyIHNlbGYgPSB0aGlzXHJcbiAgICBpZiAoZSkge1xyXG4gICAgICBzZWxmID0gJChlLmN1cnJlbnRUYXJnZXQpLmRhdGEoJ2JzLicgKyB0aGlzLnR5cGUpXHJcbiAgICAgIGlmICghc2VsZikge1xyXG4gICAgICAgIHNlbGYgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihlLmN1cnJlbnRUYXJnZXQsIHRoaXMuZ2V0RGVsZWdhdGVPcHRpb25zKCkpXHJcbiAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpLmRhdGEoJ2JzLicgKyB0aGlzLnR5cGUsIHNlbGYpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZSkge1xyXG4gICAgICBzZWxmLmluU3RhdGUuY2xpY2sgPSAhc2VsZi5pblN0YXRlLmNsaWNrXHJcbiAgICAgIGlmIChzZWxmLmlzSW5TdGF0ZVRydWUoKSkgc2VsZi5lbnRlcihzZWxmKVxyXG4gICAgICBlbHNlIHNlbGYubGVhdmUoc2VsZilcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNlbGYudGlwKCkuaGFzQ2xhc3MoJ2luJykgPyBzZWxmLmxlYXZlKHNlbGYpIDogc2VsZi5lbnRlcihzZWxmKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgVG9vbHRpcC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciB0aGF0ID0gdGhpc1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dClcclxuICAgIHRoaXMuaGlkZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHRoYXQuJGVsZW1lbnQub2ZmKCcuJyArIHRoYXQudHlwZSkucmVtb3ZlRGF0YSgnYnMuJyArIHRoYXQudHlwZSlcclxuICAgICAgaWYgKHRoYXQuJHRpcCkge1xyXG4gICAgICAgIHRoYXQuJHRpcC5kZXRhY2goKVxyXG4gICAgICB9XHJcbiAgICAgIHRoYXQuJHRpcCA9IG51bGxcclxuICAgICAgdGhhdC4kYXJyb3cgPSBudWxsXHJcbiAgICAgIHRoYXQuJHZpZXdwb3J0ID0gbnVsbFxyXG4gICAgICB0aGF0LiRlbGVtZW50ID0gbnVsbFxyXG4gICAgfSlcclxuICB9XHJcblxyXG5cclxuICAvLyBUT09MVElQIFBMVUdJTiBERUZJTklUSU9OXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXHJcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnYnMudG9vbHRpcCcpXHJcbiAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb25cclxuXHJcbiAgICAgIGlmICghZGF0YSAmJiAvZGVzdHJveXxoaWRlLy50ZXN0KG9wdGlvbikpIHJldHVyblxyXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLnRvb2x0aXAnLCAoZGF0YSA9IG5ldyBUb29sdGlwKHRoaXMsIG9wdGlvbnMpKSlcclxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdmFyIG9sZCA9ICQuZm4udG9vbHRpcFxyXG5cclxuICAkLmZuLnRvb2x0aXAgICAgICAgICAgICAgPSBQbHVnaW5cclxuICAkLmZuLnRvb2x0aXAuQ29uc3RydWN0b3IgPSBUb29sdGlwXHJcblxyXG5cclxuICAvLyBUT09MVElQIE5PIENPTkZMSUNUXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAkLmZuLnRvb2x0aXAubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICQuZm4udG9vbHRpcCA9IG9sZFxyXG4gICAgcmV0dXJuIHRoaXNcclxuICB9XHJcblxyXG59KGpRdWVyeSk7XHJcblxyXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQm9vdHN0cmFwOiBwb3BvdmVyLmpzIHYzLjMuN1xyXG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyNwb3BvdmVyc1xyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuXHJcbitmdW5jdGlvbiAoJCkge1xyXG4gICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgLy8gUE9QT1ZFUiBQVUJMSUMgQ0xBU1MgREVGSU5JVElPTlxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgdmFyIFBvcG92ZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xyXG4gICAgdGhpcy5pbml0KCdwb3BvdmVyJywgZWxlbWVudCwgb3B0aW9ucylcclxuICB9XHJcblxyXG4gIGlmICghJC5mbi50b29sdGlwKSB0aHJvdyBuZXcgRXJyb3IoJ1BvcG92ZXIgcmVxdWlyZXMgdG9vbHRpcC5qcycpXHJcblxyXG4gIFBvcG92ZXIuVkVSU0lPTiAgPSAnMy4zLjcnXHJcblxyXG4gIFBvcG92ZXIuREVGQVVMVFMgPSAkLmV4dGVuZCh7fSwgJC5mbi50b29sdGlwLkNvbnN0cnVjdG9yLkRFRkFVTFRTLCB7XHJcbiAgICBwbGFjZW1lbnQ6ICdyaWdodCcsXHJcbiAgICB0cmlnZ2VyOiAnY2xpY2snLFxyXG4gICAgY29udGVudDogJycsXHJcbiAgICB0ZW1wbGF0ZTogJzxkaXYgY2xhc3M9XCJwb3BvdmVyXCIgcm9sZT1cInRvb2x0aXBcIj48ZGl2IGNsYXNzPVwiYXJyb3dcIj48L2Rpdj48aDMgY2xhc3M9XCJwb3BvdmVyLXRpdGxlXCI+PC9oMz48ZGl2IGNsYXNzPVwicG9wb3Zlci1jb250ZW50XCI+PC9kaXY+PC9kaXY+J1xyXG4gIH0pXHJcblxyXG5cclxuICAvLyBOT1RFOiBQT1BPVkVSIEVYVEVORFMgdG9vbHRpcC5qc1xyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIFBvcG92ZXIucHJvdG90eXBlID0gJC5leHRlbmQoe30sICQuZm4udG9vbHRpcC5Db25zdHJ1Y3Rvci5wcm90b3R5cGUpXHJcblxyXG4gIFBvcG92ZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9wb3ZlclxyXG5cclxuICBQb3BvdmVyLnByb3RvdHlwZS5nZXREZWZhdWx0cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHJldHVybiBQb3BvdmVyLkRFRkFVTFRTXHJcbiAgfVxyXG5cclxuICBQb3BvdmVyLnByb3RvdHlwZS5zZXRDb250ZW50ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyICR0aXAgICAgPSB0aGlzLnRpcCgpXHJcbiAgICB2YXIgdGl0bGUgICA9IHRoaXMuZ2V0VGl0bGUoKVxyXG4gICAgdmFyIGNvbnRlbnQgPSB0aGlzLmdldENvbnRlbnQoKVxyXG5cclxuICAgICR0aXAuZmluZCgnLnBvcG92ZXItdGl0bGUnKVt0aGlzLm9wdGlvbnMuaHRtbCA/ICdodG1sJyA6ICd0ZXh0J10odGl0bGUpXHJcbiAgICAkdGlwLmZpbmQoJy5wb3BvdmVyLWNvbnRlbnQnKS5jaGlsZHJlbigpLmRldGFjaCgpLmVuZCgpWyAvLyB3ZSB1c2UgYXBwZW5kIGZvciBodG1sIG9iamVjdHMgdG8gbWFpbnRhaW4ganMgZXZlbnRzXHJcbiAgICAgIHRoaXMub3B0aW9ucy5odG1sID8gKHR5cGVvZiBjb250ZW50ID09ICdzdHJpbmcnID8gJ2h0bWwnIDogJ2FwcGVuZCcpIDogJ3RleHQnXHJcbiAgICBdKGNvbnRlbnQpXHJcblxyXG4gICAgJHRpcC5yZW1vdmVDbGFzcygnZmFkZSB0b3AgYm90dG9tIGxlZnQgcmlnaHQgaW4nKVxyXG5cclxuICAgIC8vIElFOCBkb2Vzbid0IGFjY2VwdCBoaWRpbmcgdmlhIHRoZSBgOmVtcHR5YCBwc2V1ZG8gc2VsZWN0b3IsIHdlIGhhdmUgdG8gZG9cclxuICAgIC8vIHRoaXMgbWFudWFsbHkgYnkgY2hlY2tpbmcgdGhlIGNvbnRlbnRzLlxyXG4gICAgaWYgKCEkdGlwLmZpbmQoJy5wb3BvdmVyLXRpdGxlJykuaHRtbCgpKSAkdGlwLmZpbmQoJy5wb3BvdmVyLXRpdGxlJykuaGlkZSgpXHJcbiAgfVxyXG5cclxuICBQb3BvdmVyLnByb3RvdHlwZS5oYXNDb250ZW50ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0VGl0bGUoKSB8fCB0aGlzLmdldENvbnRlbnQoKVxyXG4gIH1cclxuXHJcbiAgUG9wb3Zlci5wcm90b3R5cGUuZ2V0Q29udGVudCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciAkZSA9IHRoaXMuJGVsZW1lbnRcclxuICAgIHZhciBvICA9IHRoaXMub3B0aW9uc1xyXG5cclxuICAgIHJldHVybiAkZS5hdHRyKCdkYXRhLWNvbnRlbnQnKVxyXG4gICAgICB8fCAodHlwZW9mIG8uY29udGVudCA9PSAnZnVuY3Rpb24nID9cclxuICAgICAgICAgICAgby5jb250ZW50LmNhbGwoJGVbMF0pIDpcclxuICAgICAgICAgICAgby5jb250ZW50KVxyXG4gIH1cclxuXHJcbiAgUG9wb3Zlci5wcm90b3R5cGUuYXJyb3cgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMuJGFycm93ID0gdGhpcy4kYXJyb3cgfHwgdGhpcy50aXAoKS5maW5kKCcuYXJyb3cnKSlcclxuICB9XHJcblxyXG5cclxuICAvLyBQT1BPVkVSIFBMVUdJTiBERUZJTklUSU9OXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXHJcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnYnMucG9wb3ZlcicpXHJcbiAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb25cclxuXHJcbiAgICAgIGlmICghZGF0YSAmJiAvZGVzdHJveXxoaWRlLy50ZXN0KG9wdGlvbikpIHJldHVyblxyXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLnBvcG92ZXInLCAoZGF0YSA9IG5ldyBQb3BvdmVyKHRoaXMsIG9wdGlvbnMpKSlcclxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdmFyIG9sZCA9ICQuZm4ucG9wb3ZlclxyXG5cclxuICAkLmZuLnBvcG92ZXIgICAgICAgICAgICAgPSBQbHVnaW5cclxuICAkLmZuLnBvcG92ZXIuQ29uc3RydWN0b3IgPSBQb3BvdmVyXHJcblxyXG5cclxuICAvLyBQT1BPVkVSIE5PIENPTkZMSUNUXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAkLmZuLnBvcG92ZXIubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICQuZm4ucG9wb3ZlciA9IG9sZFxyXG4gICAgcmV0dXJuIHRoaXNcclxuICB9XHJcblxyXG59KGpRdWVyeSk7XHJcblxyXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQm9vdHN0cmFwOiBzY3JvbGxzcHkuanMgdjMuMy43XHJcbiAqIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2phdmFzY3JpcHQvI3Njcm9sbHNweVxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQ29weXJpZ2h0IDIwMTEtMjAxNiBUd2l0dGVyLCBJbmMuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xyXG5cclxuXHJcbitmdW5jdGlvbiAoJCkge1xyXG4gICd1c2Ugc3RyaWN0JztcclxuXHJcbiAgLy8gU0NST0xMU1BZIENMQVNTIERFRklOSVRJT05cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICBmdW5jdGlvbiBTY3JvbGxTcHkoZWxlbWVudCwgb3B0aW9ucykge1xyXG4gICAgdGhpcy4kYm9keSAgICAgICAgICA9ICQoZG9jdW1lbnQuYm9keSlcclxuICAgIHRoaXMuJHNjcm9sbEVsZW1lbnQgPSAkKGVsZW1lbnQpLmlzKGRvY3VtZW50LmJvZHkpID8gJCh3aW5kb3cpIDogJChlbGVtZW50KVxyXG4gICAgdGhpcy5vcHRpb25zICAgICAgICA9ICQuZXh0ZW5kKHt9LCBTY3JvbGxTcHkuREVGQVVMVFMsIG9wdGlvbnMpXHJcbiAgICB0aGlzLnNlbGVjdG9yICAgICAgID0gKHRoaXMub3B0aW9ucy50YXJnZXQgfHwgJycpICsgJyAubmF2IGxpID4gYSdcclxuICAgIHRoaXMub2Zmc2V0cyAgICAgICAgPSBbXVxyXG4gICAgdGhpcy50YXJnZXRzICAgICAgICA9IFtdXHJcbiAgICB0aGlzLmFjdGl2ZVRhcmdldCAgID0gbnVsbFxyXG4gICAgdGhpcy5zY3JvbGxIZWlnaHQgICA9IDBcclxuXHJcbiAgICB0aGlzLiRzY3JvbGxFbGVtZW50Lm9uKCdzY3JvbGwuYnMuc2Nyb2xsc3B5JywgJC5wcm94eSh0aGlzLnByb2Nlc3MsIHRoaXMpKVxyXG4gICAgdGhpcy5yZWZyZXNoKClcclxuICAgIHRoaXMucHJvY2VzcygpXHJcbiAgfVxyXG5cclxuICBTY3JvbGxTcHkuVkVSU0lPTiAgPSAnMy4zLjcnXHJcblxyXG4gIFNjcm9sbFNweS5ERUZBVUxUUyA9IHtcclxuICAgIG9mZnNldDogMTBcclxuICB9XHJcblxyXG4gIFNjcm9sbFNweS5wcm90b3R5cGUuZ2V0U2Nyb2xsSGVpZ2h0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuJHNjcm9sbEVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0IHx8IE1hdGgubWF4KHRoaXMuJGJvZHlbMF0uc2Nyb2xsSGVpZ2h0LCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0KVxyXG4gIH1cclxuXHJcbiAgU2Nyb2xsU3B5LnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIHRoYXQgICAgICAgICAgPSB0aGlzXHJcbiAgICB2YXIgb2Zmc2V0TWV0aG9kICA9ICdvZmZzZXQnXHJcbiAgICB2YXIgb2Zmc2V0QmFzZSAgICA9IDBcclxuXHJcbiAgICB0aGlzLm9mZnNldHMgICAgICA9IFtdXHJcbiAgICB0aGlzLnRhcmdldHMgICAgICA9IFtdXHJcbiAgICB0aGlzLnNjcm9sbEhlaWdodCA9IHRoaXMuZ2V0U2Nyb2xsSGVpZ2h0KClcclxuXHJcbiAgICBpZiAoISQuaXNXaW5kb3codGhpcy4kc2Nyb2xsRWxlbWVudFswXSkpIHtcclxuICAgICAgb2Zmc2V0TWV0aG9kID0gJ3Bvc2l0aW9uJ1xyXG4gICAgICBvZmZzZXRCYXNlICAgPSB0aGlzLiRzY3JvbGxFbGVtZW50LnNjcm9sbFRvcCgpXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy4kYm9keVxyXG4gICAgICAuZmluZCh0aGlzLnNlbGVjdG9yKVxyXG4gICAgICAubWFwKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgJGVsICAgPSAkKHRoaXMpXHJcbiAgICAgICAgdmFyIGhyZWYgID0gJGVsLmRhdGEoJ3RhcmdldCcpIHx8ICRlbC5hdHRyKCdocmVmJylcclxuICAgICAgICB2YXIgJGhyZWYgPSAvXiMuLy50ZXN0KGhyZWYpICYmICQoaHJlZilcclxuXHJcbiAgICAgICAgcmV0dXJuICgkaHJlZlxyXG4gICAgICAgICAgJiYgJGhyZWYubGVuZ3RoXHJcbiAgICAgICAgICAmJiAkaHJlZi5pcygnOnZpc2libGUnKVxyXG4gICAgICAgICAgJiYgW1skaHJlZltvZmZzZXRNZXRob2RdKCkudG9wICsgb2Zmc2V0QmFzZSwgaHJlZl1dKSB8fCBudWxsXHJcbiAgICAgIH0pXHJcbiAgICAgIC5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhWzBdIC0gYlswXSB9KVxyXG4gICAgICAuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhhdC5vZmZzZXRzLnB1c2godGhpc1swXSlcclxuICAgICAgICB0aGF0LnRhcmdldHMucHVzaCh0aGlzWzFdKVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgU2Nyb2xsU3B5LnByb3RvdHlwZS5wcm9jZXNzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIHNjcm9sbFRvcCAgICA9IHRoaXMuJHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wKCkgKyB0aGlzLm9wdGlvbnMub2Zmc2V0XHJcbiAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gdGhpcy5nZXRTY3JvbGxIZWlnaHQoKVxyXG4gICAgdmFyIG1heFNjcm9sbCAgICA9IHRoaXMub3B0aW9ucy5vZmZzZXQgKyBzY3JvbGxIZWlnaHQgLSB0aGlzLiRzY3JvbGxFbGVtZW50LmhlaWdodCgpXHJcbiAgICB2YXIgb2Zmc2V0cyAgICAgID0gdGhpcy5vZmZzZXRzXHJcbiAgICB2YXIgdGFyZ2V0cyAgICAgID0gdGhpcy50YXJnZXRzXHJcbiAgICB2YXIgYWN0aXZlVGFyZ2V0ID0gdGhpcy5hY3RpdmVUYXJnZXRcclxuICAgIHZhciBpXHJcblxyXG4gICAgaWYgKHRoaXMuc2Nyb2xsSGVpZ2h0ICE9IHNjcm9sbEhlaWdodCkge1xyXG4gICAgICB0aGlzLnJlZnJlc2goKVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChzY3JvbGxUb3AgPj0gbWF4U2Nyb2xsKSB7XHJcbiAgICAgIHJldHVybiBhY3RpdmVUYXJnZXQgIT0gKGkgPSB0YXJnZXRzW3RhcmdldHMubGVuZ3RoIC0gMV0pICYmIHRoaXMuYWN0aXZhdGUoaSlcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYWN0aXZlVGFyZ2V0ICYmIHNjcm9sbFRvcCA8IG9mZnNldHNbMF0pIHtcclxuICAgICAgdGhpcy5hY3RpdmVUYXJnZXQgPSBudWxsXHJcbiAgICAgIHJldHVybiB0aGlzLmNsZWFyKClcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGkgPSBvZmZzZXRzLmxlbmd0aDsgaS0tOykge1xyXG4gICAgICBhY3RpdmVUYXJnZXQgIT0gdGFyZ2V0c1tpXVxyXG4gICAgICAgICYmIHNjcm9sbFRvcCA+PSBvZmZzZXRzW2ldXHJcbiAgICAgICAgJiYgKG9mZnNldHNbaSArIDFdID09PSB1bmRlZmluZWQgfHwgc2Nyb2xsVG9wIDwgb2Zmc2V0c1tpICsgMV0pXHJcbiAgICAgICAgJiYgdGhpcy5hY3RpdmF0ZSh0YXJnZXRzW2ldKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgU2Nyb2xsU3B5LnByb3RvdHlwZS5hY3RpdmF0ZSA9IGZ1bmN0aW9uICh0YXJnZXQpIHtcclxuICAgIHRoaXMuYWN0aXZlVGFyZ2V0ID0gdGFyZ2V0XHJcblxyXG4gICAgdGhpcy5jbGVhcigpXHJcblxyXG4gICAgdmFyIHNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciArXHJcbiAgICAgICdbZGF0YS10YXJnZXQ9XCInICsgdGFyZ2V0ICsgJ1wiXSwnICtcclxuICAgICAgdGhpcy5zZWxlY3RvciArICdbaHJlZj1cIicgKyB0YXJnZXQgKyAnXCJdJ1xyXG5cclxuICAgIHZhciBhY3RpdmUgPSAkKHNlbGVjdG9yKVxyXG4gICAgICAucGFyZW50cygnbGknKVxyXG4gICAgICAuYWRkQ2xhc3MoJ2FjdGl2ZScpXHJcblxyXG4gICAgaWYgKGFjdGl2ZS5wYXJlbnQoJy5kcm9wZG93bi1tZW51JykubGVuZ3RoKSB7XHJcbiAgICAgIGFjdGl2ZSA9IGFjdGl2ZVxyXG4gICAgICAgIC5jbG9zZXN0KCdsaS5kcm9wZG93bicpXHJcbiAgICAgICAgLmFkZENsYXNzKCdhY3RpdmUnKVxyXG4gICAgfVxyXG5cclxuICAgIGFjdGl2ZS50cmlnZ2VyKCdhY3RpdmF0ZS5icy5zY3JvbGxzcHknKVxyXG4gIH1cclxuXHJcbiAgU2Nyb2xsU3B5LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICQodGhpcy5zZWxlY3RvcilcclxuICAgICAgLnBhcmVudHNVbnRpbCh0aGlzLm9wdGlvbnMudGFyZ2V0LCAnLmFjdGl2ZScpXHJcbiAgICAgIC5yZW1vdmVDbGFzcygnYWN0aXZlJylcclxuICB9XHJcblxyXG5cclxuICAvLyBTQ1JPTExTUFkgUExVR0lOIERFRklOSVRJT05cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgZnVuY3Rpb24gUGx1Z2luKG9wdGlvbikge1xyXG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyAgID0gJCh0aGlzKVxyXG4gICAgICB2YXIgZGF0YSAgICA9ICR0aGlzLmRhdGEoJ2JzLnNjcm9sbHNweScpXHJcbiAgICAgIHZhciBvcHRpb25zID0gdHlwZW9mIG9wdGlvbiA9PSAnb2JqZWN0JyAmJiBvcHRpb25cclxuXHJcbiAgICAgIGlmICghZGF0YSkgJHRoaXMuZGF0YSgnYnMuc2Nyb2xsc3B5JywgKGRhdGEgPSBuZXcgU2Nyb2xsU3B5KHRoaXMsIG9wdGlvbnMpKSlcclxuICAgICAgaWYgKHR5cGVvZiBvcHRpb24gPT0gJ3N0cmluZycpIGRhdGFbb3B0aW9uXSgpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdmFyIG9sZCA9ICQuZm4uc2Nyb2xsc3B5XHJcblxyXG4gICQuZm4uc2Nyb2xsc3B5ICAgICAgICAgICAgID0gUGx1Z2luXHJcbiAgJC5mbi5zY3JvbGxzcHkuQ29uc3RydWN0b3IgPSBTY3JvbGxTcHlcclxuXHJcblxyXG4gIC8vIFNDUk9MTFNQWSBOTyBDT05GTElDVFxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAkLmZuLnNjcm9sbHNweS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgJC5mbi5zY3JvbGxzcHkgPSBvbGRcclxuICAgIHJldHVybiB0aGlzXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gU0NST0xMU1BZIERBVEEtQVBJXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09XHJcblxyXG4gICQod2luZG93KS5vbignbG9hZC5icy5zY3JvbGxzcHkuZGF0YS1hcGknLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAkKCdbZGF0YS1zcHk9XCJzY3JvbGxcIl0nKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICRzcHkgPSAkKHRoaXMpXHJcbiAgICAgIFBsdWdpbi5jYWxsKCRzcHksICRzcHkuZGF0YSgpKVxyXG4gICAgfSlcclxuICB9KVxyXG5cclxufShqUXVlcnkpO1xyXG5cclxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIEJvb3RzdHJhcDogdGFiLmpzIHYzLjMuN1xyXG4gKiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9qYXZhc2NyaXB0LyN0YWJzXHJcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gKiBDb3B5cmlnaHQgMjAxMS0yMDE2IFR3aXR0ZXIsIEluYy5cclxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovXHJcblxyXG5cclxuK2Z1bmN0aW9uICgkKSB7XHJcbiAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAvLyBUQUIgQ0xBU1MgREVGSU5JVElPTlxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIHZhciBUYWIgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xyXG4gICAgLy8ganNjczpkaXNhYmxlIHJlcXVpcmVEb2xsYXJCZWZvcmVqUXVlcnlBc3NpZ25tZW50XHJcbiAgICB0aGlzLmVsZW1lbnQgPSAkKGVsZW1lbnQpXHJcbiAgICAvLyBqc2NzOmVuYWJsZSByZXF1aXJlRG9sbGFyQmVmb3JlalF1ZXJ5QXNzaWdubWVudFxyXG4gIH1cclxuXHJcbiAgVGFiLlZFUlNJT04gPSAnMy4zLjcnXHJcblxyXG4gIFRhYi5UUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwXHJcblxyXG4gIFRhYi5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciAkdGhpcyAgICA9IHRoaXMuZWxlbWVudFxyXG4gICAgdmFyICR1bCAgICAgID0gJHRoaXMuY2xvc2VzdCgndWw6bm90KC5kcm9wZG93bi1tZW51KScpXHJcbiAgICB2YXIgc2VsZWN0b3IgPSAkdGhpcy5kYXRhKCd0YXJnZXQnKVxyXG5cclxuICAgIGlmICghc2VsZWN0b3IpIHtcclxuICAgICAgc2VsZWN0b3IgPSAkdGhpcy5hdHRyKCdocmVmJylcclxuICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvciAmJiBzZWxlY3Rvci5yZXBsYWNlKC8uKig/PSNbXlxcc10qJCkvLCAnJykgLy8gc3RyaXAgZm9yIGllN1xyXG4gICAgfVxyXG5cclxuICAgIGlmICgkdGhpcy5wYXJlbnQoJ2xpJykuaGFzQ2xhc3MoJ2FjdGl2ZScpKSByZXR1cm5cclxuXHJcbiAgICB2YXIgJHByZXZpb3VzID0gJHVsLmZpbmQoJy5hY3RpdmU6bGFzdCBhJylcclxuICAgIHZhciBoaWRlRXZlbnQgPSAkLkV2ZW50KCdoaWRlLmJzLnRhYicsIHtcclxuICAgICAgcmVsYXRlZFRhcmdldDogJHRoaXNbMF1cclxuICAgIH0pXHJcbiAgICB2YXIgc2hvd0V2ZW50ID0gJC5FdmVudCgnc2hvdy5icy50YWInLCB7XHJcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6ICRwcmV2aW91c1swXVxyXG4gICAgfSlcclxuXHJcbiAgICAkcHJldmlvdXMudHJpZ2dlcihoaWRlRXZlbnQpXHJcbiAgICAkdGhpcy50cmlnZ2VyKHNob3dFdmVudClcclxuXHJcbiAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpIHx8IGhpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXHJcblxyXG4gICAgdmFyICR0YXJnZXQgPSAkKHNlbGVjdG9yKVxyXG5cclxuICAgIHRoaXMuYWN0aXZhdGUoJHRoaXMuY2xvc2VzdCgnbGknKSwgJHVsKVxyXG4gICAgdGhpcy5hY3RpdmF0ZSgkdGFyZ2V0LCAkdGFyZ2V0LnBhcmVudCgpLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICRwcmV2aW91cy50cmlnZ2VyKHtcclxuICAgICAgICB0eXBlOiAnaGlkZGVuLmJzLnRhYicsXHJcbiAgICAgICAgcmVsYXRlZFRhcmdldDogJHRoaXNbMF1cclxuICAgICAgfSlcclxuICAgICAgJHRoaXMudHJpZ2dlcih7XHJcbiAgICAgICAgdHlwZTogJ3Nob3duLmJzLnRhYicsXHJcbiAgICAgICAgcmVsYXRlZFRhcmdldDogJHByZXZpb3VzWzBdXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgVGFiLnByb3RvdHlwZS5hY3RpdmF0ZSA9IGZ1bmN0aW9uIChlbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XHJcbiAgICB2YXIgJGFjdGl2ZSAgICA9IGNvbnRhaW5lci5maW5kKCc+IC5hY3RpdmUnKVxyXG4gICAgdmFyIHRyYW5zaXRpb24gPSBjYWxsYmFja1xyXG4gICAgICAmJiAkLnN1cHBvcnQudHJhbnNpdGlvblxyXG4gICAgICAmJiAoJGFjdGl2ZS5sZW5ndGggJiYgJGFjdGl2ZS5oYXNDbGFzcygnZmFkZScpIHx8ICEhY29udGFpbmVyLmZpbmQoJz4gLmZhZGUnKS5sZW5ndGgpXHJcblxyXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcclxuICAgICAgJGFjdGl2ZVxyXG4gICAgICAgIC5yZW1vdmVDbGFzcygnYWN0aXZlJylcclxuICAgICAgICAuZmluZCgnPiAuZHJvcGRvd24tbWVudSA+IC5hY3RpdmUnKVxyXG4gICAgICAgICAgLnJlbW92ZUNsYXNzKCdhY3RpdmUnKVxyXG4gICAgICAgIC5lbmQoKVxyXG4gICAgICAgIC5maW5kKCdbZGF0YS10b2dnbGU9XCJ0YWJcIl0nKVxyXG4gICAgICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSlcclxuXHJcbiAgICAgIGVsZW1lbnRcclxuICAgICAgICAuYWRkQ2xhc3MoJ2FjdGl2ZScpXHJcbiAgICAgICAgLmZpbmQoJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXScpXHJcbiAgICAgICAgICAuYXR0cignYXJpYS1leHBhbmRlZCcsIHRydWUpXHJcblxyXG4gICAgICBpZiAodHJhbnNpdGlvbikge1xyXG4gICAgICAgIGVsZW1lbnRbMF0ub2Zmc2V0V2lkdGggLy8gcmVmbG93IGZvciB0cmFuc2l0aW9uXHJcbiAgICAgICAgZWxlbWVudC5hZGRDbGFzcygnaW4nKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2ZhZGUnKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZWxlbWVudC5wYXJlbnQoJy5kcm9wZG93bi1tZW51JykubGVuZ3RoKSB7XHJcbiAgICAgICAgZWxlbWVudFxyXG4gICAgICAgICAgLmNsb3Nlc3QoJ2xpLmRyb3Bkb3duJylcclxuICAgICAgICAgICAgLmFkZENsYXNzKCdhY3RpdmUnKVxyXG4gICAgICAgICAgLmVuZCgpXHJcbiAgICAgICAgICAuZmluZCgnW2RhdGEtdG9nZ2xlPVwidGFiXCJdJylcclxuICAgICAgICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjYWxsYmFjayAmJiBjYWxsYmFjaygpXHJcbiAgICB9XHJcblxyXG4gICAgJGFjdGl2ZS5sZW5ndGggJiYgdHJhbnNpdGlvbiA/XHJcbiAgICAgICRhY3RpdmVcclxuICAgICAgICAub25lKCdic1RyYW5zaXRpb25FbmQnLCBuZXh0KVxyXG4gICAgICAgIC5lbXVsYXRlVHJhbnNpdGlvbkVuZChUYWIuVFJBTlNJVElPTl9EVVJBVElPTikgOlxyXG4gICAgICBuZXh0KClcclxuXHJcbiAgICAkYWN0aXZlLnJlbW92ZUNsYXNzKCdpbicpXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gVEFCIFBMVUdJTiBERUZJTklUSU9OXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIGZ1bmN0aW9uIFBsdWdpbihvcHRpb24pIHtcclxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpXHJcbiAgICAgIHZhciBkYXRhICA9ICR0aGlzLmRhdGEoJ2JzLnRhYicpXHJcblxyXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLnRhYicsIChkYXRhID0gbmV3IFRhYih0aGlzKSkpXHJcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnKSBkYXRhW29wdGlvbl0oKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHZhciBvbGQgPSAkLmZuLnRhYlxyXG5cclxuICAkLmZuLnRhYiAgICAgICAgICAgICA9IFBsdWdpblxyXG4gICQuZm4udGFiLkNvbnN0cnVjdG9yID0gVGFiXHJcblxyXG5cclxuICAvLyBUQUIgTk8gQ09ORkxJQ1RcclxuICAvLyA9PT09PT09PT09PT09PT1cclxuXHJcbiAgJC5mbi50YWIubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICQuZm4udGFiID0gb2xkXHJcbiAgICByZXR1cm4gdGhpc1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIFRBQiBEQVRBLUFQSVxyXG4gIC8vID09PT09PT09PT09PVxyXG5cclxuICB2YXIgY2xpY2tIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHtcclxuICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgUGx1Z2luLmNhbGwoJCh0aGlzKSwgJ3Nob3cnKVxyXG4gIH1cclxuXHJcbiAgJChkb2N1bWVudClcclxuICAgIC5vbignY2xpY2suYnMudGFiLmRhdGEtYXBpJywgJ1tkYXRhLXRvZ2dsZT1cInRhYlwiXScsIGNsaWNrSGFuZGxlcilcclxuICAgIC5vbignY2xpY2suYnMudGFiLmRhdGEtYXBpJywgJ1tkYXRhLXRvZ2dsZT1cInBpbGxcIl0nLCBjbGlja0hhbmRsZXIpXHJcblxyXG59KGpRdWVyeSk7XHJcblxyXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICogQm9vdHN0cmFwOiBhZmZpeC5qcyB2My4zLjdcclxuICogaHR0cDovL2dldGJvb3RzdHJhcC5jb20vamF2YXNjcmlwdC8jYWZmaXhcclxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAqIENvcHlyaWdodCAyMDExLTIwMTYgVHdpdHRlciwgSW5jLlxyXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxyXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cclxuXHJcblxyXG4rZnVuY3Rpb24gKCQpIHtcclxuICAndXNlIHN0cmljdCc7XHJcblxyXG4gIC8vIEFGRklYIENMQVNTIERFRklOSVRJT05cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIHZhciBBZmZpeCA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zKSB7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgQWZmaXguREVGQVVMVFMsIG9wdGlvbnMpXHJcblxyXG4gICAgdGhpcy4kdGFyZ2V0ID0gJCh0aGlzLm9wdGlvbnMudGFyZ2V0KVxyXG4gICAgICAub24oJ3Njcm9sbC5icy5hZmZpeC5kYXRhLWFwaScsICQucHJveHkodGhpcy5jaGVja1Bvc2l0aW9uLCB0aGlzKSlcclxuICAgICAgLm9uKCdjbGljay5icy5hZmZpeC5kYXRhLWFwaScsICAkLnByb3h5KHRoaXMuY2hlY2tQb3NpdGlvbldpdGhFdmVudExvb3AsIHRoaXMpKVxyXG5cclxuICAgIHRoaXMuJGVsZW1lbnQgICAgID0gJChlbGVtZW50KVxyXG4gICAgdGhpcy5hZmZpeGVkICAgICAgPSBudWxsXHJcbiAgICB0aGlzLnVucGluICAgICAgICA9IG51bGxcclxuICAgIHRoaXMucGlubmVkT2Zmc2V0ID0gbnVsbFxyXG5cclxuICAgIHRoaXMuY2hlY2tQb3NpdGlvbigpXHJcbiAgfVxyXG5cclxuICBBZmZpeC5WRVJTSU9OICA9ICczLjMuNydcclxuXHJcbiAgQWZmaXguUkVTRVQgICAgPSAnYWZmaXggYWZmaXgtdG9wIGFmZml4LWJvdHRvbSdcclxuXHJcbiAgQWZmaXguREVGQVVMVFMgPSB7XHJcbiAgICBvZmZzZXQ6IDAsXHJcbiAgICB0YXJnZXQ6IHdpbmRvd1xyXG4gIH1cclxuXHJcbiAgQWZmaXgucHJvdG90eXBlLmdldFN0YXRlID0gZnVuY3Rpb24gKHNjcm9sbEhlaWdodCwgaGVpZ2h0LCBvZmZzZXRUb3AsIG9mZnNldEJvdHRvbSkge1xyXG4gICAgdmFyIHNjcm9sbFRvcCAgICA9IHRoaXMuJHRhcmdldC5zY3JvbGxUb3AoKVxyXG4gICAgdmFyIHBvc2l0aW9uICAgICA9IHRoaXMuJGVsZW1lbnQub2Zmc2V0KClcclxuICAgIHZhciB0YXJnZXRIZWlnaHQgPSB0aGlzLiR0YXJnZXQuaGVpZ2h0KClcclxuXHJcbiAgICBpZiAob2Zmc2V0VG9wICE9IG51bGwgJiYgdGhpcy5hZmZpeGVkID09ICd0b3AnKSByZXR1cm4gc2Nyb2xsVG9wIDwgb2Zmc2V0VG9wID8gJ3RvcCcgOiBmYWxzZVxyXG5cclxuICAgIGlmICh0aGlzLmFmZml4ZWQgPT0gJ2JvdHRvbScpIHtcclxuICAgICAgaWYgKG9mZnNldFRvcCAhPSBudWxsKSByZXR1cm4gKHNjcm9sbFRvcCArIHRoaXMudW5waW4gPD0gcG9zaXRpb24udG9wKSA/IGZhbHNlIDogJ2JvdHRvbSdcclxuICAgICAgcmV0dXJuIChzY3JvbGxUb3AgKyB0YXJnZXRIZWlnaHQgPD0gc2Nyb2xsSGVpZ2h0IC0gb2Zmc2V0Qm90dG9tKSA/IGZhbHNlIDogJ2JvdHRvbSdcclxuICAgIH1cclxuXHJcbiAgICB2YXIgaW5pdGlhbGl6aW5nICAgPSB0aGlzLmFmZml4ZWQgPT0gbnVsbFxyXG4gICAgdmFyIGNvbGxpZGVyVG9wICAgID0gaW5pdGlhbGl6aW5nID8gc2Nyb2xsVG9wIDogcG9zaXRpb24udG9wXHJcbiAgICB2YXIgY29sbGlkZXJIZWlnaHQgPSBpbml0aWFsaXppbmcgPyB0YXJnZXRIZWlnaHQgOiBoZWlnaHRcclxuXHJcbiAgICBpZiAob2Zmc2V0VG9wICE9IG51bGwgJiYgc2Nyb2xsVG9wIDw9IG9mZnNldFRvcCkgcmV0dXJuICd0b3AnXHJcbiAgICBpZiAob2Zmc2V0Qm90dG9tICE9IG51bGwgJiYgKGNvbGxpZGVyVG9wICsgY29sbGlkZXJIZWlnaHQgPj0gc2Nyb2xsSGVpZ2h0IC0gb2Zmc2V0Qm90dG9tKSkgcmV0dXJuICdib3R0b20nXHJcblxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG5cclxuICBBZmZpeC5wcm90b3R5cGUuZ2V0UGlubmVkT2Zmc2V0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKHRoaXMucGlubmVkT2Zmc2V0KSByZXR1cm4gdGhpcy5waW5uZWRPZmZzZXRcclxuICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoQWZmaXguUkVTRVQpLmFkZENsYXNzKCdhZmZpeCcpXHJcbiAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy4kdGFyZ2V0LnNjcm9sbFRvcCgpXHJcbiAgICB2YXIgcG9zaXRpb24gID0gdGhpcy4kZWxlbWVudC5vZmZzZXQoKVxyXG4gICAgcmV0dXJuICh0aGlzLnBpbm5lZE9mZnNldCA9IHBvc2l0aW9uLnRvcCAtIHNjcm9sbFRvcClcclxuICB9XHJcblxyXG4gIEFmZml4LnByb3RvdHlwZS5jaGVja1Bvc2l0aW9uV2l0aEV2ZW50TG9vcCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHNldFRpbWVvdXQoJC5wcm94eSh0aGlzLmNoZWNrUG9zaXRpb24sIHRoaXMpLCAxKVxyXG4gIH1cclxuXHJcbiAgQWZmaXgucHJvdG90eXBlLmNoZWNrUG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBpZiAoIXRoaXMuJGVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHJldHVyblxyXG5cclxuICAgIHZhciBoZWlnaHQgICAgICAgPSB0aGlzLiRlbGVtZW50LmhlaWdodCgpXHJcbiAgICB2YXIgb2Zmc2V0ICAgICAgID0gdGhpcy5vcHRpb25zLm9mZnNldFxyXG4gICAgdmFyIG9mZnNldFRvcCAgICA9IG9mZnNldC50b3BcclxuICAgIHZhciBvZmZzZXRCb3R0b20gPSBvZmZzZXQuYm90dG9tXHJcbiAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gTWF0aC5tYXgoJChkb2N1bWVudCkuaGVpZ2h0KCksICQoZG9jdW1lbnQuYm9keSkuaGVpZ2h0KCkpXHJcblxyXG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgIT0gJ29iamVjdCcpICAgICAgICAgb2Zmc2V0Qm90dG9tID0gb2Zmc2V0VG9wID0gb2Zmc2V0XHJcbiAgICBpZiAodHlwZW9mIG9mZnNldFRvcCA9PSAnZnVuY3Rpb24nKSAgICBvZmZzZXRUb3AgICAgPSBvZmZzZXQudG9wKHRoaXMuJGVsZW1lbnQpXHJcbiAgICBpZiAodHlwZW9mIG9mZnNldEJvdHRvbSA9PSAnZnVuY3Rpb24nKSBvZmZzZXRCb3R0b20gPSBvZmZzZXQuYm90dG9tKHRoaXMuJGVsZW1lbnQpXHJcblxyXG4gICAgdmFyIGFmZml4ID0gdGhpcy5nZXRTdGF0ZShzY3JvbGxIZWlnaHQsIGhlaWdodCwgb2Zmc2V0VG9wLCBvZmZzZXRCb3R0b20pXHJcblxyXG4gICAgaWYgKHRoaXMuYWZmaXhlZCAhPSBhZmZpeCkge1xyXG4gICAgICBpZiAodGhpcy51bnBpbiAhPSBudWxsKSB0aGlzLiRlbGVtZW50LmNzcygndG9wJywgJycpXHJcblxyXG4gICAgICB2YXIgYWZmaXhUeXBlID0gJ2FmZml4JyArIChhZmZpeCA/ICctJyArIGFmZml4IDogJycpXHJcbiAgICAgIHZhciBlICAgICAgICAgPSAkLkV2ZW50KGFmZml4VHlwZSArICcuYnMuYWZmaXgnKVxyXG5cclxuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKGUpXHJcblxyXG4gICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgcmV0dXJuXHJcblxyXG4gICAgICB0aGlzLmFmZml4ZWQgPSBhZmZpeFxyXG4gICAgICB0aGlzLnVucGluID0gYWZmaXggPT0gJ2JvdHRvbScgPyB0aGlzLmdldFBpbm5lZE9mZnNldCgpIDogbnVsbFxyXG5cclxuICAgICAgdGhpcy4kZWxlbWVudFxyXG4gICAgICAgIC5yZW1vdmVDbGFzcyhBZmZpeC5SRVNFVClcclxuICAgICAgICAuYWRkQ2xhc3MoYWZmaXhUeXBlKVxyXG4gICAgICAgIC50cmlnZ2VyKGFmZml4VHlwZS5yZXBsYWNlKCdhZmZpeCcsICdhZmZpeGVkJykgKyAnLmJzLmFmZml4JylcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYWZmaXggPT0gJ2JvdHRvbScpIHtcclxuICAgICAgdGhpcy4kZWxlbWVudC5vZmZzZXQoe1xyXG4gICAgICAgIHRvcDogc2Nyb2xsSGVpZ2h0IC0gaGVpZ2h0IC0gb2Zmc2V0Qm90dG9tXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gQUZGSVggUExVR0lOIERFRklOSVRJT05cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICBmdW5jdGlvbiBQbHVnaW4ob3B0aW9uKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICR0aGlzICAgPSAkKHRoaXMpXHJcbiAgICAgIHZhciBkYXRhICAgID0gJHRoaXMuZGF0YSgnYnMuYWZmaXgnKVxyXG4gICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uXHJcblxyXG4gICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoJ2JzLmFmZml4JywgKGRhdGEgPSBuZXcgQWZmaXgodGhpcywgb3B0aW9ucykpKVxyXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJykgZGF0YVtvcHRpb25dKClcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICB2YXIgb2xkID0gJC5mbi5hZmZpeFxyXG5cclxuICAkLmZuLmFmZml4ICAgICAgICAgICAgID0gUGx1Z2luXHJcbiAgJC5mbi5hZmZpeC5Db25zdHJ1Y3RvciA9IEFmZml4XHJcblxyXG5cclxuICAvLyBBRkZJWCBOTyBDT05GTElDVFxyXG4gIC8vID09PT09PT09PT09PT09PT09XHJcblxyXG4gICQuZm4uYWZmaXgubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICQuZm4uYWZmaXggPSBvbGRcclxuICAgIHJldHVybiB0aGlzXHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gQUZGSVggREFUQS1BUElcclxuICAvLyA9PT09PT09PT09PT09PVxyXG5cclxuICAkKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAkKCdbZGF0YS1zcHk9XCJhZmZpeFwiXScpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgJHNweSA9ICQodGhpcylcclxuICAgICAgdmFyIGRhdGEgPSAkc3B5LmRhdGEoKVxyXG5cclxuICAgICAgZGF0YS5vZmZzZXQgPSBkYXRhLm9mZnNldCB8fCB7fVxyXG5cclxuICAgICAgaWYgKGRhdGEub2Zmc2V0Qm90dG9tICE9IG51bGwpIGRhdGEub2Zmc2V0LmJvdHRvbSA9IGRhdGEub2Zmc2V0Qm90dG9tXHJcbiAgICAgIGlmIChkYXRhLm9mZnNldFRvcCAgICAhPSBudWxsKSBkYXRhLm9mZnNldC50b3AgICAgPSBkYXRhLm9mZnNldFRvcFxyXG5cclxuICAgICAgUGx1Z2luLmNhbGwoJHNweSwgZGF0YSlcclxuICAgIH0pXHJcbiAgfSlcclxuXHJcbn0oalF1ZXJ5KTtcclxuLypcclxuICAgICBfIF8gICAgICBfICAgICAgIF9cclxuIF9fX3wgKF8pIF9fX3wgfCBfXyAgKF8pX19fXHJcbi8gX198IHwgfC8gX198IHwvIC8gIHwgLyBfX3xcclxuXFxfXyBcXCB8IHwgKF9ffCAgIDwgXyB8IFxcX18gXFxcclxufF9fXy9ffF98XFxfX198X3xcXF8oXykvIHxfX18vXHJcbiAgICAgICAgICAgICAgICAgICB8X18vXHJcblxyXG4gVmVyc2lvbjogMS42LjBcclxuICBBdXRob3I6IEtlbiBXaGVlbGVyXHJcbiBXZWJzaXRlOiBodHRwOi8va2Vud2hlZWxlci5naXRodWIuaW9cclxuICAgIERvY3M6IGh0dHA6Ly9rZW53aGVlbGVyLmdpdGh1Yi5pby9zbGlja1xyXG4gICAgUmVwbzogaHR0cDovL2dpdGh1Yi5jb20va2Vud2hlZWxlci9zbGlja1xyXG4gIElzc3VlczogaHR0cDovL2dpdGh1Yi5jb20va2Vud2hlZWxlci9zbGljay9pc3N1ZXNcclxuXHJcbiAqL1xyXG4vKiBnbG9iYWwgd2luZG93LCBkb2N1bWVudCwgZGVmaW5lLCBqUXVlcnksIHNldEludGVydmFsLCBjbGVhckludGVydmFsICovXHJcbihmdW5jdGlvbihmYWN0b3J5KSB7XHJcbiAgICAndXNlIHN0cmljdCc7XHJcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XHJcbiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpO1xyXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBmYWN0b3J5KGpRdWVyeSk7XHJcbiAgICB9XHJcblxyXG59KGZ1bmN0aW9uKGpRdWVyeSkge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG4gICAgdmFyIFNsaWNrID0gd2luZG93LlNsaWNrIHx8IHt9O1xyXG5cclxuICAgIFNsaWNrID0gKGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgaW5zdGFuY2VVaWQgPSAwO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBTbGljayhlbGVtZW50LCBzZXR0aW5ncykge1xyXG5cclxuICAgICAgICAgICAgdmFyIF8gPSB0aGlzLCBkYXRhU2V0dGluZ3M7XHJcblxyXG4gICAgICAgICAgICBfLmRlZmF1bHRzID0ge1xyXG4gICAgICAgICAgICAgICAgYWNjZXNzaWJpbGl0eTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGFkYXB0aXZlSGVpZ2h0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGFwcGVuZEFycm93czogalF1ZXJ5KGVsZW1lbnQpLFxyXG4gICAgICAgICAgICAgICAgYXBwZW5kRG90czogalF1ZXJ5KGVsZW1lbnQpLFxyXG4gICAgICAgICAgICAgICAgYXJyb3dzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgYXNOYXZGb3I6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBwcmV2QXJyb3c6ICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLXJvbGU9XCJub25lXCIgY2xhc3M9XCJzbGljay1wcmV2XCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzXCIgdGFiaW5kZXg9XCIwXCIgcm9sZT1cImJ1dHRvblwiPlByZXZpb3VzPC9idXR0b24+JyxcclxuICAgICAgICAgICAgICAgIG5leHRBcnJvdzogJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtcm9sZT1cIm5vbmVcIiBjbGFzcz1cInNsaWNrLW5leHRcIiBhcmlhLWxhYmVsPVwiTmV4dFwiIHRhYmluZGV4PVwiMFwiIHJvbGU9XCJidXR0b25cIj5OZXh0PC9idXR0b24+JyxcclxuICAgICAgICAgICAgICAgIGF1dG9wbGF5OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGF1dG9wbGF5U3BlZWQ6IDMwMDAsXHJcbiAgICAgICAgICAgICAgICBjZW50ZXJNb2RlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGNlbnRlclBhZGRpbmc6ICc1MHB4JyxcclxuICAgICAgICAgICAgICAgIGNzc0Vhc2U6ICdlYXNlJyxcclxuICAgICAgICAgICAgICAgIGN1c3RvbVBhZ2luZzogZnVuY3Rpb24oc2xpZGVyLCBpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpRdWVyeSgnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1yb2xlPVwibm9uZVwiIHJvbGU9XCJidXR0b25cIiB0YWJpbmRleD1cIjBcIiAvPicpLnRleHQoaSArIDEpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGRvdHM6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgZG90c0NsYXNzOiAnc2xpY2stZG90cycsXHJcbiAgICAgICAgICAgICAgICBkcmFnZ2FibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBlYXNpbmc6ICdsaW5lYXInLFxyXG4gICAgICAgICAgICAgICAgZWRnZUZyaWN0aW9uOiAwLjM1LFxyXG4gICAgICAgICAgICAgICAgZmFkZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBmb2N1c09uU2VsZWN0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGluZmluaXRlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgaW5pdGlhbFNsaWRlOiAwLFxyXG4gICAgICAgICAgICAgICAgbGF6eUxvYWQ6ICdvbmRlbWFuZCcsXHJcbiAgICAgICAgICAgICAgICBtb2JpbGVGaXJzdDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBwYXVzZU9uSG92ZXI6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBwYXVzZU9uRm9jdXM6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBwYXVzZU9uRG90c0hvdmVyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHJlc3BvbmRUbzogJ3dpbmRvdycsXHJcbiAgICAgICAgICAgICAgICByZXNwb25zaXZlOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgcm93czogMSxcclxuICAgICAgICAgICAgICAgIHJ0bDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBzbGlkZTogJycsXHJcbiAgICAgICAgICAgICAgICBzbGlkZXNQZXJSb3c6IDEsXHJcbiAgICAgICAgICAgICAgICBzbGlkZXNUb1Nob3c6IDEsXHJcbiAgICAgICAgICAgICAgICBzbGlkZXNUb1Njcm9sbDogMSxcclxuICAgICAgICAgICAgICAgIHNwZWVkOiA1MDAsXHJcbiAgICAgICAgICAgICAgICBzd2lwZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHN3aXBlVG9TbGlkZTogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB0b3VjaE1vdmU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICB0b3VjaFRocmVzaG9sZDogNSxcclxuICAgICAgICAgICAgICAgIHVzZUNTUzogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHVzZVRyYW5zZm9ybTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHZhcmlhYmxlV2lkdGg6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdmVydGljYWw6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdmVydGljYWxTd2lwaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHdhaXRGb3JBbmltYXRlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgekluZGV4OiAxMDAwXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBfLmluaXRpYWxzID0ge1xyXG4gICAgICAgICAgICAgICAgYW5pbWF0aW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGRyYWdnaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGF1dG9QbGF5VGltZXI6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50RGlyZWN0aW9uOiAwLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudExlZnQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50U2xpZGU6IDAsXHJcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IDEsXHJcbiAgICAgICAgICAgICAgICBqUXVlcnlkb3RzOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgbGlzdFdpZHRoOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgbGlzdEhlaWdodDogbnVsbCxcclxuICAgICAgICAgICAgICAgIGxvYWRJbmRleDogMCxcclxuICAgICAgICAgICAgICAgIGpRdWVyeW5leHRBcnJvdzogbnVsbCxcclxuICAgICAgICAgICAgICAgIGpRdWVyeXByZXZBcnJvdzogbnVsbCxcclxuICAgICAgICAgICAgICAgIHNsaWRlQ291bnQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzbGlkZVdpZHRoOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgalF1ZXJ5c2xpZGVUcmFjazogbnVsbCxcclxuICAgICAgICAgICAgICAgIGpRdWVyeXNsaWRlczogbnVsbCxcclxuICAgICAgICAgICAgICAgIHNsaWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgc2xpZGVPZmZzZXQ6IDAsXHJcbiAgICAgICAgICAgICAgICBzd2lwZUxlZnQ6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBqUXVlcnlsaXN0OiBudWxsLFxyXG4gICAgICAgICAgICAgICAgdG91Y2hPYmplY3Q6IHt9LFxyXG4gICAgICAgICAgICAgICAgdHJhbnNmb3Jtc0VuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdW5zbGlja2VkOiBmYWxzZVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgalF1ZXJ5LmV4dGVuZChfLCBfLmluaXRpYWxzKTtcclxuXHJcbiAgICAgICAgICAgIF8uYWN0aXZlQnJlYWtwb2ludCA9IG51bGw7XHJcbiAgICAgICAgICAgIF8uYW5pbVR5cGUgPSBudWxsO1xyXG4gICAgICAgICAgICBfLmFuaW1Qcm9wID0gbnVsbDtcclxuICAgICAgICAgICAgXy5icmVha3BvaW50cyA9IFtdO1xyXG4gICAgICAgICAgICBfLmJyZWFrcG9pbnRTZXR0aW5ncyA9IFtdO1xyXG4gICAgICAgICAgICBfLmNzc1RyYW5zaXRpb25zID0gZmFsc2U7XHJcbiAgICAgICAgICAgIF8uZm9jdXNzZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgXy5pbnRlcnJ1cHRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBfLmhpZGRlbiA9ICdoaWRkZW4nO1xyXG4gICAgICAgICAgICBfLnBhdXNlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIF8ucG9zaXRpb25Qcm9wID0gbnVsbDtcclxuICAgICAgICAgICAgXy5yZXNwb25kVG8gPSBudWxsO1xyXG4gICAgICAgICAgICBfLnJvd0NvdW50ID0gMTtcclxuICAgICAgICAgICAgXy5zaG91bGRDbGljayA9IHRydWU7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVyID0galF1ZXJ5KGVsZW1lbnQpO1xyXG4gICAgICAgICAgICBfLmpRdWVyeXNsaWRlc0NhY2hlID0gbnVsbDtcclxuICAgICAgICAgICAgXy50cmFuc2Zvcm1UeXBlID0gbnVsbDtcclxuICAgICAgICAgICAgXy50cmFuc2l0aW9uVHlwZSA9IG51bGw7XHJcbiAgICAgICAgICAgIF8udmlzaWJpbGl0eUNoYW5nZSA9ICd2aXNpYmlsaXR5Y2hhbmdlJztcclxuICAgICAgICAgICAgXy53aW5kb3dXaWR0aCA9IDA7XHJcbiAgICAgICAgICAgIF8ud2luZG93VGltZXIgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgZGF0YVNldHRpbmdzID0galF1ZXJ5KGVsZW1lbnQpLmRhdGEoJ3NsaWNrJykgfHwge307XHJcblxyXG4gICAgICAgICAgICBfLm9wdGlvbnMgPSBqUXVlcnkuZXh0ZW5kKHt9LCBfLmRlZmF1bHRzLCBzZXR0aW5ncywgZGF0YVNldHRpbmdzKTtcclxuXHJcbiAgICAgICAgICAgIF8uY3VycmVudFNsaWRlID0gXy5vcHRpb25zLmluaXRpYWxTbGlkZTtcclxuXHJcbiAgICAgICAgICAgIF8ub3JpZ2luYWxTZXR0aW5ncyA9IF8ub3B0aW9ucztcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQubW96SGlkZGVuICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgXy5oaWRkZW4gPSAnbW96SGlkZGVuJztcclxuICAgICAgICAgICAgICAgIF8udmlzaWJpbGl0eUNoYW5nZSA9ICdtb3p2aXNpYmlsaXR5Y2hhbmdlJztcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQud2Via2l0SGlkZGVuICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgXy5oaWRkZW4gPSAnd2Via2l0SGlkZGVuJztcclxuICAgICAgICAgICAgICAgIF8udmlzaWJpbGl0eUNoYW5nZSA9ICd3ZWJraXR2aXNpYmlsaXR5Y2hhbmdlJztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgXy5hdXRvUGxheSA9IGpRdWVyeS5wcm94eShfLmF1dG9QbGF5LCBfKTtcclxuICAgICAgICAgICAgXy5hdXRvUGxheUNsZWFyID0galF1ZXJ5LnByb3h5KF8uYXV0b1BsYXlDbGVhciwgXyk7XHJcbiAgICAgICAgICAgIF8uYXV0b1BsYXlJdGVyYXRvciA9IGpRdWVyeS5wcm94eShfLmF1dG9QbGF5SXRlcmF0b3IsIF8pO1xyXG4gICAgICAgICAgICBfLmNoYW5nZVNsaWRlID0galF1ZXJ5LnByb3h5KF8uY2hhbmdlU2xpZGUsIF8pO1xyXG4gICAgICAgICAgICBfLmNsaWNrSGFuZGxlciA9IGpRdWVyeS5wcm94eShfLmNsaWNrSGFuZGxlciwgXyk7XHJcbiAgICAgICAgICAgIF8uc2VsZWN0SGFuZGxlciA9IGpRdWVyeS5wcm94eShfLnNlbGVjdEhhbmRsZXIsIF8pO1xyXG4gICAgICAgICAgICBfLnNldFBvc2l0aW9uID0galF1ZXJ5LnByb3h5KF8uc2V0UG9zaXRpb24sIF8pO1xyXG4gICAgICAgICAgICBfLnN3aXBlSGFuZGxlciA9IGpRdWVyeS5wcm94eShfLnN3aXBlSGFuZGxlciwgXyk7XHJcbiAgICAgICAgICAgIF8uZHJhZ0hhbmRsZXIgPSBqUXVlcnkucHJveHkoXy5kcmFnSGFuZGxlciwgXyk7XHJcbiAgICAgICAgICAgIF8ua2V5SGFuZGxlciA9IGpRdWVyeS5wcm94eShfLmtleUhhbmRsZXIsIF8pO1xyXG5cclxuICAgICAgICAgICAgXy5pbnN0YW5jZVVpZCA9IGluc3RhbmNlVWlkKys7XHJcblxyXG4gICAgICAgICAgICAvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xyXG4gICAgICAgICAgICAvLyBTdHJpY3QgSFRNTCByZWNvZ25pdGlvbiAobXVzdCBzdGFydCB3aXRoIDwpXHJcbiAgICAgICAgICAgIC8vIEV4dHJhY3RlZCBmcm9tIGpRdWVyeSB2MS4xMSBzb3VyY2VcclxuICAgICAgICAgICAgXy5odG1sRXhwciA9IC9eKD86XFxzKig8W1xcd1xcV10rPilbXj5dKikkLztcclxuXHJcblxyXG4gICAgICAgICAgICBfLnJlZ2lzdGVyQnJlYWtwb2ludHMoKTtcclxuICAgICAgICAgICAgXy5pbml0KHRydWUpO1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBTbGljaztcclxuXHJcbiAgICB9KCkpO1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5hY3RpdmF0ZUFEQSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuXHJcbiAgICAgICAgXy5qUXVlcnlzbGlkZVRyYWNrLmZpbmQoJy5zbGljay1hY3RpdmUnKS5hdHRyKHtcclxuICAgICAgICAgICAgJ2FyaWEtaGlkZGVuJzogJ2ZhbHNlJ1xyXG4gICAgICAgIH0pLmZpbmQoJ2EsIGlucHV0LCBidXR0b24sIHNlbGVjdCcpLmF0dHIoe1xyXG4gICAgICAgICAgICAndGFiaW5kZXgnOiAnMCdcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5hZGRTbGlkZSA9IFNsaWNrLnByb3RvdHlwZS5zbGlja0FkZCA9IGZ1bmN0aW9uKG1hcmt1cCwgaW5kZXgsIGFkZEJlZm9yZSkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YoaW5kZXgpID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICAgICAgYWRkQmVmb3JlID0gaW5kZXg7XHJcbiAgICAgICAgICAgIGluZGV4ID0gbnVsbDtcclxuICAgICAgICB9IGVsc2UgaWYgKGluZGV4IDwgMCB8fCAoaW5kZXggPj0gXy5zbGlkZUNvdW50KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfLnVubG9hZCgpO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mKGluZGV4KSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwICYmIF8ualF1ZXJ5c2xpZGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KG1hcmt1cCkuYXBwZW5kVG8oXy5qUXVlcnlzbGlkZVRyYWNrKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChhZGRCZWZvcmUpIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeShtYXJrdXApLmluc2VydEJlZm9yZShfLmpRdWVyeXNsaWRlcy5lcShpbmRleCkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KG1hcmt1cCkuaW5zZXJ0QWZ0ZXIoXy5qUXVlcnlzbGlkZXMuZXEoaW5kZXgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChhZGRCZWZvcmUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGpRdWVyeShtYXJrdXApLnByZXBlbmRUbyhfLmpRdWVyeXNsaWRlVHJhY2spO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KG1hcmt1cCkuYXBwZW5kVG8oXy5qUXVlcnlzbGlkZVRyYWNrKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgXy5qUXVlcnlzbGlkZXMgPSBfLmpRdWVyeXNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKTtcclxuXHJcbiAgICAgICAgXy5qUXVlcnlzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSkuZGV0YWNoKCk7XHJcblxyXG4gICAgICAgIF8ualF1ZXJ5c2xpZGVUcmFjay5hcHBlbmQoXy5qUXVlcnlzbGlkZXMpO1xyXG5cclxuICAgICAgICBfLmpRdWVyeXNsaWRlcy5lYWNoKGZ1bmN0aW9uKGluZGV4LCBlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGpRdWVyeShlbGVtZW50KS5hdHRyKCdkYXRhLXNsaWNrLWluZGV4JywgaW5kZXgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBfLmpRdWVyeXNsaWRlc0NhY2hlID0gXy5qUXVlcnlzbGlkZXM7XHJcblxyXG4gICAgICAgIF8ucmVpbml0KCk7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuYW5pbWF0ZUhlaWdodCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuICAgICAgICBpZiAoXy5vcHRpb25zLnNsaWRlc1RvU2hvdyA9PT0gMSAmJiBfLm9wdGlvbnMuYWRhcHRpdmVIZWlnaHQgPT09IHRydWUgJiYgXy5vcHRpb25zLnZlcnRpY2FsID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB2YXIgdGFyZ2V0SGVpZ2h0ID0gXy5qUXVlcnlzbGlkZXMuZXEoXy5jdXJyZW50U2xpZGUpLm91dGVySGVpZ2h0KHRydWUpO1xyXG4gICAgICAgICAgICBfLmpRdWVyeWxpc3QuYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHRhcmdldEhlaWdodFxyXG4gICAgICAgICAgICB9LCBfLm9wdGlvbnMuc3BlZWQpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLmFuaW1hdGVTbGlkZSA9IGZ1bmN0aW9uKHRhcmdldExlZnQsIGNhbGxiYWNrKSB7XHJcblxyXG4gICAgICAgIHZhciBhbmltUHJvcHMgPSB7fSxcclxuICAgICAgICAgICAgXyA9IHRoaXM7XHJcblxyXG4gICAgICAgIF8uYW5pbWF0ZUhlaWdodCgpO1xyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLnJ0bCA9PT0gdHJ1ZSAmJiBfLm9wdGlvbnMudmVydGljYWwgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRhcmdldExlZnQgPSAtdGFyZ2V0TGVmdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKF8udHJhbnNmb3Jtc0VuYWJsZWQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIGlmIChfLm9wdGlvbnMudmVydGljYWwgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBfLmpRdWVyeXNsaWRlVHJhY2suYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogdGFyZ2V0TGVmdFxyXG4gICAgICAgICAgICAgICAgfSwgXy5vcHRpb25zLnNwZWVkLCBfLm9wdGlvbnMuZWFzaW5nLCBjYWxsYmFjayk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBfLmpRdWVyeXNsaWRlVHJhY2suYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiB0YXJnZXRMZWZ0XHJcbiAgICAgICAgICAgICAgICB9LCBfLm9wdGlvbnMuc3BlZWQsIF8ub3B0aW9ucy5lYXNpbmcsIGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgaWYgKF8uY3NzVHJhbnNpdGlvbnMgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXy5vcHRpb25zLnJ0bCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIF8uY3VycmVudExlZnQgPSAtKF8uY3VycmVudExlZnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KHtcclxuICAgICAgICAgICAgICAgICAgICBhbmltU3RhcnQ6IF8uY3VycmVudExlZnRcclxuICAgICAgICAgICAgICAgIH0pLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgIGFuaW1TdGFydDogdGFyZ2V0TGVmdFxyXG4gICAgICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiBfLm9wdGlvbnMuc3BlZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgZWFzaW5nOiBfLm9wdGlvbnMuZWFzaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0ZXA6IGZ1bmN0aW9uKG5vdykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBub3cgPSBNYXRoLmNlaWwobm93KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF8ub3B0aW9ucy52ZXJ0aWNhbCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1Qcm9wc1tfLmFuaW1UeXBlXSA9ICd0cmFuc2xhdGUoJyArXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93ICsgJ3B4LCAwcHgpJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVUcmFjay5jc3MoYW5pbVByb3BzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1Qcm9wc1tfLmFuaW1UeXBlXSA9ICd0cmFuc2xhdGUoMHB4LCcgK1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdyArICdweCknO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5qUXVlcnlzbGlkZVRyYWNrLmNzcyhhbmltUHJvcHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjaykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgICAgIF8uYXBwbHlUcmFuc2l0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRMZWZ0ID0gTWF0aC5jZWlsKHRhcmdldExlZnQpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChfLm9wdGlvbnMudmVydGljYWwgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYW5pbVByb3BzW18uYW5pbVR5cGVdID0gJ3RyYW5zbGF0ZTNkKCcgKyB0YXJnZXRMZWZ0ICsgJ3B4LCAwcHgsIDBweCknO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhbmltUHJvcHNbXy5hbmltVHlwZV0gPSAndHJhbnNsYXRlM2QoMHB4LCcgKyB0YXJnZXRMZWZ0ICsgJ3B4LCAwcHgpJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVUcmFjay5jc3MoYW5pbVByb3BzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgXy5kaXNhYmxlVHJhbnNpdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY2FsbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIF8ub3B0aW9ucy5zcGVlZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5nZXROYXZUYXJnZXQgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzLFxyXG4gICAgICAgICAgICBhc05hdkZvciA9IF8ub3B0aW9ucy5hc05hdkZvcjtcclxuXHJcbiAgICAgICAgaWYgKCBhc05hdkZvciAmJiBhc05hdkZvciAhPT0gbnVsbCApIHtcclxuICAgICAgICAgICAgYXNOYXZGb3IgPSBqUXVlcnkoYXNOYXZGb3IpLm5vdChfLmpRdWVyeXNsaWRlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYXNOYXZGb3I7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuYXNOYXZGb3IgPSBmdW5jdGlvbihpbmRleCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXMsXHJcbiAgICAgICAgICAgIGFzTmF2Rm9yID0gXy5nZXROYXZUYXJnZXQoKTtcclxuXHJcbiAgICAgICAgaWYgKCBhc05hdkZvciAhPT0gbnVsbCAmJiB0eXBlb2YgYXNOYXZGb3IgPT09ICdvYmplY3QnICkge1xyXG4gICAgICAgICAgICBhc05hdkZvci5lYWNoKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGpRdWVyeSh0aGlzKS5zbGljaygnZ2V0U2xpY2snKTtcclxuICAgICAgICAgICAgICAgIGlmKCF0YXJnZXQudW5zbGlja2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNsaWRlSGFuZGxlcihpbmRleCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5hcHBseVRyYW5zaXRpb24gPSBmdW5jdGlvbihzbGlkZSkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXMsXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb24gPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy5mYWRlID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0cmFuc2l0aW9uW18udHJhbnNpdGlvblR5cGVdID0gXy50cmFuc2Zvcm1UeXBlICsgJyAnICsgXy5vcHRpb25zLnNwZWVkICsgJ21zICcgKyBfLm9wdGlvbnMuY3NzRWFzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0cmFuc2l0aW9uW18udHJhbnNpdGlvblR5cGVdID0gJ29wYWNpdHkgJyArIF8ub3B0aW9ucy5zcGVlZCArICdtcyAnICsgXy5vcHRpb25zLmNzc0Vhc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLmZhZGUgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVUcmFjay5jc3ModHJhbnNpdGlvbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgXy5qUXVlcnlzbGlkZXMuZXEoc2xpZGUpLmNzcyh0cmFuc2l0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuYXV0b1BsYXkgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBfLmF1dG9QbGF5Q2xlYXIoKTtcclxuXHJcbiAgICAgICAgaWYgKCBfLnNsaWRlQ291bnQgPiBfLm9wdGlvbnMuc2xpZGVzVG9TaG93ICkge1xyXG4gICAgICAgICAgICBfLmF1dG9QbGF5VGltZXIgPSBzZXRJbnRlcnZhbCggXy5hdXRvUGxheUl0ZXJhdG9yLCBfLm9wdGlvbnMuYXV0b3BsYXlTcGVlZCApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5hdXRvUGxheUNsZWFyID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKF8uYXV0b1BsYXlUaW1lcikge1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKF8uYXV0b1BsYXlUaW1lcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLmF1dG9QbGF5SXRlcmF0b3IgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzLFxyXG4gICAgICAgICAgICBzbGlkZVRvID0gXy5jdXJyZW50U2xpZGUgKyBfLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw7XHJcblxyXG4gICAgICAgIGlmICggIV8ucGF1c2VkICYmICFfLmludGVycnVwdGVkICYmICFfLmZvY3Vzc2VkICkge1xyXG5cclxuICAgICAgICAgICAgaWYgKCBfLm9wdGlvbnMuaW5maW5pdGUgPT09IGZhbHNlICkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICggXy5kaXJlY3Rpb24gPT09IDEgJiYgKCBfLmN1cnJlbnRTbGlkZSArIDEgKSA9PT0gKCBfLnNsaWRlQ291bnQgLSAxICkpIHtcclxuICAgICAgICAgICAgICAgICAgICBfLmRpcmVjdGlvbiA9IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIF8uZGlyZWN0aW9uID09PSAwICkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBzbGlkZVRvID0gXy5jdXJyZW50U2xpZGUgLSBfLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICggXy5jdXJyZW50U2xpZGUgLSAxID09PSAwICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmRpcmVjdGlvbiA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIF8uc2xpZGVIYW5kbGVyKCBzbGlkZVRvICk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5idWlsZEFycm93cyA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGlmIChfLm9wdGlvbnMuYXJyb3dzID09PSB0cnVlICkge1xyXG5cclxuICAgICAgICAgICAgXy5qUXVlcnlwcmV2QXJyb3cgPSBqUXVlcnkoXy5vcHRpb25zLnByZXZBcnJvdykuYWRkQ2xhc3MoJ3NsaWNrLWFycm93Jyk7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5bmV4dEFycm93ID0galF1ZXJ5KF8ub3B0aW9ucy5uZXh0QXJyb3cpLmFkZENsYXNzKCdzbGljay1hcnJvdycpO1xyXG5cclxuICAgICAgICAgICAgaWYoIF8uc2xpZGVDb3VudCA+IF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cgKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgXy5qUXVlcnlwcmV2QXJyb3cucmVtb3ZlQ2xhc3MoJ3NsaWNrLWhpZGRlbicpLnJlbW92ZUF0dHIoJ2FyaWEtaGlkZGVuIHRhYmluZGV4Jyk7XHJcbiAgICAgICAgICAgICAgICBfLmpRdWVyeW5leHRBcnJvdy5yZW1vdmVDbGFzcygnc2xpY2staGlkZGVuJykucmVtb3ZlQXR0cignYXJpYS1oaWRkZW4gdGFiaW5kZXgnKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoXy5odG1sRXhwci50ZXN0KF8ub3B0aW9ucy5wcmV2QXJyb3cpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgXy5qUXVlcnlwcmV2QXJyb3cucHJlcGVuZFRvKF8ub3B0aW9ucy5hcHBlbmRBcnJvd3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChfLmh0bWxFeHByLnRlc3QoXy5vcHRpb25zLm5leHRBcnJvdykpIHtcclxuICAgICAgICAgICAgICAgICAgICBfLmpRdWVyeW5leHRBcnJvdy5hcHBlbmRUbyhfLm9wdGlvbnMuYXBwZW5kQXJyb3dzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoXy5vcHRpb25zLmluZmluaXRlICE9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgXy5qUXVlcnlwcmV2QXJyb3dcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdzbGljay1kaXNhYmxlZCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLWRpc2FibGVkJywgJ3RydWUnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgXy5qUXVlcnlwcmV2QXJyb3cuYWRkKCBfLmpRdWVyeW5leHRBcnJvdyApXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnc2xpY2staGlkZGVuJylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cih7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdhcmlhLWRpc2FibGVkJzogJ3RydWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAndGFiaW5kZXgnOiAnLTEnXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5idWlsZERvdHMgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzLFxyXG4gICAgICAgICAgICBpLCBkb3Q7XHJcblxyXG4gICAgICAgIGlmIChfLm9wdGlvbnMuZG90cyA9PT0gdHJ1ZSAmJiBfLnNsaWRlQ291bnQgPiBfLm9wdGlvbnMuc2xpZGVzVG9TaG93KSB7XHJcblxyXG4gICAgICAgICAgICBfLmpRdWVyeXNsaWRlci5hZGRDbGFzcygnc2xpY2stZG90dGVkJyk7XHJcblxyXG4gICAgICAgICAgICBkb3QgPSBqUXVlcnkoJzx1bCAvPicpLmFkZENsYXNzKF8ub3B0aW9ucy5kb3RzQ2xhc3MpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBfLmdldERvdENvdW50KCk7IGkgKz0gMSkge1xyXG4gICAgICAgICAgICAgICAgZG90LmFwcGVuZChqUXVlcnkoJzxsaSAvPicpLmFwcGVuZChfLm9wdGlvbnMuY3VzdG9tUGFnaW5nLmNhbGwodGhpcywgXywgaSkpKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgXy5qUXVlcnlkb3RzID0gZG90LmFwcGVuZFRvKF8ub3B0aW9ucy5hcHBlbmREb3RzKTtcclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5ZG90cy5maW5kKCdsaScpLmZpcnN0KCkuYWRkQ2xhc3MoJ3NsaWNrLWFjdGl2ZScpLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5idWlsZE91dCA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXM7XHJcblxyXG4gICAgICAgIF8ualF1ZXJ5c2xpZGVzID1cclxuICAgICAgICAgICAgXy5qUXVlcnlzbGlkZXJcclxuICAgICAgICAgICAgICAgIC5jaGlsZHJlbiggXy5vcHRpb25zLnNsaWRlICsgJzpub3QoLnNsaWNrLWNsb25lZCknKVxyXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCdzbGljay1zbGlkZScpO1xyXG5cclxuICAgICAgICBfLnNsaWRlQ291bnQgPSBfLmpRdWVyeXNsaWRlcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIF8ualF1ZXJ5c2xpZGVzLmVhY2goZnVuY3Rpb24oaW5kZXgsIGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgalF1ZXJ5KGVsZW1lbnQpXHJcbiAgICAgICAgICAgICAgICAuYXR0cignZGF0YS1zbGljay1pbmRleCcsIGluZGV4KVxyXG4gICAgICAgICAgICAgICAgLmRhdGEoJ29yaWdpbmFsU3R5bGluZycsIGpRdWVyeShlbGVtZW50KS5hdHRyKCdzdHlsZScpIHx8ICcnKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgXy5qUXVlcnlzbGlkZXIuYWRkQ2xhc3MoJ3NsaWNrLXNsaWRlcicpO1xyXG5cclxuICAgICAgICBfLmpRdWVyeXNsaWRlVHJhY2sgPSAoXy5zbGlkZUNvdW50ID09PSAwKSA/XHJcbiAgICAgICAgICAgIGpRdWVyeSgnPGRpdiBjbGFzcz1cInNsaWNrLXRyYWNrXCIvPicpLmFwcGVuZFRvKF8ualF1ZXJ5c2xpZGVyKSA6XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVzLndyYXBBbGwoJzxkaXYgY2xhc3M9XCJzbGljay10cmFja1wiLz4nKS5wYXJlbnQoKTtcclxuXHJcbiAgICAgICAgXy5qUXVlcnlsaXN0ID0gXy5qUXVlcnlzbGlkZVRyYWNrLndyYXAoXHJcbiAgICAgICAgICAgICc8ZGl2IGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGNsYXNzPVwic2xpY2stbGlzdFwiLz4nKS5wYXJlbnQoKTtcclxuICAgICAgICBfLmpRdWVyeXNsaWRlVHJhY2suY3NzKCdvcGFjaXR5JywgMCk7XHJcblxyXG4gICAgICAgIGlmIChfLm9wdGlvbnMuY2VudGVyTW9kZSA9PT0gdHJ1ZSB8fCBfLm9wdGlvbnMuc3dpcGVUb1NsaWRlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIF8ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCA9IDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBqUXVlcnkoJ2ltZ1tkYXRhLWxhenldJywgXy5qUXVlcnlzbGlkZXIpLm5vdCgnW3NyY10nKS5hZGRDbGFzcygnc2xpY2stbG9hZGluZycpO1xyXG5cclxuICAgICAgICBfLnNldHVwSW5maW5pdGUoKTtcclxuXHJcbiAgICAgICAgXy5idWlsZERvdHMoKTtcclxuXHJcbiAgICAgICAgXy51cGRhdGVEb3RzKCk7XHJcblxyXG4gICAgICAgIF8uYnVpbGRBcnJvd3MoKTtcclxuXHJcbiAgICAgICAgXy5zZXRTbGlkZUNsYXNzZXModHlwZW9mIF8uY3VycmVudFNsaWRlID09PSAnbnVtYmVyJyA/IF8uY3VycmVudFNsaWRlIDogMCk7XHJcblxyXG4gICAgICAgIGlmIChfLm9wdGlvbnMuZHJhZ2dhYmxlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5bGlzdC5hZGRDbGFzcygnZHJhZ2dhYmxlJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLmJ1aWxkUm93cyA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXMsIGEsIGIsIGMsIG5ld1NsaWRlcywgbnVtT2ZTbGlkZXMsIG9yaWdpbmFsU2xpZGVzLHNsaWRlc1BlclNlY3Rpb247XHJcblxyXG4gICAgICAgIG5ld1NsaWRlcyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcclxuICAgICAgICBvcmlnaW5hbFNsaWRlcyA9IF8ualF1ZXJ5c2xpZGVyLmNoaWxkcmVuKCk7XHJcblxyXG4gICAgICAgIGlmKF8ub3B0aW9ucy5yb3dzID4gMCkge1xyXG5cclxuICAgICAgICAgICAgc2xpZGVzUGVyU2VjdGlvbiA9IF8ub3B0aW9ucy5zbGlkZXNQZXJSb3cgKiBfLm9wdGlvbnMucm93cztcclxuICAgICAgICAgICAgbnVtT2ZTbGlkZXMgPSBNYXRoLmNlaWwoXHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFNsaWRlcy5sZW5ndGggLyBzbGlkZXNQZXJTZWN0aW9uXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBmb3IoYSA9IDA7IGEgPCBudW1PZlNsaWRlczsgYSsrKXtcclxuICAgICAgICAgICAgICAgIHZhciBzbGlkZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgICAgICAgICAgICAgZm9yKGIgPSAwOyBiIDwgXy5vcHRpb25zLnJvd3M7IGIrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IoYyA9IDA7IGMgPCBfLm9wdGlvbnMuc2xpZGVzUGVyUm93OyBjKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IChhICogc2xpZGVzUGVyU2VjdGlvbiArICgoYiAqIF8ub3B0aW9ucy5zbGlkZXNQZXJSb3cpICsgYykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxTbGlkZXMuZ2V0KHRhcmdldCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChvcmlnaW5hbFNsaWRlcy5nZXQodGFyZ2V0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgc2xpZGUuYXBwZW5kQ2hpbGQocm93KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIG5ld1NsaWRlcy5hcHBlbmRDaGlsZChzbGlkZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVyLmVtcHR5KCkuYXBwZW5kKG5ld1NsaWRlcyk7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVyLmNoaWxkcmVuKCkuY2hpbGRyZW4oKS5jaGlsZHJlbigpXHJcbiAgICAgICAgICAgICAgICAuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOigxMDAgLyBfLm9wdGlvbnMuc2xpZGVzUGVyUm93KSArICclJyxcclxuICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSc6ICdpbmxpbmUtYmxvY2snXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLmNoZWNrUmVzcG9uc2l2ZSA9IGZ1bmN0aW9uKGluaXRpYWwsIGZvcmNlVXBkYXRlKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcyxcclxuICAgICAgICAgICAgYnJlYWtwb2ludCwgdGFyZ2V0QnJlYWtwb2ludCwgcmVzcG9uZFRvV2lkdGgsIHRyaWdnZXJCcmVha3BvaW50ID0gZmFsc2U7XHJcbiAgICAgICAgdmFyIHNsaWRlcldpZHRoID0gXy5qUXVlcnlzbGlkZXIud2lkdGgoKTtcclxuICAgICAgICB2YXIgd2luZG93V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCB8fCBqUXVlcnkod2luZG93KS53aWR0aCgpO1xyXG5cclxuICAgICAgICBpZiAoXy5yZXNwb25kVG8gPT09ICd3aW5kb3cnKSB7XHJcbiAgICAgICAgICAgIHJlc3BvbmRUb1dpZHRoID0gd2luZG93V2lkdGg7XHJcbiAgICAgICAgfSBlbHNlIGlmIChfLnJlc3BvbmRUbyA9PT0gJ3NsaWRlcicpIHtcclxuICAgICAgICAgICAgcmVzcG9uZFRvV2lkdGggPSBzbGlkZXJXaWR0aDtcclxuICAgICAgICB9IGVsc2UgaWYgKF8ucmVzcG9uZFRvID09PSAnbWluJykge1xyXG4gICAgICAgICAgICByZXNwb25kVG9XaWR0aCA9IE1hdGgubWluKHdpbmRvd1dpZHRoLCBzbGlkZXJXaWR0aCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIF8ub3B0aW9ucy5yZXNwb25zaXZlICYmXHJcbiAgICAgICAgICAgIF8ub3B0aW9ucy5yZXNwb25zaXZlLmxlbmd0aCAmJlxyXG4gICAgICAgICAgICBfLm9wdGlvbnMucmVzcG9uc2l2ZSAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgdGFyZ2V0QnJlYWtwb2ludCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGJyZWFrcG9pbnQgaW4gXy5icmVha3BvaW50cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKF8uYnJlYWtwb2ludHMuaGFzT3duUHJvcGVydHkoYnJlYWtwb2ludCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoXy5vcmlnaW5hbFNldHRpbmdzLm1vYmlsZUZpcnN0ID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uZFRvV2lkdGggPCBfLmJyZWFrcG9pbnRzW2JyZWFrcG9pbnRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCcmVha3BvaW50ID0gXy5icmVha3BvaW50c1ticmVha3BvaW50XTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25kVG9XaWR0aCA+IF8uYnJlYWtwb2ludHNbYnJlYWtwb2ludF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJyZWFrcG9pbnQgPSBfLmJyZWFrcG9pbnRzW2JyZWFrcG9pbnRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGFyZ2V0QnJlYWtwb2ludCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKF8uYWN0aXZlQnJlYWtwb2ludCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRCcmVha3BvaW50ICE9PSBfLmFjdGl2ZUJyZWFrcG9pbnQgfHwgZm9yY2VVcGRhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXy5hY3RpdmVCcmVha3BvaW50ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJyZWFrcG9pbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfLmJyZWFrcG9pbnRTZXR0aW5nc1t0YXJnZXRCcmVha3BvaW50XSA9PT0gJ3Vuc2xpY2snKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLnVuc2xpY2sodGFyZ2V0QnJlYWtwb2ludCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLm9wdGlvbnMgPSBqUXVlcnkuZXh0ZW5kKHt9LCBfLm9yaWdpbmFsU2V0dGluZ3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5icmVha3BvaW50U2V0dGluZ3NbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJyZWFrcG9pbnRdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbml0aWFsID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5jdXJyZW50U2xpZGUgPSBfLm9wdGlvbnMuaW5pdGlhbFNsaWRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5yZWZyZXNoKGluaXRpYWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJCcmVha3BvaW50ID0gdGFyZ2V0QnJlYWtwb2ludDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIF8uYWN0aXZlQnJlYWtwb2ludCA9IHRhcmdldEJyZWFrcG9pbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKF8uYnJlYWtwb2ludFNldHRpbmdzW3RhcmdldEJyZWFrcG9pbnRdID09PSAndW5zbGljaycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXy51bnNsaWNrKHRhcmdldEJyZWFrcG9pbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ub3B0aW9ucyA9IGpRdWVyeS5leHRlbmQoe30sIF8ub3JpZ2luYWxTZXR0aW5ncyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uYnJlYWtwb2ludFNldHRpbmdzW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEJyZWFrcG9pbnRdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWwgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uY3VycmVudFNsaWRlID0gXy5vcHRpb25zLmluaXRpYWxTbGlkZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBfLnJlZnJlc2goaW5pdGlhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJCcmVha3BvaW50ID0gdGFyZ2V0QnJlYWtwb2ludDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChfLmFjdGl2ZUJyZWFrcG9pbnQgIT09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICBfLmFjdGl2ZUJyZWFrcG9pbnQgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIF8ub3B0aW9ucyA9IF8ub3JpZ2luYWxTZXR0aW5ncztcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfLmN1cnJlbnRTbGlkZSA9IF8ub3B0aW9ucy5pbml0aWFsU2xpZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIF8ucmVmcmVzaChpbml0aWFsKTtcclxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQnJlYWtwb2ludCA9IHRhcmdldEJyZWFrcG9pbnQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIG9ubHkgdHJpZ2dlciBicmVha3BvaW50cyBkdXJpbmcgYW4gYWN0dWFsIGJyZWFrLiBub3Qgb24gaW5pdGlhbGl6ZS5cclxuICAgICAgICAgICAgaWYoICFpbml0aWFsICYmIHRyaWdnZXJCcmVha3BvaW50ICE9PSBmYWxzZSApIHtcclxuICAgICAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVyLnRyaWdnZXIoJ2JyZWFrcG9pbnQnLCBbXywgdHJpZ2dlckJyZWFrcG9pbnRdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5jaGFuZ2VTbGlkZSA9IGZ1bmN0aW9uKGV2ZW50LCBkb250QW5pbWF0ZSkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXMsXHJcbiAgICAgICAgICAgIGpRdWVyeXRhcmdldCA9IGpRdWVyeShldmVudC5jdXJyZW50VGFyZ2V0KSxcclxuICAgICAgICAgICAgaW5kZXhPZmZzZXQsIHNsaWRlT2Zmc2V0LCB1bmV2ZW5PZmZzZXQ7XHJcblxyXG4gICAgICAgIC8vIElmIHRhcmdldCBpcyBhIGxpbmssIHByZXZlbnQgZGVmYXVsdCBhY3Rpb24uXHJcbiAgICAgICAgaWYoalF1ZXJ5dGFyZ2V0LmlzKCdhJykpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHRhcmdldCBpcyBub3QgdGhlIDxsaT4gZWxlbWVudCAoaWU6IGEgY2hpbGQpLCBmaW5kIHRoZSA8bGk+LlxyXG4gICAgICAgIGlmKCFqUXVlcnl0YXJnZXQuaXMoJ2xpJykpIHtcclxuICAgICAgICAgICAgalF1ZXJ5dGFyZ2V0ID0galF1ZXJ5dGFyZ2V0LmNsb3Nlc3QoJ2xpJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB1bmV2ZW5PZmZzZXQgPSAoXy5zbGlkZUNvdW50ICUgXy5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsICE9PSAwKTtcclxuICAgICAgICBpbmRleE9mZnNldCA9IHVuZXZlbk9mZnNldCA/IDAgOiAoXy5zbGlkZUNvdW50IC0gXy5jdXJyZW50U2xpZGUpICUgXy5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsO1xyXG5cclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmRhdGEubWVzc2FnZSkge1xyXG5cclxuICAgICAgICAgICAgY2FzZSAncHJldmlvdXMnOlxyXG4gICAgICAgICAgICAgICAgc2xpZGVPZmZzZXQgPSBpbmRleE9mZnNldCA9PT0gMCA/IF8ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCA6IF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cgLSBpbmRleE9mZnNldDtcclxuICAgICAgICAgICAgICAgIGlmIChfLnNsaWRlQ291bnQgPiBfLm9wdGlvbnMuc2xpZGVzVG9TaG93KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgXy5zbGlkZUhhbmRsZXIoXy5jdXJyZW50U2xpZGUgLSBzbGlkZU9mZnNldCwgZmFsc2UsIGRvbnRBbmltYXRlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnbmV4dCc6XHJcbiAgICAgICAgICAgICAgICBzbGlkZU9mZnNldCA9IGluZGV4T2Zmc2V0ID09PSAwID8gXy5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsIDogaW5kZXhPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoXy5zbGlkZUNvdW50ID4gXy5vcHRpb25zLnNsaWRlc1RvU2hvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIF8uc2xpZGVIYW5kbGVyKF8uY3VycmVudFNsaWRlICsgc2xpZGVPZmZzZXQsIGZhbHNlLCBkb250QW5pbWF0ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgIGNhc2UgJ2luZGV4JzpcclxuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGV2ZW50LmRhdGEuaW5kZXggPT09IDAgPyAwIDpcclxuICAgICAgICAgICAgICAgICAgICBldmVudC5kYXRhLmluZGV4IHx8IGpRdWVyeXRhcmdldC5pbmRleCgpICogXy5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsO1xyXG5cclxuICAgICAgICAgICAgICAgIF8uc2xpZGVIYW5kbGVyKF8uY2hlY2tOYXZpZ2FibGUoaW5kZXgpLCBmYWxzZSwgZG9udEFuaW1hdGUpO1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5dGFyZ2V0LmNoaWxkcmVuKCkudHJpZ2dlcignZm9jdXMnKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuY2hlY2tOYXZpZ2FibGUgPSBmdW5jdGlvbihpbmRleCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXMsXHJcbiAgICAgICAgICAgIG5hdmlnYWJsZXMsIHByZXZOYXZpZ2FibGU7XHJcblxyXG4gICAgICAgIG5hdmlnYWJsZXMgPSBfLmdldE5hdmlnYWJsZUluZGV4ZXMoKTtcclxuICAgICAgICBwcmV2TmF2aWdhYmxlID0gMDtcclxuICAgICAgICBpZiAoaW5kZXggPiBuYXZpZ2FibGVzW25hdmlnYWJsZXMubGVuZ3RoIC0gMV0pIHtcclxuICAgICAgICAgICAgaW5kZXggPSBuYXZpZ2FibGVzW25hdmlnYWJsZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgbiBpbiBuYXZpZ2FibGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBuYXZpZ2FibGVzW25dKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwcmV2TmF2aWdhYmxlO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcHJldk5hdmlnYWJsZSA9IG5hdmlnYWJsZXNbbl07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpbmRleDtcclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLmNsZWFuVXBFdmVudHMgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLmRvdHMgJiYgXy5qUXVlcnlkb3RzICE9PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICBqUXVlcnkoJ2xpJywgXy5qUXVlcnlkb3RzKVxyXG4gICAgICAgICAgICAgICAgLm9mZignY2xpY2suc2xpY2snLCBfLmNoYW5nZVNsaWRlKVxyXG4gICAgICAgICAgICAgICAgLm9mZignbW91c2VlbnRlci5zbGljaycsIGpRdWVyeS5wcm94eShfLmludGVycnVwdCwgXywgdHJ1ZSkpXHJcbiAgICAgICAgICAgICAgICAub2ZmKCdtb3VzZWxlYXZlLnNsaWNrJywgalF1ZXJ5LnByb3h5KF8uaW50ZXJydXB0LCBfLCBmYWxzZSkpO1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF8ualF1ZXJ5c2xpZGVyLm9mZignZm9jdXMuc2xpY2sgYmx1ci5zbGljaycpO1xyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLmFycm93cyA9PT0gdHJ1ZSAmJiBfLnNsaWRlQ291bnQgPiBfLm9wdGlvbnMuc2xpZGVzVG9TaG93KSB7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5cHJldkFycm93ICYmIF8ualF1ZXJ5cHJldkFycm93Lm9mZignY2xpY2suc2xpY2snLCBfLmNoYW5nZVNsaWRlKTtcclxuICAgICAgICAgICAgXy5qUXVlcnluZXh0QXJyb3cgJiYgXy5qUXVlcnluZXh0QXJyb3cub2ZmKCdjbGljay5zbGljaycsIF8uY2hhbmdlU2xpZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgXy5qUXVlcnlsaXN0Lm9mZigndG91Y2hzdGFydC5zbGljayBtb3VzZWRvd24uc2xpY2snLCBfLnN3aXBlSGFuZGxlcik7XHJcbiAgICAgICAgXy5qUXVlcnlsaXN0Lm9mZigndG91Y2htb3ZlLnNsaWNrIG1vdXNlbW92ZS5zbGljaycsIF8uc3dpcGVIYW5kbGVyKTtcclxuICAgICAgICBfLmpRdWVyeWxpc3Qub2ZmKCd0b3VjaGVuZC5zbGljayBtb3VzZXVwLnNsaWNrJywgXy5zd2lwZUhhbmRsZXIpO1xyXG4gICAgICAgIF8ualF1ZXJ5bGlzdC5vZmYoJ3RvdWNoY2FuY2VsLnNsaWNrIG1vdXNlbGVhdmUuc2xpY2snLCBfLnN3aXBlSGFuZGxlcik7XHJcblxyXG4gICAgICAgIF8ualF1ZXJ5bGlzdC5vZmYoJ2NsaWNrLnNsaWNrJywgXy5jbGlja0hhbmRsZXIpO1xyXG5cclxuICAgICAgICBqUXVlcnkoZG9jdW1lbnQpLm9mZihfLnZpc2liaWxpdHlDaGFuZ2UsIF8udmlzaWJpbGl0eSk7XHJcblxyXG4gICAgICAgIF8uY2xlYW5VcFNsaWRlRXZlbnRzKCk7XHJcblxyXG4gICAgICAgIGlmIChfLm9wdGlvbnMuYWNjZXNzaWJpbGl0eSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBfLmpRdWVyeWxpc3Qub2ZmKCdrZXlkb3duLnNsaWNrJywgXy5rZXlIYW5kbGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChfLm9wdGlvbnMuZm9jdXNPblNlbGVjdCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBqUXVlcnkoXy5qUXVlcnlzbGlkZVRyYWNrKS5jaGlsZHJlbigpLm9mZignY2xpY2suc2xpY2snLCBfLnNlbGVjdEhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgalF1ZXJ5KHdpbmRvdykub2ZmKCdvcmllbnRhdGlvbmNoYW5nZS5zbGljay5zbGljay0nICsgXy5pbnN0YW5jZVVpZCwgXy5vcmllbnRhdGlvbkNoYW5nZSk7XHJcblxyXG4gICAgICAgIGpRdWVyeSh3aW5kb3cpLm9mZigncmVzaXplLnNsaWNrLnNsaWNrLScgKyBfLmluc3RhbmNlVWlkLCBfLnJlc2l6ZSk7XHJcblxyXG4gICAgICAgIGpRdWVyeSgnW2RyYWdnYWJsZSE9dHJ1ZV0nLCBfLmpRdWVyeXNsaWRlVHJhY2spLm9mZignZHJhZ3N0YXJ0JywgXy5wcmV2ZW50RGVmYXVsdCk7XHJcblxyXG4gICAgICAgIGpRdWVyeSh3aW5kb3cpLm9mZignbG9hZC5zbGljay5zbGljay0nICsgXy5pbnN0YW5jZVVpZCwgXy5zZXRQb3NpdGlvbik7XHJcbiAgICAgICAgalF1ZXJ5KGRvY3VtZW50KS5vZmYoJ3JlYWR5LnNsaWNrLnNsaWNrLScgKyBfLmluc3RhbmNlVWlkLCBfLnNldFBvc2l0aW9uKTtcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5jbGVhblVwU2xpZGVFdmVudHMgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBfLmpRdWVyeWxpc3Qub2ZmKCdtb3VzZWVudGVyLnNsaWNrJywgalF1ZXJ5LnByb3h5KF8uaW50ZXJydXB0LCBfLCB0cnVlKSk7XHJcbiAgICAgICAgXy5qUXVlcnlsaXN0Lm9mZignbW91c2VsZWF2ZS5zbGljaycsIGpRdWVyeS5wcm94eShfLmludGVycnVwdCwgXywgZmFsc2UpKTtcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5jbGVhblVwUm93cyA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXMsIG9yaWdpbmFsU2xpZGVzO1xyXG5cclxuICAgICAgICBpZihfLm9wdGlvbnMucm93cyA+IDApIHtcclxuICAgICAgICAgICAgb3JpZ2luYWxTbGlkZXMgPSBfLmpRdWVyeXNsaWRlcy5jaGlsZHJlbigpLmNoaWxkcmVuKCk7XHJcbiAgICAgICAgICAgIG9yaWdpbmFsU2xpZGVzLnJlbW92ZUF0dHIoJ3N0eWxlJyk7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVyLmVtcHR5KCkuYXBwZW5kKG9yaWdpbmFsU2xpZGVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuY2xpY2tIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBpZiAoXy5zaG91bGRDbGljayA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24ocmVmcmVzaCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXM7XHJcblxyXG4gICAgICAgIF8uYXV0b1BsYXlDbGVhcigpO1xyXG5cclxuICAgICAgICBfLnRvdWNoT2JqZWN0ID0ge307XHJcblxyXG4gICAgICAgIF8uY2xlYW5VcEV2ZW50cygpO1xyXG5cclxuICAgICAgICBqUXVlcnkoJy5zbGljay1jbG9uZWQnLCBfLmpRdWVyeXNsaWRlcikuZGV0YWNoKCk7XHJcblxyXG4gICAgICAgIGlmIChfLmpRdWVyeWRvdHMpIHtcclxuICAgICAgICAgICAgXy5qUXVlcnlkb3RzLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmICggXy5qUXVlcnlwcmV2QXJyb3cgJiYgXy5qUXVlcnlwcmV2QXJyb3cubGVuZ3RoICkge1xyXG5cclxuICAgICAgICAgICAgXy5qUXVlcnlwcmV2QXJyb3dcclxuICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnc2xpY2stZGlzYWJsZWQgc2xpY2stYXJyb3cgc2xpY2staGlkZGVuJylcclxuICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdhcmlhLWhpZGRlbiBhcmlhLWRpc2FibGVkIHRhYmluZGV4JylcclxuICAgICAgICAgICAgICAgIC5jc3MoJ2Rpc3BsYXknLCcnKTtcclxuXHJcbiAgICAgICAgICAgIGlmICggXy5odG1sRXhwci50ZXN0KCBfLm9wdGlvbnMucHJldkFycm93ICkpIHtcclxuICAgICAgICAgICAgICAgIF8ualF1ZXJ5cHJldkFycm93LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIF8ualF1ZXJ5bmV4dEFycm93ICYmIF8ualF1ZXJ5bmV4dEFycm93Lmxlbmd0aCApIHtcclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5bmV4dEFycm93XHJcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3NsaWNrLWRpc2FibGVkIHNsaWNrLWFycm93IHNsaWNrLWhpZGRlbicpXHJcbiAgICAgICAgICAgICAgICAucmVtb3ZlQXR0cignYXJpYS1oaWRkZW4gYXJpYS1kaXNhYmxlZCB0YWJpbmRleCcpXHJcbiAgICAgICAgICAgICAgICAuY3NzKCdkaXNwbGF5JywnJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIF8uaHRtbEV4cHIudGVzdCggXy5vcHRpb25zLm5leHRBcnJvdyApKSB7XHJcbiAgICAgICAgICAgICAgICBfLmpRdWVyeW5leHRBcnJvdy5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZiAoXy5qUXVlcnlzbGlkZXMpIHtcclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVzXHJcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3NsaWNrLXNsaWRlIHNsaWNrLWFjdGl2ZSBzbGljay1jZW50ZXIgc2xpY2stdmlzaWJsZSBzbGljay1jdXJyZW50JylcclxuICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdhcmlhLWhpZGRlbicpXHJcbiAgICAgICAgICAgICAgICAucmVtb3ZlQXR0cignZGF0YS1zbGljay1pbmRleCcpXHJcbiAgICAgICAgICAgICAgICAuZWFjaChmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgICAgIGpRdWVyeSh0aGlzKS5hdHRyKCdzdHlsZScsIGpRdWVyeSh0aGlzKS5kYXRhKCdvcmlnaW5hbFN0eWxpbmcnKSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmRldGFjaCgpO1xyXG5cclxuICAgICAgICAgICAgXy5qUXVlcnlzbGlkZVRyYWNrLmRldGFjaCgpO1xyXG5cclxuICAgICAgICAgICAgXy5qUXVlcnlsaXN0LmRldGFjaCgpO1xyXG5cclxuICAgICAgICAgICAgXy5qUXVlcnlzbGlkZXIuYXBwZW5kKF8ualF1ZXJ5c2xpZGVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF8uY2xlYW5VcFJvd3MoKTtcclxuXHJcbiAgICAgICAgXy5qUXVlcnlzbGlkZXIucmVtb3ZlQ2xhc3MoJ3NsaWNrLXNsaWRlcicpO1xyXG4gICAgICAgIF8ualF1ZXJ5c2xpZGVyLnJlbW92ZUNsYXNzKCdzbGljay1pbml0aWFsaXplZCcpO1xyXG4gICAgICAgIF8ualF1ZXJ5c2xpZGVyLnJlbW92ZUNsYXNzKCdzbGljay1kb3R0ZWQnKTtcclxuXHJcbiAgICAgICAgXy51bnNsaWNrZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZighcmVmcmVzaCkge1xyXG4gICAgICAgICAgICBfLmpRdWVyeXNsaWRlci50cmlnZ2VyKCdkZXN0cm95JywgW19dKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuZGlzYWJsZVRyYW5zaXRpb24gPSBmdW5jdGlvbihzbGlkZSkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXMsXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb24gPSB7fTtcclxuXHJcbiAgICAgICAgdHJhbnNpdGlvbltfLnRyYW5zaXRpb25UeXBlXSA9ICcnO1xyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLmZhZGUgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVUcmFjay5jc3ModHJhbnNpdGlvbik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgXy5qUXVlcnlzbGlkZXMuZXEoc2xpZGUpLmNzcyh0cmFuc2l0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuZmFkZVNsaWRlID0gZnVuY3Rpb24oc2xpZGVJbmRleCwgY2FsbGJhY2spIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBpZiAoXy5jc3NUcmFuc2l0aW9ucyA9PT0gZmFsc2UpIHtcclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVzLmVxKHNsaWRlSW5kZXgpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICB6SW5kZXg6IF8ub3B0aW9ucy56SW5kZXhcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBfLmpRdWVyeXNsaWRlcy5lcShzbGlkZUluZGV4KS5hbmltYXRlKHtcclxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDFcclxuICAgICAgICAgICAgfSwgXy5vcHRpb25zLnNwZWVkLCBfLm9wdGlvbnMuZWFzaW5nLCBjYWxsYmFjayk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICBfLmFwcGx5VHJhbnNpdGlvbihzbGlkZUluZGV4KTtcclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVzLmVxKHNsaWRlSW5kZXgpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLFxyXG4gICAgICAgICAgICAgICAgekluZGV4OiBfLm9wdGlvbnMuekluZGV4XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBfLmRpc2FibGVUcmFuc2l0aW9uKHNsaWRlSW5kZXgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKCk7XHJcbiAgICAgICAgICAgICAgICB9LCBfLm9wdGlvbnMuc3BlZWQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5mYWRlU2xpZGVPdXQgPSBmdW5jdGlvbihzbGlkZUluZGV4KSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKF8uY3NzVHJhbnNpdGlvbnMgPT09IGZhbHNlKSB7XHJcblxyXG4gICAgICAgICAgICBfLmpRdWVyeXNsaWRlcy5lcShzbGlkZUluZGV4KS5hbmltYXRlKHtcclxuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAsXHJcbiAgICAgICAgICAgICAgICB6SW5kZXg6IF8ub3B0aW9ucy56SW5kZXggLSAyXHJcbiAgICAgICAgICAgIH0sIF8ub3B0aW9ucy5zcGVlZCwgXy5vcHRpb25zLmVhc2luZyk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICBfLmFwcGx5VHJhbnNpdGlvbihzbGlkZUluZGV4KTtcclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVzLmVxKHNsaWRlSW5kZXgpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLFxyXG4gICAgICAgICAgICAgICAgekluZGV4OiBfLm9wdGlvbnMuekluZGV4IC0gMlxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLmZpbHRlclNsaWRlcyA9IFNsaWNrLnByb3RvdHlwZS5zbGlja0ZpbHRlciA9IGZ1bmN0aW9uKGZpbHRlcikge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGlmIChmaWx0ZXIgIT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVzQ2FjaGUgPSBfLmpRdWVyeXNsaWRlcztcclxuXHJcbiAgICAgICAgICAgIF8udW5sb2FkKCk7XHJcblxyXG4gICAgICAgICAgICBfLmpRdWVyeXNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKTtcclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVzQ2FjaGUuZmlsdGVyKGZpbHRlcikuYXBwZW5kVG8oXy5qUXVlcnlzbGlkZVRyYWNrKTtcclxuXHJcbiAgICAgICAgICAgIF8ucmVpbml0KCk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5mb2N1c0hhbmRsZXIgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBfLmpRdWVyeXNsaWRlclxyXG4gICAgICAgICAgICAub2ZmKCdmb2N1cy5zbGljayBibHVyLnNsaWNrJylcclxuICAgICAgICAgICAgLm9uKCdmb2N1cy5zbGljayBibHVyLnNsaWNrJyxcclxuICAgICAgICAgICAgICAgICcqOm5vdCguc2xpY2stYXJyb3cpJywgZnVuY3Rpb24oZXZlbnQpIHtcclxuXHJcbiAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICB2YXIgalF1ZXJ5c2YgPSBqUXVlcnkodGhpcyk7XHJcblxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKCBfLm9wdGlvbnMucGF1c2VPbkZvY3VzICkge1xyXG4gICAgICAgICAgICAgICAgICAgIF8uZm9jdXNzZWQgPSBqUXVlcnlzZi5pcygnOmZvY3VzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy5hdXRvUGxheSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSwgMCk7XHJcblxyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuZ2V0Q3VycmVudCA9IFNsaWNrLnByb3RvdHlwZS5zbGlja0N1cnJlbnRTbGlkZSA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIF8uY3VycmVudFNsaWRlO1xyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLmdldERvdENvdW50ID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuXHJcbiAgICAgICAgdmFyIGJyZWFrUG9pbnQgPSAwO1xyXG4gICAgICAgIHZhciBjb3VudGVyID0gMDtcclxuICAgICAgICB2YXIgcGFnZXJRdHkgPSAwO1xyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLmluZmluaXRlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIHdoaWxlIChicmVha1BvaW50IDwgXy5zbGlkZUNvdW50KSB7XHJcbiAgICAgICAgICAgICAgICArK3BhZ2VyUXR5O1xyXG4gICAgICAgICAgICAgICAgYnJlYWtQb2ludCA9IGNvdW50ZXIgKyBfLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw7XHJcbiAgICAgICAgICAgICAgICBjb3VudGVyICs9IF8ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCA8PSBfLm9wdGlvbnMuc2xpZGVzVG9TaG93ID8gXy5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsIDogXy5vcHRpb25zLnNsaWRlc1RvU2hvdztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoXy5vcHRpb25zLmNlbnRlck1vZGUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgcGFnZXJRdHkgPSBfLnNsaWRlQ291bnQ7XHJcbiAgICAgICAgfSBlbHNlIGlmKCFfLm9wdGlvbnMuYXNOYXZGb3IpIHtcclxuICAgICAgICAgICAgcGFnZXJRdHkgPSAxICsgTWF0aC5jZWlsKChfLnNsaWRlQ291bnQgLSBfLm9wdGlvbnMuc2xpZGVzVG9TaG93KSAvIF8ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCk7XHJcbiAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICB3aGlsZSAoYnJlYWtQb2ludCA8IF8uc2xpZGVDb3VudCkge1xyXG4gICAgICAgICAgICAgICAgKytwYWdlclF0eTtcclxuICAgICAgICAgICAgICAgIGJyZWFrUG9pbnQgPSBjb3VudGVyICsgXy5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsO1xyXG4gICAgICAgICAgICAgICAgY291bnRlciArPSBfLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwgPD0gXy5vcHRpb25zLnNsaWRlc1RvU2hvdyA/IF8ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCA6IF8ub3B0aW9ucy5zbGlkZXNUb1Nob3c7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwYWdlclF0eSAtIDE7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuZ2V0TGVmdCA9IGZ1bmN0aW9uKHNsaWRlSW5kZXgpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzLFxyXG4gICAgICAgICAgICB0YXJnZXRMZWZ0LFxyXG4gICAgICAgICAgICB2ZXJ0aWNhbEhlaWdodCxcclxuICAgICAgICAgICAgdmVydGljYWxPZmZzZXQgPSAwLFxyXG4gICAgICAgICAgICB0YXJnZXRTbGlkZTtcclxuXHJcbiAgICAgICAgXy5zbGlkZU9mZnNldCA9IDA7XHJcbiAgICAgICAgdmVydGljYWxIZWlnaHQgPSBfLmpRdWVyeXNsaWRlcy5maXJzdCgpLm91dGVySGVpZ2h0KHRydWUpO1xyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLmluZmluaXRlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGlmIChfLnNsaWRlQ291bnQgPiBfLm9wdGlvbnMuc2xpZGVzVG9TaG93KSB7XHJcbiAgICAgICAgICAgICAgICBfLnNsaWRlT2Zmc2V0ID0gKF8uc2xpZGVXaWR0aCAqIF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cpICogLTE7XHJcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldCA9ICh2ZXJ0aWNhbEhlaWdodCAqIF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cpICogLTE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKF8uc2xpZGVDb3VudCAlIF8ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNsaWRlSW5kZXggKyBfLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwgPiBfLnNsaWRlQ291bnQgJiYgXy5zbGlkZUNvdW50ID4gXy5vcHRpb25zLnNsaWRlc1RvU2hvdykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzbGlkZUluZGV4ID4gXy5zbGlkZUNvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF8uc2xpZGVPZmZzZXQgPSAoKF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cgLSAoc2xpZGVJbmRleCAtIF8uc2xpZGVDb3VudCkpICogXy5zbGlkZVdpZHRoKSAqIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldCA9ICgoXy5vcHRpb25zLnNsaWRlc1RvU2hvdyAtIChzbGlkZUluZGV4IC0gXy5zbGlkZUNvdW50KSkgKiB2ZXJ0aWNhbEhlaWdodCkgKiAtMTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfLnNsaWRlT2Zmc2V0ID0gKChfLnNsaWRlQ291bnQgJSBfLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwpICogXy5zbGlkZVdpZHRoKSAqIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbE9mZnNldCA9ICgoXy5zbGlkZUNvdW50ICUgXy5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsKSAqIHZlcnRpY2FsSGVpZ2h0KSAqIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChzbGlkZUluZGV4ICsgXy5vcHRpb25zLnNsaWRlc1RvU2hvdyA+IF8uc2xpZGVDb3VudCkge1xyXG4gICAgICAgICAgICAgICAgXy5zbGlkZU9mZnNldCA9ICgoc2xpZGVJbmRleCArIF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cpIC0gXy5zbGlkZUNvdW50KSAqIF8uc2xpZGVXaWR0aDtcclxuICAgICAgICAgICAgICAgIHZlcnRpY2FsT2Zmc2V0ID0gKChzbGlkZUluZGV4ICsgXy5vcHRpb25zLnNsaWRlc1RvU2hvdykgLSBfLnNsaWRlQ291bnQpICogdmVydGljYWxIZWlnaHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChfLnNsaWRlQ291bnQgPD0gXy5vcHRpb25zLnNsaWRlc1RvU2hvdykge1xyXG4gICAgICAgICAgICBfLnNsaWRlT2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgdmVydGljYWxPZmZzZXQgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy5jZW50ZXJNb2RlID09PSB0cnVlICYmIF8ub3B0aW9ucy5pbmZpbml0ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBfLnNsaWRlT2Zmc2V0ICs9IF8uc2xpZGVXaWR0aCAqIE1hdGguZmxvb3IoXy5vcHRpb25zLnNsaWRlc1RvU2hvdyAvIDIpIC0gXy5zbGlkZVdpZHRoO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXy5vcHRpb25zLmNlbnRlck1vZGUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgXy5zbGlkZU9mZnNldCA9IDA7XHJcbiAgICAgICAgICAgIF8uc2xpZGVPZmZzZXQgKz0gXy5zbGlkZVdpZHRoICogTWF0aC5mbG9vcihfLm9wdGlvbnMuc2xpZGVzVG9TaG93IC8gMik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLnZlcnRpY2FsID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0YXJnZXRMZWZ0ID0gKChzbGlkZUluZGV4ICogXy5zbGlkZVdpZHRoKSAqIC0xKSArIF8uc2xpZGVPZmZzZXQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGFyZ2V0TGVmdCA9ICgoc2xpZGVJbmRleCAqIHZlcnRpY2FsSGVpZ2h0KSAqIC0xKSArIHZlcnRpY2FsT2Zmc2V0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy52YXJpYWJsZVdpZHRoID09PSB0cnVlKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoXy5zbGlkZUNvdW50IDw9IF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cgfHwgXy5vcHRpb25zLmluZmluaXRlID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0U2xpZGUgPSBfLmpRdWVyeXNsaWRlVHJhY2suY2hpbGRyZW4oJy5zbGljay1zbGlkZScpLmVxKHNsaWRlSW5kZXgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0U2xpZGUgPSBfLmpRdWVyeXNsaWRlVHJhY2suY2hpbGRyZW4oJy5zbGljay1zbGlkZScpLmVxKHNsaWRlSW5kZXggKyBfLm9wdGlvbnMuc2xpZGVzVG9TaG93KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKF8ub3B0aW9ucy5ydGwgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTbGlkZVswXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldExlZnQgPSAoXy5qUXVlcnlzbGlkZVRyYWNrLndpZHRoKCkgLSB0YXJnZXRTbGlkZVswXS5vZmZzZXRMZWZ0IC0gdGFyZ2V0U2xpZGUud2lkdGgoKSkgKiAtMTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TGVmdCA9ICAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0TGVmdCA9IHRhcmdldFNsaWRlWzBdID8gdGFyZ2V0U2xpZGVbMF0ub2Zmc2V0TGVmdCAqIC0xIDogMDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKF8ub3B0aW9ucy5jZW50ZXJNb2RlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXy5zbGlkZUNvdW50IDw9IF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cgfHwgXy5vcHRpb25zLmluZmluaXRlID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFNsaWRlID0gXy5qUXVlcnlzbGlkZVRyYWNrLmNoaWxkcmVuKCcuc2xpY2stc2xpZGUnKS5lcShzbGlkZUluZGV4KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2xpZGUgPSBfLmpRdWVyeXNsaWRlVHJhY2suY2hpbGRyZW4oJy5zbGljay1zbGlkZScpLmVxKHNsaWRlSW5kZXggKyBfLm9wdGlvbnMuc2xpZGVzVG9TaG93ICsgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKF8ub3B0aW9ucy5ydGwgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0U2xpZGVbMF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TGVmdCA9IChfLmpRdWVyeXNsaWRlVHJhY2sud2lkdGgoKSAtIHRhcmdldFNsaWRlWzBdLm9mZnNldExlZnQgLSB0YXJnZXRTbGlkZS53aWR0aCgpKSAqIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldExlZnQgPSAgMDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldExlZnQgPSB0YXJnZXRTbGlkZVswXSA/IHRhcmdldFNsaWRlWzBdLm9mZnNldExlZnQgKiAtMSA6IDA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGFyZ2V0TGVmdCArPSAoXy5qUXVlcnlsaXN0LndpZHRoKCkgLSB0YXJnZXRTbGlkZS5vdXRlcldpZHRoKCkpIC8gMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRhcmdldExlZnQ7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuZ2V0T3B0aW9uID0gU2xpY2sucHJvdG90eXBlLnNsaWNrR2V0T3B0aW9uID0gZnVuY3Rpb24ob3B0aW9uKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuXHJcbiAgICAgICAgcmV0dXJuIF8ub3B0aW9uc1tvcHRpb25dO1xyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLmdldE5hdmlnYWJsZUluZGV4ZXMgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzLFxyXG4gICAgICAgICAgICBicmVha1BvaW50ID0gMCxcclxuICAgICAgICAgICAgY291bnRlciA9IDAsXHJcbiAgICAgICAgICAgIGluZGV4ZXMgPSBbXSxcclxuICAgICAgICAgICAgbWF4O1xyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLmluZmluaXRlID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBtYXggPSBfLnNsaWRlQ291bnQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYnJlYWtQb2ludCA9IF8ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCAqIC0xO1xyXG4gICAgICAgICAgICBjb3VudGVyID0gXy5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsICogLTE7XHJcbiAgICAgICAgICAgIG1heCA9IF8uc2xpZGVDb3VudCAqIDI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB3aGlsZSAoYnJlYWtQb2ludCA8IG1heCkge1xyXG4gICAgICAgICAgICBpbmRleGVzLnB1c2goYnJlYWtQb2ludCk7XHJcbiAgICAgICAgICAgIGJyZWFrUG9pbnQgPSBjb3VudGVyICsgXy5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsO1xyXG4gICAgICAgICAgICBjb3VudGVyICs9IF8ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCA8PSBfLm9wdGlvbnMuc2xpZGVzVG9TaG93ID8gXy5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsIDogXy5vcHRpb25zLnNsaWRlc1RvU2hvdztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpbmRleGVzO1xyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLmdldFNsaWNrID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLmdldFNsaWRlQ291bnQgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzLFxyXG4gICAgICAgICAgICBzbGlkZXNUcmF2ZXJzZWQsIHN3aXBlZFNsaWRlLCBjZW50ZXJPZmZzZXQ7XHJcblxyXG4gICAgICAgIGNlbnRlck9mZnNldCA9IF8ub3B0aW9ucy5jZW50ZXJNb2RlID09PSB0cnVlID8gXy5zbGlkZVdpZHRoICogTWF0aC5mbG9vcihfLm9wdGlvbnMuc2xpZGVzVG9TaG93IC8gMikgOiAwO1xyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLnN3aXBlVG9TbGlkZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBfLmpRdWVyeXNsaWRlVHJhY2suZmluZCgnLnNsaWNrLXNsaWRlJykuZWFjaChmdW5jdGlvbihpbmRleCwgc2xpZGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzbGlkZS5vZmZzZXRMZWZ0IC0gY2VudGVyT2Zmc2V0ICsgKGpRdWVyeShzbGlkZSkub3V0ZXJXaWR0aCgpIC8gMikgPiAoXy5zd2lwZUxlZnQgKiAtMSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBzd2lwZWRTbGlkZSA9IHNsaWRlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBzbGlkZXNUcmF2ZXJzZWQgPSBNYXRoLmFicyhqUXVlcnkoc3dpcGVkU2xpZGUpLmF0dHIoJ2RhdGEtc2xpY2staW5kZXgnKSAtIF8uY3VycmVudFNsaWRlKSB8fCAxO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHNsaWRlc1RyYXZlcnNlZDtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIF8ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuZ29UbyA9IFNsaWNrLnByb3RvdHlwZS5zbGlja0dvVG8gPSBmdW5jdGlvbihzbGlkZSwgZG9udEFuaW1hdGUpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBfLmNoYW5nZVNsaWRlKHtcclxuICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2luZGV4JyxcclxuICAgICAgICAgICAgICAgIGluZGV4OiBwYXJzZUludChzbGlkZSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sIGRvbnRBbmltYXRlKTtcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oY3JlYXRpb24pIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBpZiAoIWpRdWVyeShfLmpRdWVyeXNsaWRlcikuaGFzQ2xhc3MoJ3NsaWNrLWluaXRpYWxpemVkJykpIHtcclxuXHJcbiAgICAgICAgICAgIGpRdWVyeShfLmpRdWVyeXNsaWRlcikuYWRkQ2xhc3MoJ3NsaWNrLWluaXRpYWxpemVkJyk7XHJcblxyXG4gICAgICAgICAgICBfLmJ1aWxkUm93cygpO1xyXG4gICAgICAgICAgICBfLmJ1aWxkT3V0KCk7XHJcbiAgICAgICAgICAgIF8uc2V0UHJvcHMoKTtcclxuICAgICAgICAgICAgXy5zdGFydExvYWQoKTtcclxuICAgICAgICAgICAgXy5sb2FkU2xpZGVyKCk7XHJcbiAgICAgICAgICAgIF8uaW5pdGlhbGl6ZUV2ZW50cygpO1xyXG4gICAgICAgICAgICBfLnVwZGF0ZUFycm93cygpO1xyXG4gICAgICAgICAgICBfLnVwZGF0ZURvdHMoKTtcclxuICAgICAgICAgICAgXy5jaGVja1Jlc3BvbnNpdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIF8uZm9jdXNIYW5kbGVyKCk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNyZWF0aW9uKSB7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVyLnRyaWdnZXIoJ2luaXQnLCBbX10pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy5hY2Nlc3NpYmlsaXR5ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIF8uaW5pdEFEQSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCBfLm9wdGlvbnMuYXV0b3BsYXkgKSB7XHJcblxyXG4gICAgICAgICAgICBfLnBhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBfLmF1dG9QbGF5KCk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5pbml0QURBID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG4gICAgICAgIF8ualF1ZXJ5c2xpZGVzLmFkZChfLmpRdWVyeXNsaWRlVHJhY2suZmluZCgnLnNsaWNrLWNsb25lZCcpKS5hdHRyKHtcclxuICAgICAgICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLFxyXG4gICAgICAgICAgICAndGFiaW5kZXgnOiAnLTEnXHJcbiAgICAgICAgfSkuZmluZCgnYSwgaW5wdXQsIGJ1dHRvbiwgc2VsZWN0JykuYXR0cih7XHJcbiAgICAgICAgICAgICd0YWJpbmRleCc6ICctMSdcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgXy5qUXVlcnlzbGlkZVRyYWNrLmF0dHIoJ3JvbGUnLCAnbGlzdGJveCcpO1xyXG5cclxuICAgICAgICBfLmpRdWVyeXNsaWRlcy5ub3QoXy5qUXVlcnlzbGlkZVRyYWNrLmZpbmQoJy5zbGljay1jbG9uZWQnKSkuZWFjaChmdW5jdGlvbihpKSB7XHJcbiAgICAgICAgICAgIGpRdWVyeSh0aGlzKS5hdHRyKHtcclxuICAgICAgICAgICAgICAgICdyb2xlJzogJ29wdGlvbicsXHJcbiAgICAgICAgICAgICAgICAnYXJpYS1kZXNjcmliZWRieSc6ICdzbGljay1zbGlkZScgKyBfLmluc3RhbmNlVWlkICsgaSArICcnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoXy5qUXVlcnlkb3RzICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5ZG90cy5hdHRyKCdyb2xlJywgJ3RhYmxpc3QnKS5maW5kKCdsaScpLmVhY2goZnVuY3Rpb24oaSkge1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KHRoaXMpLmF0dHIoe1xyXG4gICAgICAgICAgICAgICAgICAgICdyb2xlJzogJ3ByZXNlbnRhdGlvbicsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2FyaWEtc2VsZWN0ZWQnOiAnZmFsc2UnLFxyXG4gICAgICAgICAgICAgICAgICAgICdhcmlhLWNvbnRyb2xzJzogJ25hdmlnYXRpb24nICsgXy5pbnN0YW5jZVVpZCArIGkgKyAnJyxcclxuICAgICAgICAgICAgICAgICAgICAnaWQnOiAnc2xpY2stc2xpZGUnICsgXy5pbnN0YW5jZVVpZCArIGkgKyAnJ1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAuZmlyc3QoKS5hdHRyKCdhcmlhLXNlbGVjdGVkJywgJ3RydWUnKS5lbmQoKVxyXG4gICAgICAgICAgICAgICAgLmZpbmQoJ2J1dHRvbicpLmF0dHIoJ3JvbGUnLCAnYnV0dG9uJykuZW5kKClcclxuICAgICAgICAgICAgICAgIC5jbG9zZXN0KCdkaXYnKS5hdHRyKCdyb2xlJywgJ3Rvb2xiYXInKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXy5hY3RpdmF0ZUFEQSgpO1xyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLmluaXRBcnJvd0V2ZW50cyA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGlmIChfLm9wdGlvbnMuYXJyb3dzID09PSB0cnVlICYmIF8uc2xpZGVDb3VudCA+IF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cpIHtcclxuICAgICAgICAgICAgXy5qUXVlcnlwcmV2QXJyb3dcclxuICAgICAgICAgICAgICAgLm9mZignY2xpY2suc2xpY2snKVxyXG4gICAgICAgICAgICAgICAub24oJ2NsaWNrLnNsaWNrJywge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdwcmV2aW91cydcclxuICAgICAgICAgICAgICAgfSwgXy5jaGFuZ2VTbGlkZSk7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5bmV4dEFycm93XHJcbiAgICAgICAgICAgICAgIC5vZmYoJ2NsaWNrLnNsaWNrJylcclxuICAgICAgICAgICAgICAgLm9uKCdjbGljay5zbGljaycsIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnbmV4dCdcclxuICAgICAgICAgICAgICAgfSwgXy5jaGFuZ2VTbGlkZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLmluaXREb3RFdmVudHMgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLmRvdHMgPT09IHRydWUgJiYgXy5zbGlkZUNvdW50ID4gXy5vcHRpb25zLnNsaWRlc1RvU2hvdykge1xyXG4gICAgICAgICAgICBqUXVlcnkoJ2xpJywgXy5qUXVlcnlkb3RzKS5vbignY2xpY2suc2xpY2snLCB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaW5kZXgnXHJcbiAgICAgICAgICAgIH0sIF8uY2hhbmdlU2xpZGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCBfLm9wdGlvbnMuZG90cyA9PT0gdHJ1ZSAmJiBfLm9wdGlvbnMucGF1c2VPbkRvdHNIb3ZlciA9PT0gdHJ1ZSApIHtcclxuXHJcbiAgICAgICAgICAgIGpRdWVyeSgnbGknLCBfLmpRdWVyeWRvdHMpXHJcbiAgICAgICAgICAgICAgICAub24oJ21vdXNlZW50ZXIuc2xpY2snLCBqUXVlcnkucHJveHkoXy5pbnRlcnJ1cHQsIF8sIHRydWUpKVxyXG4gICAgICAgICAgICAgICAgLm9uKCdtb3VzZWxlYXZlLnNsaWNrJywgalF1ZXJ5LnByb3h5KF8uaW50ZXJydXB0LCBfLCBmYWxzZSkpO1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuaW5pdFNsaWRlRXZlbnRzID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKCBfLm9wdGlvbnMucGF1c2VPbkhvdmVyICkge1xyXG5cclxuICAgICAgICAgICAgXy5qUXVlcnlsaXN0Lm9uKCdtb3VzZWVudGVyLnNsaWNrJywgalF1ZXJ5LnByb3h5KF8uaW50ZXJydXB0LCBfLCB0cnVlKSk7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5bGlzdC5vbignbW91c2VsZWF2ZS5zbGljaycsIGpRdWVyeS5wcm94eShfLmludGVycnVwdCwgXywgZmFsc2UpKTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLmluaXRpYWxpemVFdmVudHMgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBfLmluaXRBcnJvd0V2ZW50cygpO1xyXG5cclxuICAgICAgICBfLmluaXREb3RFdmVudHMoKTtcclxuICAgICAgICBfLmluaXRTbGlkZUV2ZW50cygpO1xyXG5cclxuICAgICAgICBfLmpRdWVyeWxpc3Qub24oJ3RvdWNoc3RhcnQuc2xpY2sgbW91c2Vkb3duLnNsaWNrJywge1xyXG4gICAgICAgICAgICBhY3Rpb246ICdzdGFydCdcclxuICAgICAgICB9LCBfLnN3aXBlSGFuZGxlcik7XHJcbiAgICAgICAgXy5qUXVlcnlsaXN0Lm9uKCd0b3VjaG1vdmUuc2xpY2sgbW91c2Vtb3ZlLnNsaWNrJywge1xyXG4gICAgICAgICAgICBhY3Rpb246ICdtb3ZlJ1xyXG4gICAgICAgIH0sIF8uc3dpcGVIYW5kbGVyKTtcclxuICAgICAgICBfLmpRdWVyeWxpc3Qub24oJ3RvdWNoZW5kLnNsaWNrIG1vdXNldXAuc2xpY2snLCB7XHJcbiAgICAgICAgICAgIGFjdGlvbjogJ2VuZCdcclxuICAgICAgICB9LCBfLnN3aXBlSGFuZGxlcik7XHJcbiAgICAgICAgXy5qUXVlcnlsaXN0Lm9uKCd0b3VjaGNhbmNlbC5zbGljayBtb3VzZWxlYXZlLnNsaWNrJywge1xyXG4gICAgICAgICAgICBhY3Rpb246ICdlbmQnXHJcbiAgICAgICAgfSwgXy5zd2lwZUhhbmRsZXIpO1xyXG5cclxuICAgICAgICBfLmpRdWVyeWxpc3Qub24oJ2NsaWNrLnNsaWNrJywgXy5jbGlja0hhbmRsZXIpO1xyXG5cclxuICAgICAgICBqUXVlcnkoZG9jdW1lbnQpLm9uKF8udmlzaWJpbGl0eUNoYW5nZSwgalF1ZXJ5LnByb3h5KF8udmlzaWJpbGl0eSwgXykpO1xyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLmFjY2Vzc2liaWxpdHkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgXy5qUXVlcnlsaXN0Lm9uKCdrZXlkb3duLnNsaWNrJywgXy5rZXlIYW5kbGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChfLm9wdGlvbnMuZm9jdXNPblNlbGVjdCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBqUXVlcnkoXy5qUXVlcnlzbGlkZVRyYWNrKS5jaGlsZHJlbigpLm9uKCdjbGljay5zbGljaycsIF8uc2VsZWN0SGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBqUXVlcnkod2luZG93KS5vbignb3JpZW50YXRpb25jaGFuZ2Uuc2xpY2suc2xpY2stJyArIF8uaW5zdGFuY2VVaWQsIGpRdWVyeS5wcm94eShfLm9yaWVudGF0aW9uQ2hhbmdlLCBfKSk7XHJcblxyXG4gICAgICAgIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUuc2xpY2suc2xpY2stJyArIF8uaW5zdGFuY2VVaWQsIGpRdWVyeS5wcm94eShfLnJlc2l6ZSwgXykpO1xyXG5cclxuICAgICAgICBqUXVlcnkoJ1tkcmFnZ2FibGUhPXRydWVdJywgXy5qUXVlcnlzbGlkZVRyYWNrKS5vbignZHJhZ3N0YXJ0JywgXy5wcmV2ZW50RGVmYXVsdCk7XHJcblxyXG4gICAgICAgIGpRdWVyeSh3aW5kb3cpLm9uKCdsb2FkLnNsaWNrLnNsaWNrLScgKyBfLmluc3RhbmNlVWlkLCBfLnNldFBvc2l0aW9uKTtcclxuICAgICAgICBqUXVlcnkoZG9jdW1lbnQpLm9uKCdyZWFkeS5zbGljay5zbGljay0nICsgXy5pbnN0YW5jZVVpZCwgXy5zZXRQb3NpdGlvbik7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuaW5pdFVJID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy5hcnJvd3MgPT09IHRydWUgJiYgXy5zbGlkZUNvdW50ID4gXy5vcHRpb25zLnNsaWRlc1RvU2hvdykge1xyXG5cclxuICAgICAgICAgICAgXy5qUXVlcnlwcmV2QXJyb3cuc2hvdygpO1xyXG4gICAgICAgICAgICBfLmpRdWVyeW5leHRBcnJvdy5zaG93KCk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy5kb3RzID09PSB0cnVlICYmIF8uc2xpZGVDb3VudCA+IF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cpIHtcclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5ZG90cy5zaG93KCk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5rZXlIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG4gICAgICAgICAvL0RvbnQgc2xpZGUgaWYgdGhlIGN1cnNvciBpcyBpbnNpZGUgdGhlIGZvcm0gZmllbGRzIGFuZCBhcnJvdyBrZXlzIGFyZSBwcmVzc2VkXHJcbiAgICAgICAgaWYoIWV2ZW50LnRhcmdldC50YWdOYW1lLm1hdGNoKCdURVhUQVJFQXxJTlBVVHxTRUxFQ1QnKSkge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzcgJiYgXy5vcHRpb25zLmFjY2Vzc2liaWxpdHkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIF8uY2hhbmdlU2xpZGUoe1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXy5vcHRpb25zLnJ0bCA9PT0gdHJ1ZSA/ICduZXh0JyA6ICAncHJldmlvdXMnXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzkgJiYgXy5vcHRpb25zLmFjY2Vzc2liaWxpdHkgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIF8uY2hhbmdlU2xpZGUoe1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXy5vcHRpb25zLnJ0bCA9PT0gdHJ1ZSA/ICdwcmV2aW91cycgOiAnbmV4dCdcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5sYXp5TG9hZCA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXMsXHJcbiAgICAgICAgICAgIGxvYWRSYW5nZSwgY2xvbmVSYW5nZSwgcmFuZ2VTdGFydCwgcmFuZ2VFbmQ7XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGxvYWRJbWFnZXMoaW1hZ2VzU2NvcGUpIHtcclxuXHJcbiAgICAgICAgICAgIGpRdWVyeSgnaW1nW2RhdGEtbGF6eV0nLCBpbWFnZXNTY29wZSkuZWFjaChmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgaW1hZ2UgPSBqUXVlcnkodGhpcyksXHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VTb3VyY2UgPSBqUXVlcnkodGhpcykuYXR0cignZGF0YS1sYXp5JyksXHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VUb0xvYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpbWFnZVRvTG9hZC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFuaW1hdGUoeyBvcGFjaXR5OiAwIH0sIDEwMCwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdzcmMnLCBpbWFnZVNvdXJjZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYW5pbWF0ZSh7IG9wYWNpdHk6IDEgfSwgMjAwLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLWxhenknKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdzbGljay1sb2FkaW5nJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmpRdWVyeXNsaWRlci50cmlnZ2VyKCdsYXp5TG9hZGVkJywgW18sIGltYWdlLCBpbWFnZVNvdXJjZV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIGltYWdlVG9Mb2FkLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUF0dHIoICdkYXRhLWxhenknIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCAnc2xpY2stbG9hZGluZycgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoICdzbGljay1sYXp5bG9hZC1lcnJvcicgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgXy5qUXVlcnlzbGlkZXIudHJpZ2dlcignbGF6eUxvYWRFcnJvcicsIFsgXywgaW1hZ2UsIGltYWdlU291cmNlIF0pO1xyXG5cclxuICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgaW1hZ2VUb0xvYWQuc3JjID0gaW1hZ2VTb3VyY2U7XHJcblxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLmNlbnRlck1vZGUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKF8ub3B0aW9ucy5pbmZpbml0ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgcmFuZ2VTdGFydCA9IF8uY3VycmVudFNsaWRlICsgKF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cgLyAyICsgMSk7XHJcbiAgICAgICAgICAgICAgICByYW5nZUVuZCA9IHJhbmdlU3RhcnQgKyBfLm9wdGlvbnMuc2xpZGVzVG9TaG93ICsgMjtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJhbmdlU3RhcnQgPSBNYXRoLm1heCgwLCBfLmN1cnJlbnRTbGlkZSAtIChfLm9wdGlvbnMuc2xpZGVzVG9TaG93IC8gMiArIDEpKTtcclxuICAgICAgICAgICAgICAgIHJhbmdlRW5kID0gMiArIChfLm9wdGlvbnMuc2xpZGVzVG9TaG93IC8gMiArIDEpICsgXy5jdXJyZW50U2xpZGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByYW5nZVN0YXJ0ID0gXy5vcHRpb25zLmluZmluaXRlID8gXy5vcHRpb25zLnNsaWRlc1RvU2hvdyArIF8uY3VycmVudFNsaWRlIDogXy5jdXJyZW50U2xpZGU7XHJcbiAgICAgICAgICAgIHJhbmdlRW5kID0gTWF0aC5jZWlsKHJhbmdlU3RhcnQgKyBfLm9wdGlvbnMuc2xpZGVzVG9TaG93KTtcclxuICAgICAgICAgICAgaWYgKF8ub3B0aW9ucy5mYWRlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmFuZ2VTdGFydCA+IDApIHJhbmdlU3RhcnQtLTtcclxuICAgICAgICAgICAgICAgIGlmIChyYW5nZUVuZCA8PSBfLnNsaWRlQ291bnQpIHJhbmdlRW5kKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxvYWRSYW5nZSA9IF8ualF1ZXJ5c2xpZGVyLmZpbmQoJy5zbGljay1zbGlkZScpLnNsaWNlKHJhbmdlU3RhcnQsIHJhbmdlRW5kKTtcclxuICAgICAgICBsb2FkSW1hZ2VzKGxvYWRSYW5nZSk7XHJcblxyXG4gICAgICAgIGlmIChfLnNsaWRlQ291bnQgPD0gXy5vcHRpb25zLnNsaWRlc1RvU2hvdykge1xyXG4gICAgICAgICAgICBjbG9uZVJhbmdlID0gXy5qUXVlcnlzbGlkZXIuZmluZCgnLnNsaWNrLXNsaWRlJyk7XHJcbiAgICAgICAgICAgIGxvYWRJbWFnZXMoY2xvbmVSYW5nZSk7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgaWYgKF8uY3VycmVudFNsaWRlID49IF8uc2xpZGVDb3VudCAtIF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cpIHtcclxuICAgICAgICAgICAgY2xvbmVSYW5nZSA9IF8ualF1ZXJ5c2xpZGVyLmZpbmQoJy5zbGljay1jbG9uZWQnKS5zbGljZSgwLCBfLm9wdGlvbnMuc2xpZGVzVG9TaG93KTtcclxuICAgICAgICAgICAgbG9hZEltYWdlcyhjbG9uZVJhbmdlKTtcclxuICAgICAgICB9IGVsc2UgaWYgKF8uY3VycmVudFNsaWRlID09PSAwKSB7XHJcbiAgICAgICAgICAgIGNsb25lUmFuZ2UgPSBfLmpRdWVyeXNsaWRlci5maW5kKCcuc2xpY2stY2xvbmVkJykuc2xpY2UoXy5vcHRpb25zLnNsaWRlc1RvU2hvdyAqIC0xKTtcclxuICAgICAgICAgICAgbG9hZEltYWdlcyhjbG9uZVJhbmdlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUubG9hZFNsaWRlciA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXM7XHJcblxyXG4gICAgICAgIF8uc2V0UG9zaXRpb24oKTtcclxuXHJcbiAgICAgICAgXy5qUXVlcnlzbGlkZVRyYWNrLmNzcyh7XHJcbiAgICAgICAgICAgIG9wYWNpdHk6IDFcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgXy5qUXVlcnlzbGlkZXIucmVtb3ZlQ2xhc3MoJ3NsaWNrLWxvYWRpbmcnKTtcclxuXHJcbiAgICAgICAgXy5pbml0VUkoKTtcclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy5sYXp5TG9hZCA9PT0gJ3Byb2dyZXNzaXZlJykge1xyXG4gICAgICAgICAgICBfLnByb2dyZXNzaXZlTGF6eUxvYWQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUubmV4dCA9IFNsaWNrLnByb3RvdHlwZS5zbGlja05leHQgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBfLmNoYW5nZVNsaWRlKHtcclxuICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ25leHQnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5vcmllbnRhdGlvbkNoYW5nZSA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXM7XHJcblxyXG4gICAgICAgIF8uY2hlY2tSZXNwb25zaXZlKCk7XHJcbiAgICAgICAgXy5zZXRQb3NpdGlvbigpO1xyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLnBhdXNlID0gU2xpY2sucHJvdG90eXBlLnNsaWNrUGF1c2UgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBfLmF1dG9QbGF5Q2xlYXIoKTtcclxuICAgICAgICBfLnBhdXNlZCA9IHRydWU7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUucGxheSA9IFNsaWNrLnByb3RvdHlwZS5zbGlja1BsYXkgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBfLmF1dG9QbGF5KCk7XHJcbiAgICAgICAgXy5vcHRpb25zLmF1dG9wbGF5ID0gdHJ1ZTtcclxuICAgICAgICBfLnBhdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIF8uZm9jdXNzZWQgPSBmYWxzZTtcclxuICAgICAgICBfLmludGVycnVwdGVkID0gZmFsc2U7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUucG9zdFNsaWRlID0gZnVuY3Rpb24oaW5kZXgpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBpZiggIV8udW5zbGlja2VkICkge1xyXG5cclxuICAgICAgICAgICAgXy5qUXVlcnlzbGlkZXIudHJpZ2dlcignYWZ0ZXJDaGFuZ2UnLCBbXywgaW5kZXhdKTtcclxuXHJcbiAgICAgICAgICAgIF8uYW5pbWF0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBfLnNldFBvc2l0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICBfLnN3aXBlTGVmdCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAoIF8ub3B0aW9ucy5hdXRvcGxheSApIHtcclxuICAgICAgICAgICAgICAgIF8uYXV0b1BsYXkoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKF8ub3B0aW9ucy5hY2Nlc3NpYmlsaXR5ID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBfLmluaXRBREEoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUucHJldiA9IFNsaWNrLnByb3RvdHlwZS5zbGlja1ByZXYgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBfLmNoYW5nZVNsaWRlKHtcclxuICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ3ByZXZpb3VzJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbihldmVudCkge1xyXG5cclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLnByb2dyZXNzaXZlTGF6eUxvYWQgPSBmdW5jdGlvbiggdHJ5Q291bnQgKSB7XHJcblxyXG4gICAgICAgIHRyeUNvdW50ID0gdHJ5Q291bnQgfHwgMTtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzLFxyXG4gICAgICAgICAgICBqUXVlcnlpbWdzVG9Mb2FkID0galF1ZXJ5KCAnaW1nW2RhdGEtbGF6eV0nLCBfLmpRdWVyeXNsaWRlciApLFxyXG4gICAgICAgICAgICBpbWFnZSxcclxuICAgICAgICAgICAgaW1hZ2VTb3VyY2UsXHJcbiAgICAgICAgICAgIGltYWdlVG9Mb2FkO1xyXG5cclxuICAgICAgICBpZiAoIGpRdWVyeWltZ3NUb0xvYWQubGVuZ3RoICkge1xyXG5cclxuICAgICAgICAgICAgaW1hZ2UgPSBqUXVlcnlpbWdzVG9Mb2FkLmZpcnN0KCk7XHJcbiAgICAgICAgICAgIGltYWdlU291cmNlID0gaW1hZ2UuYXR0cignZGF0YS1sYXp5Jyk7XHJcbiAgICAgICAgICAgIGltYWdlVG9Mb2FkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XHJcblxyXG4gICAgICAgICAgICBpbWFnZVRvTG9hZC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpbWFnZVxyXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCAnc3JjJywgaW1hZ2VTb3VyY2UgKVxyXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLWxhenknKVxyXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnc2xpY2stbG9hZGluZycpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICggXy5vcHRpb25zLmFkYXB0aXZlSGVpZ2h0ID09PSB0cnVlICkge1xyXG4gICAgICAgICAgICAgICAgICAgIF8uc2V0UG9zaXRpb24oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBfLmpRdWVyeXNsaWRlci50cmlnZ2VyKCdsYXp5TG9hZGVkJywgWyBfLCBpbWFnZSwgaW1hZ2VTb3VyY2UgXSk7XHJcbiAgICAgICAgICAgICAgICBfLnByb2dyZXNzaXZlTGF6eUxvYWQoKTtcclxuXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpbWFnZVRvTG9hZC5vbmVycm9yID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKCB0cnlDb3VudCA8IDMgKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICAgICAqIHRyeSB0byBsb2FkIHRoZSBpbWFnZSAzIHRpbWVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAqIGxlYXZlIGEgc2xpZ2h0IGRlbGF5IHNvIHdlIGRvbid0IGdldFxyXG4gICAgICAgICAgICAgICAgICAgICAqIHNlcnZlcnMgYmxvY2tpbmcgdGhlIHJlcXVlc3QuXHJcbiAgICAgICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ucHJvZ3Jlc3NpdmVMYXp5TG9hZCggdHJ5Q291bnQgKyAxICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgNTAwICk7XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUF0dHIoICdkYXRhLWxhenknIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCAnc2xpY2stbG9hZGluZycgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoICdzbGljay1sYXp5bG9hZC1lcnJvcicgKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgXy5qUXVlcnlzbGlkZXIudHJpZ2dlcignbGF6eUxvYWRFcnJvcicsIFsgXywgaW1hZ2UsIGltYWdlU291cmNlIF0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBfLnByb2dyZXNzaXZlTGF6eUxvYWQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaW1hZ2VUb0xvYWQuc3JjID0gaW1hZ2VTb3VyY2U7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICBfLmpRdWVyeXNsaWRlci50cmlnZ2VyKCdhbGxJbWFnZXNMb2FkZWQnLCBbIF8gXSk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24oIGluaXRpYWxpemluZyApIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzLCBjdXJyZW50U2xpZGUsIGxhc3RWaXNpYmxlSW5kZXg7XHJcblxyXG4gICAgICAgIGxhc3RWaXNpYmxlSW5kZXggPSBfLnNsaWRlQ291bnQgLSBfLm9wdGlvbnMuc2xpZGVzVG9TaG93O1xyXG5cclxuICAgICAgICAvLyBpbiBub24taW5maW5pdGUgc2xpZGVycywgd2UgZG9uJ3Qgd2FudCB0byBnbyBwYXN0IHRoZVxyXG4gICAgICAgIC8vIGxhc3QgdmlzaWJsZSBpbmRleC5cclxuICAgICAgICBpZiggIV8ub3B0aW9ucy5pbmZpbml0ZSAmJiAoIF8uY3VycmVudFNsaWRlID4gbGFzdFZpc2libGVJbmRleCApKSB7XHJcbiAgICAgICAgICAgIF8uY3VycmVudFNsaWRlID0gbGFzdFZpc2libGVJbmRleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGlmIGxlc3Mgc2xpZGVzIHRoYW4gdG8gc2hvdywgZ28gdG8gc3RhcnQuXHJcbiAgICAgICAgaWYgKCBfLnNsaWRlQ291bnQgPD0gXy5vcHRpb25zLnNsaWRlc1RvU2hvdyApIHtcclxuICAgICAgICAgICAgXy5jdXJyZW50U2xpZGUgPSAwO1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN1cnJlbnRTbGlkZSA9IF8uY3VycmVudFNsaWRlO1xyXG5cclxuICAgICAgICBfLmRlc3Ryb3kodHJ1ZSk7XHJcblxyXG4gICAgICAgIGpRdWVyeS5leHRlbmQoXywgXy5pbml0aWFscywgeyBjdXJyZW50U2xpZGU6IGN1cnJlbnRTbGlkZSB9KTtcclxuXHJcbiAgICAgICAgXy5pbml0KCk7XHJcblxyXG4gICAgICAgIGlmKCAhaW5pdGlhbGl6aW5nICkge1xyXG5cclxuICAgICAgICAgICAgXy5jaGFuZ2VTbGlkZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2luZGV4JyxcclxuICAgICAgICAgICAgICAgICAgICBpbmRleDogY3VycmVudFNsaWRlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLnJlZ2lzdGVyQnJlYWtwb2ludHMgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzLCBicmVha3BvaW50LCBjdXJyZW50QnJlYWtwb2ludCwgbCxcclxuICAgICAgICAgICAgcmVzcG9uc2l2ZVNldHRpbmdzID0gXy5vcHRpb25zLnJlc3BvbnNpdmUgfHwgbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKCBqUXVlcnkudHlwZShyZXNwb25zaXZlU2V0dGluZ3MpID09PSAnYXJyYXknICYmIHJlc3BvbnNpdmVTZXR0aW5ncy5sZW5ndGggKSB7XHJcblxyXG4gICAgICAgICAgICBfLnJlc3BvbmRUbyA9IF8ub3B0aW9ucy5yZXNwb25kVG8gfHwgJ3dpbmRvdyc7XHJcblxyXG4gICAgICAgICAgICBmb3IgKCBicmVha3BvaW50IGluIHJlc3BvbnNpdmVTZXR0aW5ncyApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBsID0gXy5icmVha3BvaW50cy5sZW5ndGgtMTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRCcmVha3BvaW50ID0gcmVzcG9uc2l2ZVNldHRpbmdzW2JyZWFrcG9pbnRdLmJyZWFrcG9pbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNpdmVTZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShicmVha3BvaW50KSkge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIGJyZWFrcG9pbnRzIGFuZCBjdXQgb3V0IGFueSBleGlzdGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIG9uZXMgd2l0aCB0aGUgc2FtZSBicmVha3BvaW50IG51bWJlciwgd2UgZG9uJ3Qgd2FudCBkdXBlcy5cclxuICAgICAgICAgICAgICAgICAgICB3aGlsZSggbCA+PSAwICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggXy5icmVha3BvaW50c1tsXSAmJiBfLmJyZWFrcG9pbnRzW2xdID09PSBjdXJyZW50QnJlYWtwb2ludCApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uYnJlYWtwb2ludHMuc3BsaWNlKGwsMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbC0tO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgXy5icmVha3BvaW50cy5wdXNoKGN1cnJlbnRCcmVha3BvaW50KTtcclxuICAgICAgICAgICAgICAgICAgICBfLmJyZWFrcG9pbnRTZXR0aW5nc1tjdXJyZW50QnJlYWtwb2ludF0gPSByZXNwb25zaXZlU2V0dGluZ3NbYnJlYWtwb2ludF0uc2V0dGluZ3M7XHJcblxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgXy5icmVha3BvaW50cy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAoIF8ub3B0aW9ucy5tb2JpbGVGaXJzdCApID8gYS1iIDogYi1hO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLnJlaW5pdCA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXM7XHJcblxyXG4gICAgICAgIF8ualF1ZXJ5c2xpZGVzID1cclxuICAgICAgICAgICAgXy5qUXVlcnlzbGlkZVRyYWNrXHJcbiAgICAgICAgICAgICAgICAuY2hpbGRyZW4oXy5vcHRpb25zLnNsaWRlKVxyXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCdzbGljay1zbGlkZScpO1xyXG5cclxuICAgICAgICBfLnNsaWRlQ291bnQgPSBfLmpRdWVyeXNsaWRlcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmIChfLmN1cnJlbnRTbGlkZSA+PSBfLnNsaWRlQ291bnQgJiYgXy5jdXJyZW50U2xpZGUgIT09IDApIHtcclxuICAgICAgICAgICAgXy5jdXJyZW50U2xpZGUgPSBfLmN1cnJlbnRTbGlkZSAtIF8ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChfLnNsaWRlQ291bnQgPD0gXy5vcHRpb25zLnNsaWRlc1RvU2hvdykge1xyXG4gICAgICAgICAgICBfLmN1cnJlbnRTbGlkZSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfLnJlZ2lzdGVyQnJlYWtwb2ludHMoKTtcclxuXHJcbiAgICAgICAgXy5zZXRQcm9wcygpO1xyXG4gICAgICAgIF8uc2V0dXBJbmZpbml0ZSgpO1xyXG5cclxuICAgICAgICBfLmJ1aWxkRG90cygpO1xyXG4gICAgICAgIF8udXBkYXRlRG90cygpO1xyXG4gICAgICAgIF8uaW5pdERvdEV2ZW50cygpO1xyXG4gICAgICAgIF8uYnVpbGRBcnJvd3MoKTtcclxuICAgICAgICBfLnVwZGF0ZUFycm93cygpO1xyXG4gICAgICAgIF8uaW5pdEFycm93RXZlbnRzKCk7XHJcbiAgICAgICAgXy5jbGVhblVwU2xpZGVFdmVudHMoKTtcclxuICAgICAgICBfLmluaXRTbGlkZUV2ZW50cygpO1xyXG5cclxuICAgICAgICBfLmNoZWNrUmVzcG9uc2l2ZShmYWxzZSwgdHJ1ZSk7XHJcblxyXG4gICAgICAgIGlmIChfLm9wdGlvbnMuZm9jdXNPblNlbGVjdCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBqUXVlcnkoXy5qUXVlcnlzbGlkZVRyYWNrKS5jaGlsZHJlbigpLm9uKCdjbGljay5zbGljaycsIF8uc2VsZWN0SGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfLnNldFNsaWRlQ2xhc3Nlcyh0eXBlb2YgXy5jdXJyZW50U2xpZGUgPT09ICdudW1iZXInID8gXy5jdXJyZW50U2xpZGUgOiAwKTtcclxuXHJcbiAgICAgICAgXy5zZXRQb3NpdGlvbigpO1xyXG4gICAgICAgIF8uZm9jdXNIYW5kbGVyKCk7XHJcblxyXG4gICAgICAgIF8ucGF1c2VkID0gIV8ub3B0aW9ucy5hdXRvcGxheTtcclxuICAgICAgICBfLmF1dG9QbGF5KCk7XHJcblxyXG4gICAgICAgIF8ualF1ZXJ5c2xpZGVyLnRyaWdnZXIoJ3JlSW5pdCcsIFtfXSk7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUucmVzaXplID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKGpRdWVyeSh3aW5kb3cpLndpZHRoKCkgIT09IF8ud2luZG93V2lkdGgpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KF8ud2luZG93RGVsYXkpO1xyXG4gICAgICAgICAgICBfLndpbmRvd0RlbGF5ID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBfLndpbmRvd1dpZHRoID0galF1ZXJ5KHdpbmRvdykud2lkdGgoKTtcclxuICAgICAgICAgICAgICAgIF8uY2hlY2tSZXNwb25zaXZlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiggIV8udW5zbGlja2VkICkgeyBfLnNldFBvc2l0aW9uKCk7IH1cclxuICAgICAgICAgICAgfSwgNTApO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLnJlbW92ZVNsaWRlID0gU2xpY2sucHJvdG90eXBlLnNsaWNrUmVtb3ZlID0gZnVuY3Rpb24oaW5kZXgsIHJlbW92ZUJlZm9yZSwgcmVtb3ZlQWxsKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZihpbmRleCkgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgICAgICByZW1vdmVCZWZvcmUgPSBpbmRleDtcclxuICAgICAgICAgICAgaW5kZXggPSByZW1vdmVCZWZvcmUgPT09IHRydWUgPyAwIDogXy5zbGlkZUNvdW50IC0gMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbmRleCA9IHJlbW92ZUJlZm9yZSA9PT0gdHJ1ZSA/IC0taW5kZXggOiBpbmRleDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChfLnNsaWRlQ291bnQgPCAxIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+IF8uc2xpZGVDb3VudCAtIDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgXy51bmxvYWQoKTtcclxuXHJcbiAgICAgICAgaWYgKHJlbW92ZUFsbCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBfLmpRdWVyeXNsaWRlVHJhY2suY2hpbGRyZW4oKS5yZW1vdmUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBfLmpRdWVyeXNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5lcShpbmRleCkucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfLmpRdWVyeXNsaWRlcyA9IF8ualF1ZXJ5c2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpO1xyXG5cclxuICAgICAgICBfLmpRdWVyeXNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKTtcclxuXHJcbiAgICAgICAgXy5qUXVlcnlzbGlkZVRyYWNrLmFwcGVuZChfLmpRdWVyeXNsaWRlcyk7XHJcblxyXG4gICAgICAgIF8ualF1ZXJ5c2xpZGVzQ2FjaGUgPSBfLmpRdWVyeXNsaWRlcztcclxuXHJcbiAgICAgICAgXy5yZWluaXQoKTtcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5zZXRDU1MgPSBmdW5jdGlvbihwb3NpdGlvbikge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXMsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uUHJvcHMgPSB7fSxcclxuICAgICAgICAgICAgeCwgeTtcclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy5ydGwgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgcG9zaXRpb24gPSAtcG9zaXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHggPSBfLnBvc2l0aW9uUHJvcCA9PSAnbGVmdCcgPyBNYXRoLmNlaWwocG9zaXRpb24pICsgJ3B4JyA6ICcwcHgnO1xyXG4gICAgICAgIHkgPSBfLnBvc2l0aW9uUHJvcCA9PSAndG9wJyA/IE1hdGguY2VpbChwb3NpdGlvbikgKyAncHgnIDogJzBweCc7XHJcblxyXG4gICAgICAgIHBvc2l0aW9uUHJvcHNbXy5wb3NpdGlvblByb3BdID0gcG9zaXRpb247XHJcblxyXG4gICAgICAgIGlmIChfLnRyYW5zZm9ybXNFbmFibGVkID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBfLmpRdWVyeXNsaWRlVHJhY2suY3NzKHBvc2l0aW9uUHJvcHMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBvc2l0aW9uUHJvcHMgPSB7fTtcclxuICAgICAgICAgICAgaWYgKF8uY3NzVHJhbnNpdGlvbnMgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvblByb3BzW18uYW5pbVR5cGVdID0gJ3RyYW5zbGF0ZSgnICsgeCArICcsICcgKyB5ICsgJyknO1xyXG4gICAgICAgICAgICAgICAgXy5qUXVlcnlzbGlkZVRyYWNrLmNzcyhwb3NpdGlvblByb3BzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHBvc2l0aW9uUHJvcHNbXy5hbmltVHlwZV0gPSAndHJhbnNsYXRlM2QoJyArIHggKyAnLCAnICsgeSArICcsIDBweCknO1xyXG4gICAgICAgICAgICAgICAgXy5qUXVlcnlzbGlkZVRyYWNrLmNzcyhwb3NpdGlvblByb3BzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5zZXREaW1lbnNpb25zID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy52ZXJ0aWNhbCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgaWYgKF8ub3B0aW9ucy5jZW50ZXJNb2RlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBfLmpRdWVyeWxpc3QuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAoJzBweCAnICsgXy5vcHRpb25zLmNlbnRlclBhZGRpbmcpXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5bGlzdC5oZWlnaHQoXy5qUXVlcnlzbGlkZXMuZmlyc3QoKS5vdXRlckhlaWdodCh0cnVlKSAqIF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cpO1xyXG4gICAgICAgICAgICBpZiAoXy5vcHRpb25zLmNlbnRlck1vZGUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgIF8ualF1ZXJ5bGlzdC5jc3Moe1xyXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IChfLm9wdGlvbnMuY2VudGVyUGFkZGluZyArICcgMHB4JylcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfLmxpc3RXaWR0aCA9IF8ualF1ZXJ5bGlzdC53aWR0aCgpO1xyXG4gICAgICAgIF8ubGlzdEhlaWdodCA9IF8ualF1ZXJ5bGlzdC5oZWlnaHQoKTtcclxuXHJcblxyXG4gICAgICAgIGlmIChfLm9wdGlvbnMudmVydGljYWwgPT09IGZhbHNlICYmIF8ub3B0aW9ucy52YXJpYWJsZVdpZHRoID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBfLnNsaWRlV2lkdGggPSBNYXRoLmNlaWwoXy5saXN0V2lkdGggLyBfLm9wdGlvbnMuc2xpZGVzVG9TaG93KTtcclxuICAgICAgICAgICAgXy5qUXVlcnlzbGlkZVRyYWNrLndpZHRoKE1hdGguY2VpbCgoXy5zbGlkZVdpZHRoICogXy5qUXVlcnlzbGlkZVRyYWNrLmNoaWxkcmVuKCcuc2xpY2stc2xpZGUnKS5sZW5ndGgpKSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAoXy5vcHRpb25zLnZhcmlhYmxlV2lkdGggPT09IHRydWUpIHtcclxuICAgICAgICAgICAgXy5qUXVlcnlzbGlkZVRyYWNrLndpZHRoKDUwMDAgKiBfLnNsaWRlQ291bnQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIF8uc2xpZGVXaWR0aCA9IE1hdGguY2VpbChfLmxpc3RXaWR0aCk7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVUcmFjay5oZWlnaHQoTWF0aC5jZWlsKChfLmpRdWVyeXNsaWRlcy5maXJzdCgpLm91dGVySGVpZ2h0KHRydWUpICogXy5qUXVlcnlzbGlkZVRyYWNrLmNoaWxkcmVuKCcuc2xpY2stc2xpZGUnKS5sZW5ndGgpKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgb2Zmc2V0ID0gXy5qUXVlcnlzbGlkZXMuZmlyc3QoKS5vdXRlcldpZHRoKHRydWUpIC0gXy5qUXVlcnlzbGlkZXMuZmlyc3QoKS53aWR0aCgpO1xyXG4gICAgICAgIGlmIChfLm9wdGlvbnMudmFyaWFibGVXaWR0aCA9PT0gZmFsc2UpIF8ualF1ZXJ5c2xpZGVUcmFjay5jaGlsZHJlbignLnNsaWNrLXNsaWRlJykud2lkdGgoXy5zbGlkZVdpZHRoIC0gb2Zmc2V0KTtcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5zZXRGYWRlID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcyxcclxuICAgICAgICAgICAgdGFyZ2V0TGVmdDtcclxuXHJcbiAgICAgICAgXy5qUXVlcnlzbGlkZXMuZWFjaChmdW5jdGlvbihpbmRleCwgZWxlbWVudCkge1xyXG4gICAgICAgICAgICB0YXJnZXRMZWZ0ID0gKF8uc2xpZGVXaWR0aCAqIGluZGV4KSAqIC0xO1xyXG4gICAgICAgICAgICBpZiAoXy5vcHRpb25zLnJ0bCA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgalF1ZXJ5KGVsZW1lbnQpLmNzcyh7XHJcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IHRhcmdldExlZnQsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgIHpJbmRleDogXy5vcHRpb25zLnpJbmRleCAtIDIsXHJcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoZWxlbWVudCkuY3NzKHtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0OiB0YXJnZXRMZWZ0LFxyXG4gICAgICAgICAgICAgICAgICAgIHRvcDogMCxcclxuICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IF8ub3B0aW9ucy56SW5kZXggLSAyLFxyXG4gICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDBcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIF8ualF1ZXJ5c2xpZGVzLmVxKF8uY3VycmVudFNsaWRlKS5jc3Moe1xyXG4gICAgICAgICAgICB6SW5kZXg6IF8ub3B0aW9ucy56SW5kZXggLSAxLFxyXG4gICAgICAgICAgICBvcGFjaXR5OiAxXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuc2V0SGVpZ2h0ID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cgPT09IDEgJiYgXy5vcHRpb25zLmFkYXB0aXZlSGVpZ2h0ID09PSB0cnVlICYmIF8ub3B0aW9ucy52ZXJ0aWNhbCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdmFyIHRhcmdldEhlaWdodCA9IF8ualF1ZXJ5c2xpZGVzLmVxKF8uY3VycmVudFNsaWRlKS5vdXRlckhlaWdodCh0cnVlKTtcclxuICAgICAgICAgICAgXy5qUXVlcnlsaXN0LmNzcygnaGVpZ2h0JywgdGFyZ2V0SGVpZ2h0KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuc2V0T3B0aW9uID1cclxuICAgIFNsaWNrLnByb3RvdHlwZS5zbGlja1NldE9wdGlvbiA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBhY2NlcHRzIGFyZ3VtZW50cyBpbiBmb3JtYXQgb2Y6XHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiAgLSBmb3IgY2hhbmdpbmcgYSBzaW5nbGUgb3B0aW9uJ3MgdmFsdWU6XHJcbiAgICAgICAgICogICAgIC5zbGljayhcInNldE9wdGlvblwiLCBvcHRpb24sIHZhbHVlLCByZWZyZXNoIClcclxuICAgICAgICAgKlxyXG4gICAgICAgICAqICAtIGZvciBjaGFuZ2luZyBhIHNldCBvZiByZXNwb25zaXZlIG9wdGlvbnM6XHJcbiAgICAgICAgICogICAgIC5zbGljayhcInNldE9wdGlvblwiLCAncmVzcG9uc2l2ZScsIFt7fSwgLi4uXSwgcmVmcmVzaCApXHJcbiAgICAgICAgICpcclxuICAgICAgICAgKiAgLSBmb3IgdXBkYXRpbmcgbXVsdGlwbGUgdmFsdWVzIGF0IG9uY2UgKG5vdCByZXNwb25zaXZlKVxyXG4gICAgICAgICAqICAgICAuc2xpY2soXCJzZXRPcHRpb25cIiwgeyAnb3B0aW9uJzogdmFsdWUsIC4uLiB9LCByZWZyZXNoIClcclxuICAgICAgICAgKi9cclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzLCBsLCBpdGVtLCBvcHRpb24sIHZhbHVlLCByZWZyZXNoID0gZmFsc2UsIHR5cGU7XHJcblxyXG4gICAgICAgIGlmKCBqUXVlcnkudHlwZSggYXJndW1lbnRzWzBdICkgPT09ICdvYmplY3QnICkge1xyXG5cclxuICAgICAgICAgICAgb3B0aW9uID0gIGFyZ3VtZW50c1swXTtcclxuICAgICAgICAgICAgcmVmcmVzaCA9IGFyZ3VtZW50c1sxXTtcclxuICAgICAgICAgICAgdHlwZSA9ICdtdWx0aXBsZSc7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAoIGpRdWVyeS50eXBlKCBhcmd1bWVudHNbMF0gKSA9PT0gJ3N0cmluZycgKSB7XHJcblxyXG4gICAgICAgICAgICBvcHRpb24gPSAgYXJndW1lbnRzWzBdO1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGFyZ3VtZW50c1sxXTtcclxuICAgICAgICAgICAgcmVmcmVzaCA9IGFyZ3VtZW50c1syXTtcclxuXHJcbiAgICAgICAgICAgIGlmICggYXJndW1lbnRzWzBdID09PSAncmVzcG9uc2l2ZScgJiYgalF1ZXJ5LnR5cGUoIGFyZ3VtZW50c1sxXSApID09PSAnYXJyYXknICkge1xyXG5cclxuICAgICAgICAgICAgICAgIHR5cGUgPSAncmVzcG9uc2l2ZSc7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCB0eXBlb2YgYXJndW1lbnRzWzFdICE9PSAndW5kZWZpbmVkJyApIHtcclxuXHJcbiAgICAgICAgICAgICAgICB0eXBlID0gJ3NpbmdsZSc7XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCB0eXBlID09PSAnc2luZ2xlJyApIHtcclxuXHJcbiAgICAgICAgICAgIF8ub3B0aW9uc1tvcHRpb25dID0gdmFsdWU7XHJcblxyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKCB0eXBlID09PSAnbXVsdGlwbGUnICkge1xyXG5cclxuICAgICAgICAgICAgalF1ZXJ5LmVhY2goIG9wdGlvbiAsIGZ1bmN0aW9uKCBvcHQsIHZhbCApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBfLm9wdGlvbnNbb3B0XSA9IHZhbDtcclxuXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgfSBlbHNlIGlmICggdHlwZSA9PT0gJ3Jlc3BvbnNpdmUnICkge1xyXG5cclxuICAgICAgICAgICAgZm9yICggaXRlbSBpbiB2YWx1ZSApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiggalF1ZXJ5LnR5cGUoIF8ub3B0aW9ucy5yZXNwb25zaXZlICkgIT09ICdhcnJheScgKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIF8ub3B0aW9ucy5yZXNwb25zaXZlID0gWyB2YWx1ZVtpdGVtXSBdO1xyXG5cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGwgPSBfLm9wdGlvbnMucmVzcG9uc2l2ZS5sZW5ndGgtMTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRoZSByZXNwb25zaXZlIG9iamVjdCBhbmQgc3BsaWNlIG91dCBkdXBsaWNhdGVzLlxyXG4gICAgICAgICAgICAgICAgICAgIHdoaWxlKCBsID49IDAgKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiggXy5vcHRpb25zLnJlc3BvbnNpdmVbbF0uYnJlYWtwb2ludCA9PT0gdmFsdWVbaXRlbV0uYnJlYWtwb2ludCApIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLm9wdGlvbnMucmVzcG9uc2l2ZS5zcGxpY2UobCwxKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGwtLTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBfLm9wdGlvbnMucmVzcG9uc2l2ZS5wdXNoKCB2YWx1ZVtpdGVtXSApO1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIHJlZnJlc2ggKSB7XHJcblxyXG4gICAgICAgICAgICBfLnVubG9hZCgpO1xyXG4gICAgICAgICAgICBfLnJlaW5pdCgpO1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuc2V0UG9zaXRpb24gPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBfLnNldERpbWVuc2lvbnMoKTtcclxuXHJcbiAgICAgICAgXy5zZXRIZWlnaHQoKTtcclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy5mYWRlID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBfLnNldENTUyhfLmdldExlZnQoXy5jdXJyZW50U2xpZGUpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBfLnNldEZhZGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF8ualF1ZXJ5c2xpZGVyLnRyaWdnZXIoJ3NldFBvc2l0aW9uJywgW19dKTtcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5zZXRQcm9wcyA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXMsXHJcbiAgICAgICAgICAgIGJvZHlTdHlsZSA9IGRvY3VtZW50LmJvZHkuc3R5bGU7XHJcblxyXG4gICAgICAgIF8ucG9zaXRpb25Qcm9wID0gXy5vcHRpb25zLnZlcnRpY2FsID09PSB0cnVlID8gJ3RvcCcgOiAnbGVmdCc7XHJcblxyXG4gICAgICAgIGlmIChfLnBvc2l0aW9uUHJvcCA9PT0gJ3RvcCcpIHtcclxuICAgICAgICAgICAgXy5qUXVlcnlzbGlkZXIuYWRkQ2xhc3MoJ3NsaWNrLXZlcnRpY2FsJyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgXy5qUXVlcnlzbGlkZXIucmVtb3ZlQ2xhc3MoJ3NsaWNrLXZlcnRpY2FsJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYm9keVN0eWxlLldlYmtpdFRyYW5zaXRpb24gIT09IHVuZGVmaW5lZCB8fFxyXG4gICAgICAgICAgICBib2R5U3R5bGUuTW96VHJhbnNpdGlvbiAhPT0gdW5kZWZpbmVkIHx8XHJcbiAgICAgICAgICAgIGJvZHlTdHlsZS5tc1RyYW5zaXRpb24gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBpZiAoXy5vcHRpb25zLnVzZUNTUyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgXy5jc3NUcmFuc2l0aW9ucyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICggXy5vcHRpb25zLmZhZGUgKSB7XHJcbiAgICAgICAgICAgIGlmICggdHlwZW9mIF8ub3B0aW9ucy56SW5kZXggPT09ICdudW1iZXInICkge1xyXG4gICAgICAgICAgICAgICAgaWYoIF8ub3B0aW9ucy56SW5kZXggPCAzICkge1xyXG4gICAgICAgICAgICAgICAgICAgIF8ub3B0aW9ucy56SW5kZXggPSAzO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgXy5vcHRpb25zLnpJbmRleCA9IF8uZGVmYXVsdHMuekluZGV4O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYm9keVN0eWxlLk9UcmFuc2Zvcm0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBfLmFuaW1UeXBlID0gJ09UcmFuc2Zvcm0nO1xyXG4gICAgICAgICAgICBfLnRyYW5zZm9ybVR5cGUgPSAnLW8tdHJhbnNmb3JtJztcclxuICAgICAgICAgICAgXy50cmFuc2l0aW9uVHlwZSA9ICdPVHJhbnNpdGlvbic7XHJcbiAgICAgICAgICAgIGlmIChib2R5U3R5bGUucGVyc3BlY3RpdmVQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkICYmIGJvZHlTdHlsZS53ZWJraXRQZXJzcGVjdGl2ZSA9PT0gdW5kZWZpbmVkKSBfLmFuaW1UeXBlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChib2R5U3R5bGUuTW96VHJhbnNmb3JtICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgXy5hbmltVHlwZSA9ICdNb3pUcmFuc2Zvcm0nO1xyXG4gICAgICAgICAgICBfLnRyYW5zZm9ybVR5cGUgPSAnLW1vei10cmFuc2Zvcm0nO1xyXG4gICAgICAgICAgICBfLnRyYW5zaXRpb25UeXBlID0gJ01velRyYW5zaXRpb24nO1xyXG4gICAgICAgICAgICBpZiAoYm9keVN0eWxlLnBlcnNwZWN0aXZlUHJvcGVydHkgPT09IHVuZGVmaW5lZCAmJiBib2R5U3R5bGUuTW96UGVyc3BlY3RpdmUgPT09IHVuZGVmaW5lZCkgXy5hbmltVHlwZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYm9keVN0eWxlLndlYmtpdFRyYW5zZm9ybSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIF8uYW5pbVR5cGUgPSAnd2Via2l0VHJhbnNmb3JtJztcclxuICAgICAgICAgICAgXy50cmFuc2Zvcm1UeXBlID0gJy13ZWJraXQtdHJhbnNmb3JtJztcclxuICAgICAgICAgICAgXy50cmFuc2l0aW9uVHlwZSA9ICd3ZWJraXRUcmFuc2l0aW9uJztcclxuICAgICAgICAgICAgaWYgKGJvZHlTdHlsZS5wZXJzcGVjdGl2ZVByb3BlcnR5ID09PSB1bmRlZmluZWQgJiYgYm9keVN0eWxlLndlYmtpdFBlcnNwZWN0aXZlID09PSB1bmRlZmluZWQpIF8uYW5pbVR5cGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJvZHlTdHlsZS5tc1RyYW5zZm9ybSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIF8uYW5pbVR5cGUgPSAnbXNUcmFuc2Zvcm0nO1xyXG4gICAgICAgICAgICBfLnRyYW5zZm9ybVR5cGUgPSAnLW1zLXRyYW5zZm9ybSc7XHJcbiAgICAgICAgICAgIF8udHJhbnNpdGlvblR5cGUgPSAnbXNUcmFuc2l0aW9uJztcclxuICAgICAgICAgICAgaWYgKGJvZHlTdHlsZS5tc1RyYW5zZm9ybSA9PT0gdW5kZWZpbmVkKSBfLmFuaW1UeXBlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChib2R5U3R5bGUudHJhbnNmb3JtICE9PSB1bmRlZmluZWQgJiYgXy5hbmltVHlwZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgXy5hbmltVHlwZSA9ICd0cmFuc2Zvcm0nO1xyXG4gICAgICAgICAgICBfLnRyYW5zZm9ybVR5cGUgPSAndHJhbnNmb3JtJztcclxuICAgICAgICAgICAgXy50cmFuc2l0aW9uVHlwZSA9ICd0cmFuc2l0aW9uJztcclxuICAgICAgICB9XHJcbiAgICAgICAgXy50cmFuc2Zvcm1zRW5hYmxlZCA9IF8ub3B0aW9ucy51c2VUcmFuc2Zvcm0gJiYgKF8uYW5pbVR5cGUgIT09IG51bGwgJiYgXy5hbmltVHlwZSAhPT0gZmFsc2UpO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLnNldFNsaWRlQ2xhc3NlcyA9IGZ1bmN0aW9uKGluZGV4KSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcyxcclxuICAgICAgICAgICAgY2VudGVyT2Zmc2V0LCBhbGxTbGlkZXMsIGluZGV4T2Zmc2V0LCByZW1haW5kZXI7XHJcblxyXG4gICAgICAgIGFsbFNsaWRlcyA9IF8ualF1ZXJ5c2xpZGVyXHJcbiAgICAgICAgICAgIC5maW5kKCcuc2xpY2stc2xpZGUnKVxyXG4gICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3NsaWNrLWFjdGl2ZSBzbGljay1jZW50ZXIgc2xpY2stY3VycmVudCcpXHJcbiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XHJcblxyXG4gICAgICAgIF8ualF1ZXJ5c2xpZGVzXHJcbiAgICAgICAgICAgIC5lcShpbmRleClcclxuICAgICAgICAgICAgLmFkZENsYXNzKCdzbGljay1jdXJyZW50Jyk7XHJcblxyXG4gICAgICAgIGlmIChfLm9wdGlvbnMuY2VudGVyTW9kZSA9PT0gdHJ1ZSkge1xyXG5cclxuICAgICAgICAgICAgY2VudGVyT2Zmc2V0ID0gTWF0aC5mbG9vcihfLm9wdGlvbnMuc2xpZGVzVG9TaG93IC8gMik7XHJcblxyXG4gICAgICAgICAgICBpZiAoXy5vcHRpb25zLmluZmluaXRlID09PSB0cnVlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IGNlbnRlck9mZnNldCAmJiBpbmRleCA8PSAoXy5zbGlkZUNvdW50IC0gMSkgLSBjZW50ZXJPZmZzZXQpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgXy5qUXVlcnlzbGlkZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKGluZGV4IC0gY2VudGVyT2Zmc2V0LCBpbmRleCArIGNlbnRlck9mZnNldCArIDEpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnc2xpY2stYWN0aXZlJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhPZmZzZXQgPSBfLm9wdGlvbnMuc2xpZGVzVG9TaG93ICsgaW5kZXg7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsU2xpZGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZShpbmRleE9mZnNldCAtIGNlbnRlck9mZnNldCArIDEsIGluZGV4T2Zmc2V0ICsgY2VudGVyT2Zmc2V0ICsgMilcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdzbGljay1hY3RpdmUnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGFsbFNsaWRlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZXEoYWxsU2xpZGVzLmxlbmd0aCAtIDEgLSBfLm9wdGlvbnMuc2xpZGVzVG9TaG93KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ3NsaWNrLWNlbnRlcicpO1xyXG5cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IF8uc2xpZGVDb3VudCAtIDEpIHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYWxsU2xpZGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5lcShfLm9wdGlvbnMuc2xpZGVzVG9TaG93KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ3NsaWNrLWNlbnRlcicpO1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVzXHJcbiAgICAgICAgICAgICAgICAuZXEoaW5kZXgpXHJcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ3NsaWNrLWNlbnRlcicpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPD0gKF8uc2xpZGVDb3VudCAtIF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cpKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgXy5qUXVlcnlzbGlkZXNcclxuICAgICAgICAgICAgICAgICAgICAuc2xpY2UoaW5kZXgsIGluZGV4ICsgXy5vcHRpb25zLnNsaWRlc1RvU2hvdylcclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ3NsaWNrLWFjdGl2ZScpXHJcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFsbFNsaWRlcy5sZW5ndGggPD0gXy5vcHRpb25zLnNsaWRlc1RvU2hvdykge1xyXG5cclxuICAgICAgICAgICAgICAgIGFsbFNsaWRlc1xyXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnc2xpY2stYWN0aXZlJylcclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgcmVtYWluZGVyID0gXy5zbGlkZUNvdW50ICUgXy5vcHRpb25zLnNsaWRlc1RvU2hvdztcclxuICAgICAgICAgICAgICAgIGluZGV4T2Zmc2V0ID0gXy5vcHRpb25zLmluZmluaXRlID09PSB0cnVlID8gXy5vcHRpb25zLnNsaWRlc1RvU2hvdyArIGluZGV4IDogaW5kZXg7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cgPT0gXy5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsICYmIChfLnNsaWRlQ291bnQgLSBpbmRleCkgPCBfLm9wdGlvbnMuc2xpZGVzVG9TaG93KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGFsbFNsaWRlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoaW5kZXhPZmZzZXQgLSAoXy5vcHRpb25zLnNsaWRlc1RvU2hvdyAtIHJlbWFpbmRlciksIGluZGV4T2Zmc2V0ICsgcmVtYWluZGVyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ3NsaWNrLWFjdGl2ZScpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xyXG5cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGFsbFNsaWRlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoaW5kZXhPZmZzZXQsIGluZGV4T2Zmc2V0ICsgXy5vcHRpb25zLnNsaWRlc1RvU2hvdylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdzbGljay1hY3RpdmUnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy5sYXp5TG9hZCA9PT0gJ29uZGVtYW5kJykge1xyXG4gICAgICAgICAgICBfLmxhenlMb2FkKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLnNldHVwSW5maW5pdGUgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzLFxyXG4gICAgICAgICAgICBpLCBzbGlkZUluZGV4LCBpbmZpbml0ZUNvdW50O1xyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLmZhZGUgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgXy5vcHRpb25zLmNlbnRlck1vZGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChfLm9wdGlvbnMuaW5maW5pdGUgPT09IHRydWUgJiYgXy5vcHRpb25zLmZhZGUgPT09IGZhbHNlKSB7XHJcblxyXG4gICAgICAgICAgICBzbGlkZUluZGV4ID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmIChfLnNsaWRlQ291bnQgPiBfLm9wdGlvbnMuc2xpZGVzVG9TaG93KSB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKF8ub3B0aW9ucy5jZW50ZXJNb2RlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaW5maW5pdGVDb3VudCA9IF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cgKyAxO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpbmZpbml0ZUNvdW50ID0gXy5vcHRpb25zLnNsaWRlc1RvU2hvdztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSBfLnNsaWRlQ291bnQ7IGkgPiAoXy5zbGlkZUNvdW50IC1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaW5maW5pdGVDb3VudCk7IGkgLT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNsaWRlSW5kZXggPSBpIC0gMTtcclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkoXy5qUXVlcnlzbGlkZXNbc2xpZGVJbmRleF0pLmNsb25lKHRydWUpLmF0dHIoJ2lkJywgJycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdkYXRhLXNsaWNrLWluZGV4Jywgc2xpZGVJbmRleCAtIF8uc2xpZGVDb3VudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnByZXBlbmRUbyhfLmpRdWVyeXNsaWRlVHJhY2spLmFkZENsYXNzKCdzbGljay1jbG9uZWQnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZpbml0ZUNvdW50OyBpICs9IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBzbGlkZUluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkoXy5qUXVlcnlzbGlkZXNbc2xpZGVJbmRleF0pLmNsb25lKHRydWUpLmF0dHIoJ2lkJywgJycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdkYXRhLXNsaWNrLWluZGV4Jywgc2xpZGVJbmRleCArIF8uc2xpZGVDb3VudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKF8ualF1ZXJ5c2xpZGVUcmFjaykuYWRkQ2xhc3MoJ3NsaWNrLWNsb25lZCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXy5qUXVlcnlzbGlkZVRyYWNrLmZpbmQoJy5zbGljay1jbG9uZWQnKS5maW5kKCdbaWRdJykuZWFjaChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICBqUXVlcnkodGhpcykuYXR0cignaWQnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLmludGVycnVwdCA9IGZ1bmN0aW9uKCB0b2dnbGUgKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYoICF0b2dnbGUgKSB7XHJcbiAgICAgICAgICAgIF8uYXV0b1BsYXkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXy5pbnRlcnJ1cHRlZCA9IHRvZ2dsZTtcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5zZWxlY3RIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICB2YXIgdGFyZ2V0RWxlbWVudCA9XHJcbiAgICAgICAgICAgIGpRdWVyeShldmVudC50YXJnZXQpLmlzKCcuc2xpY2stc2xpZGUnKSA/XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoZXZlbnQudGFyZ2V0KSA6XHJcbiAgICAgICAgICAgICAgICBqUXVlcnkoZXZlbnQudGFyZ2V0KS5wYXJlbnRzKCcuc2xpY2stc2xpZGUnKTtcclxuXHJcbiAgICAgICAgdmFyIGluZGV4ID0gcGFyc2VJbnQodGFyZ2V0RWxlbWVudC5hdHRyKCdkYXRhLXNsaWNrLWluZGV4JykpO1xyXG5cclxuICAgICAgICBpZiAoIWluZGV4KSBpbmRleCA9IDA7XHJcblxyXG4gICAgICAgIGlmIChfLnNsaWRlQ291bnQgPD0gXy5vcHRpb25zLnNsaWRlc1RvU2hvdykge1xyXG5cclxuICAgICAgICAgICAgXy5zZXRTbGlkZUNsYXNzZXMoaW5kZXgpO1xyXG4gICAgICAgICAgICBfLmFzTmF2Rm9yKGluZGV4KTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF8uc2xpZGVIYW5kbGVyKGluZGV4KTtcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5zbGlkZUhhbmRsZXIgPSBmdW5jdGlvbihpbmRleCwgc3luYywgZG9udEFuaW1hdGUpIHtcclxuXHJcbiAgICAgICAgdmFyIHRhcmdldFNsaWRlLCBhbmltU2xpZGUsIG9sZFNsaWRlLCBzbGlkZUxlZnQsIHRhcmdldExlZnQgPSBudWxsLFxyXG4gICAgICAgICAgICBfID0gdGhpcywgbmF2VGFyZ2V0O1xyXG5cclxuICAgICAgICBzeW5jID0gc3luYyB8fCBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKF8uYW5pbWF0aW5nID09PSB0cnVlICYmIF8ub3B0aW9ucy53YWl0Rm9yQW5pbWF0ZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLmZhZGUgPT09IHRydWUgJiYgXy5jdXJyZW50U2xpZGUgPT09IGluZGV4KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChfLnNsaWRlQ291bnQgPD0gXy5vcHRpb25zLnNsaWRlc1RvU2hvdykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3luYyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgXy5hc05hdkZvcihpbmRleCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0YXJnZXRTbGlkZSA9IGluZGV4O1xyXG4gICAgICAgIHRhcmdldExlZnQgPSBfLmdldExlZnQodGFyZ2V0U2xpZGUpO1xyXG4gICAgICAgIHNsaWRlTGVmdCA9IF8uZ2V0TGVmdChfLmN1cnJlbnRTbGlkZSk7XHJcblxyXG4gICAgICAgIF8uY3VycmVudExlZnQgPSBfLnN3aXBlTGVmdCA9PT0gbnVsbCA/IHNsaWRlTGVmdCA6IF8uc3dpcGVMZWZ0O1xyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLmluZmluaXRlID09PSBmYWxzZSAmJiBfLm9wdGlvbnMuY2VudGVyTW9kZSA9PT0gZmFsc2UgJiYgKGluZGV4IDwgMCB8fCBpbmRleCA+IF8uZ2V0RG90Q291bnQoKSAqIF8ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpIHtcclxuICAgICAgICAgICAgaWYgKF8ub3B0aW9ucy5mYWRlID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgdGFyZ2V0U2xpZGUgPSBfLmN1cnJlbnRTbGlkZTtcclxuICAgICAgICAgICAgICAgIGlmIChkb250QW5pbWF0ZSAhPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIF8uYW5pbWF0ZVNsaWRlKHNsaWRlTGVmdCwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF8ucG9zdFNsaWRlKHRhcmdldFNsaWRlKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgXy5wb3N0U2xpZGUodGFyZ2V0U2xpZGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2UgaWYgKF8ub3B0aW9ucy5pbmZpbml0ZSA9PT0gZmFsc2UgJiYgXy5vcHRpb25zLmNlbnRlck1vZGUgPT09IHRydWUgJiYgKGluZGV4IDwgMCB8fCBpbmRleCA+IChfLnNsaWRlQ291bnQgLSBfLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwpKSkge1xyXG4gICAgICAgICAgICBpZiAoXy5vcHRpb25zLmZhZGUgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXRTbGlkZSA9IF8uY3VycmVudFNsaWRlO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRvbnRBbmltYXRlICE9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgXy5hbmltYXRlU2xpZGUoc2xpZGVMZWZ0LCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXy5wb3N0U2xpZGUodGFyZ2V0U2xpZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBfLnBvc3RTbGlkZSh0YXJnZXRTbGlkZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCBfLm9wdGlvbnMuYXV0b3BsYXkgKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoXy5hdXRvUGxheVRpbWVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRTbGlkZSA8IDApIHtcclxuICAgICAgICAgICAgaWYgKF8uc2xpZGVDb3VudCAlIF8ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgYW5pbVNsaWRlID0gXy5zbGlkZUNvdW50IC0gKF8uc2xpZGVDb3VudCAlIF8ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhbmltU2xpZGUgPSBfLnNsaWRlQ291bnQgKyB0YXJnZXRTbGlkZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0U2xpZGUgPj0gXy5zbGlkZUNvdW50KSB7XHJcbiAgICAgICAgICAgIGlmIChfLnNsaWRlQ291bnQgJSBfLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwgIT09IDApIHtcclxuICAgICAgICAgICAgICAgIGFuaW1TbGlkZSA9IDA7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhbmltU2xpZGUgPSB0YXJnZXRTbGlkZSAtIF8uc2xpZGVDb3VudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFuaW1TbGlkZSA9IHRhcmdldFNsaWRlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgXy5hbmltYXRpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICBfLmpRdWVyeXNsaWRlci50cmlnZ2VyKCdiZWZvcmVDaGFuZ2UnLCBbXywgXy5jdXJyZW50U2xpZGUsIGFuaW1TbGlkZV0pO1xyXG5cclxuICAgICAgICBvbGRTbGlkZSA9IF8uY3VycmVudFNsaWRlO1xyXG4gICAgICAgIF8uY3VycmVudFNsaWRlID0gYW5pbVNsaWRlO1xyXG5cclxuICAgICAgICBfLnNldFNsaWRlQ2xhc3NlcyhfLmN1cnJlbnRTbGlkZSk7XHJcblxyXG4gICAgICAgIGlmICggXy5vcHRpb25zLmFzTmF2Rm9yICkge1xyXG5cclxuICAgICAgICAgICAgbmF2VGFyZ2V0ID0gXy5nZXROYXZUYXJnZXQoKTtcclxuICAgICAgICAgICAgbmF2VGFyZ2V0ID0gbmF2VGFyZ2V0LnNsaWNrKCdnZXRTbGljaycpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCBuYXZUYXJnZXQuc2xpZGVDb3VudCA8PSBuYXZUYXJnZXQub3B0aW9ucy5zbGlkZXNUb1Nob3cgKSB7XHJcbiAgICAgICAgICAgICAgICBuYXZUYXJnZXQuc2V0U2xpZGVDbGFzc2VzKF8uY3VycmVudFNsaWRlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF8udXBkYXRlRG90cygpO1xyXG4gICAgICAgIF8udXBkYXRlQXJyb3dzKCk7XHJcblxyXG4gICAgICAgIGlmIChfLm9wdGlvbnMuZmFkZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBpZiAoZG9udEFuaW1hdGUgIT09IHRydWUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBfLmZhZGVTbGlkZU91dChvbGRTbGlkZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgXy5mYWRlU2xpZGUoYW5pbVNsaWRlLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICBfLnBvc3RTbGlkZShhbmltU2xpZGUpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgXy5wb3N0U2xpZGUoYW5pbVNsaWRlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfLmFuaW1hdGVIZWlnaHQoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRvbnRBbmltYXRlICE9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIF8uYW5pbWF0ZVNsaWRlKHRhcmdldExlZnQsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgXy5wb3N0U2xpZGUoYW5pbVNsaWRlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgXy5wb3N0U2xpZGUoYW5pbVNsaWRlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuc3RhcnRMb2FkID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy5hcnJvd3MgPT09IHRydWUgJiYgXy5zbGlkZUNvdW50ID4gXy5vcHRpb25zLnNsaWRlc1RvU2hvdykge1xyXG5cclxuICAgICAgICAgICAgXy5qUXVlcnlwcmV2QXJyb3cuaGlkZSgpO1xyXG4gICAgICAgICAgICBfLmpRdWVyeW5leHRBcnJvdy5oaWRlKCk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy5kb3RzID09PSB0cnVlICYmIF8uc2xpZGVDb3VudCA+IF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cpIHtcclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5ZG90cy5oaWRlKCk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgXy5qUXVlcnlzbGlkZXIuYWRkQ2xhc3MoJ3NsaWNrLWxvYWRpbmcnKTtcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5zd2lwZURpcmVjdGlvbiA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgeERpc3QsIHlEaXN0LCByLCBzd2lwZUFuZ2xlLCBfID0gdGhpcztcclxuXHJcbiAgICAgICAgeERpc3QgPSBfLnRvdWNoT2JqZWN0LnN0YXJ0WCAtIF8udG91Y2hPYmplY3QuY3VyWDtcclxuICAgICAgICB5RGlzdCA9IF8udG91Y2hPYmplY3Quc3RhcnRZIC0gXy50b3VjaE9iamVjdC5jdXJZO1xyXG4gICAgICAgIHIgPSBNYXRoLmF0YW4yKHlEaXN0LCB4RGlzdCk7XHJcblxyXG4gICAgICAgIHN3aXBlQW5nbGUgPSBNYXRoLnJvdW5kKHIgKiAxODAgLyBNYXRoLlBJKTtcclxuICAgICAgICBpZiAoc3dpcGVBbmdsZSA8IDApIHtcclxuICAgICAgICAgICAgc3dpcGVBbmdsZSA9IDM2MCAtIE1hdGguYWJzKHN3aXBlQW5nbGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKChzd2lwZUFuZ2xlIDw9IDQ1KSAmJiAoc3dpcGVBbmdsZSA+PSAwKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gKF8ub3B0aW9ucy5ydGwgPT09IGZhbHNlID8gJ2xlZnQnIDogJ3JpZ2h0Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICgoc3dpcGVBbmdsZSA8PSAzNjApICYmIChzd2lwZUFuZ2xlID49IDMxNSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChfLm9wdGlvbnMucnRsID09PSBmYWxzZSA/ICdsZWZ0JyA6ICdyaWdodCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKHN3aXBlQW5nbGUgPj0gMTM1KSAmJiAoc3dpcGVBbmdsZSA8PSAyMjUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoXy5vcHRpb25zLnJ0bCA9PT0gZmFsc2UgPyAncmlnaHQnIDogJ2xlZnQnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmcgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKChzd2lwZUFuZ2xlID49IDM1KSAmJiAoc3dpcGVBbmdsZSA8PSAxMzUpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Rvd24nO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICd1cCc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAndmVydGljYWwnO1xyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLnN3aXBlRW5kID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzLFxyXG4gICAgICAgICAgICBzbGlkZUNvdW50LFxyXG4gICAgICAgICAgICBkaXJlY3Rpb247XHJcblxyXG4gICAgICAgIF8uZHJhZ2dpbmcgPSBmYWxzZTtcclxuICAgICAgICBfLmludGVycnVwdGVkID0gZmFsc2U7XHJcbiAgICAgICAgXy5zaG91bGRDbGljayA9ICggXy50b3VjaE9iamVjdC5zd2lwZUxlbmd0aCA+IDEwICkgPyBmYWxzZSA6IHRydWU7XHJcblxyXG4gICAgICAgIGlmICggXy50b3VjaE9iamVjdC5jdXJYID09PSB1bmRlZmluZWQgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICggXy50b3VjaE9iamVjdC5lZGdlSGl0ID09PSB0cnVlICkge1xyXG4gICAgICAgICAgICBfLmpRdWVyeXNsaWRlci50cmlnZ2VyKCdlZGdlJywgW18sIF8uc3dpcGVEaXJlY3Rpb24oKSBdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICggXy50b3VjaE9iamVjdC5zd2lwZUxlbmd0aCA+PSBfLnRvdWNoT2JqZWN0Lm1pblN3aXBlICkge1xyXG5cclxuICAgICAgICAgICAgZGlyZWN0aW9uID0gXy5zd2lwZURpcmVjdGlvbigpO1xyXG5cclxuICAgICAgICAgICAgc3dpdGNoICggZGlyZWN0aW9uICkge1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgJ2xlZnQnOlxyXG4gICAgICAgICAgICAgICAgY2FzZSAnZG93bic6XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHNsaWRlQ291bnQgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBfLm9wdGlvbnMuc3dpcGVUb1NsaWRlID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uY2hlY2tOYXZpZ2FibGUoIF8uY3VycmVudFNsaWRlICsgXy5nZXRTbGlkZUNvdW50KCkgKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmN1cnJlbnRTbGlkZSArIF8uZ2V0U2xpZGVDb3VudCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBfLmN1cnJlbnREaXJlY3Rpb24gPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBjYXNlICdyaWdodCc6XHJcbiAgICAgICAgICAgICAgICBjYXNlICd1cCc6XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHNsaWRlQ291bnQgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBfLm9wdGlvbnMuc3dpcGVUb1NsaWRlID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uY2hlY2tOYXZpZ2FibGUoIF8uY3VycmVudFNsaWRlIC0gXy5nZXRTbGlkZUNvdW50KCkgKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmN1cnJlbnRTbGlkZSAtIF8uZ2V0U2xpZGVDb3VudCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBfLmN1cnJlbnREaXJlY3Rpb24gPSAxO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG5cclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmKCBkaXJlY3Rpb24gIT0gJ3ZlcnRpY2FsJyApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBfLnNsaWRlSGFuZGxlciggc2xpZGVDb3VudCApO1xyXG4gICAgICAgICAgICAgICAgXy50b3VjaE9iamVjdCA9IHt9O1xyXG4gICAgICAgICAgICAgICAgXy5qUXVlcnlzbGlkZXIudHJpZ2dlcignc3dpcGUnLCBbXywgZGlyZWN0aW9uIF0pO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgICAgaWYgKCBfLnRvdWNoT2JqZWN0LnN0YXJ0WCAhPT0gXy50b3VjaE9iamVjdC5jdXJYICkge1xyXG5cclxuICAgICAgICAgICAgICAgIF8uc2xpZGVIYW5kbGVyKCBfLmN1cnJlbnRTbGlkZSApO1xyXG4gICAgICAgICAgICAgICAgXy50b3VjaE9iamVjdCA9IHt9O1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUuc3dpcGVIYW5kbGVyID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBpZiAoKF8ub3B0aW9ucy5zd2lwZSA9PT0gZmFsc2UpIHx8ICgnb250b3VjaGVuZCcgaW4gZG9jdW1lbnQgJiYgXy5vcHRpb25zLnN3aXBlID09PSBmYWxzZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXy5vcHRpb25zLmRyYWdnYWJsZSA9PT0gZmFsc2UgJiYgZXZlbnQudHlwZS5pbmRleE9mKCdtb3VzZScpICE9PSAtMSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfLnRvdWNoT2JqZWN0LmZpbmdlckNvdW50ID0gZXZlbnQub3JpZ2luYWxFdmVudCAmJiBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXMgIT09IHVuZGVmaW5lZCA/XHJcbiAgICAgICAgICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlcy5sZW5ndGggOiAxO1xyXG5cclxuICAgICAgICBfLnRvdWNoT2JqZWN0Lm1pblN3aXBlID0gXy5saXN0V2lkdGggLyBfLm9wdGlvbnNcclxuICAgICAgICAgICAgLnRvdWNoVGhyZXNob2xkO1xyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLnZlcnRpY2FsU3dpcGluZyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBfLnRvdWNoT2JqZWN0Lm1pblN3aXBlID0gXy5saXN0SGVpZ2h0IC8gXy5vcHRpb25zXHJcbiAgICAgICAgICAgICAgICAudG91Y2hUaHJlc2hvbGQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmRhdGEuYWN0aW9uKSB7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdzdGFydCc6XHJcbiAgICAgICAgICAgICAgICBfLnN3aXBlU3RhcnQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICBjYXNlICdtb3ZlJzpcclxuICAgICAgICAgICAgICAgIF8uc3dpcGVNb3ZlKGV2ZW50KTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgY2FzZSAnZW5kJzpcclxuICAgICAgICAgICAgICAgIF8uc3dpcGVFbmQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5zd2lwZU1vdmUgPSBmdW5jdGlvbihldmVudCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXMsXHJcbiAgICAgICAgICAgIGVkZ2VXYXNIaXQgPSBmYWxzZSxcclxuICAgICAgICAgICAgY3VyTGVmdCwgc3dpcGVEaXJlY3Rpb24sIHN3aXBlTGVuZ3RoLCBwb3NpdGlvbk9mZnNldCwgdG91Y2hlcztcclxuXHJcbiAgICAgICAgdG91Y2hlcyA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQgIT09IHVuZGVmaW5lZCA/IGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlcyA6IG51bGw7XHJcblxyXG4gICAgICAgIGlmICghXy5kcmFnZ2luZyB8fCB0b3VjaGVzICYmIHRvdWNoZXMubGVuZ3RoICE9PSAxKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGN1ckxlZnQgPSBfLmdldExlZnQoXy5jdXJyZW50U2xpZGUpO1xyXG5cclxuICAgICAgICBfLnRvdWNoT2JqZWN0LmN1clggPSB0b3VjaGVzICE9PSB1bmRlZmluZWQgPyB0b3VjaGVzWzBdLnBhZ2VYIDogZXZlbnQuY2xpZW50WDtcclxuICAgICAgICBfLnRvdWNoT2JqZWN0LmN1clkgPSB0b3VjaGVzICE9PSB1bmRlZmluZWQgPyB0b3VjaGVzWzBdLnBhZ2VZIDogZXZlbnQuY2xpZW50WTtcclxuXHJcbiAgICAgICAgXy50b3VjaE9iamVjdC5zd2lwZUxlbmd0aCA9IE1hdGgucm91bmQoTWF0aC5zcXJ0KFxyXG4gICAgICAgICAgICBNYXRoLnBvdyhfLnRvdWNoT2JqZWN0LmN1clggLSBfLnRvdWNoT2JqZWN0LnN0YXJ0WCwgMikpKTtcclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmcgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgXy50b3VjaE9iamVjdC5zd2lwZUxlbmd0aCA9IE1hdGgucm91bmQoTWF0aC5zcXJ0KFxyXG4gICAgICAgICAgICAgICAgTWF0aC5wb3coXy50b3VjaE9iamVjdC5jdXJZIC0gXy50b3VjaE9iamVjdC5zdGFydFksIDIpKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzd2lwZURpcmVjdGlvbiA9IF8uc3dpcGVEaXJlY3Rpb24oKTtcclxuXHJcbiAgICAgICAgaWYgKHN3aXBlRGlyZWN0aW9uID09PSAndmVydGljYWwnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChldmVudC5vcmlnaW5hbEV2ZW50ICE9PSB1bmRlZmluZWQgJiYgXy50b3VjaE9iamVjdC5zd2lwZUxlbmd0aCA+IDQpIHtcclxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBvc2l0aW9uT2Zmc2V0ID0gKF8ub3B0aW9ucy5ydGwgPT09IGZhbHNlID8gMSA6IC0xKSAqIChfLnRvdWNoT2JqZWN0LmN1clggPiBfLnRvdWNoT2JqZWN0LnN0YXJ0WCA/IDEgOiAtMSk7XHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmcgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgcG9zaXRpb25PZmZzZXQgPSBfLnRvdWNoT2JqZWN0LmN1clkgPiBfLnRvdWNoT2JqZWN0LnN0YXJ0WSA/IDEgOiAtMTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBzd2lwZUxlbmd0aCA9IF8udG91Y2hPYmplY3Quc3dpcGVMZW5ndGg7XHJcblxyXG4gICAgICAgIF8udG91Y2hPYmplY3QuZWRnZUhpdCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoXy5vcHRpb25zLmluZmluaXRlID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICBpZiAoKF8uY3VycmVudFNsaWRlID09PSAwICYmIHN3aXBlRGlyZWN0aW9uID09PSAncmlnaHQnKSB8fCAoXy5jdXJyZW50U2xpZGUgPj0gXy5nZXREb3RDb3VudCgpICYmIHN3aXBlRGlyZWN0aW9uID09PSAnbGVmdCcpKSB7XHJcbiAgICAgICAgICAgICAgICBzd2lwZUxlbmd0aCA9IF8udG91Y2hPYmplY3Quc3dpcGVMZW5ndGggKiBfLm9wdGlvbnMuZWRnZUZyaWN0aW9uO1xyXG4gICAgICAgICAgICAgICAgXy50b3VjaE9iamVjdC5lZGdlSGl0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy52ZXJ0aWNhbCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgXy5zd2lwZUxlZnQgPSBjdXJMZWZ0ICsgc3dpcGVMZW5ndGggKiBwb3NpdGlvbk9mZnNldDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBfLnN3aXBlTGVmdCA9IGN1ckxlZnQgKyAoc3dpcGVMZW5ndGggKiAoXy5qUXVlcnlsaXN0LmhlaWdodCgpIC8gXy5saXN0V2lkdGgpKSAqIHBvc2l0aW9uT2Zmc2V0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoXy5vcHRpb25zLnZlcnRpY2FsU3dpcGluZyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBfLnN3aXBlTGVmdCA9IGN1ckxlZnQgKyBzd2lwZUxlbmd0aCAqIHBvc2l0aW9uT2Zmc2V0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF8ub3B0aW9ucy5mYWRlID09PSB0cnVlIHx8IF8ub3B0aW9ucy50b3VjaE1vdmUgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChfLmFuaW1hdGluZyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBfLnN3aXBlTGVmdCA9IG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF8uc2V0Q1NTKF8uc3dpcGVMZWZ0KTtcclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS5zd2lwZVN0YXJ0ID0gZnVuY3Rpb24oZXZlbnQpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzLFxyXG4gICAgICAgICAgICB0b3VjaGVzO1xyXG5cclxuICAgICAgICBfLmludGVycnVwdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKF8udG91Y2hPYmplY3QuZmluZ2VyQ291bnQgIT09IDEgfHwgXy5zbGlkZUNvdW50IDw9IF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cpIHtcclxuICAgICAgICAgICAgXy50b3VjaE9iamVjdCA9IHt9O1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZXZlbnQub3JpZ2luYWxFdmVudCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlcyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRvdWNoZXMgPSBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBfLnRvdWNoT2JqZWN0LnN0YXJ0WCA9IF8udG91Y2hPYmplY3QuY3VyWCA9IHRvdWNoZXMgIT09IHVuZGVmaW5lZCA/IHRvdWNoZXMucGFnZVggOiBldmVudC5jbGllbnRYO1xyXG4gICAgICAgIF8udG91Y2hPYmplY3Quc3RhcnRZID0gXy50b3VjaE9iamVjdC5jdXJZID0gdG91Y2hlcyAhPT0gdW5kZWZpbmVkID8gdG91Y2hlcy5wYWdlWSA6IGV2ZW50LmNsaWVudFk7XHJcblxyXG4gICAgICAgIF8uZHJhZ2dpbmcgPSB0cnVlO1xyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLnVuZmlsdGVyU2xpZGVzID0gU2xpY2sucHJvdG90eXBlLnNsaWNrVW5maWx0ZXIgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBpZiAoXy5qUXVlcnlzbGlkZXNDYWNoZSAhPT0gbnVsbCkge1xyXG5cclxuICAgICAgICAgICAgXy51bmxvYWQoKTtcclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5c2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmRldGFjaCgpO1xyXG5cclxuICAgICAgICAgICAgXy5qUXVlcnlzbGlkZXNDYWNoZS5hcHBlbmRUbyhfLmpRdWVyeXNsaWRlVHJhY2spO1xyXG5cclxuICAgICAgICAgICAgXy5yZWluaXQoKTtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLnVubG9hZCA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgICAgICB2YXIgXyA9IHRoaXM7XHJcblxyXG4gICAgICAgIGpRdWVyeSgnLnNsaWNrLWNsb25lZCcsIF8ualF1ZXJ5c2xpZGVyKS5yZW1vdmUoKTtcclxuXHJcbiAgICAgICAgaWYgKF8ualF1ZXJ5ZG90cykge1xyXG4gICAgICAgICAgICBfLmpRdWVyeWRvdHMucmVtb3ZlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoXy5qUXVlcnlwcmV2QXJyb3cgJiYgXy5odG1sRXhwci50ZXN0KF8ub3B0aW9ucy5wcmV2QXJyb3cpKSB7XHJcbiAgICAgICAgICAgIF8ualF1ZXJ5cHJldkFycm93LnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKF8ualF1ZXJ5bmV4dEFycm93ICYmIF8uaHRtbEV4cHIudGVzdChfLm9wdGlvbnMubmV4dEFycm93KSkge1xyXG4gICAgICAgICAgICBfLmpRdWVyeW5leHRBcnJvdy5yZW1vdmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF8ualF1ZXJ5c2xpZGVzXHJcbiAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnc2xpY2stc2xpZGUgc2xpY2stYWN0aXZlIHNsaWNrLXZpc2libGUgc2xpY2stY3VycmVudCcpXHJcbiAgICAgICAgICAgIC5hdHRyKCdhcmlhLWhpZGRlbicsICd0cnVlJylcclxuICAgICAgICAgICAgLmNzcygnd2lkdGgnLCAnJyk7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUudW5zbGljayA9IGZ1bmN0aW9uKGZyb21CcmVha3BvaW50KSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuICAgICAgICBfLmpRdWVyeXNsaWRlci50cmlnZ2VyKCd1bnNsaWNrJywgW18sIGZyb21CcmVha3BvaW50XSk7XHJcbiAgICAgICAgXy5kZXN0cm95KCk7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBTbGljay5wcm90b3R5cGUudXBkYXRlQXJyb3dzID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcyxcclxuICAgICAgICAgICAgY2VudGVyT2Zmc2V0O1xyXG5cclxuICAgICAgICBjZW50ZXJPZmZzZXQgPSBNYXRoLmZsb29yKF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cgLyAyKTtcclxuXHJcbiAgICAgICAgaWYgKCBfLm9wdGlvbnMuYXJyb3dzID09PSB0cnVlICYmXHJcbiAgICAgICAgICAgIF8uc2xpZGVDb3VudCA+IF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cgJiZcclxuICAgICAgICAgICAgIV8ub3B0aW9ucy5pbmZpbml0ZSApIHtcclxuXHJcbiAgICAgICAgICAgIF8ualF1ZXJ5cHJldkFycm93LnJlbW92ZUNsYXNzKCdzbGljay1kaXNhYmxlZCcpLmF0dHIoJ2FyaWEtZGlzYWJsZWQnLCAnZmFsc2UnKTtcclxuICAgICAgICAgICAgXy5qUXVlcnluZXh0QXJyb3cucmVtb3ZlQ2xhc3MoJ3NsaWNrLWRpc2FibGVkJykuYXR0cignYXJpYS1kaXNhYmxlZCcsICdmYWxzZScpO1xyXG5cclxuICAgICAgICAgICAgaWYgKF8uY3VycmVudFNsaWRlID09PSAwKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgXy5qUXVlcnlwcmV2QXJyb3cuYWRkQ2xhc3MoJ3NsaWNrLWRpc2FibGVkJykuYXR0cignYXJpYS1kaXNhYmxlZCcsICd0cnVlJyk7XHJcbiAgICAgICAgICAgICAgICBfLmpRdWVyeW5leHRBcnJvdy5yZW1vdmVDbGFzcygnc2xpY2stZGlzYWJsZWQnKS5hdHRyKCdhcmlhLWRpc2FibGVkJywgJ2ZhbHNlJyk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKF8uY3VycmVudFNsaWRlID49IF8uc2xpZGVDb3VudCAtIF8ub3B0aW9ucy5zbGlkZXNUb1Nob3cgJiYgXy5vcHRpb25zLmNlbnRlck1vZGUgPT09IGZhbHNlKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgXy5qUXVlcnluZXh0QXJyb3cuYWRkQ2xhc3MoJ3NsaWNrLWRpc2FibGVkJykuYXR0cignYXJpYS1kaXNhYmxlZCcsICd0cnVlJyk7XHJcbiAgICAgICAgICAgICAgICBfLmpRdWVyeXByZXZBcnJvdy5yZW1vdmVDbGFzcygnc2xpY2stZGlzYWJsZWQnKS5hdHRyKCdhcmlhLWRpc2FibGVkJywgJ2ZhbHNlJyk7XHJcblxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKF8uY3VycmVudFNsaWRlID49IF8uc2xpZGVDb3VudCAtIDEgJiYgXy5vcHRpb25zLmNlbnRlck1vZGUgPT09IHRydWUpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBfLmpRdWVyeW5leHRBcnJvdy5hZGRDbGFzcygnc2xpY2stZGlzYWJsZWQnKS5hdHRyKCdhcmlhLWRpc2FibGVkJywgJ3RydWUnKTtcclxuICAgICAgICAgICAgICAgIF8ualF1ZXJ5cHJldkFycm93LnJlbW92ZUNsYXNzKCdzbGljay1kaXNhYmxlZCcpLmF0dHIoJ2FyaWEtZGlzYWJsZWQnLCAnZmFsc2UnKTtcclxuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgIH07XHJcblxyXG4gICAgU2xpY2sucHJvdG90eXBlLnVwZGF0ZURvdHMgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIF8gPSB0aGlzO1xyXG5cclxuICAgICAgICBpZiAoXy5qUXVlcnlkb3RzICE9PSBudWxsKSB7XHJcblxyXG4gICAgICAgICAgICBfLmpRdWVyeWRvdHNcclxuICAgICAgICAgICAgICAgIC5maW5kKCdsaScpXHJcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3NsaWNrLWFjdGl2ZScpXHJcbiAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xyXG5cclxuICAgICAgICAgICAgXy5qUXVlcnlkb3RzXHJcbiAgICAgICAgICAgICAgICAuZmluZCgnbGknKVxyXG4gICAgICAgICAgICAgICAgLmVxKE1hdGguZmxvb3IoXy5jdXJyZW50U2xpZGUgLyBfLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwpKVxyXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCdzbGljay1hY3RpdmUnKVxyXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICB9O1xyXG5cclxuICAgIFNsaWNrLnByb3RvdHlwZS52aXNpYmlsaXR5ID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgICAgIHZhciBfID0gdGhpcztcclxuXHJcbiAgICAgICAgaWYgKCBfLm9wdGlvbnMuYXV0b3BsYXkgKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoIGRvY3VtZW50W18uaGlkZGVuXSApIHtcclxuXHJcbiAgICAgICAgICAgICAgICBfLmludGVycnVwdGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAgICAgXy5pbnRlcnJ1cHRlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICBqUXVlcnkuZm4uc2xpY2sgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICB2YXIgXyA9IHRoaXMsXHJcbiAgICAgICAgICAgIG9wdCA9IGFyZ3VtZW50c1swXSxcclxuICAgICAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksXHJcbiAgICAgICAgICAgIGwgPSBfLmxlbmd0aCxcclxuICAgICAgICAgICAgaSxcclxuICAgICAgICAgICAgcmV0O1xyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHQgPT0gJ29iamVjdCcgfHwgdHlwZW9mIG9wdCA9PSAndW5kZWZpbmVkJylcclxuICAgICAgICAgICAgICAgIF9baV0uc2xpY2sgPSBuZXcgU2xpY2soX1tpXSwgb3B0KTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgcmV0ID0gX1tpXS5zbGlja1tvcHRdLmFwcGx5KF9baV0uc2xpY2ssIGFyZ3MpO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJldCAhPSAndW5kZWZpbmVkJykgcmV0dXJuIHJldDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF87XHJcbiAgICB9O1xyXG5cclxufSkpO1xyXG4hZnVuY3Rpb24odCl7aWYoXCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGUpbW9kdWxlLmV4cG9ydHM9dCgpO2Vsc2UgaWYoXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXSx0KTtlbHNle3ZhciBlO1widW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/ZT13aW5kb3c6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGdsb2JhbD9lPWdsb2JhbDpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZiYmKGU9c2VsZiksZS5TbGlkZW91dD10KCl9fShmdW5jdGlvbigpe3ZhciB0LGUsbjtyZXR1cm4gZnVuY3Rpb24gaSh0LGUsbil7ZnVuY3Rpb24gbyhyLGEpe2lmKCFlW3JdKXtpZighdFtyXSl7dmFyIHU9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighYSYmdSlyZXR1cm4gdShyLCEwKTtpZihzKXJldHVybiBzKHIsITApO3ZhciBsPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrcitcIidcIik7dGhyb3cgbC5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGx9dmFyIGg9ZVtyXT17ZXhwb3J0czp7fX07dFtyXVswXS5jYWxsKGguZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W3JdWzFdW2VdO3JldHVybiBvKG4/bjplKX0saCxoLmV4cG9ydHMsaSx0LGUsbil9cmV0dXJuIGVbcl0uZXhwb3J0c312YXIgcz10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKW8obltyXSk7cmV0dXJuIG99KHsxOltmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGk9dChcImRlY291cGxlXCIpO3ZhciBvPXQoXCJlbWl0dGVyXCIpO3ZhciBzO3ZhciByPWZhbHNlO3ZhciBhPXdpbmRvdy5kb2N1bWVudDt2YXIgdT1hLmRvY3VtZW50RWxlbWVudDt2YXIgbD13aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQ7dmFyIGg9e3N0YXJ0Omw/XCJNU1BvaW50ZXJEb3duXCI6XCJ0b3VjaHN0YXJ0XCIsbW92ZTpsP1wiTVNQb2ludGVyTW92ZVwiOlwidG91Y2htb3ZlXCIsZW5kOmw/XCJNU1BvaW50ZXJVcFwiOlwidG91Y2hlbmRcIn07dmFyIGY9ZnVuY3Rpb24gdigpe3ZhciB0PS9eKFdlYmtpdHxLaHRtbHxNb3p8bXN8TykoPz1bQS1aXSkvO3ZhciBlPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIilbMF0uc3R5bGU7Zm9yKHZhciBuIGluIGUpe2lmKHQudGVzdChuKSl7cmV0dXJuXCItXCIrbi5tYXRjaCh0KVswXS50b0xvd2VyQ2FzZSgpK1wiLVwifX1pZihcIldlYmtpdE9wYWNpdHlcImluIGUpe3JldHVyblwiLXdlYmtpdC1cIn1pZihcIktodG1sT3BhY2l0eVwiaW4gZSl7cmV0dXJuXCIta2h0bWwtXCJ9cmV0dXJuXCJcIn0oKTtmdW5jdGlvbiBjKHQsZSl7Zm9yKHZhciBuIGluIGUpe2lmKGVbbl0pe3Rbbl09ZVtuXX19cmV0dXJuIHR9ZnVuY3Rpb24gcCh0LGUpe3QucHJvdG90eXBlPWModC5wcm90b3R5cGV8fHt9LGUucHJvdG90eXBlKX1mdW5jdGlvbiBkKHQpe3doaWxlKHQucGFyZW50Tm9kZSl7aWYodC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXNsaWRlb3V0LWlnbm9yZVwiKSE9PW51bGwpe3JldHVybiB0fXQ9dC5wYXJlbnROb2RlfXJldHVybiBudWxsfWZ1bmN0aW9uIF8odCl7dD10fHx7fTt0aGlzLl9zdGFydE9mZnNldFg9MDt0aGlzLl9jdXJyZW50T2Zmc2V0WD0wO3RoaXMuX29wZW5pbmc9ZmFsc2U7dGhpcy5fbW92ZWQ9ZmFsc2U7dGhpcy5fb3BlbmVkPWZhbHNlO3RoaXMuX3ByZXZlbnRPcGVuPWZhbHNlO3RoaXMucGFuZWw9dC5wYW5lbDt0aGlzLm1lbnU9dC5tZW51O3RoaXMuX3RvdWNoPXQudG91Y2g9PT11bmRlZmluZWQ/dHJ1ZTp0LnRvdWNoJiZ0cnVlO3RoaXMuX3NpZGU9dC5zaWRlfHxcImxlZnRcIjt0aGlzLl9lYXNpbmc9dC5meHx8dC5lYXNpbmd8fFwiZWFzZVwiO3RoaXMuX2R1cmF0aW9uPXBhcnNlSW50KHQuZHVyYXRpb24sMTApfHwzMDA7dGhpcy5fdG9sZXJhbmNlPXBhcnNlSW50KHQudG9sZXJhbmNlLDEwKXx8NzA7dGhpcy5fcGFkZGluZz10aGlzLl90cmFuc2xhdGVUbz1wYXJzZUludCh0LnBhZGRpbmcsMTApfHwyNTY7dGhpcy5fb3JpZW50YXRpb249dGhpcy5fc2lkZT09PVwicmlnaHRcIj8tMToxO3RoaXMuX3RyYW5zbGF0ZVRvKj10aGlzLl9vcmllbnRhdGlvbjtpZighdGhpcy5wYW5lbC5jbGFzc0xpc3QuY29udGFpbnMoXCJzbGlkZW91dC1wYW5lbFwiKSl7dGhpcy5wYW5lbC5jbGFzc0xpc3QuYWRkKFwic2xpZGVvdXQtcGFuZWxcIil9aWYoIXRoaXMucGFuZWwuY2xhc3NMaXN0LmNvbnRhaW5zKFwic2xpZGVvdXQtcGFuZWwtXCIrdGhpcy5fc2lkZSkpe3RoaXMucGFuZWwuY2xhc3NMaXN0LmFkZChcInNsaWRlb3V0LXBhbmVsLVwiK3RoaXMuX3NpZGUpfWlmKCF0aGlzLm1lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKFwic2xpZGVvdXQtbWVudVwiKSl7dGhpcy5tZW51LmNsYXNzTGlzdC5hZGQoXCJzbGlkZW91dC1tZW51XCIpfWlmKCF0aGlzLm1lbnUuY2xhc3NMaXN0LmNvbnRhaW5zKFwic2xpZGVvdXQtbWVudS1cIit0aGlzLl9zaWRlKSl7dGhpcy5tZW51LmNsYXNzTGlzdC5hZGQoXCJzbGlkZW91dC1tZW51LVwiK3RoaXMuX3NpZGUpfWlmKHRoaXMuX3RvdWNoKXt0aGlzLl9pbml0VG91Y2hFdmVudHMoKX19cChfLG8pO18ucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuZW1pdChcImJlZm9yZW9wZW5cIik7aWYoIXUuY2xhc3NMaXN0LmNvbnRhaW5zKFwic2xpZGVvdXQtb3BlblwiKSl7dS5jbGFzc0xpc3QuYWRkKFwic2xpZGVvdXQtb3BlblwiKX10aGlzLl9zZXRUcmFuc2l0aW9uKCk7dGhpcy5fdHJhbnNsYXRlWFRvKHRoaXMuX3RyYW5zbGF0ZVRvKTt0aGlzLl9vcGVuZWQ9dHJ1ZTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5wYW5lbC5zdHlsZS50cmFuc2l0aW9uPXQucGFuZWwuc3R5bGVbXCItd2Via2l0LXRyYW5zaXRpb25cIl09XCJcIjt0LmVtaXQoXCJvcGVuXCIpfSx0aGlzLl9kdXJhdGlvbis1MCk7cmV0dXJuIHRoaXN9O18ucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZighdGhpcy5pc09wZW4oKSYmIXRoaXMuX29wZW5pbmcpe3JldHVybiB0aGlzfXRoaXMuZW1pdChcImJlZm9yZWNsb3NlXCIpO3RoaXMuX3NldFRyYW5zaXRpb24oKTt0aGlzLl90cmFuc2xhdGVYVG8oMCk7dGhpcy5fb3BlbmVkPWZhbHNlO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt1LmNsYXNzTGlzdC5yZW1vdmUoXCJzbGlkZW91dC1vcGVuXCIpO3QucGFuZWwuc3R5bGUudHJhbnNpdGlvbj10LnBhbmVsLnN0eWxlW1wiLXdlYmtpdC10cmFuc2l0aW9uXCJdPXQucGFuZWwuc3R5bGVbZitcInRyYW5zZm9ybVwiXT10LnBhbmVsLnN0eWxlLnRyYW5zZm9ybT1cIlwiO3QuZW1pdChcImNsb3NlXCIpfSx0aGlzLl9kdXJhdGlvbis1MCk7cmV0dXJuIHRoaXN9O18ucHJvdG90eXBlLnRvZ2dsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzT3BlbigpP3RoaXMuY2xvc2UoKTp0aGlzLm9wZW4oKX07Xy5wcm90b3R5cGUuaXNPcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29wZW5lZH07Xy5wcm90b3R5cGUuX3RyYW5zbGF0ZVhUbz1mdW5jdGlvbih0KXt0aGlzLl9jdXJyZW50T2Zmc2V0WD10O3RoaXMucGFuZWwuc3R5bGVbZitcInRyYW5zZm9ybVwiXT10aGlzLnBhbmVsLnN0eWxlLnRyYW5zZm9ybT1cInRyYW5zbGF0ZVgoXCIrdCtcInB4KVwiO3JldHVybiB0aGlzfTtfLnByb3RvdHlwZS5fc2V0VHJhbnNpdGlvbj1mdW5jdGlvbigpe3RoaXMucGFuZWwuc3R5bGVbZitcInRyYW5zaXRpb25cIl09dGhpcy5wYW5lbC5zdHlsZS50cmFuc2l0aW9uPWYrXCJ0cmFuc2Zvcm0gXCIrdGhpcy5fZHVyYXRpb24rXCJtcyBcIit0aGlzLl9lYXNpbmc7cmV0dXJuIHRoaXN9O18ucHJvdG90eXBlLl9pbml0VG91Y2hFdmVudHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX29uU2Nyb2xsRm49aShhLFwic2Nyb2xsXCIsZnVuY3Rpb24oKXtpZighdC5fbW92ZWQpe2NsZWFyVGltZW91dChzKTtyPXRydWU7cz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cj1mYWxzZX0sMjUwKX19KTt0aGlzLl9wcmV2ZW50TW92ZT1mdW5jdGlvbihlKXtpZih0Ll9tb3ZlZCl7ZS5wcmV2ZW50RGVmYXVsdCgpfX07YS5hZGRFdmVudExpc3RlbmVyKGgubW92ZSx0aGlzLl9wcmV2ZW50TW92ZSk7dGhpcy5fcmVzZXRUb3VjaEZuPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlLnRvdWNoZXM9PT1cInVuZGVmaW5lZFwiKXtyZXR1cm59dC5fbW92ZWQ9ZmFsc2U7dC5fb3BlbmluZz1mYWxzZTt0Ll9zdGFydE9mZnNldFg9ZS50b3VjaGVzWzBdLnBhZ2VYO3QuX3ByZXZlbnRPcGVuPSF0Ll90b3VjaHx8IXQuaXNPcGVuKCkmJnQubWVudS5jbGllbnRXaWR0aCE9PTB9O3RoaXMucGFuZWwuYWRkRXZlbnRMaXN0ZW5lcihoLnN0YXJ0LHRoaXMuX3Jlc2V0VG91Y2hGbik7dGhpcy5fb25Ub3VjaENhbmNlbEZuPWZ1bmN0aW9uKCl7dC5fbW92ZWQ9ZmFsc2U7dC5fb3BlbmluZz1mYWxzZX07dGhpcy5wYW5lbC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hjYW5jZWxcIix0aGlzLl9vblRvdWNoQ2FuY2VsRm4pO3RoaXMuX29uVG91Y2hFbmRGbj1mdW5jdGlvbigpe2lmKHQuX21vdmVkKXt0LmVtaXQoXCJ0cmFuc2xhdGVlbmRcIik7dC5fb3BlbmluZyYmTWF0aC5hYnModC5fY3VycmVudE9mZnNldFgpPnQuX3RvbGVyYW5jZT90Lm9wZW4oKTp0LmNsb3NlKCl9dC5fbW92ZWQ9ZmFsc2V9O3RoaXMucGFuZWwuYWRkRXZlbnRMaXN0ZW5lcihoLmVuZCx0aGlzLl9vblRvdWNoRW5kRm4pO3RoaXMuX29uVG91Y2hNb3ZlRm49ZnVuY3Rpb24oZSl7aWYocnx8dC5fcHJldmVudE9wZW58fHR5cGVvZiBlLnRvdWNoZXM9PT1cInVuZGVmaW5lZFwifHxkKGUudGFyZ2V0KSl7cmV0dXJufXZhciBuPWUudG91Y2hlc1swXS5jbGllbnRYLXQuX3N0YXJ0T2Zmc2V0WDt2YXIgaT10Ll9jdXJyZW50T2Zmc2V0WD1uO2lmKE1hdGguYWJzKGkpPnQuX3BhZGRpbmcpe3JldHVybn1pZihNYXRoLmFicyhuKT4yMCl7dC5fb3BlbmluZz10cnVlO3ZhciBvPW4qdC5fb3JpZW50YXRpb247aWYodC5fb3BlbmVkJiZvPjB8fCF0Ll9vcGVuZWQmJm88MCl7cmV0dXJufWlmKCF0Ll9tb3ZlZCl7dC5lbWl0KFwidHJhbnNsYXRlc3RhcnRcIil9aWYobzw9MCl7aT1uK3QuX3BhZGRpbmcqdC5fb3JpZW50YXRpb247dC5fb3BlbmluZz1mYWxzZX1pZighKHQuX21vdmVkJiZ1LmNsYXNzTGlzdC5jb250YWlucyhcInNsaWRlb3V0LW9wZW5cIikpKXt1LmNsYXNzTGlzdC5hZGQoXCJzbGlkZW91dC1vcGVuXCIpfXQucGFuZWwuc3R5bGVbZitcInRyYW5zZm9ybVwiXT10LnBhbmVsLnN0eWxlLnRyYW5zZm9ybT1cInRyYW5zbGF0ZVgoXCIraStcInB4KVwiO3QuZW1pdChcInRyYW5zbGF0ZVwiLGkpO3QuX21vdmVkPXRydWV9fTt0aGlzLnBhbmVsLmFkZEV2ZW50TGlzdGVuZXIoaC5tb3ZlLHRoaXMuX29uVG91Y2hNb3ZlRm4pO3JldHVybiB0aGlzfTtfLnByb3RvdHlwZS5lbmFibGVUb3VjaD1mdW5jdGlvbigpe3RoaXMuX3RvdWNoPXRydWU7cmV0dXJuIHRoaXN9O18ucHJvdG90eXBlLmRpc2FibGVUb3VjaD1mdW5jdGlvbigpe3RoaXMuX3RvdWNoPWZhbHNlO3JldHVybiB0aGlzfTtfLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5jbG9zZSgpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcihoLm1vdmUsdGhpcy5fcHJldmVudE1vdmUpO3RoaXMucGFuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihoLnN0YXJ0LHRoaXMuX3Jlc2V0VG91Y2hGbik7dGhpcy5wYW5lbC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hjYW5jZWxcIix0aGlzLl9vblRvdWNoQ2FuY2VsRm4pO3RoaXMucGFuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihoLmVuZCx0aGlzLl9vblRvdWNoRW5kRm4pO3RoaXMucGFuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihoLm1vdmUsdGhpcy5fb25Ub3VjaE1vdmVGbik7YS5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsdGhpcy5fb25TY3JvbGxGbik7dGhpcy5vcGVuPXRoaXMuY2xvc2U9ZnVuY3Rpb24oKXt9O3JldHVybiB0aGlzfTtlLmV4cG9ydHM9X30se2RlY291cGxlOjIsZW1pdHRlcjozfV0sMjpbZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO3ZhciBpPWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fGZ1bmN0aW9uKHQpe3dpbmRvdy5zZXRUaW1lb3V0KHQsMWUzLzYwKX19KCk7ZnVuY3Rpb24gbyh0LGUsbil7dmFyIG8scz1mYWxzZTtmdW5jdGlvbiByKHQpe289dDthKCl9ZnVuY3Rpb24gYSgpe2lmKCFzKXtpKHUpO3M9dHJ1ZX19ZnVuY3Rpb24gdSgpe24uY2FsbCh0LG8pO3M9ZmFsc2V9dC5hZGRFdmVudExpc3RlbmVyKGUscixmYWxzZSk7cmV0dXJuIHJ9ZS5leHBvcnRzPW99LHt9XSwzOltmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGk9ZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX19O24uX19lc01vZHVsZT10cnVlO3ZhciBvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe2kodGhpcyx0KX10LnByb3RvdHlwZS5vbj1mdW5jdGlvbiBlKHQsbil7dGhpcy5fZXZlbnRDb2xsZWN0aW9uPXRoaXMuX2V2ZW50Q29sbGVjdGlvbnx8e307dGhpcy5fZXZlbnRDb2xsZWN0aW9uW3RdPXRoaXMuX2V2ZW50Q29sbGVjdGlvblt0XXx8W107dGhpcy5fZXZlbnRDb2xsZWN0aW9uW3RdLnB1c2gobik7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24gbih0LGUpe3ZhciBuPXRoaXM7ZnVuY3Rpb24gaSgpe24ub2ZmKHQsaSk7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9aS5saXN0ZW5lcj1lO3RoaXMub24odCxpKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUub2ZmPWZ1bmN0aW9uIG8odCxlKXt2YXIgbj11bmRlZmluZWQ7aWYoIXRoaXMuX2V2ZW50Q29sbGVjdGlvbnx8IShuPXRoaXMuX2V2ZW50Q29sbGVjdGlvblt0XSkpe3JldHVybiB0aGlzfW4uZm9yRWFjaChmdW5jdGlvbih0LGkpe2lmKHQ9PT1lfHx0Lmxpc3RlbmVyPT09ZSl7bi5zcGxpY2UoaSwxKX19KTtpZihuLmxlbmd0aD09PTApe2RlbGV0ZSB0aGlzLl9ldmVudENvbGxlY3Rpb25bdF19cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24gcyh0KXt2YXIgZT10aGlzO2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLGk9QXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKyl7aVtvLTFdPWFyZ3VtZW50c1tvXX12YXIgcz11bmRlZmluZWQ7aWYoIXRoaXMuX2V2ZW50Q29sbGVjdGlvbnx8IShzPXRoaXMuX2V2ZW50Q29sbGVjdGlvblt0XSkpe3JldHVybiB0aGlzfXM9cy5zbGljZSgwKTtzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQuYXBwbHkoZSxpKX0pO3JldHVybiB0aGlzfTtyZXR1cm4gdH0oKTtuW1wiZGVmYXVsdFwiXT1vO2UuZXhwb3J0cz1uW1wiZGVmYXVsdFwiXX0se31dfSx7fSxbMV0pKDEpfSk7XHJcblxyXG5cclxuKGZ1bmN0aW9uICgkKSB7XHJcbiAgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICAvLzxlZGl0b3ItZm9sZCBkZXNjPVwiU2hpbXNcIj5cclxuICBpZiAoIVN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMpIHtcclxuICAgIChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICd1c2Ugc3RyaWN0JzsgLy8gbmVlZGVkIHRvIHN1cHBvcnQgYGFwcGx5YC9gY2FsbGAgd2l0aCBgdW5kZWZpbmVkYC9gbnVsbGBcclxuICAgICAgdmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XHJcbiAgICAgIHZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gSUUgOCBvbmx5IHN1cHBvcnRzIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG9uIERPTSBlbGVtZW50c1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB2YXIgb2JqZWN0ID0ge307XHJcbiAgICAgICAgICB2YXIgJGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xyXG4gICAgICAgICAgdmFyIHJlc3VsdCA9ICRkZWZpbmVQcm9wZXJ0eShvYmplY3QsIG9iamVjdCwgb2JqZWN0KSAmJiAkZGVmaW5lUHJvcGVydHk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfSgpKTtcclxuICAgICAgdmFyIGluZGV4T2YgPSAnJy5pbmRleE9mO1xyXG4gICAgICB2YXIgaW5jbHVkZXMgPSBmdW5jdGlvbiAoc2VhcmNoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc3RyaW5nID0gU3RyaW5nKHRoaXMpO1xyXG4gICAgICAgIGlmIChzZWFyY2ggJiYgdG9TdHJpbmcuY2FsbChzZWFyY2gpID09ICdbb2JqZWN0IFJlZ0V4cF0nKSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHZhciBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xyXG4gICAgICAgIHZhciBzZWFyY2hTdHJpbmcgPSBTdHJpbmcoc2VhcmNoKTtcclxuICAgICAgICB2YXIgc2VhcmNoTGVuZ3RoID0gc2VhcmNoU3RyaW5nLmxlbmd0aDtcclxuICAgICAgICB2YXIgcG9zaXRpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcclxuICAgICAgICAvLyBgVG9JbnRlZ2VyYFxyXG4gICAgICAgIHZhciBwb3MgPSBwb3NpdGlvbiA/IE51bWJlcihwb3NpdGlvbikgOiAwO1xyXG4gICAgICAgIGlmIChwb3MgIT0gcG9zKSB7IC8vIGJldHRlciBgaXNOYU5gXHJcbiAgICAgICAgICBwb3MgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc3RhcnQgPSBNYXRoLm1pbihNYXRoLm1heChwb3MsIDApLCBzdHJpbmdMZW5ndGgpO1xyXG4gICAgICAgIC8vIEF2b2lkIHRoZSBgaW5kZXhPZmAgY2FsbCBpZiBubyBtYXRjaCBpcyBwb3NzaWJsZVxyXG4gICAgICAgIGlmIChzZWFyY2hMZW5ndGggKyBzdGFydCA+IHN0cmluZ0xlbmd0aCkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5kZXhPZi5jYWxsKHN0cmluZywgc2VhcmNoU3RyaW5nLCBwb3MpICE9IC0xO1xyXG4gICAgICB9O1xyXG4gICAgICBpZiAoZGVmaW5lUHJvcGVydHkpIHtcclxuICAgICAgICBkZWZpbmVQcm9wZXJ0eShTdHJpbmcucHJvdG90eXBlLCAnaW5jbHVkZXMnLCB7XHJcbiAgICAgICAgICAndmFsdWUnOiBpbmNsdWRlcyxcclxuICAgICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLFxyXG4gICAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMgPSBpbmNsdWRlcztcclxuICAgICAgfVxyXG4gICAgfSgpKTtcclxuICB9XHJcblxyXG4gIGlmICghU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoKSB7XHJcbiAgICAoZnVuY3Rpb24gKCkge1xyXG4gICAgICAndXNlIHN0cmljdCc7IC8vIG5lZWRlZCB0byBzdXBwb3J0IGBhcHBseWAvYGNhbGxgIHdpdGggYHVuZGVmaW5lZGAvYG51bGxgXHJcbiAgICAgIHZhciBkZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgLy8gSUUgOCBvbmx5IHN1cHBvcnRzIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgIG9uIERPTSBlbGVtZW50c1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB2YXIgb2JqZWN0ID0ge307XHJcbiAgICAgICAgICB2YXIgJGRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xyXG4gICAgICAgICAgdmFyIHJlc3VsdCA9ICRkZWZpbmVQcm9wZXJ0eShvYmplY3QsIG9iamVjdCwgb2JqZWN0KSAmJiAkZGVmaW5lUHJvcGVydHk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfSgpKTtcclxuICAgICAgdmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XHJcbiAgICAgIHZhciBzdGFydHNXaXRoID0gZnVuY3Rpb24gKHNlYXJjaCkge1xyXG4gICAgICAgIGlmICh0aGlzID09IG51bGwpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHN0cmluZyA9IFN0cmluZyh0aGlzKTtcclxuICAgICAgICBpZiAoc2VhcmNoICYmIHRvU3RyaW5nLmNhbGwoc2VhcmNoKSA9PSAnW29iamVjdCBSZWdFeHBdJykge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcclxuICAgICAgICB2YXIgc2VhcmNoU3RyaW5nID0gU3RyaW5nKHNlYXJjaCk7XHJcbiAgICAgICAgdmFyIHNlYXJjaExlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGg7XHJcbiAgICAgICAgdmFyIHBvc2l0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgLy8gYFRvSW50ZWdlcmBcclxuICAgICAgICB2YXIgcG9zID0gcG9zaXRpb24gPyBOdW1iZXIocG9zaXRpb24pIDogMDtcclxuICAgICAgICBpZiAocG9zICE9IHBvcykgeyAvLyBiZXR0ZXIgYGlzTmFOYFxyXG4gICAgICAgICAgcG9zID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHN0YXJ0ID0gTWF0aC5taW4oTWF0aC5tYXgocG9zLCAwKSwgc3RyaW5nTGVuZ3RoKTtcclxuICAgICAgICAvLyBBdm9pZCB0aGUgYGluZGV4T2ZgIGNhbGwgaWYgbm8gbWF0Y2ggaXMgcG9zc2libGVcclxuICAgICAgICBpZiAoc2VhcmNoTGVuZ3RoICsgc3RhcnQgPiBzdHJpbmdMZW5ndGgpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIGluZGV4ID0gLTE7XHJcbiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBzZWFyY2hMZW5ndGgpIHtcclxuICAgICAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdChzdGFydCArIGluZGV4KSAhPSBzZWFyY2hTdHJpbmcuY2hhckNvZGVBdChpbmRleCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfTtcclxuICAgICAgaWYgKGRlZmluZVByb3BlcnR5KSB7XHJcbiAgICAgICAgZGVmaW5lUHJvcGVydHkoU3RyaW5nLnByb3RvdHlwZSwgJ3N0YXJ0c1dpdGgnLCB7XHJcbiAgICAgICAgICAndmFsdWUnOiBzdGFydHNXaXRoLFxyXG4gICAgICAgICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsXHJcbiAgICAgICAgICAnd3JpdGFibGUnOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgU3RyaW5nLnByb3RvdHlwZS5zdGFydHNXaXRoID0gc3RhcnRzV2l0aDtcclxuICAgICAgfVxyXG4gICAgfSgpKTtcclxuICB9XHJcblxyXG4gIGlmICghT2JqZWN0LmtleXMpIHtcclxuICAgIE9iamVjdC5rZXlzID0gZnVuY3Rpb24gKFxyXG4gICAgICBvLCAvLyBvYmplY3RcclxuICAgICAgaywgLy8ga2V5XHJcbiAgICAgIHIgIC8vIHJlc3VsdCBhcnJheVxyXG4gICAgICApe1xyXG4gICAgICAvLyBpbml0aWFsaXplIG9iamVjdCBhbmQgcmVzdWx0XHJcbiAgICAgIHI9W107XHJcbiAgICAgIC8vIGl0ZXJhdGUgb3ZlciBvYmplY3Qga2V5c1xyXG4gICAgICBmb3IgKGsgaW4gbylcclxuICAgICAgICAgIC8vIGZpbGwgcmVzdWx0IGFycmF5IHdpdGggbm9uLXByb3RvdHlwaWNhbCBrZXlzXHJcbiAgICAgICAgci5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspICYmIHIucHVzaChrKTtcclxuICAgICAgLy8gcmV0dXJuIHJlc3VsdFxyXG4gICAgICByZXR1cm4gcjtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvLyBzZXQgZGF0YS1zZWxlY3RlZCBvbiBvcHRpb25zIHRoYXQgYXJlIHByb2dyYW1tYXRpY2FsbHkgc2VsZWN0ZWRcclxuICAvLyBwcmlvciB0byBpbml0aWFsaXphdGlvbiBvZiBib290c3RyYXAtc2VsZWN0XHJcbiAgdmFyIF92YWwgPSAkLmZuLnZhbDtcclxuICAkLmZuLnZhbCA9IGZ1bmN0aW9uKHZhbHVlKXtcclxuICAgIGlmICh0aGlzLmlzKCdzZWxlY3QnKSAmJiB2YWx1ZSkge1xyXG4gICAgICB0aGlzLmZpbmQoJ29wdGlvblt2YWx1ZT1cIicgKyB2YWx1ZSArICdcIl0nKS5kYXRhKCdzZWxlY3RlZCcsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBfdmFsLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgfTtcclxuXHJcbiAgJC5mbi50cmlnZ2VyTmF0aXZlID0gZnVuY3Rpb24gKGV2ZW50TmFtZSkge1xyXG4gICAgdmFyIGVsID0gdGhpc1swXSxcclxuICAgICAgICBldmVudDtcclxuXHJcbiAgICBpZiAoZWwuZGlzcGF0Y2hFdmVudCkge1xyXG4gICAgICBpZiAodHlwZW9mIEV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgLy8gRm9yIG1vZGVybiBicm93c2Vyc1xyXG4gICAgICAgIGV2ZW50ID0gbmV3IEV2ZW50KGV2ZW50TmFtZSwge1xyXG4gICAgICAgICAgYnViYmxlczogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIEZvciBJRSBzaW5jZSBpdCBkb2Vzbid0IHN1cHBvcnQgRXZlbnQgY29uc3RydWN0b3JcclxuICAgICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xyXG4gICAgICAgIGV2ZW50LmluaXRFdmVudChldmVudE5hbWUsIHRydWUsIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgZWwuZGlzcGF0Y2hFdmVudChldmVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoZWwuZmlyZUV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCgpO1xyXG4gICAgICAgIGV2ZW50LmV2ZW50VHlwZSA9IGV2ZW50TmFtZTtcclxuICAgICAgICBlbC5maXJlRXZlbnQoJ29uJyArIGV2ZW50TmFtZSwgZXZlbnQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnRyaWdnZXIoZXZlbnROYW1lKTtcclxuICAgIH1cclxuICB9O1xyXG4gIC8vPC9lZGl0b3ItZm9sZD5cclxuXHJcbiAgLy8gQ2FzZSBpbnNlbnNpdGl2ZSBjb250YWlucyBzZWFyY2hcclxuICAkLmV4cHJbJzonXS5pY29udGFpbnMgPSBmdW5jdGlvbiAob2JqLCBpbmRleCwgbWV0YSkge1xyXG4gICAgdmFyICRvYmogPSAkKG9iaik7XHJcbiAgICB2YXIgaGF5c3RhY2sgPSAoJG9iai5kYXRhKCd0b2tlbnMnKSB8fCAkb2JqLnRleHQoKSkudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKG1ldGFbM10udG9VcHBlckNhc2UoKSk7XHJcbiAgfTtcclxuXHJcbiAgLy8gQ2FzZSBpbnNlbnNpdGl2ZSBiZWdpbnMgc2VhcmNoXHJcbiAgJC5leHByWyc6J10uaWJlZ2lucyA9IGZ1bmN0aW9uIChvYmosIGluZGV4LCBtZXRhKSB7XHJcbiAgICB2YXIgJG9iaiA9ICQob2JqKTtcclxuICAgIHZhciBoYXlzdGFjayA9ICgkb2JqLmRhdGEoJ3Rva2VucycpIHx8ICRvYmoudGV4dCgpKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gaGF5c3RhY2suc3RhcnRzV2l0aChtZXRhWzNdLnRvVXBwZXJDYXNlKCkpO1xyXG4gIH07XHJcblxyXG4gIC8vIENhc2UgYW5kIGFjY2VudCBpbnNlbnNpdGl2ZSBjb250YWlucyBzZWFyY2hcclxuICAkLmV4cHJbJzonXS5haWNvbnRhaW5zID0gZnVuY3Rpb24gKG9iaiwgaW5kZXgsIG1ldGEpIHtcclxuICAgIHZhciAkb2JqID0gJChvYmopO1xyXG4gICAgdmFyIGhheXN0YWNrID0gKCRvYmouZGF0YSgndG9rZW5zJykgfHwgJG9iai5kYXRhKCdub3JtYWxpemVkVGV4dCcpIHx8ICRvYmoudGV4dCgpKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gaGF5c3RhY2suaW5jbHVkZXMobWV0YVszXS50b1VwcGVyQ2FzZSgpKTtcclxuICB9O1xyXG5cclxuICAvLyBDYXNlIGFuZCBhY2NlbnQgaW5zZW5zaXRpdmUgYmVnaW5zIHNlYXJjaFxyXG4gICQuZXhwclsnOiddLmFpYmVnaW5zID0gZnVuY3Rpb24gKG9iaiwgaW5kZXgsIG1ldGEpIHtcclxuICAgIHZhciAkb2JqID0gJChvYmopO1xyXG4gICAgdmFyIGhheXN0YWNrID0gKCRvYmouZGF0YSgndG9rZW5zJykgfHwgJG9iai5kYXRhKCdub3JtYWxpemVkVGV4dCcpIHx8ICRvYmoudGV4dCgpKS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCk7XHJcbiAgICByZXR1cm4gaGF5c3RhY2suc3RhcnRzV2l0aChtZXRhWzNdLnRvVXBwZXJDYXNlKCkpO1xyXG4gIH07XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBhbGwgZGlhdHJpY3MgZnJvbSB0aGUgZ2l2ZW4gdGV4dC5cclxuICAgKiBAYWNjZXNzIHByaXZhdGVcclxuICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dFxyXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XHJcbiAgICovXHJcbiAgZnVuY3Rpb24gbm9ybWFsaXplVG9CYXNlKHRleHQpIHtcclxuICAgIHZhciByRXhwcyA9IFtcclxuICAgICAge3JlOiAvW1xceEMwLVxceEM2XS9nLCBjaDogXCJBXCJ9LFxyXG4gICAgICB7cmU6IC9bXFx4RTAtXFx4RTZdL2csIGNoOiBcImFcIn0sXHJcbiAgICAgIHtyZTogL1tcXHhDOC1cXHhDQl0vZywgY2g6IFwiRVwifSxcclxuICAgICAge3JlOiAvW1xceEU4LVxceEVCXS9nLCBjaDogXCJlXCJ9LFxyXG4gICAgICB7cmU6IC9bXFx4Q0MtXFx4Q0ZdL2csIGNoOiBcIklcIn0sXHJcbiAgICAgIHtyZTogL1tcXHhFQy1cXHhFRl0vZywgY2g6IFwiaVwifSxcclxuICAgICAge3JlOiAvW1xceEQyLVxceEQ2XS9nLCBjaDogXCJPXCJ9LFxyXG4gICAgICB7cmU6IC9bXFx4RjItXFx4RjZdL2csIGNoOiBcIm9cIn0sXHJcbiAgICAgIHtyZTogL1tcXHhEOS1cXHhEQ10vZywgY2g6IFwiVVwifSxcclxuICAgICAge3JlOiAvW1xceEY5LVxceEZDXS9nLCBjaDogXCJ1XCJ9LFxyXG4gICAgICB7cmU6IC9bXFx4QzctXFx4RTddL2csIGNoOiBcImNcIn0sXHJcbiAgICAgIHtyZTogL1tcXHhEMV0vZywgY2g6IFwiTlwifSxcclxuICAgICAge3JlOiAvW1xceEYxXS9nLCBjaDogXCJuXCJ9XHJcbiAgICBdO1xyXG4gICAgJC5lYWNoKHJFeHBzLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UodGhpcy5yZSwgdGhpcy5jaCk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0ZXh0O1xyXG4gIH1cclxuXHJcblxyXG4gIGZ1bmN0aW9uIGh0bWxFc2NhcGUoaHRtbCkge1xyXG4gICAgdmFyIGVzY2FwZU1hcCA9IHtcclxuICAgICAgJyYnOiAnJmFtcDsnLFxyXG4gICAgICAnPCc6ICcmbHQ7JyxcclxuICAgICAgJz4nOiAnJmd0OycsXHJcbiAgICAgICdcIic6ICcmcXVvdDsnLFxyXG4gICAgICBcIidcIjogJyYjeDI3OycsXHJcbiAgICAgICdgJzogJyYjeDYwOydcclxuICAgIH07XHJcbiAgICB2YXIgc291cmNlID0gJyg/OicgKyBPYmplY3Qua2V5cyhlc2NhcGVNYXApLmpvaW4oJ3wnKSArICcpJyxcclxuICAgICAgICB0ZXN0UmVnZXhwID0gbmV3IFJlZ0V4cChzb3VyY2UpLFxyXG4gICAgICAgIHJlcGxhY2VSZWdleHAgPSBuZXcgUmVnRXhwKHNvdXJjZSwgJ2cnKSxcclxuICAgICAgICBzdHJpbmcgPSBodG1sID09IG51bGwgPyAnJyA6ICcnICsgaHRtbDtcclxuICAgIHJldHVybiB0ZXN0UmVnZXhwLnRlc3Qoc3RyaW5nKSA/IHN0cmluZy5yZXBsYWNlKHJlcGxhY2VSZWdleHAsIGZ1bmN0aW9uIChtYXRjaCkge1xyXG4gICAgICByZXR1cm4gZXNjYXBlTWFwW21hdGNoXTtcclxuICAgIH0pIDogc3RyaW5nO1xyXG4gIH1cclxuXHJcbiAgdmFyIFNlbGVjdHBpY2tlciA9IGZ1bmN0aW9uIChlbGVtZW50LCBvcHRpb25zLCBlKSB7XHJcbiAgICAvLyBib290c3RyYXAtc2VsZWN0IGhhcyBiZWVuIGluaXRpYWxpemVkIC0gcmV2ZXJ0IHZhbCBiYWNrIHRvIGl0cyBvcmlnaW5hbCBmdW5jdGlvblxyXG4gICAgaWYgKF92YWwpIHtcclxuICAgICAgJC5mbi52YWwgPSBfdmFsO1xyXG4gICAgICBfdmFsID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZSkge1xyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy4kZWxlbWVudCA9ICQoZWxlbWVudCk7XHJcbiAgICB0aGlzLiRuZXdFbGVtZW50ID0gbnVsbDtcclxuICAgIHRoaXMuJGJ1dHRvbiA9IG51bGw7XHJcbiAgICB0aGlzLiRtZW51ID0gbnVsbDtcclxuICAgIHRoaXMuJGxpcyA9IG51bGw7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG5cclxuICAgIC8vIElmIHdlIGhhdmUgbm8gdGl0bGUgeWV0LCB0cnkgdG8gcHVsbCBpdCBmcm9tIHRoZSBodG1sIHRpdGxlIGF0dHJpYnV0ZSAoalF1ZXJ5IGRvZXNudCcgcGljayBpdCB1cCBhcyBpdCdzIG5vdCBhXHJcbiAgICAvLyBkYXRhLWF0dHJpYnV0ZSlcclxuICAgIGlmICh0aGlzLm9wdGlvbnMudGl0bGUgPT09IG51bGwpIHtcclxuICAgICAgdGhpcy5vcHRpb25zLnRpdGxlID0gdGhpcy4kZWxlbWVudC5hdHRyKCd0aXRsZScpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vRXhwb3NlIHB1YmxpYyBtZXRob2RzXHJcbiAgICB0aGlzLnZhbCA9IFNlbGVjdHBpY2tlci5wcm90b3R5cGUudmFsO1xyXG4gICAgdGhpcy5yZW5kZXIgPSBTZWxlY3RwaWNrZXIucHJvdG90eXBlLnJlbmRlcjtcclxuICAgIHRoaXMucmVmcmVzaCA9IFNlbGVjdHBpY2tlci5wcm90b3R5cGUucmVmcmVzaDtcclxuICAgIHRoaXMuc2V0U3R5bGUgPSBTZWxlY3RwaWNrZXIucHJvdG90eXBlLnNldFN0eWxlO1xyXG4gICAgdGhpcy5zZWxlY3RBbGwgPSBTZWxlY3RwaWNrZXIucHJvdG90eXBlLnNlbGVjdEFsbDtcclxuICAgIHRoaXMuZGVzZWxlY3RBbGwgPSBTZWxlY3RwaWNrZXIucHJvdG90eXBlLmRlc2VsZWN0QWxsO1xyXG4gICAgdGhpcy5kZXN0cm95ID0gU2VsZWN0cGlja2VyLnByb3RvdHlwZS5kZXN0cm95O1xyXG4gICAgdGhpcy5yZW1vdmUgPSBTZWxlY3RwaWNrZXIucHJvdG90eXBlLnJlbW92ZTtcclxuICAgIHRoaXMuc2hvdyA9IFNlbGVjdHBpY2tlci5wcm90b3R5cGUuc2hvdztcclxuICAgIHRoaXMuaGlkZSA9IFNlbGVjdHBpY2tlci5wcm90b3R5cGUuaGlkZTtcclxuXHJcbiAgICB0aGlzLmluaXQoKTtcclxuICB9O1xyXG5cclxuICBTZWxlY3RwaWNrZXIuVkVSU0lPTiA9ICcxLjEwLjAnO1xyXG5cclxuICAvLyBwYXJ0IG9mIHRoaXMgaXMgZHVwbGljYXRlZCBpbiBpMThuL2RlZmF1bHRzLWVuX1VTLmpzLiBNYWtlIHN1cmUgdG8gdXBkYXRlIGJvdGguXHJcbiAgU2VsZWN0cGlja2VyLkRFRkFVTFRTID0ge1xyXG4gICAgbm9uZVNlbGVjdGVkVGV4dDogJ05vdGhpbmcgc2VsZWN0ZWQnLFxyXG4gICAgbm9uZVJlc3VsdHNUZXh0OiAnTm8gcmVzdWx0cyBtYXRjaGVkIHswfScsXHJcbiAgICBjb3VudFNlbGVjdGVkVGV4dDogZnVuY3Rpb24gKG51bVNlbGVjdGVkLCBudW1Ub3RhbCkge1xyXG4gICAgICByZXR1cm4gKG51bVNlbGVjdGVkID09IDEpID8gXCJ7MH0gaXRlbSBzZWxlY3RlZFwiIDogXCJ7MH0gaXRlbXMgc2VsZWN0ZWRcIjtcclxuICAgIH0sXHJcbiAgICBtYXhPcHRpb25zVGV4dDogZnVuY3Rpb24gKG51bUFsbCwgbnVtR3JvdXApIHtcclxuICAgICAgcmV0dXJuIFtcclxuICAgICAgICAobnVtQWxsID09IDEpID8gJ0xpbWl0IHJlYWNoZWQgKHtufSBpdGVtIG1heCknIDogJ0xpbWl0IHJlYWNoZWQgKHtufSBpdGVtcyBtYXgpJyxcclxuICAgICAgICAobnVtR3JvdXAgPT0gMSkgPyAnR3JvdXAgbGltaXQgcmVhY2hlZCAoe259IGl0ZW0gbWF4KScgOiAnR3JvdXAgbGltaXQgcmVhY2hlZCAoe259IGl0ZW1zIG1heCknXHJcbiAgICAgIF07XHJcbiAgICB9LFxyXG4gICAgc2VsZWN0QWxsVGV4dDogJ1NlbGVjdCBBbGwnLFxyXG4gICAgZGVzZWxlY3RBbGxUZXh0OiAnRGVzZWxlY3QgQWxsJyxcclxuICAgIGRvbmVCdXR0b246IGZhbHNlLFxyXG4gICAgZG9uZUJ1dHRvblRleHQ6ICdDbG9zZScsXHJcbiAgICBtdWx0aXBsZVNlcGFyYXRvcjogJywgJyxcclxuICAgIHN0eWxlQmFzZTogJ2J0bicsXHJcbiAgICBzdHlsZTogJ2J0bi1kZWZhdWx0JyxcclxuICAgIHNpemU6ICdhdXRvJyxcclxuICAgIHRpdGxlOiBudWxsLFxyXG4gICAgc2VsZWN0ZWRUZXh0Rm9ybWF0OiAndmFsdWVzJyxcclxuICAgIHdpZHRoOiBmYWxzZSxcclxuICAgIGNvbnRhaW5lcjogZmFsc2UsXHJcbiAgICBoaWRlRGlzYWJsZWQ6IGZhbHNlLFxyXG4gICAgc2hvd1N1YnRleHQ6IGZhbHNlLFxyXG4gICAgc2hvd0ljb246IHRydWUsXHJcbiAgICBzaG93Q29udGVudDogdHJ1ZSxcclxuICAgIGRyb3B1cEF1dG86IHRydWUsXHJcbiAgICBoZWFkZXI6IGZhbHNlLFxyXG4gICAgbGl2ZVNlYXJjaDogZmFsc2UsXHJcbiAgICBsaXZlU2VhcmNoUGxhY2Vob2xkZXI6IG51bGwsXHJcbiAgICBsaXZlU2VhcmNoTm9ybWFsaXplOiBmYWxzZSxcclxuICAgIGxpdmVTZWFyY2hTdHlsZTogJ2NvbnRhaW5zJyxcclxuICAgIGFjdGlvbnNCb3g6IGZhbHNlLFxyXG4gICAgaWNvbkJhc2U6ICdnbHlwaGljb24nLFxyXG4gICAgdGlja0ljb246ICdnbHlwaGljb24tb2snLFxyXG4gICAgc2hvd1RpY2s6IGZhbHNlLFxyXG4gICAgdGVtcGxhdGU6IHtcclxuICAgICAgY2FyZXQ6ICc8c3BhbiBjbGFzcz1cImNhcmV0XCI+PC9zcGFuPidcclxuICAgIH0sXHJcbiAgICBtYXhPcHRpb25zOiBmYWxzZSxcclxuICAgIG1vYmlsZTogZmFsc2UsXHJcbiAgICBzZWxlY3RPblRhYjogZmFsc2UsXHJcbiAgICBkcm9wZG93bkFsaWduUmlnaHQ6IGZhbHNlLFxyXG4gICAgaGlkZU9uQ2xpY2tTZWxlY3RBbGw6IGZhbHNlXHJcbiAgfTtcclxuXHJcbiAgU2VsZWN0cGlja2VyLnByb3RvdHlwZSA9IHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcjogU2VsZWN0cGlja2VyLFxyXG5cclxuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIHRoYXQgPSB0aGlzLFxyXG4gICAgICAgICAgaWQgPSB0aGlzLiRlbGVtZW50LmF0dHIoJ2lkJyk7XHJcblxyXG4gICAgICB0aGlzLiRlbGVtZW50LmFkZENsYXNzKCdicy1zZWxlY3QtaGlkZGVuJyk7XHJcblxyXG4gICAgICAvLyBzdG9yZSBvcmlnaW5hbEluZGV4IChrZXkpIGFuZCBuZXdJbmRleCAodmFsdWUpIGluIHRoaXMubGlPYmogZm9yIGZhc3QgYWNjZXNzaWJpbGl0eVxyXG4gICAgICAvLyBhbGxvd3MgdXMgdG8gZG8gdGhpcy4kbGlzLmVxKHRoYXQubGlPYmpbaW5kZXhdKSBpbnN0ZWFkIG9mIHRoaXMuJGxpcy5maWx0ZXIoJ1tkYXRhLW9yaWdpbmFsLWluZGV4PVwiJyArIGluZGV4ICsgJ1wiXScpXHJcbiAgICAgIHRoaXMubGlPYmogPSB7fTtcclxuICAgICAgdGhpcy5tdWx0aXBsZSA9IHRoaXMuJGVsZW1lbnQucHJvcCgnbXVsdGlwbGUnKTtcclxuICAgICAgdGhpcy5hdXRvZm9jdXMgPSB0aGlzLiRlbGVtZW50LnByb3AoJ2F1dG9mb2N1cycpO1xyXG4gICAgICB0aGlzLiRuZXdFbGVtZW50ID0gdGhpcy5jcmVhdGVWaWV3KCk7XHJcbiAgICAgIHRoaXMuJGVsZW1lbnRcclxuICAgICAgICAuYWZ0ZXIodGhpcy4kbmV3RWxlbWVudClcclxuICAgICAgICAuYXBwZW5kVG8odGhpcy4kbmV3RWxlbWVudCk7XHJcbiAgICAgIHRoaXMuJGJ1dHRvbiA9IHRoaXMuJG5ld0VsZW1lbnQuY2hpbGRyZW4oJ2J1dHRvbicpO1xyXG4gICAgICB0aGlzLiRtZW51ID0gdGhpcy4kbmV3RWxlbWVudC5jaGlsZHJlbignLmRyb3Bkb3duLW1lbnUnKTtcclxuICAgICAgdGhpcy4kbWVudUlubmVyID0gdGhpcy4kbWVudS5jaGlsZHJlbignLmlubmVyJyk7XHJcbiAgICAgIHRoaXMuJHNlYXJjaGJveCA9IHRoaXMuJG1lbnUuZmluZCgnaW5wdXQnKTtcclxuXHJcbiAgICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2JzLXNlbGVjdC1oaWRkZW4nKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZHJvcGRvd25BbGlnblJpZ2h0ID09PSB0cnVlKSB0aGlzLiRtZW51LmFkZENsYXNzKCdkcm9wZG93bi1tZW51LXJpZ2h0Jyk7XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGlkICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHRoaXMuJGJ1dHRvbi5hdHRyKCdkYXRhLWlkJywgaWQpO1xyXG4gICAgICAgICQoJ2xhYmVsW2Zvcj1cIicgKyBpZCArICdcIl0nKS5jbGljayhmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgdGhhdC4kYnV0dG9uLmZvY3VzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2hlY2tEaXNhYmxlZCgpO1xyXG4gICAgICB0aGlzLmNsaWNrTGlzdGVuZXIoKTtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5saXZlU2VhcmNoKSB0aGlzLmxpdmVTZWFyY2hMaXN0ZW5lcigpO1xyXG4gICAgICB0aGlzLnJlbmRlcigpO1xyXG4gICAgICB0aGlzLnNldFN0eWxlKCk7XHJcbiAgICAgIHRoaXMuc2V0V2lkdGgoKTtcclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb250YWluZXIpIHRoaXMuc2VsZWN0UG9zaXRpb24oKTtcclxuICAgICAgdGhpcy4kbWVudS5kYXRhKCd0aGlzJywgdGhpcyk7XHJcbiAgICAgIHRoaXMuJG5ld0VsZW1lbnQuZGF0YSgndGhpcycsIHRoaXMpO1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLm1vYmlsZSkgdGhpcy5tb2JpbGUoKTtcclxuXHJcbiAgICAgIHRoaXMuJG5ld0VsZW1lbnQub24oe1xyXG4gICAgICAgICdoaWRlLmJzLmRyb3Bkb3duJzogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgIHRoYXQuJG1lbnVJbm5lci5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xyXG4gICAgICAgICAgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdoaWRlLmJzLnNlbGVjdCcsIGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgJ2hpZGRlbi5icy5kcm9wZG93bic6IGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICB0aGF0LiRlbGVtZW50LnRyaWdnZXIoJ2hpZGRlbi5icy5zZWxlY3QnLCBlKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgICdzaG93LmJzLmRyb3Bkb3duJzogZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgIHRoYXQuJG1lbnVJbm5lci5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgICB0aGF0LiRlbGVtZW50LnRyaWdnZXIoJ3Nob3cuYnMuc2VsZWN0JywgZSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAnc2hvd24uYnMuZHJvcGRvd24nOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdzaG93bi5icy5zZWxlY3QnLCBlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHRoYXQuJGVsZW1lbnRbMF0uaGFzQXR0cmlidXRlKCdyZXF1aXJlZCcpKSB7XHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5vbignaW52YWxpZCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHRoYXQuJGJ1dHRvblxyXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2JzLWludmFsaWQnKVxyXG4gICAgICAgICAgICAuZm9jdXMoKTtcclxuXHJcbiAgICAgICAgICB0aGF0LiRlbGVtZW50Lm9uKHtcclxuICAgICAgICAgICAgJ2ZvY3VzLmJzLnNlbGVjdCc6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICB0aGF0LiRidXR0b24uZm9jdXMoKTtcclxuICAgICAgICAgICAgICB0aGF0LiRlbGVtZW50Lm9mZignZm9jdXMuYnMuc2VsZWN0Jyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICdzaG93bi5icy5zZWxlY3QnOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgdGhhdC4kZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgLnZhbCh0aGF0LiRlbGVtZW50LnZhbCgpKSAvLyBzZXQgdGhlIHZhbHVlIHRvIGhpZGUgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSBpbiBDaHJvbWUgd2hlbiBtZW51IGlzIG9wZW5lZFxyXG4gICAgICAgICAgICAgICAgLm9mZignc2hvd24uYnMuc2VsZWN0Jyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICdyZW5kZXJlZC5icy5zZWxlY3QnOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgLy8gaWYgc2VsZWN0IGlzIG5vIGxvbmdlciBpbnZhbGlkLCByZW1vdmUgdGhlIGJzLWludmFsaWQgY2xhc3NcclxuICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGl0eS52YWxpZCkgdGhhdC4kYnV0dG9uLnJlbW92ZUNsYXNzKCdicy1pbnZhbGlkJyk7XHJcbiAgICAgICAgICAgICAgdGhhdC4kZWxlbWVudC5vZmYoJ3JlbmRlcmVkLmJzLnNlbGVjdCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhhdC4kZWxlbWVudC50cmlnZ2VyKCdsb2FkZWQuYnMuc2VsZWN0Jyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuXHJcbiAgICBjcmVhdGVEcm9wZG93bjogZnVuY3Rpb24gKCkge1xyXG4gICAgICAvLyBPcHRpb25zXHJcbiAgICAgIC8vIElmIHdlIGFyZSBtdWx0aXBsZSBvciBzaG93VGljayBvcHRpb24gaXMgc2V0LCB0aGVuIGFkZCB0aGUgc2hvdy10aWNrIGNsYXNzXHJcbiAgICAgIHZhciBzaG93VGljayA9ICh0aGlzLm11bHRpcGxlIHx8IHRoaXMub3B0aW9ucy5zaG93VGljaykgPyAnIHNob3ctdGljaycgOiAnJyxcclxuICAgICAgICAgIGlucHV0R3JvdXAgPSB0aGlzLiRlbGVtZW50LnBhcmVudCgpLmhhc0NsYXNzKCdpbnB1dC1ncm91cCcpID8gJyBpbnB1dC1ncm91cC1idG4nIDogJycsXHJcbiAgICAgICAgICBhdXRvZm9jdXMgPSB0aGlzLmF1dG9mb2N1cyA/ICcgYXV0b2ZvY3VzJyA6ICcnO1xyXG4gICAgICAvLyBFbGVtZW50c1xyXG4gICAgICB2YXIgaGVhZGVyID0gdGhpcy5vcHRpb25zLmhlYWRlciA/ICc8ZGl2IGNsYXNzPVwicG9wb3Zlci10aXRsZVwiPjxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9idXR0b24+JyArIHRoaXMub3B0aW9ucy5oZWFkZXIgKyAnPC9kaXY+JyA6ICcnO1xyXG4gICAgICB2YXIgc2VhcmNoYm94ID0gdGhpcy5vcHRpb25zLmxpdmVTZWFyY2ggP1xyXG4gICAgICAnPGRpdiBjbGFzcz1cImJzLXNlYXJjaGJveFwiPicgK1xyXG4gICAgICAnPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBhdXRvY29tcGxldGU9XCJvZmZcIicgK1xyXG4gICAgICAobnVsbCA9PT0gdGhpcy5vcHRpb25zLmxpdmVTZWFyY2hQbGFjZWhvbGRlciA/ICcnIDogJyBwbGFjZWhvbGRlcj1cIicgKyBodG1sRXNjYXBlKHRoaXMub3B0aW9ucy5saXZlU2VhcmNoUGxhY2Vob2xkZXIpICsgJ1wiJykgKyAnIHJvbGU9XCJ0ZXh0Ym94XCIgYXJpYS1sYWJlbD1cIlNlYXJjaFwiPicgK1xyXG4gICAgICAnPC9kaXY+J1xyXG4gICAgICAgICAgOiAnJztcclxuICAgICAgdmFyIGFjdGlvbnNib3ggPSB0aGlzLm11bHRpcGxlICYmIHRoaXMub3B0aW9ucy5hY3Rpb25zQm94ID9cclxuICAgICAgJzxkaXYgY2xhc3M9XCJicy1hY3Rpb25zYm94XCI+JyArXHJcbiAgICAgICc8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ncm91cC1zbSBidG4tYmxvY2tcIj4nICtcclxuICAgICAgJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYWN0aW9ucy1idG4gYnMtc2VsZWN0LWFsbCBidG4gYnRuLWRlZmF1bHRcIj4nICtcclxuICAgICAgdGhpcy5vcHRpb25zLnNlbGVjdEFsbFRleHQgK1xyXG4gICAgICAnPC9idXR0b24+JyArXHJcbiAgICAgICc8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFjdGlvbnMtYnRuIGJzLWRlc2VsZWN0LWFsbCBidG4gYnRuLWRlZmF1bHRcIj4nICtcclxuICAgICAgdGhpcy5vcHRpb25zLmRlc2VsZWN0QWxsVGV4dCArXHJcbiAgICAgICc8L2J1dHRvbj4nICtcclxuICAgICAgJzwvZGl2PicgK1xyXG4gICAgICAnPC9kaXY+J1xyXG4gICAgICAgICAgOiAnJztcclxuICAgICAgdmFyIGRvbmVidXR0b24gPSB0aGlzLm11bHRpcGxlICYmIHRoaXMub3B0aW9ucy5kb25lQnV0dG9uID9cclxuICAgICAgJzxkaXYgY2xhc3M9XCJicy1kb25lYnV0dG9uXCI+JyArXHJcbiAgICAgICc8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ibG9ja1wiPicgK1xyXG4gICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kZWZhdWx0XCI+JyArXHJcbiAgICAgIHRoaXMub3B0aW9ucy5kb25lQnV0dG9uVGV4dCArXHJcbiAgICAgICc8L2J1dHRvbj4nICtcclxuICAgICAgJzwvZGl2PicgK1xyXG4gICAgICAnPC9kaXY+J1xyXG4gICAgICAgICAgOiAnJztcclxuICAgICAgdmFyIGRyb3AgPVxyXG4gICAgICAgICAgJzxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYm9vdHN0cmFwLXNlbGVjdCcgKyBzaG93VGljayArIGlucHV0R3JvdXAgKyAnXCI+JyArXHJcbiAgICAgICAgICAnPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCInICsgdGhpcy5vcHRpb25zLnN0eWxlQmFzZSArICcgZHJvcGRvd24tdG9nZ2xlXCIgZGF0YS10b2dnbGU9XCJkcm9wZG93blwiJyArIGF1dG9mb2N1cyArICcgcm9sZT1cImJ1dHRvblwiPicgK1xyXG4gICAgICAgICAgJzxzcGFuIGNsYXNzPVwiZmlsdGVyLW9wdGlvbiBwdWxsLWxlZnRcIj48L3NwYW4+Jm5ic3A7JyArXHJcbiAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJicy1jYXJldFwiPicgK1xyXG4gICAgICAgICAgdGhpcy5vcHRpb25zLnRlbXBsYXRlLmNhcmV0ICtcclxuICAgICAgICAgICc8L3NwYW4+JyArXHJcbiAgICAgICAgICAnPC9idXR0b24+JyArXHJcbiAgICAgICAgICAnPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnUgb3BlblwiIHJvbGU9XCJjb21ib2JveFwiPicgK1xyXG4gICAgICAgICAgaGVhZGVyICtcclxuICAgICAgICAgIHNlYXJjaGJveCArXHJcbiAgICAgICAgICBhY3Rpb25zYm94ICtcclxuICAgICAgICAgICc8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51IGlubmVyXCIgcm9sZT1cImxpc3Rib3hcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj4nICtcclxuICAgICAgICAgICc8L3VsPicgK1xyXG4gICAgICAgICAgZG9uZWJ1dHRvbiArXHJcbiAgICAgICAgICAnPC9kaXY+JyArXHJcbiAgICAgICAgICAnPC9kaXY+JztcclxuXHJcbiAgICAgIHJldHVybiAkKGRyb3ApO1xyXG4gICAgfSxcclxuXHJcbiAgICBjcmVhdGVWaWV3OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkZHJvcCA9IHRoaXMuY3JlYXRlRHJvcGRvd24oKSxcclxuICAgICAgICAgIGxpID0gdGhpcy5jcmVhdGVMaSgpO1xyXG5cclxuICAgICAgJGRyb3AuZmluZCgndWwnKVswXS5pbm5lckhUTUwgPSBsaTtcclxuICAgICAgcmV0dXJuICRkcm9wO1xyXG4gICAgfSxcclxuXHJcbiAgICByZWxvYWRMaTogZnVuY3Rpb24gKCkge1xyXG4gICAgICAvL1JlbW92ZSBhbGwgY2hpbGRyZW4uXHJcbiAgICAgIHRoaXMuZGVzdHJveUxpKCk7XHJcbiAgICAgIC8vUmUgYnVpbGRcclxuICAgICAgdmFyIGxpID0gdGhpcy5jcmVhdGVMaSgpO1xyXG4gICAgICB0aGlzLiRtZW51SW5uZXJbMF0uaW5uZXJIVE1MID0gbGk7XHJcbiAgICB9LFxyXG5cclxuICAgIGRlc3Ryb3lMaTogZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzLiRtZW51LmZpbmQoJ2xpJykucmVtb3ZlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIGNyZWF0ZUxpOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciB0aGF0ID0gdGhpcyxcclxuICAgICAgICAgIF9saSA9IFtdLFxyXG4gICAgICAgICAgb3B0SUQgPSAwLFxyXG4gICAgICAgICAgdGl0bGVPcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKSxcclxuICAgICAgICAgIGxpSW5kZXggPSAtMTsgLy8gaW5jcmVtZW50IGxpSW5kZXggd2hlbmV2ZXIgYSBuZXcgPGxpPiBlbGVtZW50IGlzIGNyZWF0ZWQgdG8gZW5zdXJlIGxpT2JqIGlzIGNvcnJlY3RcclxuXHJcbiAgICAgIC8vIEhlbHBlciBmdW5jdGlvbnNcclxuICAgICAgLyoqXHJcbiAgICAgICAqIEBwYXJhbSBjb250ZW50XHJcbiAgICAgICAqIEBwYXJhbSBbaW5kZXhdXHJcbiAgICAgICAqIEBwYXJhbSBbY2xhc3Nlc11cclxuICAgICAgICogQHBhcmFtIFtvcHRncm91cF1cclxuICAgICAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgICAgICovXHJcbiAgICAgIHZhciBnZW5lcmF0ZUxJID0gZnVuY3Rpb24gKGNvbnRlbnQsIGluZGV4LCBjbGFzc2VzLCBvcHRncm91cCkge1xyXG4gICAgICAgIHJldHVybiAnPGxpJyArXHJcbiAgICAgICAgICAgICgodHlwZW9mIGNsYXNzZXMgIT09ICd1bmRlZmluZWQnICYgJycgIT09IGNsYXNzZXMpID8gJyBjbGFzcz1cIicgKyBjbGFzc2VzICsgJ1wiJyA6ICcnKSArXHJcbiAgICAgICAgICAgICgodHlwZW9mIGluZGV4ICE9PSAndW5kZWZpbmVkJyAmIG51bGwgIT09IGluZGV4KSA/ICcgZGF0YS1vcmlnaW5hbC1pbmRleD1cIicgKyBpbmRleCArICdcIicgOiAnJykgK1xyXG4gICAgICAgICAgICAoKHR5cGVvZiBvcHRncm91cCAhPT0gJ3VuZGVmaW5lZCcgJiBudWxsICE9PSBvcHRncm91cCkgPyAnZGF0YS1vcHRncm91cD1cIicgKyBvcHRncm91cCArICdcIicgOiAnJykgK1xyXG4gICAgICAgICAgICAnPicgKyBjb250ZW50ICsgJzwvbGk+JztcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBAcGFyYW0gdGV4dFxyXG4gICAgICAgKiBAcGFyYW0gW2NsYXNzZXNdXHJcbiAgICAgICAqIEBwYXJhbSBbaW5saW5lXVxyXG4gICAgICAgKiBAcGFyYW0gW3Rva2Vuc11cclxuICAgICAgICogQHJldHVybnMge3N0cmluZ31cclxuICAgICAgICovXHJcbiAgICAgIHZhciBnZW5lcmF0ZUEgPSBmdW5jdGlvbiAodGV4dCwgY2xhc3NlcywgaW5saW5lLCB0b2tlbnMpIHtcclxuICAgICAgICByZXR1cm4gJzxhIHRhYmluZGV4PVwiMFwiJyArXHJcbiAgICAgICAgICAgICh0eXBlb2YgY2xhc3NlcyAhPT0gJ3VuZGVmaW5lZCcgPyAnIGNsYXNzPVwiJyArIGNsYXNzZXMgKyAnXCInIDogJycpICtcclxuICAgICAgICAgICAgKHR5cGVvZiBpbmxpbmUgIT09ICd1bmRlZmluZWQnID8gJyBzdHlsZT1cIicgKyBpbmxpbmUgKyAnXCInIDogJycpICtcclxuICAgICAgICAgICAgKHRoYXQub3B0aW9ucy5saXZlU2VhcmNoTm9ybWFsaXplID8gJyBkYXRhLW5vcm1hbGl6ZWQtdGV4dD1cIicgKyBub3JtYWxpemVUb0Jhc2UoaHRtbEVzY2FwZSh0ZXh0KSkgKyAnXCInIDogJycpICtcclxuICAgICAgICAgICAgKHR5cGVvZiB0b2tlbnMgIT09ICd1bmRlZmluZWQnIHx8IHRva2VucyAhPT0gbnVsbCA/ICcgZGF0YS10b2tlbnM9XCInICsgdG9rZW5zICsgJ1wiJyA6ICcnKSArXHJcbiAgICAgICAgICAgICcgcm9sZT1cIm9wdGlvblwiPicgKyB0ZXh0ICtcclxuICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiJyArIHRoYXQub3B0aW9ucy5pY29uQmFzZSArICcgJyArIHRoYXQub3B0aW9ucy50aWNrSWNvbiArICcgY2hlY2stbWFya1wiPjwvc3Bhbj4nICtcclxuICAgICAgICAgICAgJzwvYT4nO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy50aXRsZSAmJiAhdGhpcy5tdWx0aXBsZSkge1xyXG4gICAgICAgIC8vIHRoaXMgb3B0aW9uIGRvZXNuJ3QgY3JlYXRlIGEgbmV3IDxsaT4gZWxlbWVudCwgYnV0IGRvZXMgYWRkIGEgbmV3IG9wdGlvbiwgc28gbGlJbmRleCBpcyBkZWNyZWFzZWRcclxuICAgICAgICAvLyBzaW5jZSBsaU9iaiBpcyByZWNhbGN1bGF0ZWQgb24gZXZlcnkgcmVmcmVzaCwgbGlJbmRleCBuZWVkcyB0byBiZSBkZWNyZWFzZWQgZXZlbiBpZiB0aGUgdGl0bGVPcHRpb24gaXMgYWxyZWFkeSBhcHBlbmRlZFxyXG4gICAgICAgIGxpSW5kZXgtLTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLiRlbGVtZW50LmZpbmQoJy5icy10aXRsZS1vcHRpb24nKS5sZW5ndGgpIHtcclxuICAgICAgICAgIC8vIFVzZSBuYXRpdmUgSlMgdG8gcHJlcGVuZCBvcHRpb24gKGZhc3RlcilcclxuICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy4kZWxlbWVudFswXTtcclxuICAgICAgICAgIHRpdGxlT3B0aW9uLmNsYXNzTmFtZSA9ICdicy10aXRsZS1vcHRpb24nO1xyXG4gICAgICAgICAgdGl0bGVPcHRpb24uYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5vcHRpb25zLnRpdGxlKSk7XHJcbiAgICAgICAgICB0aXRsZU9wdGlvbi52YWx1ZSA9ICcnO1xyXG4gICAgICAgICAgZWxlbWVudC5pbnNlcnRCZWZvcmUodGl0bGVPcHRpb24sIGVsZW1lbnQuZmlyc3RDaGlsZCk7XHJcbiAgICAgICAgICAvLyBDaGVjayBpZiBzZWxlY3RlZCBvciBkYXRhLXNlbGVjdGVkIGF0dHJpYnV0ZSBpcyBhbHJlYWR5IHNldCBvbiBhbiBvcHRpb24uIElmIG5vdCwgc2VsZWN0IHRoZSB0aXRsZU9wdGlvbiBvcHRpb24uXHJcbiAgICAgICAgICAvLyB0aGUgc2VsZWN0ZWQgaXRlbSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgdXNlciBvciBwcm9ncmFtbWF0aWNhbGx5IGJlZm9yZSB0aGUgYm9vdHN0cmFwIHNlbGVjdCBwbHVnaW4gcnVucyxcclxuICAgICAgICAgIC8vIGlmIHNvLCB0aGUgb3B0aW9uIHdpbGwgaGF2ZSB0aGUgZGF0YS1zZWxlY3RlZCBhdHRyaWJ1dGVcclxuICAgICAgICAgIHZhciAkb3B0ID0gJChlbGVtZW50Lm9wdGlvbnNbZWxlbWVudC5zZWxlY3RlZEluZGV4XSk7XHJcbiAgICAgICAgICBpZiAoJG9wdC5hdHRyKCdzZWxlY3RlZCcpID09PSB1bmRlZmluZWQgJiYgJG9wdC5kYXRhKCdzZWxlY3RlZCcpID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGl0bGVPcHRpb24uc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy4kZWxlbWVudC5maW5kKCdvcHRpb24nKS5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xyXG4gICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XHJcblxyXG4gICAgICAgIGxpSW5kZXgrKztcclxuXHJcbiAgICAgICAgaWYgKCR0aGlzLmhhc0NsYXNzKCdicy10aXRsZS1vcHRpb24nKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBHZXQgdGhlIGNsYXNzIGFuZCB0ZXh0IGZvciB0aGUgb3B0aW9uXHJcbiAgICAgICAgdmFyIG9wdGlvbkNsYXNzID0gdGhpcy5jbGFzc05hbWUgfHwgJycsXHJcbiAgICAgICAgICAgIGlubGluZSA9IHRoaXMuc3R5bGUuY3NzVGV4dCxcclxuICAgICAgICAgICAgdGV4dCA9ICR0aGlzLmRhdGEoJ2NvbnRlbnQnKSA/ICR0aGlzLmRhdGEoJ2NvbnRlbnQnKSA6ICR0aGlzLmh0bWwoKSxcclxuICAgICAgICAgICAgdG9rZW5zID0gJHRoaXMuZGF0YSgndG9rZW5zJykgPyAkdGhpcy5kYXRhKCd0b2tlbnMnKSA6IG51bGwsXHJcbiAgICAgICAgICAgIHN1YnRleHQgPSB0eXBlb2YgJHRoaXMuZGF0YSgnc3VidGV4dCcpICE9PSAndW5kZWZpbmVkJyA/ICc8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+JyArICR0aGlzLmRhdGEoJ3N1YnRleHQnKSArICc8L3NtYWxsPicgOiAnJyxcclxuICAgICAgICAgICAgaWNvbiA9IHR5cGVvZiAkdGhpcy5kYXRhKCdpY29uJykgIT09ICd1bmRlZmluZWQnID8gJzxzcGFuIGNsYXNzPVwiJyArIHRoYXQub3B0aW9ucy5pY29uQmFzZSArICcgJyArICR0aGlzLmRhdGEoJ2ljb24nKSArICdcIj48L3NwYW4+ICcgOiAnJyxcclxuICAgICAgICAgICAgJHBhcmVudCA9ICR0aGlzLnBhcmVudCgpLFxyXG4gICAgICAgICAgICBpc09wdGdyb3VwID0gJHBhcmVudFswXS50YWdOYW1lID09PSAnT1BUR1JPVVAnLFxyXG4gICAgICAgICAgICBpc09wdGdyb3VwRGlzYWJsZWQgPSBpc09wdGdyb3VwICYmICRwYXJlbnRbMF0uZGlzYWJsZWQsXHJcbiAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkIHx8IGlzT3B0Z3JvdXBEaXNhYmxlZDtcclxuXHJcbiAgICAgICAgaWYgKGljb24gIT09ICcnICYmIGlzRGlzYWJsZWQpIHtcclxuICAgICAgICAgIGljb24gPSAnPHNwYW4+JyArIGljb24gKyAnPC9zcGFuPic7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhhdC5vcHRpb25zLmhpZGVEaXNhYmxlZCAmJiAoaXNEaXNhYmxlZCAmJiAhaXNPcHRncm91cCB8fCBpc09wdGdyb3VwRGlzYWJsZWQpKSB7XHJcbiAgICAgICAgICBsaUluZGV4LS07XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoISR0aGlzLmRhdGEoJ2NvbnRlbnQnKSkge1xyXG4gICAgICAgICAgLy8gUHJlcGVuZCBhbnkgaWNvbiBhbmQgYXBwZW5kIGFueSBzdWJ0ZXh0IHRvIHRoZSBtYWluIHRleHQuXHJcbiAgICAgICAgICB0ZXh0ID0gaWNvbiArICc8c3BhbiBjbGFzcz1cInRleHRcIj4nICsgdGV4dCArIHN1YnRleHQgKyAnPC9zcGFuPic7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaXNPcHRncm91cCAmJiAkdGhpcy5kYXRhKCdkaXZpZGVyJykgIT09IHRydWUpIHtcclxuICAgICAgICAgIGlmICh0aGF0Lm9wdGlvbnMuaGlkZURpc2FibGVkICYmIGlzRGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgaWYgKCRwYXJlbnQuZGF0YSgnYWxsT3B0aW9uc0Rpc2FibGVkJykgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgIHZhciAkb3B0aW9ucyA9ICRwYXJlbnQuY2hpbGRyZW4oKTtcclxuICAgICAgICAgICAgICAkcGFyZW50LmRhdGEoJ2FsbE9wdGlvbnNEaXNhYmxlZCcsICRvcHRpb25zLmZpbHRlcignOmRpc2FibGVkJykubGVuZ3RoID09PSAkb3B0aW9ucy5sZW5ndGgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoJHBhcmVudC5kYXRhKCdhbGxPcHRpb25zRGlzYWJsZWQnKSkge1xyXG4gICAgICAgICAgICAgIGxpSW5kZXgtLTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB2YXIgb3B0R3JvdXBDbGFzcyA9ICcgJyArICRwYXJlbnRbMF0uY2xhc3NOYW1lIHx8ICcnO1xyXG5cclxuICAgICAgICAgIGlmICgkdGhpcy5pbmRleCgpID09PSAwKSB7IC8vIElzIGl0IHRoZSBmaXJzdCBvcHRpb24gb2YgdGhlIG9wdGdyb3VwP1xyXG4gICAgICAgICAgICBvcHRJRCArPSAxO1xyXG5cclxuICAgICAgICAgICAgLy8gR2V0IHRoZSBvcHQgZ3JvdXAgbGFiZWxcclxuICAgICAgICAgICAgdmFyIGxhYmVsID0gJHBhcmVudFswXS5sYWJlbCxcclxuICAgICAgICAgICAgICAgIGxhYmVsU3VidGV4dCA9IHR5cGVvZiAkcGFyZW50LmRhdGEoJ3N1YnRleHQnKSAhPT0gJ3VuZGVmaW5lZCcgPyAnPHNtYWxsIGNsYXNzPVwidGV4dC1tdXRlZFwiPicgKyAkcGFyZW50LmRhdGEoJ3N1YnRleHQnKSArICc8L3NtYWxsPicgOiAnJyxcclxuICAgICAgICAgICAgICAgIGxhYmVsSWNvbiA9ICRwYXJlbnQuZGF0YSgnaWNvbicpID8gJzxzcGFuIGNsYXNzPVwiJyArIHRoYXQub3B0aW9ucy5pY29uQmFzZSArICcgJyArICRwYXJlbnQuZGF0YSgnaWNvbicpICsgJ1wiPjwvc3Bhbj4gJyA6ICcnO1xyXG5cclxuICAgICAgICAgICAgbGFiZWwgPSBsYWJlbEljb24gKyAnPHNwYW4gY2xhc3M9XCJ0ZXh0XCI+JyArIGxhYmVsICsgbGFiZWxTdWJ0ZXh0ICsgJzwvc3Bhbj4nO1xyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAwICYmIF9saS5sZW5ndGggPiAwKSB7IC8vIElzIGl0IE5PVCB0aGUgZmlyc3Qgb3B0aW9uIG9mIHRoZSBzZWxlY3QgJiYgYXJlIHRoZXJlIGVsZW1lbnRzIGluIHRoZSBkcm9wZG93bj9cclxuICAgICAgICAgICAgICBsaUluZGV4Kys7XHJcbiAgICAgICAgICAgICAgX2xpLnB1c2goZ2VuZXJhdGVMSSgnJywgbnVsbCwgJ2RpdmlkZXInLCBvcHRJRCArICdkaXYnKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGlJbmRleCsrO1xyXG4gICAgICAgICAgICBfbGkucHVzaChnZW5lcmF0ZUxJKGxhYmVsLCBudWxsLCAnZHJvcGRvd24taGVhZGVyJyArIG9wdEdyb3VwQ2xhc3MsIG9wdElEKSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5oaWRlRGlzYWJsZWQgJiYgaXNEaXNhYmxlZCkge1xyXG4gICAgICAgICAgICBsaUluZGV4LS07XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBfbGkucHVzaChnZW5lcmF0ZUxJKGdlbmVyYXRlQSh0ZXh0LCAnb3B0ICcgKyBvcHRpb25DbGFzcyArIG9wdEdyb3VwQ2xhc3MsIGlubGluZSwgdG9rZW5zKSwgaW5kZXgsICcnLCBvcHRJRCkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoJHRoaXMuZGF0YSgnZGl2aWRlcicpID09PSB0cnVlKSB7XHJcbiAgICAgICAgICBfbGkucHVzaChnZW5lcmF0ZUxJKCcnLCBpbmRleCwgJ2RpdmlkZXInKSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICgkdGhpcy5kYXRhKCdoaWRkZW4nKSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgX2xpLnB1c2goZ2VuZXJhdGVMSShnZW5lcmF0ZUEodGV4dCwgb3B0aW9uQ2xhc3MsIGlubGluZSwgdG9rZW5zKSwgaW5kZXgsICdoaWRkZW4gaXMtaGlkZGVuJykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YXIgc2hvd0RpdmlkZXIgPSB0aGlzLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgJiYgdGhpcy5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLnRhZ05hbWUgPT09ICdPUFRHUk9VUCc7XHJcblxyXG4gICAgICAgICAgLy8gaWYgcHJldmlvdXMgZWxlbWVudCBpcyBub3QgYW4gb3B0Z3JvdXAgYW5kIGhpZGVEaXNhYmxlZCBpcyB0cnVlXHJcbiAgICAgICAgICBpZiAoIXNob3dEaXZpZGVyICYmIHRoYXQub3B0aW9ucy5oaWRlRGlzYWJsZWQpIHtcclxuICAgICAgICAgICAgLy8gZ2V0IHByZXZpb3VzIGVsZW1lbnRzXHJcbiAgICAgICAgICAgIHZhciAkcHJldiA9ICQodGhpcykucHJldkFsbCgpO1xyXG5cclxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkcHJldi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHByZXZpb3VzIGVsZW1lbnRzIHRoYXQgaXMgYW4gb3B0Z3JvdXBcclxuICAgICAgICAgICAgICBpZiAoJHByZXZbaV0udGFnTmFtZSA9PT0gJ09QVEdST1VQJykge1xyXG4gICAgICAgICAgICAgICAgdmFyIG9wdEdyb3VwRGlzdGFuY2UgPSAwO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgb3B0aW9ucyBpbiBiZXR3ZWVuIHRoZSBjdXJyZW50IG9wdGlvbiBhbmQgdGhlIG9wdGdyb3VwXHJcbiAgICAgICAgICAgICAgICAvLyBhbmQgY2hlY2sgaWYgdGhleSBhcmUgaGlkZGVuIG9yIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBkID0gMDsgZCA8IGk7IGQrKykge1xyXG4gICAgICAgICAgICAgICAgICB2YXIgcHJldk9wdGlvbiA9ICRwcmV2W2RdO1xyXG4gICAgICAgICAgICAgICAgICBpZiAocHJldk9wdGlvbi5kaXNhYmxlZCB8fCAkKHByZXZPcHRpb24pLmRhdGEoJ2hpZGRlbicpID09PSB0cnVlKSBvcHRHcm91cERpc3RhbmNlKys7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaWYgYWxsIG9mIHRoZSBvcHRpb25zIGJldHdlZW4gdGhlIGN1cnJlbnQgb3B0aW9uIGFuZCB0aGUgb3B0Z3JvdXAgYXJlIGhpZGRlbiBvciBkaXNhYmxlZCwgc2hvdyB0aGUgZGl2aWRlclxyXG4gICAgICAgICAgICAgICAgaWYgKG9wdEdyb3VwRGlzdGFuY2UgPT09IGkpIHNob3dEaXZpZGVyID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoc2hvd0RpdmlkZXIpIHtcclxuICAgICAgICAgICAgbGlJbmRleCsrO1xyXG4gICAgICAgICAgICBfbGkucHVzaChnZW5lcmF0ZUxJKCcnLCBudWxsLCAnZGl2aWRlcicsIG9wdElEICsgJ2RpdicpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIF9saS5wdXNoKGdlbmVyYXRlTEkoZ2VuZXJhdGVBKHRleHQsIG9wdGlvbkNsYXNzLCBpbmxpbmUsIHRva2VucyksIGluZGV4KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGF0LmxpT2JqW2luZGV4XSA9IGxpSW5kZXg7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy9JZiB3ZSBhcmUgbm90IG11bHRpcGxlLCB3ZSBkb24ndCBoYXZlIGEgc2VsZWN0ZWQgaXRlbSwgYW5kIHdlIGRvbid0IGhhdmUgYSB0aXRsZSwgc2VsZWN0IHRoZSBmaXJzdCBlbGVtZW50IHNvIHNvbWV0aGluZyBpcyBzZXQgaW4gdGhlIGJ1dHRvblxyXG4gICAgICBpZiAoIXRoaXMubXVsdGlwbGUgJiYgdGhpcy4kZWxlbWVudC5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5sZW5ndGggPT09IDAgJiYgIXRoaXMub3B0aW9ucy50aXRsZSkge1xyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuZmluZCgnb3B0aW9uJykuZXEoMCkucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKS5hdHRyKCdzZWxlY3RlZCcsICdzZWxlY3RlZCcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gX2xpLmpvaW4oJycpO1xyXG4gICAgfSxcclxuXHJcbiAgICBmaW5kTGlzOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGlmICh0aGlzLiRsaXMgPT0gbnVsbCkgdGhpcy4kbGlzID0gdGhpcy4kbWVudS5maW5kKCdsaScpO1xyXG4gICAgICByZXR1cm4gdGhpcy4kbGlzO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBbdXBkYXRlTGldIGRlZmF1bHRzIHRvIHRydWVcclxuICAgICAqL1xyXG4gICAgcmVuZGVyOiBmdW5jdGlvbiAodXBkYXRlTGkpIHtcclxuICAgICAgdmFyIHRoYXQgPSB0aGlzLFxyXG4gICAgICAgICAgbm90RGlzYWJsZWQ7XHJcblxyXG4gICAgICAvL1VwZGF0ZSB0aGUgTEkgdG8gbWF0Y2ggdGhlIFNFTEVDVFxyXG4gICAgICBpZiAodXBkYXRlTGkgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy4kZWxlbWVudC5maW5kKCdvcHRpb24nKS5lYWNoKGZ1bmN0aW9uIChpbmRleCkge1xyXG4gICAgICAgICAgdmFyICRsaXMgPSB0aGF0LmZpbmRMaXMoKS5lcSh0aGF0LmxpT2JqW2luZGV4XSk7XHJcblxyXG4gICAgICAgICAgdGhhdC5zZXREaXNhYmxlZChpbmRleCwgdGhpcy5kaXNhYmxlZCB8fCB0aGlzLnBhcmVudE5vZGUudGFnTmFtZSA9PT0gJ09QVEdST1VQJyAmJiB0aGlzLnBhcmVudE5vZGUuZGlzYWJsZWQsICRsaXMpO1xyXG4gICAgICAgICAgdGhhdC5zZXRTZWxlY3RlZChpbmRleCwgdGhpcy5zZWxlY3RlZCwgJGxpcyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMudG9nZ2xlUGxhY2Vob2xkZXIoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy50YWJJbmRleCgpO1xyXG5cclxuICAgICAgdmFyIHNlbGVjdGVkSXRlbXMgPSB0aGlzLiRlbGVtZW50LmZpbmQoJ29wdGlvbicpLm1hcChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHtcclxuICAgICAgICAgIGlmICh0aGF0Lm9wdGlvbnMuaGlkZURpc2FibGVkICYmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucGFyZW50Tm9kZS50YWdOYW1lID09PSAnT1BUR1JPVVAnICYmIHRoaXMucGFyZW50Tm9kZS5kaXNhYmxlZCkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLFxyXG4gICAgICAgICAgICAgIGljb24gPSAkdGhpcy5kYXRhKCdpY29uJykgJiYgdGhhdC5vcHRpb25zLnNob3dJY29uID8gJzxpIGNsYXNzPVwiJyArIHRoYXQub3B0aW9ucy5pY29uQmFzZSArICcgJyArICR0aGlzLmRhdGEoJ2ljb24nKSArICdcIj48L2k+ICcgOiAnJyxcclxuICAgICAgICAgICAgICBzdWJ0ZXh0O1xyXG5cclxuICAgICAgICAgIGlmICh0aGF0Lm9wdGlvbnMuc2hvd1N1YnRleHQgJiYgJHRoaXMuZGF0YSgnc3VidGV4dCcpICYmICF0aGF0Lm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIHN1YnRleHQgPSAnIDxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj4nICsgJHRoaXMuZGF0YSgnc3VidGV4dCcpICsgJzwvc21hbGw+JztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN1YnRleHQgPSAnJztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0eXBlb2YgJHRoaXMuYXR0cigndGl0bGUnKSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuICR0aGlzLmF0dHIoJ3RpdGxlJyk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKCR0aGlzLmRhdGEoJ2NvbnRlbnQnKSAmJiB0aGF0Lm9wdGlvbnMuc2hvd0NvbnRlbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuICR0aGlzLmRhdGEoJ2NvbnRlbnQnKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpY29uICsgJHRoaXMuaHRtbCgpICsgc3VidGV4dDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pLnRvQXJyYXkoKTtcclxuXHJcbiAgICAgIC8vRml4ZXMgaXNzdWUgaW4gSUUxMCBvY2N1cnJpbmcgd2hlbiBubyBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZCBhbmQgYXQgbGVhc3Qgb25lIG9wdGlvbiBpcyBkaXNhYmxlZFxyXG4gICAgICAvL0NvbnZlcnQgYWxsIHRoZSB2YWx1ZXMgaW50byBhIGNvbW1hIGRlbGltaXRlZCBzdHJpbmdcclxuICAgICAgdmFyIHRpdGxlID0gIXRoaXMubXVsdGlwbGUgPyBzZWxlY3RlZEl0ZW1zWzBdIDogc2VsZWN0ZWRJdGVtcy5qb2luKHRoaXMub3B0aW9ucy5tdWx0aXBsZVNlcGFyYXRvcik7XHJcblxyXG4gICAgICAvL0lmIHRoaXMgaXMgbXVsdGkgc2VsZWN0LCBhbmQgdGhlIHNlbGVjdFRleHQgdHlwZSBpcyBjb3VudCwgdGhlIHNob3cgMSBvZiAyIHNlbGVjdGVkIGV0Yy4uXHJcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHRoaXMub3B0aW9ucy5zZWxlY3RlZFRleHRGb3JtYXQuaW5kZXhPZignY291bnQnKSA+IC0xKSB7XHJcbiAgICAgICAgdmFyIG1heCA9IHRoaXMub3B0aW9ucy5zZWxlY3RlZFRleHRGb3JtYXQuc3BsaXQoJz4nKTtcclxuICAgICAgICBpZiAoKG1heC5sZW5ndGggPiAxICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gbWF4WzFdKSB8fCAobWF4Lmxlbmd0aCA9PSAxICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID49IDIpKSB7XHJcbiAgICAgICAgICBub3REaXNhYmxlZCA9IHRoaXMub3B0aW9ucy5oaWRlRGlzYWJsZWQgPyAnLCBbZGlzYWJsZWRdJyA6ICcnO1xyXG4gICAgICAgICAgdmFyIHRvdGFsQ291bnQgPSB0aGlzLiRlbGVtZW50LmZpbmQoJ29wdGlvbicpLm5vdCgnW2RhdGEtZGl2aWRlcj1cInRydWVcIl0sIFtkYXRhLWhpZGRlbj1cInRydWVcIl0nICsgbm90RGlzYWJsZWQpLmxlbmd0aCxcclxuICAgICAgICAgICAgICB0cjhuVGV4dCA9ICh0eXBlb2YgdGhpcy5vcHRpb25zLmNvdW50U2VsZWN0ZWRUZXh0ID09PSAnZnVuY3Rpb24nKSA/IHRoaXMub3B0aW9ucy5jb3VudFNlbGVjdGVkVGV4dChzZWxlY3RlZEl0ZW1zLmxlbmd0aCwgdG90YWxDb3VudCkgOiB0aGlzLm9wdGlvbnMuY291bnRTZWxlY3RlZFRleHQ7XHJcbiAgICAgICAgICB0aXRsZSA9IHRyOG5UZXh0LnJlcGxhY2UoJ3swfScsIHNlbGVjdGVkSXRlbXMubGVuZ3RoLnRvU3RyaW5nKCkpLnJlcGxhY2UoJ3sxfScsIHRvdGFsQ291bnQudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnRpdGxlID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMub3B0aW9ucy50aXRsZSA9IHRoaXMuJGVsZW1lbnQuYXR0cigndGl0bGUnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWxlY3RlZFRleHRGb3JtYXQgPT0gJ3N0YXRpYycpIHtcclxuICAgICAgICB0aXRsZSA9IHRoaXMub3B0aW9ucy50aXRsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy9JZiB3ZSBkb250IGhhdmUgYSB0aXRsZSwgdGhlbiB1c2UgdGhlIGRlZmF1bHQsIG9yIGlmIG5vdGhpbmcgaXMgc2V0IGF0IGFsbCwgdXNlIHRoZSBub3Qgc2VsZWN0ZWQgdGV4dFxyXG4gICAgICBpZiAoIXRpdGxlKSB7XHJcbiAgICAgICAgdGl0bGUgPSB0eXBlb2YgdGhpcy5vcHRpb25zLnRpdGxlICE9PSAndW5kZWZpbmVkJyA/IHRoaXMub3B0aW9ucy50aXRsZSA6IHRoaXMub3B0aW9ucy5ub25lU2VsZWN0ZWRUZXh0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvL3N0cmlwIGFsbCBodG1sLXRhZ3MgYW5kIHRyaW0gdGhlIHJlc3VsdFxyXG4gICAgICB0aGlzLiRidXR0b24uYXR0cigndGl0bGUnLCAkLnRyaW0odGl0bGUucmVwbGFjZSgvPFtePl0qPj8vZywgJycpKSk7XHJcbiAgICAgIHRoaXMuJGJ1dHRvbi5jaGlsZHJlbignLmZpbHRlci1vcHRpb24nKS5odG1sKHRpdGxlKTtcclxuXHJcbiAgICAgIHRoaXMuJGVsZW1lbnQudHJpZ2dlcigncmVuZGVyZWQuYnMuc2VsZWN0Jyk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIFtzdHlsZV1cclxuICAgICAqIEBwYXJhbSBbc3RhdHVzXVxyXG4gICAgICovXHJcbiAgICBzZXRTdHlsZTogZnVuY3Rpb24gKHN0eWxlLCBzdGF0dXMpIHtcclxuICAgICAgaWYgKHRoaXMuJGVsZW1lbnQuYXR0cignY2xhc3MnKSkge1xyXG4gICAgICAgIHRoaXMuJG5ld0VsZW1lbnQuYWRkQ2xhc3ModGhpcy4kZWxlbWVudC5hdHRyKCdjbGFzcycpLnJlcGxhY2UoL3NlbGVjdHBpY2tlcnxtb2JpbGUtZGV2aWNlfGJzLXNlbGVjdC1oaWRkZW58dmFsaWRhdGVcXFsuKlxcXS9naSwgJycpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdmFyIGJ1dHRvbkNsYXNzID0gc3R5bGUgPyBzdHlsZSA6IHRoaXMub3B0aW9ucy5zdHlsZTtcclxuXHJcbiAgICAgIGlmIChzdGF0dXMgPT0gJ2FkZCcpIHtcclxuICAgICAgICB0aGlzLiRidXR0b24uYWRkQ2xhc3MoYnV0dG9uQ2xhc3MpO1xyXG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSAncmVtb3ZlJykge1xyXG4gICAgICAgIHRoaXMuJGJ1dHRvbi5yZW1vdmVDbGFzcyhidXR0b25DbGFzcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy4kYnV0dG9uLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5zdHlsZSk7XHJcbiAgICAgICAgdGhpcy4kYnV0dG9uLmFkZENsYXNzKGJ1dHRvbkNsYXNzKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBsaUhlaWdodDogZnVuY3Rpb24gKHJlZnJlc2gpIHtcclxuICAgICAgaWYgKCFyZWZyZXNoICYmICh0aGlzLm9wdGlvbnMuc2l6ZSA9PT0gZmFsc2UgfHwgdGhpcy5zaXplSW5mbykpIHJldHVybjtcclxuXHJcbiAgICAgIHZhciBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksXHJcbiAgICAgICAgICBtZW51ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksXHJcbiAgICAgICAgICBtZW51SW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd1bCcpLFxyXG4gICAgICAgICAgZGl2aWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyksXHJcbiAgICAgICAgICBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyksXHJcbiAgICAgICAgICBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpLFxyXG4gICAgICAgICAgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKSxcclxuICAgICAgICAgIGhlYWRlciA9IHRoaXMub3B0aW9ucy5oZWFkZXIgJiYgdGhpcy4kbWVudS5maW5kKCcucG9wb3Zlci10aXRsZScpLmxlbmd0aCA+IDAgPyB0aGlzLiRtZW51LmZpbmQoJy5wb3BvdmVyLXRpdGxlJylbMF0uY2xvbmVOb2RlKHRydWUpIDogbnVsbCxcclxuICAgICAgICAgIHNlYXJjaCA9IHRoaXMub3B0aW9ucy5saXZlU2VhcmNoID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykgOiBudWxsLFxyXG4gICAgICAgICAgYWN0aW9ucyA9IHRoaXMub3B0aW9ucy5hY3Rpb25zQm94ICYmIHRoaXMubXVsdGlwbGUgJiYgdGhpcy4kbWVudS5maW5kKCcuYnMtYWN0aW9uc2JveCcpLmxlbmd0aCA+IDAgPyB0aGlzLiRtZW51LmZpbmQoJy5icy1hY3Rpb25zYm94JylbMF0uY2xvbmVOb2RlKHRydWUpIDogbnVsbCxcclxuICAgICAgICAgIGRvbmVCdXR0b24gPSB0aGlzLm9wdGlvbnMuZG9uZUJ1dHRvbiAmJiB0aGlzLm11bHRpcGxlICYmIHRoaXMuJG1lbnUuZmluZCgnLmJzLWRvbmVidXR0b24nKS5sZW5ndGggPiAwID8gdGhpcy4kbWVudS5maW5kKCcuYnMtZG9uZWJ1dHRvbicpWzBdLmNsb25lTm9kZSh0cnVlKSA6IG51bGw7XHJcblxyXG4gICAgICB0ZXh0LmNsYXNzTmFtZSA9ICd0ZXh0JztcclxuICAgICAgbmV3RWxlbWVudC5jbGFzc05hbWUgPSB0aGlzLiRtZW51WzBdLnBhcmVudE5vZGUuY2xhc3NOYW1lICsgJyBvcGVuJztcclxuICAgICAgbWVudS5jbGFzc05hbWUgPSAnZHJvcGRvd24tbWVudSBvcGVuJztcclxuICAgICAgbWVudUlubmVyLmNsYXNzTmFtZSA9ICdkcm9wZG93bi1tZW51IGlubmVyJztcclxuICAgICAgZGl2aWRlci5jbGFzc05hbWUgPSAnZGl2aWRlcic7XHJcblxyXG4gICAgICB0ZXh0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCdJbm5lciB0ZXh0JykpO1xyXG4gICAgICBhLmFwcGVuZENoaWxkKHRleHQpO1xyXG4gICAgICBsaS5hcHBlbmRDaGlsZChhKTtcclxuICAgICAgbWVudUlubmVyLmFwcGVuZENoaWxkKGxpKTtcclxuICAgICAgbWVudUlubmVyLmFwcGVuZENoaWxkKGRpdmlkZXIpO1xyXG4gICAgICBpZiAoaGVhZGVyKSBtZW51LmFwcGVuZENoaWxkKGhlYWRlcik7XHJcbiAgICAgIGlmIChzZWFyY2gpIHtcclxuICAgICAgICAvLyBjcmVhdGUgYSBzcGFuIGluc3RlYWQgb2YgaW5wdXQgYXMgY3JlYXRpbmcgYW4gaW5wdXQgZWxlbWVudCBpcyBzbG93ZXJcclxuICAgICAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XHJcbiAgICAgICAgc2VhcmNoLmNsYXNzTmFtZSA9ICdicy1zZWFyY2hib3gnO1xyXG4gICAgICAgIGlucHV0LmNsYXNzTmFtZSA9ICdmb3JtLWNvbnRyb2wnO1xyXG4gICAgICAgIHNlYXJjaC5hcHBlbmRDaGlsZChpbnB1dCk7XHJcbiAgICAgICAgbWVudS5hcHBlbmRDaGlsZChzZWFyY2gpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChhY3Rpb25zKSBtZW51LmFwcGVuZENoaWxkKGFjdGlvbnMpO1xyXG4gICAgICBtZW51LmFwcGVuZENoaWxkKG1lbnVJbm5lcik7XHJcbiAgICAgIGlmIChkb25lQnV0dG9uKSBtZW51LmFwcGVuZENoaWxkKGRvbmVCdXR0b24pO1xyXG4gICAgICBuZXdFbGVtZW50LmFwcGVuZENoaWxkKG1lbnUpO1xyXG5cclxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcclxuXHJcbiAgICAgIHZhciBsaUhlaWdodCA9IGEub2Zmc2V0SGVpZ2h0LFxyXG4gICAgICAgICAgaGVhZGVySGVpZ2h0ID0gaGVhZGVyID8gaGVhZGVyLm9mZnNldEhlaWdodCA6IDAsXHJcbiAgICAgICAgICBzZWFyY2hIZWlnaHQgPSBzZWFyY2ggPyBzZWFyY2gub2Zmc2V0SGVpZ2h0IDogMCxcclxuICAgICAgICAgIGFjdGlvbnNIZWlnaHQgPSBhY3Rpb25zID8gYWN0aW9ucy5vZmZzZXRIZWlnaHQgOiAwLFxyXG4gICAgICAgICAgZG9uZUJ1dHRvbkhlaWdodCA9IGRvbmVCdXR0b24gPyBkb25lQnV0dG9uLm9mZnNldEhlaWdodCA6IDAsXHJcbiAgICAgICAgICBkaXZpZGVySGVpZ2h0ID0gJChkaXZpZGVyKS5vdXRlckhlaWdodCh0cnVlKSxcclxuICAgICAgICAgIC8vIGZhbGwgYmFjayB0byBqUXVlcnkgaWYgZ2V0Q29tcHV0ZWRTdHlsZSBpcyBub3Qgc3VwcG9ydGVkXHJcbiAgICAgICAgICBtZW51U3R5bGUgPSB0eXBlb2YgZ2V0Q29tcHV0ZWRTdHlsZSA9PT0gJ2Z1bmN0aW9uJyA/IGdldENvbXB1dGVkU3R5bGUobWVudSkgOiBmYWxzZSxcclxuICAgICAgICAgICRtZW51ID0gbWVudVN0eWxlID8gbnVsbCA6ICQobWVudSksXHJcbiAgICAgICAgICBtZW51UGFkZGluZyA9IHtcclxuICAgICAgICAgICAgdmVydDogcGFyc2VJbnQobWVudVN0eWxlID8gbWVudVN0eWxlLnBhZGRpbmdUb3AgOiAkbWVudS5jc3MoJ3BhZGRpbmdUb3AnKSkgK1xyXG4gICAgICAgICAgICAgICAgICBwYXJzZUludChtZW51U3R5bGUgPyBtZW51U3R5bGUucGFkZGluZ0JvdHRvbSA6ICRtZW51LmNzcygncGFkZGluZ0JvdHRvbScpKSArXHJcbiAgICAgICAgICAgICAgICAgIHBhcnNlSW50KG1lbnVTdHlsZSA/IG1lbnVTdHlsZS5ib3JkZXJUb3BXaWR0aCA6ICRtZW51LmNzcygnYm9yZGVyVG9wV2lkdGgnKSkgK1xyXG4gICAgICAgICAgICAgICAgICBwYXJzZUludChtZW51U3R5bGUgPyBtZW51U3R5bGUuYm9yZGVyQm90dG9tV2lkdGggOiAkbWVudS5jc3MoJ2JvcmRlckJvdHRvbVdpZHRoJykpLFxyXG4gICAgICAgICAgICBob3JpejogcGFyc2VJbnQobWVudVN0eWxlID8gbWVudVN0eWxlLnBhZGRpbmdMZWZ0IDogJG1lbnUuY3NzKCdwYWRkaW5nTGVmdCcpKSArXHJcbiAgICAgICAgICAgICAgICAgIHBhcnNlSW50KG1lbnVTdHlsZSA/IG1lbnVTdHlsZS5wYWRkaW5nUmlnaHQgOiAkbWVudS5jc3MoJ3BhZGRpbmdSaWdodCcpKSArXHJcbiAgICAgICAgICAgICAgICAgIHBhcnNlSW50KG1lbnVTdHlsZSA/IG1lbnVTdHlsZS5ib3JkZXJMZWZ0V2lkdGggOiAkbWVudS5jc3MoJ2JvcmRlckxlZnRXaWR0aCcpKSArXHJcbiAgICAgICAgICAgICAgICAgIHBhcnNlSW50KG1lbnVTdHlsZSA/IG1lbnVTdHlsZS5ib3JkZXJSaWdodFdpZHRoIDogJG1lbnUuY3NzKCdib3JkZXJSaWdodFdpZHRoJykpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgbWVudUV4dHJhcyA9ICB7XHJcbiAgICAgICAgICAgIHZlcnQ6IG1lbnVQYWRkaW5nLnZlcnQgK1xyXG4gICAgICAgICAgICAgICAgICBwYXJzZUludChtZW51U3R5bGUgPyBtZW51U3R5bGUubWFyZ2luVG9wIDogJG1lbnUuY3NzKCdtYXJnaW5Ub3AnKSkgK1xyXG4gICAgICAgICAgICAgICAgICBwYXJzZUludChtZW51U3R5bGUgPyBtZW51U3R5bGUubWFyZ2luQm90dG9tIDogJG1lbnUuY3NzKCdtYXJnaW5Cb3R0b20nKSkgKyAyLFxyXG4gICAgICAgICAgICBob3JpejogbWVudVBhZGRpbmcuaG9yaXogK1xyXG4gICAgICAgICAgICAgICAgICBwYXJzZUludChtZW51U3R5bGUgPyBtZW51U3R5bGUubWFyZ2luTGVmdCA6ICRtZW51LmNzcygnbWFyZ2luTGVmdCcpKSArXHJcbiAgICAgICAgICAgICAgICAgIHBhcnNlSW50KG1lbnVTdHlsZSA/IG1lbnVTdHlsZS5tYXJnaW5SaWdodCA6ICRtZW51LmNzcygnbWFyZ2luUmlnaHQnKSkgKyAyXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG5ld0VsZW1lbnQpO1xyXG5cclxuICAgICAgdGhpcy5zaXplSW5mbyA9IHtcclxuICAgICAgICBsaUhlaWdodDogbGlIZWlnaHQsXHJcbiAgICAgICAgaGVhZGVySGVpZ2h0OiBoZWFkZXJIZWlnaHQsXHJcbiAgICAgICAgc2VhcmNoSGVpZ2h0OiBzZWFyY2hIZWlnaHQsXHJcbiAgICAgICAgYWN0aW9uc0hlaWdodDogYWN0aW9uc0hlaWdodCxcclxuICAgICAgICBkb25lQnV0dG9uSGVpZ2h0OiBkb25lQnV0dG9uSGVpZ2h0LFxyXG4gICAgICAgIGRpdmlkZXJIZWlnaHQ6IGRpdmlkZXJIZWlnaHQsXHJcbiAgICAgICAgbWVudVBhZGRpbmc6IG1lbnVQYWRkaW5nLFxyXG4gICAgICAgIG1lbnVFeHRyYXM6IG1lbnVFeHRyYXNcclxuICAgICAgfTtcclxuICAgIH0sXHJcblxyXG4gICAgc2V0U2l6ZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzLmZpbmRMaXMoKTtcclxuICAgICAgdGhpcy5saUhlaWdodCgpO1xyXG5cclxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5oZWFkZXIpIHRoaXMuJG1lbnUuY3NzKCdwYWRkaW5nLXRvcCcsIDApO1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnNpemUgPT09IGZhbHNlKSByZXR1cm47XHJcblxyXG4gICAgICB2YXIgdGhhdCA9IHRoaXMsXHJcbiAgICAgICAgICAkbWVudSA9IHRoaXMuJG1lbnUsXHJcbiAgICAgICAgICAkbWVudUlubmVyID0gdGhpcy4kbWVudUlubmVyLFxyXG4gICAgICAgICAgJHdpbmRvdyA9ICQod2luZG93KSxcclxuICAgICAgICAgIHNlbGVjdEhlaWdodCA9IHRoaXMuJG5ld0VsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0LFxyXG4gICAgICAgICAgc2VsZWN0V2lkdGggPSB0aGlzLiRuZXdFbGVtZW50WzBdLm9mZnNldFdpZHRoLFxyXG4gICAgICAgICAgbGlIZWlnaHQgPSB0aGlzLnNpemVJbmZvWydsaUhlaWdodCddLFxyXG4gICAgICAgICAgaGVhZGVySGVpZ2h0ID0gdGhpcy5zaXplSW5mb1snaGVhZGVySGVpZ2h0J10sXHJcbiAgICAgICAgICBzZWFyY2hIZWlnaHQgPSB0aGlzLnNpemVJbmZvWydzZWFyY2hIZWlnaHQnXSxcclxuICAgICAgICAgIGFjdGlvbnNIZWlnaHQgPSB0aGlzLnNpemVJbmZvWydhY3Rpb25zSGVpZ2h0J10sXHJcbiAgICAgICAgICBkb25lQnV0dG9uSGVpZ2h0ID0gdGhpcy5zaXplSW5mb1snZG9uZUJ1dHRvbkhlaWdodCddLFxyXG4gICAgICAgICAgZGl2SGVpZ2h0ID0gdGhpcy5zaXplSW5mb1snZGl2aWRlckhlaWdodCddLFxyXG4gICAgICAgICAgbWVudVBhZGRpbmcgPSB0aGlzLnNpemVJbmZvWydtZW51UGFkZGluZyddLFxyXG4gICAgICAgICAgbWVudUV4dHJhcyA9IHRoaXMuc2l6ZUluZm9bJ21lbnVFeHRyYXMnXSxcclxuICAgICAgICAgIG5vdERpc2FibGVkID0gdGhpcy5vcHRpb25zLmhpZGVEaXNhYmxlZCA/ICcuZGlzYWJsZWQnIDogJycsXHJcbiAgICAgICAgICBtZW51SGVpZ2h0LFxyXG4gICAgICAgICAgbWVudVdpZHRoLFxyXG4gICAgICAgICAgZ2V0SGVpZ2h0LFxyXG4gICAgICAgICAgZ2V0V2lkdGgsXHJcbiAgICAgICAgICBzZWxlY3RPZmZzZXRUb3AsXHJcbiAgICAgICAgICBzZWxlY3RPZmZzZXRCb3QsXHJcbiAgICAgICAgICBzZWxlY3RPZmZzZXRMZWZ0LFxyXG4gICAgICAgICAgc2VsZWN0T2Zmc2V0UmlnaHQsXHJcbiAgICAgICAgICBnZXRQb3MgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgdmFyIHBvcyA9IHRoYXQuJG5ld0VsZW1lbnQub2Zmc2V0KCksXHJcbiAgICAgICAgICAgICAgICAkY29udGFpbmVyID0gJCh0aGF0Lm9wdGlvbnMuY29udGFpbmVyKSxcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lclBvcztcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGF0Lm9wdGlvbnMuY29udGFpbmVyICYmICEkY29udGFpbmVyLmlzKCdib2R5JykpIHtcclxuICAgICAgICAgICAgICBjb250YWluZXJQb3MgPSAkY29udGFpbmVyLm9mZnNldCgpO1xyXG4gICAgICAgICAgICAgIGNvbnRhaW5lclBvcy50b3AgKz0gcGFyc2VJbnQoJGNvbnRhaW5lci5jc3MoJ2JvcmRlclRvcFdpZHRoJykpO1xyXG4gICAgICAgICAgICAgIGNvbnRhaW5lclBvcy5sZWZ0ICs9IHBhcnNlSW50KCRjb250YWluZXIuY3NzKCdib3JkZXJMZWZ0V2lkdGgnKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29udGFpbmVyUG9zID0geyB0b3A6IDAsIGxlZnQ6IDAgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgc2VsZWN0T2Zmc2V0VG9wID0gcG9zLnRvcCAtIGNvbnRhaW5lclBvcy50b3AgLSAkd2luZG93LnNjcm9sbFRvcCgpO1xyXG4gICAgICAgICAgICBzZWxlY3RPZmZzZXRCb3QgPSAkd2luZG93LmhlaWdodCgpIC0gc2VsZWN0T2Zmc2V0VG9wIC0gc2VsZWN0SGVpZ2h0IC0gY29udGFpbmVyUG9zLnRvcDtcclxuICAgICAgICAgICAgc2VsZWN0T2Zmc2V0TGVmdCA9IHBvcy5sZWZ0IC0gY29udGFpbmVyUG9zLmxlZnQgLSAkd2luZG93LnNjcm9sbExlZnQoKTtcclxuICAgICAgICAgICAgc2VsZWN0T2Zmc2V0UmlnaHQgPSAkd2luZG93LndpZHRoKCkgLSBzZWxlY3RPZmZzZXRMZWZ0IC0gc2VsZWN0V2lkdGggLSBjb250YWluZXJQb3MubGVmdDtcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICBnZXRQb3MoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2l6ZSA9PT0gJ2F1dG8nKSB7XHJcbiAgICAgICAgdmFyIGdldFNpemUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICB2YXIgbWluSGVpZ2h0LFxyXG4gICAgICAgICAgICAgIGhhc0NsYXNzID0gZnVuY3Rpb24gKGNsYXNzTmFtZSwgaW5jbHVkZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50LmNsYXNzTGlzdCA/IGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkgOiAkKGVsZW1lbnQpLmhhc0NsYXNzKGNsYXNzTmFtZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhKGVsZW1lbnQuY2xhc3NMaXN0ID8gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSA6ICQoZWxlbWVudCkuaGFzQ2xhc3MoY2xhc3NOYW1lKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGxpcyA9IHRoYXQuJG1lbnVJbm5lclswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbGknKSxcclxuICAgICAgICAgICAgICBsaXNWaXNpYmxlID0gQXJyYXkucHJvdG90eXBlLmZpbHRlciA/IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChsaXMsIGhhc0NsYXNzKCdoaWRkZW4nLCBmYWxzZSkpIDogdGhhdC4kbGlzLm5vdCgnLmhpZGRlbicpLFxyXG4gICAgICAgICAgICAgIG9wdEdyb3VwID0gQXJyYXkucHJvdG90eXBlLmZpbHRlciA/IEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChsaXNWaXNpYmxlLCBoYXNDbGFzcygnZHJvcGRvd24taGVhZGVyJywgdHJ1ZSkpIDogbGlzVmlzaWJsZS5maWx0ZXIoJy5kcm9wZG93bi1oZWFkZXInKTtcclxuXHJcbiAgICAgICAgICBnZXRQb3MoKTtcclxuICAgICAgICAgIG1lbnVIZWlnaHQgPSBzZWxlY3RPZmZzZXRCb3QgLSBtZW51RXh0cmFzLnZlcnQ7XHJcbiAgICAgICAgICBtZW51V2lkdGggPSBzZWxlY3RPZmZzZXRSaWdodCAtIG1lbnVFeHRyYXMuaG9yaXo7XHJcblxyXG4gICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5jb250YWluZXIpIHtcclxuICAgICAgICAgICAgaWYgKCEkbWVudS5kYXRhKCdoZWlnaHQnKSkgJG1lbnUuZGF0YSgnaGVpZ2h0JywgJG1lbnUuaGVpZ2h0KCkpO1xyXG4gICAgICAgICAgICBnZXRIZWlnaHQgPSAkbWVudS5kYXRhKCdoZWlnaHQnKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghJG1lbnUuZGF0YSgnd2lkdGgnKSkgJG1lbnUuZGF0YSgnd2lkdGgnLCAkbWVudS53aWR0aCgpKTtcclxuICAgICAgICAgICAgZ2V0V2lkdGggPSAkbWVudS5kYXRhKCd3aWR0aCcpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ2V0SGVpZ2h0ID0gJG1lbnUuaGVpZ2h0KCk7XHJcbiAgICAgICAgICAgIGdldFdpZHRoID0gJG1lbnUud2lkdGgoKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAodGhhdC5vcHRpb25zLmRyb3B1cEF1dG8pIHtcclxuICAgICAgICAgICAgdGhhdC4kbmV3RWxlbWVudC50b2dnbGVDbGFzcygnZHJvcHVwJywgc2VsZWN0T2Zmc2V0VG9wID4gc2VsZWN0T2Zmc2V0Qm90ICYmIChtZW51SGVpZ2h0IC0gbWVudUV4dHJhcy52ZXJ0KSA8IGdldEhlaWdodCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoYXQuJG5ld0VsZW1lbnQuaGFzQ2xhc3MoJ2Ryb3B1cCcpKSB7XHJcbiAgICAgICAgICAgIG1lbnVIZWlnaHQgPSBzZWxlY3RPZmZzZXRUb3AgLSBtZW51RXh0cmFzLnZlcnQ7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5kcm9wZG93bkFsaWduUmlnaHQgPT09ICdhdXRvJykge1xyXG4gICAgICAgICAgICAkbWVudS50b2dnbGVDbGFzcygnZHJvcGRvd24tbWVudS1yaWdodCcsIHNlbGVjdE9mZnNldExlZnQgPiBzZWxlY3RPZmZzZXRSaWdodCAmJiAobWVudVdpZHRoIC0gbWVudUV4dHJhcy5ob3JpeikgPCAoZ2V0V2lkdGggLSBzZWxlY3RXaWR0aCkpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmICgobGlzVmlzaWJsZS5sZW5ndGggKyBvcHRHcm91cC5sZW5ndGgpID4gMykge1xyXG4gICAgICAgICAgICBtaW5IZWlnaHQgPSBsaUhlaWdodCAqIDMgKyBtZW51RXh0cmFzLnZlcnQgLSAyO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWluSGVpZ2h0ID0gMDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAkbWVudS5jc3Moe1xyXG4gICAgICAgICAgICAnbWF4LWhlaWdodCc6IG1lbnVIZWlnaHQgKyAncHgnLFxyXG4gICAgICAgICAgICAnb3ZlcmZsb3cnOiAnaGlkZGVuJyxcclxuICAgICAgICAgICAgJ21pbi1oZWlnaHQnOiBtaW5IZWlnaHQgKyBoZWFkZXJIZWlnaHQgKyBzZWFyY2hIZWlnaHQgKyBhY3Rpb25zSGVpZ2h0ICsgZG9uZUJ1dHRvbkhlaWdodCArICdweCdcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgJG1lbnVJbm5lci5jc3Moe1xyXG4gICAgICAgICAgICAnbWF4LWhlaWdodCc6IG1lbnVIZWlnaHQgLSBoZWFkZXJIZWlnaHQgLSBzZWFyY2hIZWlnaHQgLSBhY3Rpb25zSGVpZ2h0IC0gZG9uZUJ1dHRvbkhlaWdodCAtIG1lbnVQYWRkaW5nLnZlcnQgKyAncHgnLFxyXG4gICAgICAgICAgICAnb3ZlcmZsb3cteSc6ICdhdXRvJyxcclxuICAgICAgICAgICAgJ21pbi1oZWlnaHQnOiBNYXRoLm1heChtaW5IZWlnaHQgLSBtZW51UGFkZGluZy52ZXJ0LCAwKSArICdweCdcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgZ2V0U2l6ZSgpO1xyXG4gICAgICAgIHRoaXMuJHNlYXJjaGJveC5vZmYoJ2lucHV0LmdldFNpemUgcHJvcGVydHljaGFuZ2UuZ2V0U2l6ZScpLm9uKCdpbnB1dC5nZXRTaXplIHByb3BlcnR5Y2hhbmdlLmdldFNpemUnLCBnZXRTaXplKTtcclxuICAgICAgICAkd2luZG93Lm9mZigncmVzaXplLmdldFNpemUgc2Nyb2xsLmdldFNpemUnKS5vbigncmVzaXplLmdldFNpemUgc2Nyb2xsLmdldFNpemUnLCBnZXRTaXplKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuc2l6ZSAmJiB0aGlzLm9wdGlvbnMuc2l6ZSAhPSAnYXV0bycgJiYgdGhpcy4kbGlzLm5vdChub3REaXNhYmxlZCkubGVuZ3RoID4gdGhpcy5vcHRpb25zLnNpemUpIHtcclxuICAgICAgICB2YXIgb3B0SW5kZXggPSB0aGlzLiRsaXMubm90KCcuZGl2aWRlcicpLm5vdChub3REaXNhYmxlZCkuY2hpbGRyZW4oKS5zbGljZSgwLCB0aGlzLm9wdGlvbnMuc2l6ZSkubGFzdCgpLnBhcmVudCgpLmluZGV4KCksXHJcbiAgICAgICAgICAgIGRpdkxlbmd0aCA9IHRoaXMuJGxpcy5zbGljZSgwLCBvcHRJbmRleCArIDEpLmZpbHRlcignLmRpdmlkZXInKS5sZW5ndGg7XHJcbiAgICAgICAgbWVudUhlaWdodCA9IGxpSGVpZ2h0ICogdGhpcy5vcHRpb25zLnNpemUgKyBkaXZMZW5ndGggKiBkaXZIZWlnaHQgKyBtZW51UGFkZGluZy52ZXJ0O1xyXG5cclxuICAgICAgICBpZiAodGhhdC5vcHRpb25zLmNvbnRhaW5lcikge1xyXG4gICAgICAgICAgaWYgKCEkbWVudS5kYXRhKCdoZWlnaHQnKSkgJG1lbnUuZGF0YSgnaGVpZ2h0JywgJG1lbnUuaGVpZ2h0KCkpO1xyXG4gICAgICAgICAgZ2V0SGVpZ2h0ID0gJG1lbnUuZGF0YSgnaGVpZ2h0Jyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGdldEhlaWdodCA9ICRtZW51LmhlaWdodCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5kcm9wdXBBdXRvKSB7XHJcbiAgICAgICAgICAvL25vaW5zcGVjdGlvbiBKU1VudXNlZEFzc2lnbm1lbnRcclxuICAgICAgICAgIHRoaXMuJG5ld0VsZW1lbnQudG9nZ2xlQ2xhc3MoJ2Ryb3B1cCcsIHNlbGVjdE9mZnNldFRvcCA+IHNlbGVjdE9mZnNldEJvdCAmJiAobWVudUhlaWdodCAtIG1lbnVFeHRyYXMudmVydCkgPCBnZXRIZWlnaHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAkbWVudS5jc3Moe1xyXG4gICAgICAgICAgJ21heC1oZWlnaHQnOiBtZW51SGVpZ2h0ICsgaGVhZGVySGVpZ2h0ICsgc2VhcmNoSGVpZ2h0ICsgYWN0aW9uc0hlaWdodCArIGRvbmVCdXR0b25IZWlnaHQgKyAncHgnLFxyXG4gICAgICAgICAgJ292ZXJmbG93JzogJ2hpZGRlbicsXHJcbiAgICAgICAgICAnbWluLWhlaWdodCc6ICcnXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgJG1lbnVJbm5lci5jc3Moe1xyXG4gICAgICAgICAgJ21heC1oZWlnaHQnOiBtZW51SGVpZ2h0IC0gbWVudVBhZGRpbmcudmVydCArICdweCcsXHJcbiAgICAgICAgICAnb3ZlcmZsb3cteSc6ICdhdXRvJyxcclxuICAgICAgICAgICdtaW4taGVpZ2h0JzogJydcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBzZXRXaWR0aDogZnVuY3Rpb24gKCkge1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zLndpZHRoID09PSAnYXV0bycpIHtcclxuICAgICAgICB0aGlzLiRtZW51LmNzcygnbWluLXdpZHRoJywgJzAnKTtcclxuXHJcbiAgICAgICAgLy8gR2V0IGNvcnJlY3Qgd2lkdGggaWYgZWxlbWVudCBpcyBoaWRkZW5cclxuICAgICAgICB2YXIgJHNlbGVjdENsb25lID0gdGhpcy4kbWVudS5wYXJlbnQoKS5jbG9uZSgpLmFwcGVuZFRvKCdib2R5JyksXHJcbiAgICAgICAgICAgICRzZWxlY3RDbG9uZTIgPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyID8gdGhpcy4kbmV3RWxlbWVudC5jbG9uZSgpLmFwcGVuZFRvKCdib2R5JykgOiAkc2VsZWN0Q2xvbmUsXHJcbiAgICAgICAgICAgIHVsV2lkdGggPSAkc2VsZWN0Q2xvbmUuY2hpbGRyZW4oJy5kcm9wZG93bi1tZW51Jykub3V0ZXJXaWR0aCgpLFxyXG4gICAgICAgICAgICBidG5XaWR0aCA9ICRzZWxlY3RDbG9uZTIuY3NzKCd3aWR0aCcsICdhdXRvJykuY2hpbGRyZW4oJ2J1dHRvbicpLm91dGVyV2lkdGgoKTtcclxuXHJcbiAgICAgICAgJHNlbGVjdENsb25lLnJlbW92ZSgpO1xyXG4gICAgICAgICRzZWxlY3RDbG9uZTIucmVtb3ZlKCk7XHJcblxyXG4gICAgICAgIC8vIFNldCB3aWR0aCB0byB3aGF0ZXZlcidzIGxhcmdlciwgYnV0dG9uIHRpdGxlIG9yIGxvbmdlc3Qgb3B0aW9uXHJcbiAgICAgICAgdGhpcy4kbmV3RWxlbWVudC5jc3MoJ3dpZHRoJywgTWF0aC5tYXgodWxXaWR0aCwgYnRuV2lkdGgpICsgJ3B4Jyk7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLndpZHRoID09PSAnZml0Jykge1xyXG4gICAgICAgIC8vIFJlbW92ZSBpbmxpbmUgbWluLXdpZHRoIHNvIHdpZHRoIGNhbiBiZSBjaGFuZ2VkIGZyb20gJ2F1dG8nXHJcbiAgICAgICAgdGhpcy4kbWVudS5jc3MoJ21pbi13aWR0aCcsICcnKTtcclxuICAgICAgICB0aGlzLiRuZXdFbGVtZW50LmNzcygnd2lkdGgnLCAnJykuYWRkQ2xhc3MoJ2ZpdC13aWR0aCcpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy53aWR0aCkge1xyXG4gICAgICAgIC8vIFJlbW92ZSBpbmxpbmUgbWluLXdpZHRoIHNvIHdpZHRoIGNhbiBiZSBjaGFuZ2VkIGZyb20gJ2F1dG8nXHJcbiAgICAgICAgdGhpcy4kbWVudS5jc3MoJ21pbi13aWR0aCcsICcnKTtcclxuICAgICAgICB0aGlzLiRuZXdFbGVtZW50LmNzcygnd2lkdGgnLCB0aGlzLm9wdGlvbnMud2lkdGgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIFJlbW92ZSBpbmxpbmUgbWluLXdpZHRoL3dpZHRoIHNvIHdpZHRoIGNhbiBiZSBjaGFuZ2VkXHJcbiAgICAgICAgdGhpcy4kbWVudS5jc3MoJ21pbi13aWR0aCcsICcnKTtcclxuICAgICAgICB0aGlzLiRuZXdFbGVtZW50LmNzcygnd2lkdGgnLCAnJyk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gUmVtb3ZlIGZpdC13aWR0aCBjbGFzcyBpZiB3aWR0aCBpcyBjaGFuZ2VkIHByb2dyYW1tYXRpY2FsbHlcclxuICAgICAgaWYgKHRoaXMuJG5ld0VsZW1lbnQuaGFzQ2xhc3MoJ2ZpdC13aWR0aCcpICYmIHRoaXMub3B0aW9ucy53aWR0aCAhPT0gJ2ZpdCcpIHtcclxuICAgICAgICB0aGlzLiRuZXdFbGVtZW50LnJlbW92ZUNsYXNzKCdmaXQtd2lkdGgnKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBzZWxlY3RQb3NpdGlvbjogZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzLiRic0NvbnRhaW5lciA9ICQoJzxkaXYgY2xhc3M9XCJicy1jb250YWluZXJcIiAvPicpO1xyXG5cclxuICAgICAgdmFyIHRoYXQgPSB0aGlzLFxyXG4gICAgICAgICAgJGNvbnRhaW5lciA9ICQodGhpcy5vcHRpb25zLmNvbnRhaW5lciksXHJcbiAgICAgICAgICBwb3MsXHJcbiAgICAgICAgICBjb250YWluZXJQb3MsXHJcbiAgICAgICAgICBhY3R1YWxIZWlnaHQsXHJcbiAgICAgICAgICBnZXRQbGFjZW1lbnQgPSBmdW5jdGlvbiAoJGVsZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhhdC4kYnNDb250YWluZXIuYWRkQ2xhc3MoJGVsZW1lbnQuYXR0cignY2xhc3MnKS5yZXBsYWNlKC9mb3JtLWNvbnRyb2x8Zml0LXdpZHRoL2dpLCAnJykpLnRvZ2dsZUNsYXNzKCdkcm9wdXAnLCAkZWxlbWVudC5oYXNDbGFzcygnZHJvcHVwJykpO1xyXG4gICAgICAgICAgICBwb3MgPSAkZWxlbWVudC5vZmZzZXQoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghJGNvbnRhaW5lci5pcygnYm9keScpKSB7XHJcbiAgICAgICAgICAgICAgY29udGFpbmVyUG9zID0gJGNvbnRhaW5lci5vZmZzZXQoKTtcclxuICAgICAgICAgICAgICBjb250YWluZXJQb3MudG9wICs9IHBhcnNlSW50KCRjb250YWluZXIuY3NzKCdib3JkZXJUb3BXaWR0aCcpKSAtICRjb250YWluZXIuc2Nyb2xsVG9wKCk7XHJcbiAgICAgICAgICAgICAgY29udGFpbmVyUG9zLmxlZnQgKz0gcGFyc2VJbnQoJGNvbnRhaW5lci5jc3MoJ2JvcmRlckxlZnRXaWR0aCcpKSAtICRjb250YWluZXIuc2Nyb2xsTGVmdCgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnRhaW5lclBvcyA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGFjdHVhbEhlaWdodCA9ICRlbGVtZW50Lmhhc0NsYXNzKCdkcm9wdXAnKSA/IDAgOiAkZWxlbWVudFswXS5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgICAgICAgICB0aGF0LiRic0NvbnRhaW5lci5jc3Moe1xyXG4gICAgICAgICAgICAgICd0b3AnOiBwb3MudG9wIC0gY29udGFpbmVyUG9zLnRvcCArIGFjdHVhbEhlaWdodCxcclxuICAgICAgICAgICAgICAnbGVmdCc6IHBvcy5sZWZ0IC0gY29udGFpbmVyUG9zLmxlZnQsXHJcbiAgICAgICAgICAgICAgJ3dpZHRoJzogJGVsZW1lbnRbMF0ub2Zmc2V0V2lkdGhcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgdGhpcy4kYnV0dG9uLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpO1xyXG5cclxuICAgICAgICBpZiAodGhhdC5pc0Rpc2FibGVkKCkpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldFBsYWNlbWVudCh0aGF0LiRuZXdFbGVtZW50KTtcclxuXHJcbiAgICAgICAgdGhhdC4kYnNDb250YWluZXJcclxuICAgICAgICAgIC5hcHBlbmRUbyh0aGF0Lm9wdGlvbnMuY29udGFpbmVyKVxyXG4gICAgICAgICAgLnRvZ2dsZUNsYXNzKCdvcGVuJywgISR0aGlzLmhhc0NsYXNzKCdvcGVuJykpXHJcbiAgICAgICAgICAuYXBwZW5kKHRoYXQuJG1lbnUpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgICQod2luZG93KS5vbigncmVzaXplIHNjcm9sbCcsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBnZXRQbGFjZW1lbnQodGhhdC4kbmV3RWxlbWVudCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy4kZWxlbWVudC5vbignaGlkZS5icy5zZWxlY3QnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhhdC4kbWVudS5kYXRhKCdoZWlnaHQnLCB0aGF0LiRtZW51LmhlaWdodCgpKTtcclxuICAgICAgICB0aGF0LiRic0NvbnRhaW5lci5kZXRhY2goKTtcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gdGhlIGluZGV4IG9mIHRoZSBvcHRpb24gdGhhdCBpcyBiZWluZyBjaGFuZ2VkXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNlbGVjdGVkIC0gdHJ1ZSBpZiB0aGUgb3B0aW9uIGlzIGJlaW5nIHNlbGVjdGVkLCBmYWxzZSBpZiBiZWluZyBkZXNlbGVjdGVkXHJcbiAgICAgKiBAcGFyYW0ge0pRdWVyeX0gJGxpcyAtIHRoZSAnbGknIGVsZW1lbnQgdGhhdCBpcyBiZWluZyBtb2RpZmllZFxyXG4gICAgICovXHJcbiAgICBzZXRTZWxlY3RlZDogZnVuY3Rpb24gKGluZGV4LCBzZWxlY3RlZCwgJGxpcykge1xyXG4gICAgICBpZiAoISRsaXMpIHtcclxuICAgICAgICB0aGlzLnRvZ2dsZVBsYWNlaG9sZGVyKCk7IC8vIGNoZWNrIGlmIHNldFNlbGVjdGVkIGlzIGJlaW5nIGNhbGxlZCBieSBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgdGhlIHNlbGVjdFxyXG4gICAgICAgICRsaXMgPSB0aGlzLmZpbmRMaXMoKS5lcSh0aGlzLmxpT2JqW2luZGV4XSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICRsaXMudG9nZ2xlQ2xhc3MoJ3NlbGVjdGVkJywgc2VsZWN0ZWQpLmZpbmQoJ2EnKS5hdHRyKCdhcmlhLXNlbGVjdGVkJywgc2VsZWN0ZWQpO1xyXG4gICAgfSxcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCAtIHRoZSBpbmRleCBvZiB0aGUgb3B0aW9uIHRoYXQgaXMgYmVpbmcgZGlzYWJsZWRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGlzYWJsZWQgLSB0cnVlIGlmIHRoZSBvcHRpb24gaXMgYmVpbmcgZGlzYWJsZWQsIGZhbHNlIGlmIGJlaW5nIGVuYWJsZWRcclxuICAgICAqIEBwYXJhbSB7SlF1ZXJ5fSAkbGlzIC0gdGhlICdsaScgZWxlbWVudCB0aGF0IGlzIGJlaW5nIG1vZGlmaWVkXHJcbiAgICAgKi9cclxuICAgIHNldERpc2FibGVkOiBmdW5jdGlvbiAoaW5kZXgsIGRpc2FibGVkLCAkbGlzKSB7XHJcbiAgICAgIGlmICghJGxpcykge1xyXG4gICAgICAgICRsaXMgPSB0aGlzLmZpbmRMaXMoKS5lcSh0aGlzLmxpT2JqW2luZGV4XSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChkaXNhYmxlZCkge1xyXG4gICAgICAgICRsaXMuYWRkQ2xhc3MoJ2Rpc2FibGVkJykuY2hpbGRyZW4oJ2EnKS5hdHRyKCdocmVmJywgJyMnKS5hdHRyKCd0YWJpbmRleCcsIC0xKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAkbGlzLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpLmNoaWxkcmVuKCdhJykucmVtb3ZlQXR0cignaHJlZicpLmF0dHIoJ3RhYmluZGV4JywgMCk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcblxyXG4gICAgaXNEaXNhYmxlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICByZXR1cm4gdGhpcy4kZWxlbWVudFswXS5kaXNhYmxlZDtcclxuICAgIH0sXHJcblxyXG4gICAgY2hlY2tEaXNhYmxlZDogZnVuY3Rpb24gKCkge1xyXG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XHJcblxyXG4gICAgICBpZiAodGhpcy5pc0Rpc2FibGVkKCkpIHtcclxuICAgICAgICB0aGlzLiRuZXdFbGVtZW50LmFkZENsYXNzKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgIHRoaXMuJGJ1dHRvbi5hZGRDbGFzcygnZGlzYWJsZWQnKS5hdHRyKCd0YWJpbmRleCcsIC0xKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy4kYnV0dG9uLmhhc0NsYXNzKCdkaXNhYmxlZCcpKSB7XHJcbiAgICAgICAgICB0aGlzLiRuZXdFbGVtZW50LnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgICAgdGhpcy4kYnV0dG9uLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuJGJ1dHRvbi5hdHRyKCd0YWJpbmRleCcpID09IC0xICYmICF0aGlzLiRlbGVtZW50LmRhdGEoJ3RhYmluZGV4JykpIHtcclxuICAgICAgICAgIHRoaXMuJGJ1dHRvbi5yZW1vdmVBdHRyKCd0YWJpbmRleCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy4kYnV0dG9uLmNsaWNrKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICByZXR1cm4gIXRoYXQuaXNEaXNhYmxlZCgpO1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgdG9nZ2xlUGxhY2Vob2xkZXI6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIHZhbHVlID0gdGhpcy4kZWxlbWVudC52YWwoKTtcclxuICAgICAgdGhpcy4kYnV0dG9uLnRvZ2dsZUNsYXNzKCdicy1wbGFjZWhvbGRlcicsIHZhbHVlID09PSBbXSB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyh2YWx1ZSk7XHJcbiAgICAgIC8vIGlmICh2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIC8vICAgdmFsdWUgPSBbXTtcclxuICAgICAgLy8gfVxyXG4gICAgICAvLyBjb25zb2xlLmxvZyh2YWx1ZSk7XHJcbiAgICAgIC8vdGhpcy4kYnV0dG9uLnRvZ2dsZUNsYXNzKCdicy1wbGFjZWhvbGRlcicsIHZhbHVlID09PSBbXSk7XHJcbiAgICB9LFxyXG5cclxuICAgIHRhYkluZGV4OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIGlmICh0aGlzLiRlbGVtZW50LmRhdGEoJ3RhYmluZGV4JykgIT09IHRoaXMuJGVsZW1lbnQuYXR0cigndGFiaW5kZXgnKSAmJlxyXG4gICAgICAgICh0aGlzLiRlbGVtZW50LmF0dHIoJ3RhYmluZGV4JykgIT09IC05OCAmJiB0aGlzLiRlbGVtZW50LmF0dHIoJ3RhYmluZGV4JykgIT09ICctOTgnKSkge1xyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuZGF0YSgndGFiaW5kZXgnLCB0aGlzLiRlbGVtZW50LmF0dHIoJ3RhYmluZGV4JykpO1xyXG4gICAgICAgIHRoaXMuJGJ1dHRvbi5hdHRyKCd0YWJpbmRleCcsIHRoaXMuJGVsZW1lbnQuZGF0YSgndGFiaW5kZXgnKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuJGVsZW1lbnQuYXR0cigndGFiaW5kZXgnLCAtOTgpO1xyXG4gICAgfSxcclxuXHJcbiAgICBjbGlja0xpc3RlbmVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciB0aGF0ID0gdGhpcyxcclxuICAgICAgICAgICRkb2N1bWVudCA9ICQoZG9jdW1lbnQpO1xyXG5cclxuICAgICAgdGhpcy4kbmV3RWxlbWVudC5vbigndG91Y2hzdGFydC5kcm9wZG93bicsICcuZHJvcGRvd24tbWVudScsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAkZG9jdW1lbnQuZGF0YSgnc3BhY2VTZWxlY3QnLCBmYWxzZSk7XHJcblxyXG4gICAgICB0aGlzLiRidXR0b24ub24oJ2tleXVwJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAoLygzMikvLnRlc3QoZS5rZXlDb2RlLnRvU3RyaW5nKDEwKSkgJiYgJGRvY3VtZW50LmRhdGEoJ3NwYWNlU2VsZWN0JykpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAkZG9jdW1lbnQuZGF0YSgnc3BhY2VTZWxlY3QnLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuJGJ1dHRvbi5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhhdC5zZXRTaXplKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy4kZWxlbWVudC5vbignc2hvd24uYnMuc2VsZWN0JywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICghdGhhdC5vcHRpb25zLmxpdmVTZWFyY2ggJiYgIXRoYXQubXVsdGlwbGUpIHtcclxuICAgICAgICAgIHRoYXQuJG1lbnVJbm5lci5maW5kKCcuc2VsZWN0ZWQgYScpLmZvY3VzKCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghdGhhdC5tdWx0aXBsZSkge1xyXG4gICAgICAgICAgdmFyIHNlbGVjdGVkSW5kZXggPSB0aGF0LmxpT2JqW3RoYXQuJGVsZW1lbnRbMF0uc2VsZWN0ZWRJbmRleF07XHJcblxyXG4gICAgICAgICAgaWYgKHR5cGVvZiBzZWxlY3RlZEluZGV4ICE9PSAnbnVtYmVyJyB8fCB0aGF0Lm9wdGlvbnMuc2l6ZSA9PT0gZmFsc2UpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAvLyBzY3JvbGwgdG8gc2VsZWN0ZWQgb3B0aW9uXHJcbiAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhhdC4kbGlzLmVxKHNlbGVjdGVkSW5kZXgpWzBdLm9mZnNldFRvcCAtIHRoYXQuJG1lbnVJbm5lclswXS5vZmZzZXRUb3A7XHJcbiAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgLSB0aGF0LiRtZW51SW5uZXJbMF0ub2Zmc2V0SGVpZ2h0LzIgKyB0aGF0LnNpemVJbmZvLmxpSGVpZ2h0LzI7XHJcbiAgICAgICAgICB0aGF0LiRtZW51SW5uZXJbMF0uc2Nyb2xsVG9wID0gb2Zmc2V0O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLiRtZW51SW5uZXIub24oJ2NsaWNrJywgJ2xpIGEnLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksXHJcbiAgICAgICAgICAgIGNsaWNrZWRJbmRleCA9ICR0aGlzLnBhcmVudCgpLmRhdGEoJ29yaWdpbmFsSW5kZXgnKSxcclxuICAgICAgICAgICAgcHJldlZhbHVlID0gdGhhdC4kZWxlbWVudC52YWwoKSxcclxuICAgICAgICAgICAgcHJldkluZGV4ID0gdGhhdC4kZWxlbWVudC5wcm9wKCdzZWxlY3RlZEluZGV4JyksXHJcbiAgICAgICAgICAgIHRyaWdnZXJDaGFuZ2UgPSB0cnVlO1xyXG5cclxuICAgICAgICAvLyBEb24ndCBjbG9zZSBvbiBtdWx0aSBjaG9pY2UgbWVudVxyXG4gICAgICAgIGlmICh0aGF0Lm11bHRpcGxlICYmIHRoYXQub3B0aW9ucy5tYXhPcHRpb25zICE9PSAxKSB7XHJcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAvL0Rvbid0IHJ1biBpZiB3ZSBoYXZlIGJlZW4gZGlzYWJsZWRcclxuICAgICAgICBpZiAoIXRoYXQuaXNEaXNhYmxlZCgpICYmICEkdGhpcy5wYXJlbnQoKS5oYXNDbGFzcygnZGlzYWJsZWQnKSkge1xyXG4gICAgICAgICAgdmFyICRvcHRpb25zID0gdGhhdC4kZWxlbWVudC5maW5kKCdvcHRpb24nKSxcclxuICAgICAgICAgICAgICAkb3B0aW9uID0gJG9wdGlvbnMuZXEoY2xpY2tlZEluZGV4KSxcclxuICAgICAgICAgICAgICBzdGF0ZSA9ICRvcHRpb24ucHJvcCgnc2VsZWN0ZWQnKSxcclxuICAgICAgICAgICAgICAkb3B0Z3JvdXAgPSAkb3B0aW9uLnBhcmVudCgnb3B0Z3JvdXAnKSxcclxuICAgICAgICAgICAgICBtYXhPcHRpb25zID0gdGhhdC5vcHRpb25zLm1heE9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgbWF4T3B0aW9uc0dycCA9ICRvcHRncm91cC5kYXRhKCdtYXhPcHRpb25zJykgfHwgZmFsc2U7XHJcblxyXG4gICAgICAgICAgaWYgKCF0aGF0Lm11bHRpcGxlKSB7IC8vIERlc2VsZWN0IGFsbCBvdGhlcnMgaWYgbm90IG11bHRpIHNlbGVjdCBib3hcclxuICAgICAgICAgICAgJG9wdGlvbnMucHJvcCgnc2VsZWN0ZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICRvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgdGhhdC4kbWVudUlubmVyLmZpbmQoJy5zZWxlY3RlZCcpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpLmZpbmQoJ2EnKS5hdHRyKCdhcmlhLXNlbGVjdGVkJywgZmFsc2UpO1xyXG4gICAgICAgICAgICB0aGF0LnNldFNlbGVjdGVkKGNsaWNrZWRJbmRleCwgdHJ1ZSk7XHJcbiAgICAgICAgICB9IGVsc2UgeyAvLyBUb2dnbGUgdGhlIG9uZSB3ZSBoYXZlIGNob3NlbiBpZiB3ZSBhcmUgbXVsdGkgc2VsZWN0LlxyXG4gICAgICAgICAgICAkb3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgIXN0YXRlKTtcclxuICAgICAgICAgICAgdGhhdC5zZXRTZWxlY3RlZChjbGlja2VkSW5kZXgsICFzdGF0ZSk7XHJcbiAgICAgICAgICAgICR0aGlzLmJsdXIoKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChtYXhPcHRpb25zICE9PSBmYWxzZSB8fCBtYXhPcHRpb25zR3JwICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgIHZhciBtYXhSZWFjaGVkID0gbWF4T3B0aW9ucyA8ICRvcHRpb25zLmZpbHRlcignOnNlbGVjdGVkJykubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICBtYXhSZWFjaGVkR3JwID0gbWF4T3B0aW9uc0dycCA8ICRvcHRncm91cC5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgICAgIGlmICgobWF4T3B0aW9ucyAmJiBtYXhSZWFjaGVkKSB8fCAobWF4T3B0aW9uc0dycCAmJiBtYXhSZWFjaGVkR3JwKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1heE9wdGlvbnMgJiYgbWF4T3B0aW9ucyA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICRvcHRpb25zLnByb3AoJ3NlbGVjdGVkJywgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAkb3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgIHRoYXQuJG1lbnVJbm5lci5maW5kKCcuc2VsZWN0ZWQnKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgdGhhdC5zZXRTZWxlY3RlZChjbGlja2VkSW5kZXgsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXhPcHRpb25zR3JwICYmIG1heE9wdGlvbnNHcnAgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAkb3B0Z3JvdXAuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykucHJvcCgnc2VsZWN0ZWQnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICRvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgdmFyIG9wdGdyb3VwSUQgPSAkdGhpcy5wYXJlbnQoKS5kYXRhKCdvcHRncm91cCcpO1xyXG4gICAgICAgICAgICAgICAgICB0aGF0LiRtZW51SW5uZXIuZmluZCgnW2RhdGEtb3B0Z3JvdXA9XCInICsgb3B0Z3JvdXBJRCArICdcIl0nKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcclxuICAgICAgICAgICAgICAgICAgdGhhdC5zZXRTZWxlY3RlZChjbGlja2VkSW5kZXgsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgdmFyIG1heE9wdGlvbnNUZXh0ID0gdHlwZW9mIHRoYXQub3B0aW9ucy5tYXhPcHRpb25zVGV4dCA9PT0gJ3N0cmluZycgPyBbdGhhdC5vcHRpb25zLm1heE9wdGlvbnNUZXh0LCB0aGF0Lm9wdGlvbnMubWF4T3B0aW9uc1RleHRdIDogdGhhdC5vcHRpb25zLm1heE9wdGlvbnNUZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWF4T3B0aW9uc0FyciA9IHR5cGVvZiBtYXhPcHRpb25zVGV4dCA9PT0gJ2Z1bmN0aW9uJyA/IG1heE9wdGlvbnNUZXh0KG1heE9wdGlvbnMsIG1heE9wdGlvbnNHcnApIDogbWF4T3B0aW9uc1RleHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICBtYXhUeHQgPSBtYXhPcHRpb25zQXJyWzBdLnJlcGxhY2UoJ3tufScsIG1heE9wdGlvbnMpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWF4VHh0R3JwID0gbWF4T3B0aW9uc0FyclsxXS5yZXBsYWNlKCd7bn0nLCBtYXhPcHRpb25zR3JwKSxcclxuICAgICAgICAgICAgICAgICAgICAgICRub3RpZnkgPSAkKCc8ZGl2IGNsYXNzPVwibm90aWZ5XCI+PC9kaXY+Jyk7XHJcbiAgICAgICAgICAgICAgICAgIC8vIElmIHt2YXJ9IGlzIHNldCBpbiBhcnJheSwgcmVwbGFjZSBpdFxyXG4gICAgICAgICAgICAgICAgICAvKiogQGRlcHJlY2F0ZWQgKi9cclxuICAgICAgICAgICAgICAgICAgaWYgKG1heE9wdGlvbnNBcnJbMl0pIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXhUeHQgPSBtYXhUeHQucmVwbGFjZSgne3Zhcn0nLCBtYXhPcHRpb25zQXJyWzJdW21heE9wdGlvbnMgPiAxID8gMCA6IDFdKTtcclxuICAgICAgICAgICAgICAgICAgICBtYXhUeHRHcnAgPSBtYXhUeHRHcnAucmVwbGFjZSgne3Zhcn0nLCBtYXhPcHRpb25zQXJyWzJdW21heE9wdGlvbnNHcnAgPiAxID8gMCA6IDFdKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgJG9wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIHRoYXQuJG1lbnUuYXBwZW5kKCRub3RpZnkpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKG1heE9wdGlvbnMgJiYgbWF4UmVhY2hlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICRub3RpZnkuYXBwZW5kKCQoJzxkaXY+JyArIG1heFR4dCArICc8L2Rpdj4nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoYW5nZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuJGVsZW1lbnQudHJpZ2dlcignbWF4UmVhY2hlZC5icy5zZWxlY3QnKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgaWYgKG1heE9wdGlvbnNHcnAgJiYgbWF4UmVhY2hlZEdycCkge1xyXG4gICAgICAgICAgICAgICAgICAgICRub3RpZnkuYXBwZW5kKCQoJzxkaXY+JyArIG1heFR4dEdycCArICc8L2Rpdj4nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoYW5nZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoYXQuJGVsZW1lbnQudHJpZ2dlcignbWF4UmVhY2hlZEdycC5icy5zZWxlY3QnKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhhdC5zZXRTZWxlY3RlZChjbGlja2VkSW5kZXgsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgfSwgMTApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgJG5vdGlmeS5kZWxheSg3NTApLmZhZGVPdXQoMzAwLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKCF0aGF0Lm11bHRpcGxlIHx8ICh0aGF0Lm11bHRpcGxlICYmIHRoYXQub3B0aW9ucy5tYXhPcHRpb25zID09PSAxKSkge1xyXG4gICAgICAgICAgICB0aGF0LiRidXR0b24uZm9jdXMoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodGhhdC5vcHRpb25zLmxpdmVTZWFyY2gpIHtcclxuICAgICAgICAgICAgdGhhdC4kc2VhcmNoYm94LmZvY3VzKCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gVHJpZ2dlciBzZWxlY3QgJ2NoYW5nZSdcclxuICAgICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlKSB7XHJcbiAgICAgICAgICAgIGlmICgocHJldlZhbHVlICE9IHRoYXQuJGVsZW1lbnQudmFsKCkgJiYgdGhhdC5tdWx0aXBsZSkgfHwgKHByZXZJbmRleCAhPSB0aGF0LiRlbGVtZW50LnByb3AoJ3NlbGVjdGVkSW5kZXgnKSAmJiAhdGhhdC5tdWx0aXBsZSkpIHtcclxuICAgICAgICAgICAgICAvLyAkb3B0aW9uLnByb3AoJ3NlbGVjdGVkJykgaXMgY3VycmVudCBvcHRpb24gc3RhdGUgKHNlbGVjdGVkL3Vuc2VsZWN0ZWQpLiBzdGF0ZSBpcyBwcmV2aW91cyBvcHRpb24gc3RhdGUuXHJcbiAgICAgICAgICAgICAgdGhhdC4kZWxlbWVudFxyXG4gICAgICAgICAgICAgICAgLnRyaWdnZXIoJ2NoYW5nZWQuYnMuc2VsZWN0JywgW2NsaWNrZWRJbmRleCwgJG9wdGlvbi5wcm9wKCdzZWxlY3RlZCcpLCBzdGF0ZV0pXHJcbiAgICAgICAgICAgICAgICAudHJpZ2dlck5hdGl2ZSgnY2hhbmdlJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy4kbWVudS5vbignY2xpY2snLCAnbGkuZGlzYWJsZWQgYSwgLnBvcG92ZXItdGl0bGUsIC5wb3BvdmVyLXRpdGxlIDpub3QoLmNsb3NlKScsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgaWYgKGUuY3VycmVudFRhcmdldCA9PSB0aGlzKSB7XHJcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgaWYgKHRoYXQub3B0aW9ucy5saXZlU2VhcmNoICYmICEkKGUudGFyZ2V0KS5oYXNDbGFzcygnY2xvc2UnKSkge1xyXG4gICAgICAgICAgICB0aGF0LiRzZWFyY2hib3guZm9jdXMoKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoYXQuJGJ1dHRvbi5mb2N1cygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLiRtZW51SW5uZXIub24oJ2NsaWNrJywgJy5kaXZpZGVyLCAuZHJvcGRvd24taGVhZGVyJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBpZiAodGhhdC5vcHRpb25zLmxpdmVTZWFyY2gpIHtcclxuICAgICAgICAgIHRoYXQuJHNlYXJjaGJveC5mb2N1cygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGF0LiRidXR0b24uZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy4kbWVudS5vbignY2xpY2snLCAnLnBvcG92ZXItdGl0bGUgLmNsb3NlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoYXQuJGJ1dHRvbi5jbGljaygpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuJHNlYXJjaGJveC5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy4kbWVudS5vbignY2xpY2snLCAnLmFjdGlvbnMtYnRuJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBpZiAodGhhdC5vcHRpb25zLmxpdmVTZWFyY2gpIHtcclxuICAgICAgICAgIHRoYXQuJHNlYXJjaGJveC5mb2N1cygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGF0LiRidXR0b24uZm9jdXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cclxuICAgICAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnYnMtc2VsZWN0LWFsbCcpKSB7XHJcbiAgICAgICAgICBpZiAodGhhdC5vcHRpb25zLmhpZGVPbkNsaWNrU2VsZWN0QWxsKSB7XHJcbiAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnLmJ0bi5kcm9wZG93bi10b2dnbGUuYnRuLWRlZmF1bHQnKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpO1xyXG4gICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5ib290c3RyYXAtc2VsZWN0Lm9wZW4nKS5yZW1vdmVDbGFzcygnb3BlbicpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhhdC5zZWxlY3RBbGwoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhhdC5kZXNlbGVjdEFsbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLiRlbGVtZW50LmNoYW5nZShmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhhdC5yZW5kZXIoZmFsc2UpO1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgbGl2ZVNlYXJjaExpc3RlbmVyOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciB0aGF0ID0gdGhpcyxcclxuICAgICAgICAgICRub19yZXN1bHRzID0gJCgnPGxpIGNsYXNzPVwibm8tcmVzdWx0c1wiPjwvbGk+Jyk7XHJcblxyXG4gICAgICB0aGlzLiRidXR0b24ub24oJ2NsaWNrLmRyb3Bkb3duLmRhdGEtYXBpIHRvdWNoc3RhcnQuZHJvcGRvd24uZGF0YS1hcGknLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdGhhdC4kbWVudUlubmVyLmZpbmQoJy5hY3RpdmUnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgaWYgKCEhdGhhdC4kc2VhcmNoYm94LnZhbCgpKSB7XHJcbiAgICAgICAgICB0aGF0LiRzZWFyY2hib3gudmFsKCcnKTtcclxuICAgICAgICAgIHRoYXQuJGxpcy5ub3QoJy5pcy1oaWRkZW4nKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgICAgICBpZiAoISEkbm9fcmVzdWx0cy5wYXJlbnQoKS5sZW5ndGgpICRub19yZXN1bHRzLnJlbW92ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoYXQubXVsdGlwbGUpIHRoYXQuJG1lbnVJbm5lci5maW5kKCcuc2VsZWN0ZWQnKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICB0aGF0LiRzZWFyY2hib3guZm9jdXMoKTtcclxuICAgICAgICB9LCAxMCk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy4kc2VhcmNoYm94Lm9uKCdjbGljay5kcm9wZG93bi5kYXRhLWFwaSBmb2N1cy5kcm9wZG93bi5kYXRhLWFwaSB0b3VjaGVuZC5kcm9wZG93bi5kYXRhLWFwaScsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLiRzZWFyY2hib3gub24oJ2lucHV0IHByb3BlcnR5Y2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGlmICh0aGF0LiRzZWFyY2hib3gudmFsKCkpIHtcclxuICAgICAgICAgIHZhciAkc2VhcmNoQmFzZSA9IHRoYXQuJGxpcy5ub3QoJy5pcy1oaWRkZW4nKS5yZW1vdmVDbGFzcygnaGlkZGVuJykuY2hpbGRyZW4oJ2EnKTtcclxuICAgICAgICAgIGlmICh0aGF0Lm9wdGlvbnMubGl2ZVNlYXJjaE5vcm1hbGl6ZSkge1xyXG4gICAgICAgICAgICAkc2VhcmNoQmFzZSA9ICRzZWFyY2hCYXNlLm5vdCgnOmEnICsgdGhhdC5fc2VhcmNoU3R5bGUoKSArICcoXCInICsgbm9ybWFsaXplVG9CYXNlKHRoYXQuJHNlYXJjaGJveC52YWwoKSkgKyAnXCIpJyk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAkc2VhcmNoQmFzZSA9ICRzZWFyY2hCYXNlLm5vdCgnOicgKyB0aGF0Ll9zZWFyY2hTdHlsZSgpICsgJyhcIicgKyB0aGF0LiRzZWFyY2hib3gudmFsKCkgKyAnXCIpJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAkc2VhcmNoQmFzZS5wYXJlbnQoKS5hZGRDbGFzcygnaGlkZGVuJyk7XHJcblxyXG4gICAgICAgICAgdGhhdC4kbGlzLmZpbHRlcignLmRyb3Bkb3duLWhlYWRlcicpLmVhY2goZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgb3B0Z3JvdXAgPSAkdGhpcy5kYXRhKCdvcHRncm91cCcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoYXQuJGxpcy5maWx0ZXIoJ1tkYXRhLW9wdGdyb3VwPScgKyBvcHRncm91cCArICddJykubm90KCR0aGlzKS5ub3QoJy5oaWRkZW4nKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgICAkdGhpcy5hZGRDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgICAgdGhhdC4kbGlzLmZpbHRlcignW2RhdGEtb3B0Z3JvdXA9JyArIG9wdGdyb3VwICsgJ2Rpdl0nKS5hZGRDbGFzcygnaGlkZGVuJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHZhciAkbGlzVmlzaWJsZSA9IHRoYXQuJGxpcy5ub3QoJy5oaWRkZW4nKTtcclxuXHJcbiAgICAgICAgICAvLyBoaWRlIGRpdmlkZXIgaWYgZmlyc3Qgb3IgbGFzdCB2aXNpYmxlLCBvciBpZiBmb2xsb3dlZCBieSBhbm90aGVyIGRpdmlkZXJcclxuICAgICAgICAgICRsaXNWaXNpYmxlLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XHJcbiAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoJHRoaXMuaGFzQ2xhc3MoJ2RpdmlkZXInKSAmJiAoXHJcbiAgICAgICAgICAgICAgJHRoaXMuaW5kZXgoKSA9PT0gJGxpc1Zpc2libGUuZmlyc3QoKS5pbmRleCgpIHx8XHJcbiAgICAgICAgICAgICAgJHRoaXMuaW5kZXgoKSA9PT0gJGxpc1Zpc2libGUubGFzdCgpLmluZGV4KCkgfHxcclxuICAgICAgICAgICAgICAkbGlzVmlzaWJsZS5lcShpbmRleCArIDEpLmhhc0NsYXNzKCdkaXZpZGVyJykpKSB7XHJcbiAgICAgICAgICAgICAgJHRoaXMuYWRkQ2xhc3MoJ2hpZGRlbicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBpZiAoIXRoYXQuJGxpcy5ub3QoJy5oaWRkZW4sIC5uby1yZXN1bHRzJykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGlmICghISRub19yZXN1bHRzLnBhcmVudCgpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICRub19yZXN1bHRzLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICRub19yZXN1bHRzLmh0bWwodGhhdC5vcHRpb25zLm5vbmVSZXN1bHRzVGV4dC5yZXBsYWNlKCd7MH0nLCAnXCInICsgaHRtbEVzY2FwZSh0aGF0LiRzZWFyY2hib3gudmFsKCkpICsgJ1wiJykpLnNob3coKTtcclxuICAgICAgICAgICAgdGhhdC4kbWVudUlubmVyLmFwcGVuZCgkbm9fcmVzdWx0cyk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKCEhJG5vX3Jlc3VsdHMucGFyZW50KCkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICRub19yZXN1bHRzLnJlbW92ZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGF0LiRsaXMubm90KCcuaXMtaGlkZGVuJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpO1xyXG4gICAgICAgICAgaWYgKCEhJG5vX3Jlc3VsdHMucGFyZW50KCkubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICRub19yZXN1bHRzLnJlbW92ZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhhdC4kbGlzLmZpbHRlcignLmFjdGl2ZScpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcclxuICAgICAgICBpZiAodGhhdC4kc2VhcmNoYm94LnZhbCgpKSB0aGF0LiRsaXMubm90KCcuaGlkZGVuLCAuZGl2aWRlciwgLmRyb3Bkb3duLWhlYWRlcicpLmVxKDApLmFkZENsYXNzKCdhY3RpdmUnKS5jaGlsZHJlbignYScpLmZvY3VzKCk7XHJcbiAgICAgICAgJCh0aGlzKS5mb2N1cygpO1xyXG4gICAgICB9KTtcclxuICAgIH0sXHJcblxyXG4gICAgX3NlYXJjaFN0eWxlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciBzdHlsZXMgPSB7XHJcbiAgICAgICAgYmVnaW5zOiAnaWJlZ2lucycsXHJcbiAgICAgICAgc3RhcnRzV2l0aDogJ2liZWdpbnMnXHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXR1cm4gc3R5bGVzW3RoaXMub3B0aW9ucy5saXZlU2VhcmNoU3R5bGVdIHx8ICdpY29udGFpbnMnO1xyXG4gICAgfSxcclxuXHJcbiAgICB2YWw6IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIHRoaXMuJGVsZW1lbnQudmFsKHZhbHVlKTtcclxuICAgICAgICB0aGlzLnJlbmRlcigpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy4kZWxlbWVudDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcclxuICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuJGVsZW1lbnQudmFsKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG4gICAgfSxcclxuXHJcbiAgICBjaGFuZ2VBbGw6IGZ1bmN0aW9uIChzdGF0dXMpIHtcclxuICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKSByZXR1cm47XHJcbiAgICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAndW5kZWZpbmVkJykgc3RhdHVzID0gdHJ1ZTtcclxuXHJcbiAgICAgIHRoaXMuZmluZExpcygpO1xyXG5cclxuICAgICAgdmFyICRvcHRpb25zID0gdGhpcy4kZWxlbWVudC5maW5kKCdvcHRpb24nKSxcclxuICAgICAgICAgICRsaXNWaXNpYmxlID0gdGhpcy4kbGlzLm5vdCgnLmRpdmlkZXIsIC5kcm9wZG93bi1oZWFkZXIsIC5kaXNhYmxlZCwgLmhpZGRlbicpLFxyXG4gICAgICAgICAgbGlzVmlzTGVuID0gJGxpc1Zpc2libGUubGVuZ3RoLFxyXG4gICAgICAgICAgc2VsZWN0ZWRPcHRpb25zID0gW107XHJcblxyXG4gICAgICBpZiAoc3RhdHVzKSB7XHJcbiAgICAgICAgaWYgKCRsaXNWaXNpYmxlLmZpbHRlcignLnNlbGVjdGVkJykubGVuZ3RoID09PSAkbGlzVmlzaWJsZS5sZW5ndGgpIHJldHVybjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoJGxpc1Zpc2libGUuZmlsdGVyKCcuc2VsZWN0ZWQnKS5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgJGxpc1Zpc2libGUudG9nZ2xlQ2xhc3MoJ3NlbGVjdGVkJywgc3RhdHVzKTtcclxuXHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzVmlzTGVuOyBpKyspIHtcclxuICAgICAgICB2YXIgb3JpZ0luZGV4ID0gJGxpc1Zpc2libGVbaV0uZ2V0QXR0cmlidXRlKCdkYXRhLW9yaWdpbmFsLWluZGV4Jyk7XHJcbiAgICAgICAgc2VsZWN0ZWRPcHRpb25zW3NlbGVjdGVkT3B0aW9ucy5sZW5ndGhdID0gJG9wdGlvbnMuZXEob3JpZ0luZGV4KVswXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgJChzZWxlY3RlZE9wdGlvbnMpLnByb3AoJ3NlbGVjdGVkJywgc3RhdHVzKTtcclxuXHJcbiAgICAgIHRoaXMucmVuZGVyKGZhbHNlKTtcclxuXHJcbiAgICAgIHRoaXMudG9nZ2xlUGxhY2Vob2xkZXIoKTtcclxuXHJcbiAgICAgIHRoaXMuJGVsZW1lbnRcclxuICAgICAgICAudHJpZ2dlcignY2hhbmdlZC5icy5zZWxlY3QnKVxyXG4gICAgICAgIC50cmlnZ2VyTmF0aXZlKCdjaGFuZ2UnKTtcclxuICAgIH0sXHJcblxyXG4gICAgc2VsZWN0QWxsOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNoYW5nZUFsbCh0cnVlKTtcclxuICAgIH0sXHJcblxyXG4gICAgZGVzZWxlY3RBbGw6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlQWxsKGZhbHNlKTtcclxuICAgIH0sXHJcblxyXG4gICAgdG9nZ2xlOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7XHJcblxyXG4gICAgICBpZiAoZSkgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICAgIHRoaXMuJGJ1dHRvbi50cmlnZ2VyKCdjbGljaycpO1xyXG4gICAgfSxcclxuXHJcbiAgICBrZXlkb3duOiBmdW5jdGlvbiAoZSkge1xyXG4gICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLFxyXG4gICAgICAgICAgJHBhcmVudCA9ICR0aGlzLmlzKCdpbnB1dCcpID8gJHRoaXMucGFyZW50KCkucGFyZW50KCkgOiAkdGhpcy5wYXJlbnQoKSxcclxuICAgICAgICAgICRpdGVtcyxcclxuICAgICAgICAgIHRoYXQgPSAkcGFyZW50LmRhdGEoJ3RoaXMnKSxcclxuICAgICAgICAgIGluZGV4LFxyXG4gICAgICAgICAgbmV4dCxcclxuICAgICAgICAgIGZpcnN0LFxyXG4gICAgICAgICAgbGFzdCxcclxuICAgICAgICAgIHByZXYsXHJcbiAgICAgICAgICBuZXh0UHJldixcclxuICAgICAgICAgIHByZXZJbmRleCxcclxuICAgICAgICAgIGlzQWN0aXZlLFxyXG4gICAgICAgICAgc2VsZWN0b3IgPSAnOm5vdCguZGlzYWJsZWQsIC5oaWRkZW4sIC5kcm9wZG93bi1oZWFkZXIsIC5kaXZpZGVyKScsXHJcbiAgICAgICAgICBrZXlDb2RlTWFwID0ge1xyXG4gICAgICAgICAgICAzMjogJyAnLFxyXG4gICAgICAgICAgICA0ODogJzAnLFxyXG4gICAgICAgICAgICA0OTogJzEnLFxyXG4gICAgICAgICAgICA1MDogJzInLFxyXG4gICAgICAgICAgICA1MTogJzMnLFxyXG4gICAgICAgICAgICA1MjogJzQnLFxyXG4gICAgICAgICAgICA1MzogJzUnLFxyXG4gICAgICAgICAgICA1NDogJzYnLFxyXG4gICAgICAgICAgICA1NTogJzcnLFxyXG4gICAgICAgICAgICA1NjogJzgnLFxyXG4gICAgICAgICAgICA1NzogJzknLFxyXG4gICAgICAgICAgICA1OTogJzsnLFxyXG4gICAgICAgICAgICA2NTogJ2EnLFxyXG4gICAgICAgICAgICA2NjogJ2InLFxyXG4gICAgICAgICAgICA2NzogJ2MnLFxyXG4gICAgICAgICAgICA2ODogJ2QnLFxyXG4gICAgICAgICAgICA2OTogJ2UnLFxyXG4gICAgICAgICAgICA3MDogJ2YnLFxyXG4gICAgICAgICAgICA3MTogJ2cnLFxyXG4gICAgICAgICAgICA3MjogJ2gnLFxyXG4gICAgICAgICAgICA3MzogJ2knLFxyXG4gICAgICAgICAgICA3NDogJ2onLFxyXG4gICAgICAgICAgICA3NTogJ2snLFxyXG4gICAgICAgICAgICA3NjogJ2wnLFxyXG4gICAgICAgICAgICA3NzogJ20nLFxyXG4gICAgICAgICAgICA3ODogJ24nLFxyXG4gICAgICAgICAgICA3OTogJ28nLFxyXG4gICAgICAgICAgICA4MDogJ3AnLFxyXG4gICAgICAgICAgICA4MTogJ3EnLFxyXG4gICAgICAgICAgICA4MjogJ3InLFxyXG4gICAgICAgICAgICA4MzogJ3MnLFxyXG4gICAgICAgICAgICA4NDogJ3QnLFxyXG4gICAgICAgICAgICA4NTogJ3UnLFxyXG4gICAgICAgICAgICA4NjogJ3YnLFxyXG4gICAgICAgICAgICA4NzogJ3cnLFxyXG4gICAgICAgICAgICA4ODogJ3gnLFxyXG4gICAgICAgICAgICA4OTogJ3knLFxyXG4gICAgICAgICAgICA5MDogJ3onLFxyXG4gICAgICAgICAgICA5NjogJzAnLFxyXG4gICAgICAgICAgICA5NzogJzEnLFxyXG4gICAgICAgICAgICA5ODogJzInLFxyXG4gICAgICAgICAgICA5OTogJzMnLFxyXG4gICAgICAgICAgICAxMDA6ICc0JyxcclxuICAgICAgICAgICAgMTAxOiAnNScsXHJcbiAgICAgICAgICAgIDEwMjogJzYnLFxyXG4gICAgICAgICAgICAxMDM6ICc3JyxcclxuICAgICAgICAgICAgMTA0OiAnOCcsXHJcbiAgICAgICAgICAgIDEwNTogJzknXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgaWYgKHRoYXQub3B0aW9ucy5saXZlU2VhcmNoKSAkcGFyZW50ID0gJHRoaXMucGFyZW50KCkucGFyZW50KCk7XHJcblxyXG4gICAgICBpZiAodGhhdC5vcHRpb25zLmNvbnRhaW5lcikgJHBhcmVudCA9IHRoYXQuJG1lbnU7XHJcblxyXG4gICAgICAkaXRlbXMgPSAkKCdbcm9sZT1cImxpc3Rib3hcIl0gbGknLCAkcGFyZW50KTtcclxuXHJcbiAgICAgIGlzQWN0aXZlID0gdGhhdC4kbmV3RWxlbWVudC5oYXNDbGFzcygnb3BlbicpO1xyXG5cclxuICAgICAgaWYgKCFpc0FjdGl2ZSAmJiAoZS5rZXlDb2RlID49IDQ4ICYmIGUua2V5Q29kZSA8PSA1NyB8fCBlLmtleUNvZGUgPj0gOTYgJiYgZS5rZXlDb2RlIDw9IDEwNSB8fCBlLmtleUNvZGUgPj0gNjUgJiYgZS5rZXlDb2RlIDw9IDkwKSkge1xyXG4gICAgICAgIGlmICghdGhhdC5vcHRpb25zLmNvbnRhaW5lcikge1xyXG4gICAgICAgICAgdGhhdC5zZXRTaXplKCk7XHJcbiAgICAgICAgICB0aGF0LiRtZW51LnBhcmVudCgpLmFkZENsYXNzKCdvcGVuJyk7XHJcbiAgICAgICAgICBpc0FjdGl2ZSA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoYXQuJGJ1dHRvbi50cmlnZ2VyKCdjbGljaycpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGF0LiRzZWFyY2hib3guZm9jdXMoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGF0Lm9wdGlvbnMubGl2ZVNlYXJjaCkge1xyXG4gICAgICAgIGlmICgvKF45JHwyNykvLnRlc3QoZS5rZXlDb2RlLnRvU3RyaW5nKDEwKSkgJiYgaXNBY3RpdmUgJiYgdGhhdC4kbWVudS5maW5kKCcuYWN0aXZlJykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICB0aGF0LiRtZW51LnBhcmVudCgpLnJlbW92ZUNsYXNzKCdvcGVuJyk7XHJcbiAgICAgICAgICBpZiAodGhhdC5vcHRpb25zLmNvbnRhaW5lcikgdGhhdC4kbmV3RWxlbWVudC5yZW1vdmVDbGFzcygnb3BlbicpO1xyXG4gICAgICAgICAgdGhhdC4kYnV0dG9uLmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vICRpdGVtcyBjb250YWlucyBsaSBlbGVtZW50cyB3aGVuIGxpdmVTZWFyY2ggaXMgZW5hYmxlZFxyXG4gICAgICAgICRpdGVtcyA9ICQoJ1tyb2xlPVwibGlzdGJveFwiXSBsaScgKyBzZWxlY3RvciwgJHBhcmVudCk7XHJcbiAgICAgICAgaWYgKCEkdGhpcy52YWwoKSAmJiAhLygzOHw0MCkvLnRlc3QoZS5rZXlDb2RlLnRvU3RyaW5nKDEwKSkpIHtcclxuICAgICAgICAgIGlmICgkaXRlbXMuZmlsdGVyKCcuYWN0aXZlJykubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgICRpdGVtcyA9IHRoYXQuJG1lbnVJbm5lci5maW5kKCdsaScpO1xyXG4gICAgICAgICAgICBpZiAodGhhdC5vcHRpb25zLmxpdmVTZWFyY2hOb3JtYWxpemUpIHtcclxuICAgICAgICAgICAgICAkaXRlbXMgPSAkaXRlbXMuZmlsdGVyKCc6YScgKyB0aGF0Ll9zZWFyY2hTdHlsZSgpICsgJygnICsgbm9ybWFsaXplVG9CYXNlKGtleUNvZGVNYXBbZS5rZXlDb2RlXSkgKyAnKScpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICRpdGVtcyA9ICRpdGVtcy5maWx0ZXIoJzonICsgdGhhdC5fc2VhcmNoU3R5bGUoKSArICcoJyArIGtleUNvZGVNYXBbZS5rZXlDb2RlXSArICcpJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghJGl0ZW1zLmxlbmd0aCkgcmV0dXJuO1xyXG5cclxuICAgICAgaWYgKC8oMzh8NDApLy50ZXN0KGUua2V5Q29kZS50b1N0cmluZygxMCkpKSB7XHJcbiAgICAgICAgaW5kZXggPSAkaXRlbXMuaW5kZXgoJGl0ZW1zLmZpbmQoJ2EnKS5maWx0ZXIoJzpmb2N1cycpLnBhcmVudCgpKTtcclxuICAgICAgICBmaXJzdCA9ICRpdGVtcy5maWx0ZXIoc2VsZWN0b3IpLmZpcnN0KCkuaW5kZXgoKTtcclxuICAgICAgICBsYXN0ID0gJGl0ZW1zLmZpbHRlcihzZWxlY3RvcikubGFzdCgpLmluZGV4KCk7XHJcbiAgICAgICAgbmV4dCA9ICRpdGVtcy5lcShpbmRleCkubmV4dEFsbChzZWxlY3RvcikuZXEoMCkuaW5kZXgoKTtcclxuICAgICAgICBwcmV2ID0gJGl0ZW1zLmVxKGluZGV4KS5wcmV2QWxsKHNlbGVjdG9yKS5lcSgwKS5pbmRleCgpO1xyXG4gICAgICAgIG5leHRQcmV2ID0gJGl0ZW1zLmVxKG5leHQpLnByZXZBbGwoc2VsZWN0b3IpLmVxKDApLmluZGV4KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGF0Lm9wdGlvbnMubGl2ZVNlYXJjaCkge1xyXG4gICAgICAgICAgJGl0ZW1zLmVhY2goZnVuY3Rpb24gKGkpIHtcclxuICAgICAgICAgICAgaWYgKCEkKHRoaXMpLmhhc0NsYXNzKCdkaXNhYmxlZCcpKSB7XHJcbiAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdpbmRleCcsIGkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGluZGV4ID0gJGl0ZW1zLmluZGV4KCRpdGVtcy5maWx0ZXIoJy5hY3RpdmUnKSk7XHJcbiAgICAgICAgICBmaXJzdCA9ICRpdGVtcy5maXJzdCgpLmRhdGEoJ2luZGV4Jyk7XHJcbiAgICAgICAgICBsYXN0ID0gJGl0ZW1zLmxhc3QoKS5kYXRhKCdpbmRleCcpO1xyXG4gICAgICAgICAgbmV4dCA9ICRpdGVtcy5lcShpbmRleCkubmV4dEFsbCgpLmVxKDApLmRhdGEoJ2luZGV4Jyk7XHJcbiAgICAgICAgICBwcmV2ID0gJGl0ZW1zLmVxKGluZGV4KS5wcmV2QWxsKCkuZXEoMCkuZGF0YSgnaW5kZXgnKTtcclxuICAgICAgICAgIG5leHRQcmV2ID0gJGl0ZW1zLmVxKG5leHQpLnByZXZBbGwoKS5lcSgwKS5kYXRhKCdpbmRleCcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJldkluZGV4ID0gJHRoaXMuZGF0YSgncHJldkluZGV4Jyk7XHJcblxyXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT0gMzgpIHtcclxuICAgICAgICAgIGlmICh0aGF0Lm9wdGlvbnMubGl2ZVNlYXJjaCkgaW5kZXgtLTtcclxuICAgICAgICAgIGlmIChpbmRleCAhPSBuZXh0UHJldiAmJiBpbmRleCA+IHByZXYpIGluZGV4ID0gcHJldjtcclxuICAgICAgICAgIGlmIChpbmRleCA8IGZpcnN0KSBpbmRleCA9IGZpcnN0O1xyXG4gICAgICAgICAgaWYgKGluZGV4ID09IHByZXZJbmRleCkgaW5kZXggPSBsYXN0O1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09IDQwKSB7XHJcbiAgICAgICAgICBpZiAodGhhdC5vcHRpb25zLmxpdmVTZWFyY2gpIGluZGV4Kys7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIGluZGV4ID0gMDtcclxuICAgICAgICAgIGlmIChpbmRleCAhPSBuZXh0UHJldiAmJiBpbmRleCA8IG5leHQpIGluZGV4ID0gbmV4dDtcclxuICAgICAgICAgIGlmIChpbmRleCA+IGxhc3QpIGluZGV4ID0gbGFzdDtcclxuICAgICAgICAgIGlmIChpbmRleCA9PSBwcmV2SW5kZXgpIGluZGV4ID0gZmlyc3Q7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAkdGhpcy5kYXRhKCdwcmV2SW5kZXgnLCBpbmRleCk7XHJcblxyXG4gICAgICAgIGlmICghdGhhdC5vcHRpb25zLmxpdmVTZWFyY2gpIHtcclxuICAgICAgICAgICRpdGVtcy5lcShpbmRleCkuY2hpbGRyZW4oJ2EnKS5mb2N1cygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICBpZiAoISR0aGlzLmhhc0NsYXNzKCdkcm9wZG93bi10b2dnbGUnKSkge1xyXG4gICAgICAgICAgICAkaXRlbXMucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpLmVxKGluZGV4KS5hZGRDbGFzcygnYWN0aXZlJykuY2hpbGRyZW4oJ2EnKS5mb2N1cygpO1xyXG4gICAgICAgICAgICAkdGhpcy5mb2N1cygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH0gZWxzZSBpZiAoISR0aGlzLmlzKCdpbnB1dCcpKSB7XHJcbiAgICAgICAgdmFyIGtleUluZGV4ID0gW10sXHJcbiAgICAgICAgICAgIGNvdW50LFxyXG4gICAgICAgICAgICBwcmV2S2V5O1xyXG5cclxuICAgICAgICAkaXRlbXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICBpZiAoISQodGhpcykuaGFzQ2xhc3MoJ2Rpc2FibGVkJykpIHtcclxuICAgICAgICAgICAgaWYgKCQudHJpbSgkKHRoaXMpLmNoaWxkcmVuKCdhJykudGV4dCgpLnRvTG93ZXJDYXNlKCkpLnN1YnN0cmluZygwLCAxKSA9PSBrZXlDb2RlTWFwW2Uua2V5Q29kZV0pIHtcclxuICAgICAgICAgICAgICBrZXlJbmRleC5wdXNoKCQodGhpcykuaW5kZXgoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY291bnQgPSAkKGRvY3VtZW50KS5kYXRhKCdrZXljb3VudCcpO1xyXG4gICAgICAgIGNvdW50Kys7XHJcbiAgICAgICAgJChkb2N1bWVudCkuZGF0YSgna2V5Y291bnQnLCBjb3VudCk7XHJcblxyXG4gICAgICAgIHByZXZLZXkgPSAkLnRyaW0oJCgnOmZvY3VzJykudGV4dCgpLnRvTG93ZXJDYXNlKCkpLnN1YnN0cmluZygwLCAxKTtcclxuXHJcbiAgICAgICAgaWYgKHByZXZLZXkgIT0ga2V5Q29kZU1hcFtlLmtleUNvZGVdKSB7XHJcbiAgICAgICAgICBjb3VudCA9IDE7XHJcbiAgICAgICAgICAkKGRvY3VtZW50KS5kYXRhKCdrZXljb3VudCcsIGNvdW50KTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNvdW50ID49IGtleUluZGV4Lmxlbmd0aCkge1xyXG4gICAgICAgICAgJChkb2N1bWVudCkuZGF0YSgna2V5Y291bnQnLCAwKTtcclxuICAgICAgICAgIGlmIChjb3VudCA+IGtleUluZGV4Lmxlbmd0aCkgY291bnQgPSAxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJGl0ZW1zLmVxKGtleUluZGV4W2NvdW50IC0gMV0pLmNoaWxkcmVuKCdhJykuZm9jdXMoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gU2VsZWN0IGZvY3VzZWQgb3B0aW9uIGlmIFwiRW50ZXJcIiwgXCJTcGFjZWJhclwiIG9yIFwiVGFiXCIgKHdoZW4gc2VsZWN0T25UYWIgaXMgdHJ1ZSkgYXJlIHByZXNzZWQgaW5zaWRlIHRoZSBtZW51LlxyXG4gICAgICBpZiAoKC8oMTN8MzIpLy50ZXN0KGUua2V5Q29kZS50b1N0cmluZygxMCkpIHx8ICgvKF45JCkvLnRlc3QoZS5rZXlDb2RlLnRvU3RyaW5nKDEwKSkgJiYgdGhhdC5vcHRpb25zLnNlbGVjdE9uVGFiKSkgJiYgaXNBY3RpdmUpIHtcclxuICAgICAgICBpZiAoIS8oMzIpLy50ZXN0KGUua2V5Q29kZS50b1N0cmluZygxMCkpKSBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgaWYgKCF0aGF0Lm9wdGlvbnMubGl2ZVNlYXJjaCkge1xyXG4gICAgICAgICAgdmFyIGVsZW0gPSAkKCc6Zm9jdXMnKTtcclxuICAgICAgICAgIGVsZW0uY2xpY2soKTtcclxuICAgICAgICAgIC8vIEJyaW5nIGJhY2sgZm9jdXMgZm9yIG11bHRpc2VsZWN0c1xyXG4gICAgICAgICAgZWxlbS5mb2N1cygpO1xyXG4gICAgICAgICAgLy8gUHJldmVudCBzY3JlZW4gZnJvbSBzY3JvbGxpbmcgaWYgdGhlIHVzZXIgaGl0IHRoZSBzcGFjZWJhclxyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgLy8gRml4ZXMgc3BhY2ViYXIgc2VsZWN0aW9uIG9mIGRyb3Bkb3duIGl0ZW1zIGluIEZGICYgSUVcclxuICAgICAgICAgICQoZG9jdW1lbnQpLmRhdGEoJ3NwYWNlU2VsZWN0JywgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghLygzMikvLnRlc3QoZS5rZXlDb2RlLnRvU3RyaW5nKDEwKSkpIHtcclxuICAgICAgICAgIHRoYXQuJG1lbnVJbm5lci5maW5kKCcuYWN0aXZlIGEnKS5jbGljaygpO1xyXG4gICAgICAgICAgJHRoaXMuZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgJChkb2N1bWVudCkuZGF0YSgna2V5Y291bnQnLCAwKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCgvKF45JHwyNykvLnRlc3QoZS5rZXlDb2RlLnRvU3RyaW5nKDEwKSkgJiYgaXNBY3RpdmUgJiYgKHRoYXQubXVsdGlwbGUgfHwgdGhhdC5vcHRpb25zLmxpdmVTZWFyY2gpKSB8fCAoLygyNykvLnRlc3QoZS5rZXlDb2RlLnRvU3RyaW5nKDEwKSkgJiYgIWlzQWN0aXZlKSkge1xyXG4gICAgICAgIHRoYXQuJG1lbnUucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ29wZW4nKTtcclxuICAgICAgICBpZiAodGhhdC5vcHRpb25zLmNvbnRhaW5lcikgdGhhdC4kbmV3RWxlbWVudC5yZW1vdmVDbGFzcygnb3BlbicpO1xyXG4gICAgICAgIHRoYXQuJGJ1dHRvbi5mb2N1cygpO1xyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuICAgIG1vYmlsZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzLiRlbGVtZW50LmFkZENsYXNzKCdtb2JpbGUtZGV2aWNlJyk7XHJcbiAgICB9LFxyXG5cclxuICAgIHJlZnJlc2g6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdGhpcy4kbGlzID0gbnVsbDtcclxuICAgICAgdGhpcy5saU9iaiA9IHt9O1xyXG4gICAgICB0aGlzLnJlbG9hZExpKCk7XHJcbiAgICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgICAgIHRoaXMuY2hlY2tEaXNhYmxlZCgpO1xyXG4gICAgICB0aGlzLmxpSGVpZ2h0KHRydWUpO1xyXG4gICAgICB0aGlzLnNldFN0eWxlKCk7XHJcbiAgICAgIHRoaXMuc2V0V2lkdGgoKTtcclxuICAgICAgaWYgKHRoaXMuJGxpcykgdGhpcy4kc2VhcmNoYm94LnRyaWdnZXIoJ3Byb3BlcnR5Y2hhbmdlJyk7XHJcblxyXG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoJ3JlZnJlc2hlZC5icy5zZWxlY3QnKTtcclxuICAgIH0sXHJcblxyXG4gICAgaGlkZTogZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzLiRuZXdFbGVtZW50LmhpZGUoKTtcclxuICAgIH0sXHJcblxyXG4gICAgc2hvdzogZnVuY3Rpb24gKCkge1xyXG4gICAgICB0aGlzLiRuZXdFbGVtZW50LnNob3coKTtcclxuICAgIH0sXHJcblxyXG4gICAgcmVtb3ZlOiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHRoaXMuJG5ld0VsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9LFxyXG5cclxuICAgIGRlc3Ryb3k6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdGhpcy4kbmV3RWxlbWVudC5iZWZvcmUodGhpcy4kZWxlbWVudCkucmVtb3ZlKCk7XHJcblxyXG4gICAgICBpZiAodGhpcy4kYnNDb250YWluZXIpIHtcclxuICAgICAgICB0aGlzLiRic0NvbnRhaW5lci5yZW1vdmUoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLiRtZW51LnJlbW92ZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLiRlbGVtZW50XHJcbiAgICAgICAgLm9mZignLmJzLnNlbGVjdCcpXHJcbiAgICAgICAgLnJlbW92ZURhdGEoJ3NlbGVjdHBpY2tlcicpXHJcbiAgICAgICAgLnJlbW92ZUNsYXNzKCdicy1zZWxlY3QtaGlkZGVuIHNlbGVjdHBpY2tlcicpO1xyXG4gICAgfVxyXG4gIH07XHJcblxyXG4gIC8vIFNFTEVDVFBJQ0tFUiBQTFVHSU4gREVGSU5JVElPTlxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gIGZ1bmN0aW9uIFBsdWdpbihvcHRpb24sIGV2ZW50KSB7XHJcbiAgICAvLyBnZXQgdGhlIGFyZ3Mgb2YgdGhlIG91dGVyIGZ1bmN0aW9uLi5cclxuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xyXG4gICAgLy8gVGhlIGFyZ3VtZW50cyBvZiB0aGUgZnVuY3Rpb24gYXJlIGV4cGxpY2l0bHkgcmUtZGVmaW5lZCBmcm9tIHRoZSBhcmd1bWVudCBsaXN0LCBiZWNhdXNlIHRoZSBzaGlmdCBjYXVzZXMgdGhlbVxyXG4gICAgLy8gdG8gZ2V0IGxvc3QvY29ycnVwdGVkIGluIGFuZHJvaWQgMi4zIGFuZCBJRTkgIzcxNSAjNzc1XHJcbiAgICB2YXIgX29wdGlvbiA9IG9wdGlvbixcclxuICAgICAgICBfZXZlbnQgPSBldmVudDtcclxuICAgIFtdLnNoaWZ0LmFwcGx5KGFyZ3MpO1xyXG5cclxuICAgIHZhciB2YWx1ZTtcclxuICAgIHZhciBjaGFpbiA9IHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XHJcbiAgICAgIGlmICgkdGhpcy5pcygnc2VsZWN0JykpIHtcclxuICAgICAgICB2YXIgZGF0YSA9ICR0aGlzLmRhdGEoJ3NlbGVjdHBpY2tlcicpLFxyXG4gICAgICAgICAgICBvcHRpb25zID0gdHlwZW9mIF9vcHRpb24gPT0gJ29iamVjdCcgJiYgX29wdGlvbjtcclxuXHJcbiAgICAgICAgaWYgKCFkYXRhKSB7XHJcbiAgICAgICAgICB2YXIgY29uZmlnID0gJC5leHRlbmQoe30sIFNlbGVjdHBpY2tlci5ERUZBVUxUUywgJC5mbi5zZWxlY3RwaWNrZXIuZGVmYXVsdHMgfHwge30sICR0aGlzLmRhdGEoKSwgb3B0aW9ucyk7XHJcbiAgICAgICAgICBjb25maWcudGVtcGxhdGUgPSAkLmV4dGVuZCh7fSwgU2VsZWN0cGlja2VyLkRFRkFVTFRTLnRlbXBsYXRlLCAoJC5mbi5zZWxlY3RwaWNrZXIuZGVmYXVsdHMgPyAkLmZuLnNlbGVjdHBpY2tlci5kZWZhdWx0cy50ZW1wbGF0ZSA6IHt9KSwgJHRoaXMuZGF0YSgpLnRlbXBsYXRlLCBvcHRpb25zLnRlbXBsYXRlKTtcclxuICAgICAgICAgICR0aGlzLmRhdGEoJ3NlbGVjdHBpY2tlcicsIChkYXRhID0gbmV3IFNlbGVjdHBpY2tlcih0aGlzLCBjb25maWcsIF9ldmVudCkpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgIGZvciAodmFyIGkgaW4gb3B0aW9ucykge1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICAgIGRhdGEub3B0aW9uc1tpXSA9IG9wdGlvbnNbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgX29wdGlvbiA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgaWYgKGRhdGFbX29wdGlvbl0gaW5zdGFuY2VvZiBGdW5jdGlvbikge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGRhdGFbX29wdGlvbl0uYXBwbHkoZGF0YSwgYXJncyk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGRhdGEub3B0aW9uc1tfb3B0aW9uXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIC8vbm9pbnNwZWN0aW9uIEpTVW51c2VkQXNzaWdubWVudFxyXG4gICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gY2hhaW47XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YXIgb2xkID0gJC5mbi5zZWxlY3RwaWNrZXI7XHJcbiAgJC5mbi5zZWxlY3RwaWNrZXIgPSBQbHVnaW47XHJcbiAgJC5mbi5zZWxlY3RwaWNrZXIuQ29uc3RydWN0b3IgPSBTZWxlY3RwaWNrZXI7XHJcblxyXG4gIC8vIFNFTEVDVFBJQ0tFUiBOTyBDT05GTElDVFxyXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICQuZm4uc2VsZWN0cGlja2VyLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAkLmZuLnNlbGVjdHBpY2tlciA9IG9sZDtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH07XHJcblxyXG4gICQoZG9jdW1lbnQpXHJcbiAgICAgIC5kYXRhKCdrZXljb3VudCcsIDApXHJcbiAgICAgIC5vbigna2V5ZG93bi5icy5zZWxlY3QnLCAnLmJvb3RzdHJhcC1zZWxlY3QgW2RhdGEtdG9nZ2xlPWRyb3Bkb3duXSwgLmJvb3RzdHJhcC1zZWxlY3QgW3JvbGU9XCJsaXN0Ym94XCJdLCAuYnMtc2VhcmNoYm94IGlucHV0JywgU2VsZWN0cGlja2VyLnByb3RvdHlwZS5rZXlkb3duKVxyXG4gICAgICAub24oJ2ZvY3VzaW4ubW9kYWwnLCAnLmJvb3RzdHJhcC1zZWxlY3QgW2RhdGEtdG9nZ2xlPWRyb3Bkb3duXSwgLmJvb3RzdHJhcC1zZWxlY3QgW3JvbGU9XCJsaXN0Ym94XCJdLCAuYnMtc2VhcmNoYm94IGlucHV0JywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgLy8gU0VMRUNUUElDS0VSIERBVEEtQVBJXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09XHJcbiAgJCh3aW5kb3cpLm9uKCdsb2FkLmJzLnNlbGVjdC5kYXRhLWFwaScsIGZ1bmN0aW9uICgpIHtcclxuICAgICQoJy5zZWxlY3RwaWNrZXInKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyICRzZWxlY3RwaWNrZXIgPSAkKHRoaXMpO1xyXG4gICAgICBQbHVnaW4uY2FsbCgkc2VsZWN0cGlja2VyLCAkc2VsZWN0cGlja2VyLmRhdGEoKSk7XHJcbiAgICB9KVxyXG4gIH0pO1xyXG59KShqUXVlcnkpO1xyXG4rZnVuY3Rpb24oYSl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gYihhLGIpe2lmKCEoYSBpbnN0YW5jZW9mIGIpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIil9dmFyIGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY107ZC5lbnVtZXJhYmxlPWQuZW51bWVyYWJsZXx8ITEsZC5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gZCYmKGQud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGQua2V5LGQpfX1yZXR1cm4gZnVuY3Rpb24oYixjLGQpe3JldHVybiBjJiZhKGIucHJvdG90eXBlLGMpLGQmJmEoYixkKSxifX0oKTsoZnVuY3Rpb24oYSl7dmFyIGQ9XCJla2tvTGlnaHRib3hcIixlPWEuZm5bZF0sZj17dGl0bGU6XCJcIixmb290ZXI6XCJcIixzaG93QXJyb3dzOiEwLHdyYXBwaW5nOiEwLHR5cGU6bnVsbCxhbHdheXNTaG93Q2xvc2U6ITEsbG9hZGluZ01lc3NhZ2U6JzxkaXYgY2xhc3M9XCJla2tvLWxpZ2h0Ym94LWxvYWRlclwiPjxkaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjwvZGl2PjwvZGl2PicsbGVmdEFycm93OlwiPHNwYW4+JiMxMDA5NDs8L3NwYW4+XCIscmlnaHRBcnJvdzpcIjxzcGFuPiYjMTAwOTU7PC9zcGFuPlwiLHN0cmluZ3M6e2Nsb3NlOlwiQ2xvc2VcIixmYWlsOlwiRmFpbGVkIHRvIGxvYWQgaW1hZ2U6XCIsdHlwZTpcIkNvdWxkIG5vdCBkZXRlY3QgcmVtb3RlIHRhcmdldCB0eXBlLiBGb3JjZSB0aGUgdHlwZSB1c2luZyBkYXRhLXR5cGVcIn0sZG9jOmRvY3VtZW50LG9uU2hvdzpmdW5jdGlvbigpe30sb25TaG93bjpmdW5jdGlvbigpe30sb25IaWRlOmZ1bmN0aW9uKCl7fSxvbkhpZGRlbjpmdW5jdGlvbigpe30sb25OYXZpZ2F0ZTpmdW5jdGlvbigpe30sb25Db250ZW50TG9hZGVkOmZ1bmN0aW9uKCl7fX0sZz1mdW5jdGlvbigpe2Z1bmN0aW9uIGQoYyxlKXt2YXIgZz10aGlzO2IodGhpcyxkKSx0aGlzLl9jb25maWc9YS5leHRlbmQoe30sZixlKSx0aGlzLl8kbW9kYWxBcnJvd3M9bnVsbCx0aGlzLl9nYWxsZXJ5SW5kZXg9MCx0aGlzLl9nYWxsZXJ5TmFtZT1udWxsLHRoaXMuX3BhZGRpbmc9bnVsbCx0aGlzLl9ib3JkZXI9bnVsbCx0aGlzLl90aXRsZUlzU2hvd249ITEsdGhpcy5fZm9vdGVySXNTaG93bj0hMSx0aGlzLl93YW50ZWRXaWR0aD0wLHRoaXMuX3dhbnRlZEhlaWdodD0wLHRoaXMuX3RvdWNoc3RhcnRYPTAsdGhpcy5fdG91Y2hlbmRYPTAsdGhpcy5fbW9kYWxJZD1cImVra29MaWdodGJveC1cIitNYXRoLmZsb29yKDFlMypNYXRoLnJhbmRvbSgpKzEpLHRoaXMuXyRlbGVtZW50PWMgaW5zdGFuY2VvZiBqUXVlcnk/YzphKGMpLHRoaXMuX2lzQm9vdHN0cmFwMz0zPT1hLmZuLm1vZGFsLkNvbnN0cnVjdG9yLlZFUlNJT05bMF07dmFyIGg9JzxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+JysodGhpcy5fY29uZmlnLnRpdGxlfHxcIiZuYnNwO1wiKStcIjwvaDQ+XCIsaT0nPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIicrdGhpcy5fY29uZmlnLnN0cmluZ3MuY2xvc2UrJ1wiPjxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+PC9idXR0b24+JyxqPSc8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyJysodGhpcy5fY29uZmlnLnRpdGxlfHx0aGlzLl9jb25maWcuYWx3YXlzU2hvd0Nsb3NlP1wiXCI6XCIgaGlkZVwiKSsnXCI+JysodGhpcy5faXNCb290c3RyYXAzP2kraDpoK2kpK1wiPC9kaXY+XCIsaz0nPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlcicrKHRoaXMuX2NvbmZpZy5mb290ZXI/XCJcIjpcIiBoaWRlXCIpKydcIj4nKyh0aGlzLl9jb25maWcuZm9vdGVyfHxcIiZuYnNwO1wiKStcIjwvZGl2PlwiLGw9JzxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+PGRpdiBjbGFzcz1cImVra28tbGlnaHRib3gtY29udGFpbmVyXCI+PGRpdiBjbGFzcz1cImVra28tbGlnaHRib3gtaXRlbSBmYWRlIGluIHNob3dcIj48L2Rpdj48ZGl2IGNsYXNzPVwiZWtrby1saWdodGJveC1pdGVtIGZhZGVcIj48L2Rpdj48L2Rpdj48L2Rpdj4nLG09JzxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIiByb2xlPVwiZG9jdW1lbnRcIj48ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPicraitsK2srXCI8L2Rpdj48L2Rpdj5cIjthKHRoaXMuX2NvbmZpZy5kb2MuYm9keSkuYXBwZW5kKCc8ZGl2IGlkPVwiJyt0aGlzLl9tb2RhbElkKydcIiBjbGFzcz1cImVra28tbGlnaHRib3ggbW9kYWwgZmFkZVwiIHRhYmluZGV4PVwiLTFcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPicrbStcIjwvZGl2PlwiKSx0aGlzLl8kbW9kYWw9YShcIiNcIit0aGlzLl9tb2RhbElkLHRoaXMuX2NvbmZpZy5kb2MpLHRoaXMuXyRtb2RhbERpYWxvZz10aGlzLl8kbW9kYWwuZmluZChcIi5tb2RhbC1kaWFsb2dcIikuZmlyc3QoKSx0aGlzLl8kbW9kYWxDb250ZW50PXRoaXMuXyRtb2RhbC5maW5kKFwiLm1vZGFsLWNvbnRlbnRcIikuZmlyc3QoKSx0aGlzLl8kbW9kYWxCb2R5PXRoaXMuXyRtb2RhbC5maW5kKFwiLm1vZGFsLWJvZHlcIikuZmlyc3QoKSx0aGlzLl8kbW9kYWxIZWFkZXI9dGhpcy5fJG1vZGFsLmZpbmQoXCIubW9kYWwtaGVhZGVyXCIpLmZpcnN0KCksdGhpcy5fJG1vZGFsRm9vdGVyPXRoaXMuXyRtb2RhbC5maW5kKFwiLm1vZGFsLWZvb3RlclwiKS5maXJzdCgpLHRoaXMuXyRsaWdodGJveENvbnRhaW5lcj10aGlzLl8kbW9kYWxCb2R5LmZpbmQoXCIuZWtrby1saWdodGJveC1jb250YWluZXJcIikuZmlyc3QoKSx0aGlzLl8kbGlnaHRib3hCb2R5T25lPXRoaXMuXyRsaWdodGJveENvbnRhaW5lci5maW5kKFwiPiBkaXY6Zmlyc3QtY2hpbGRcIikuZmlyc3QoKSx0aGlzLl8kbGlnaHRib3hCb2R5VHdvPXRoaXMuXyRsaWdodGJveENvbnRhaW5lci5maW5kKFwiPiBkaXY6bGFzdC1jaGlsZFwiKS5maXJzdCgpLHRoaXMuX2JvcmRlcj10aGlzLl9jYWxjdWxhdGVCb3JkZXJzKCksdGhpcy5fcGFkZGluZz10aGlzLl9jYWxjdWxhdGVQYWRkaW5nKCksdGhpcy5fZ2FsbGVyeU5hbWU9dGhpcy5fJGVsZW1lbnQuZGF0YShcImdhbGxlcnlcIiksdGhpcy5fZ2FsbGVyeU5hbWUmJih0aGlzLl8kZ2FsbGVyeUl0ZW1zPWEoZG9jdW1lbnQuYm9keSkuZmluZCgnKltkYXRhLWdhbGxlcnk9XCInK3RoaXMuX2dhbGxlcnlOYW1lKydcIl0nKSx0aGlzLl9nYWxsZXJ5SW5kZXg9dGhpcy5fJGdhbGxlcnlJdGVtcy5pbmRleCh0aGlzLl8kZWxlbWVudCksYShkb2N1bWVudCkub24oXCJrZXlkb3duLmVra29MaWdodGJveFwiLHRoaXMuX25hdmlnYXRpb25hbEJpbmRlci5iaW5kKHRoaXMpKSx0aGlzLl9jb25maWcuc2hvd0Fycm93cyYmdGhpcy5fJGdhbGxlcnlJdGVtcy5sZW5ndGg+MSYmKHRoaXMuXyRsaWdodGJveENvbnRhaW5lci5hcHBlbmQoJzxkaXYgY2xhc3M9XCJla2tvLWxpZ2h0Ym94LW5hdi1vdmVybGF5XCI+PGEgaHJlZj1cIiNcIj4nK3RoaXMuX2NvbmZpZy5sZWZ0QXJyb3crJzwvYT48YSBocmVmPVwiI1wiPicrdGhpcy5fY29uZmlnLnJpZ2h0QXJyb3crXCI8L2E+PC9kaXY+XCIpLHRoaXMuXyRtb2RhbEFycm93cz10aGlzLl8kbGlnaHRib3hDb250YWluZXIuZmluZChcImRpdi5la2tvLWxpZ2h0Ym94LW5hdi1vdmVybGF5XCIpLmZpcnN0KCksdGhpcy5fJGxpZ2h0Ym94Q29udGFpbmVyLm9uKFwiY2xpY2tcIixcImE6Zmlyc3QtY2hpbGRcIixmdW5jdGlvbihhKXtyZXR1cm4gYS5wcmV2ZW50RGVmYXVsdCgpLGcubmF2aWdhdGVMZWZ0KCl9KSx0aGlzLl8kbGlnaHRib3hDb250YWluZXIub24oXCJjbGlja1wiLFwiYTpsYXN0LWNoaWxkXCIsZnVuY3Rpb24oYSl7cmV0dXJuIGEucHJldmVudERlZmF1bHQoKSxnLm5hdmlnYXRlUmlnaHQoKX0pLHRoaXMudXBkYXRlTmF2aWdhdGlvbigpKSksdGhpcy5fJG1vZGFsLm9uKFwic2hvdy5icy5tb2RhbFwiLHRoaXMuX2NvbmZpZy5vblNob3cuYmluZCh0aGlzKSkub24oXCJzaG93bi5icy5tb2RhbFwiLGZ1bmN0aW9uKCl7cmV0dXJuIGcuX3RvZ2dsZUxvYWRpbmcoITApLGcuX2hhbmRsZSgpLGcuX2NvbmZpZy5vblNob3duLmNhbGwoZyl9KS5vbihcImhpZGUuYnMubW9kYWxcIix0aGlzLl9jb25maWcub25IaWRlLmJpbmQodGhpcykpLm9uKFwiaGlkZGVuLmJzLm1vZGFsXCIsZnVuY3Rpb24oKXtyZXR1cm4gZy5fZ2FsbGVyeU5hbWUmJihhKGRvY3VtZW50KS5vZmYoXCJrZXlkb3duLmVra29MaWdodGJveFwiKSxhKHdpbmRvdykub2ZmKFwicmVzaXplLmVra29MaWdodGJveFwiKSksZy5fJG1vZGFsLnJlbW92ZSgpLGcuX2NvbmZpZy5vbkhpZGRlbi5jYWxsKGcpfSkubW9kYWwodGhpcy5fY29uZmlnKSxhKHdpbmRvdykub24oXCJyZXNpemUuZWtrb0xpZ2h0Ym94XCIsZnVuY3Rpb24oKXtnLl9yZXNpemUoZy5fd2FudGVkV2lkdGgsZy5fd2FudGVkSGVpZ2h0KX0pLHRoaXMuXyRsaWdodGJveENvbnRhaW5lci5vbihcInRvdWNoc3RhcnRcIixmdW5jdGlvbigpe2cuX3RvdWNoc3RhcnRYPWV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLnNjcmVlblh9KS5vbihcInRvdWNoZW5kXCIsZnVuY3Rpb24oKXtnLl90b3VjaGVuZFg9ZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uc2NyZWVuWCxnLl9zd2lwZUdlc3VyZSgpfSl9cmV0dXJuIGMoZCxudWxsLFt7a2V5OlwiRGVmYXVsdFwiLGdldDpmdW5jdGlvbigpe3JldHVybiBmfX1dKSxjKGQsW3trZXk6XCJlbGVtZW50XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fJGVsZW1lbnR9fSx7a2V5OlwibW9kYWxcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8kbW9kYWx9fSx7a2V5OlwibmF2aWdhdGVUb1wiLHZhbHVlOmZ1bmN0aW9uKGIpe3JldHVybiBiPDB8fGI+dGhpcy5fJGdhbGxlcnlJdGVtcy5sZW5ndGgtMT90aGlzOih0aGlzLl9nYWxsZXJ5SW5kZXg9Yix0aGlzLnVwZGF0ZU5hdmlnYXRpb24oKSx0aGlzLl8kZWxlbWVudD1hKHRoaXMuXyRnYWxsZXJ5SXRlbXMuZ2V0KHRoaXMuX2dhbGxlcnlJbmRleCkpLHZvaWQgdGhpcy5faGFuZGxlKCkpfX0se2tleTpcIm5hdmlnYXRlTGVmdFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5fJGdhbGxlcnlJdGVtcyYmMSE9PXRoaXMuXyRnYWxsZXJ5SXRlbXMubGVuZ3RoKXtpZigwPT09dGhpcy5fZ2FsbGVyeUluZGV4KXtpZighdGhpcy5fY29uZmlnLndyYXBwaW5nKXJldHVybjt0aGlzLl9nYWxsZXJ5SW5kZXg9dGhpcy5fJGdhbGxlcnlJdGVtcy5sZW5ndGgtMX1lbHNlIHRoaXMuX2dhbGxlcnlJbmRleC0tO3JldHVybiB0aGlzLl9jb25maWcub25OYXZpZ2F0ZS5jYWxsKHRoaXMsXCJsZWZ0XCIsdGhpcy5fZ2FsbGVyeUluZGV4KSx0aGlzLm5hdmlnYXRlVG8odGhpcy5fZ2FsbGVyeUluZGV4KX19fSx7a2V5OlwibmF2aWdhdGVSaWdodFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5fJGdhbGxlcnlJdGVtcyYmMSE9PXRoaXMuXyRnYWxsZXJ5SXRlbXMubGVuZ3RoKXtpZih0aGlzLl9nYWxsZXJ5SW5kZXg9PT10aGlzLl8kZ2FsbGVyeUl0ZW1zLmxlbmd0aC0xKXtpZighdGhpcy5fY29uZmlnLndyYXBwaW5nKXJldHVybjt0aGlzLl9nYWxsZXJ5SW5kZXg9MH1lbHNlIHRoaXMuX2dhbGxlcnlJbmRleCsrO3JldHVybiB0aGlzLl9jb25maWcub25OYXZpZ2F0ZS5jYWxsKHRoaXMsXCJyaWdodFwiLHRoaXMuX2dhbGxlcnlJbmRleCksdGhpcy5uYXZpZ2F0ZVRvKHRoaXMuX2dhbGxlcnlJbmRleCl9fX0se2tleTpcInVwZGF0ZU5hdmlnYXRpb25cIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLl9jb25maWcud3JhcHBpbmcpe3ZhciBhPXRoaXMuXyRsaWdodGJveENvbnRhaW5lci5maW5kKFwiZGl2LmVra28tbGlnaHRib3gtbmF2LW92ZXJsYXlcIik7MD09PXRoaXMuX2dhbGxlcnlJbmRleD9hLmZpbmQoXCJhOmZpcnN0LWNoaWxkXCIpLmFkZENsYXNzKFwiZGlzYWJsZWRcIik6YS5maW5kKFwiYTpmaXJzdC1jaGlsZFwiKS5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpLHRoaXMuX2dhbGxlcnlJbmRleD09PXRoaXMuXyRnYWxsZXJ5SXRlbXMubGVuZ3RoLTE/YS5maW5kKFwiYTpsYXN0LWNoaWxkXCIpLmFkZENsYXNzKFwiZGlzYWJsZWRcIik6YS5maW5kKFwiYTpsYXN0LWNoaWxkXCIpLnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIil9fX0se2tleTpcImNsb3NlXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fJG1vZGFsLm1vZGFsKFwiaGlkZVwiKX19LHtrZXk6XCJfbmF2aWdhdGlvbmFsQmluZGVyXCIsdmFsdWU6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9YXx8d2luZG93LmV2ZW50LDM5PT09YS5rZXlDb2RlP3RoaXMubmF2aWdhdGVSaWdodCgpOjM3PT09YS5rZXlDb2RlP3RoaXMubmF2aWdhdGVMZWZ0KCk6dm9pZCAwfX0se2tleTpcIl9kZXRlY3RSZW1vdGVUeXBlXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj1ifHwhMSwhYiYmdGhpcy5faXNJbWFnZShhKSYmKGI9XCJpbWFnZVwiKSwhYiYmdGhpcy5fZ2V0WW91dHViZUlkKGEpJiYoYj1cInlvdXR1YmVcIiksIWImJnRoaXMuX2dldFZpbWVvSWQoYSkmJihiPVwidmltZW9cIiksIWImJnRoaXMuX2dldEluc3RhZ3JhbUlkKGEpJiYoYj1cImluc3RhZ3JhbVwiKSwoIWJ8fFtcImltYWdlXCIsXCJ5b3V0dWJlXCIsXCJ2aW1lb1wiLFwiaW5zdGFncmFtXCIsXCJ2aWRlb1wiLFwidXJsXCJdLmluZGV4T2YoYik8MCkmJihiPVwidXJsXCIpLGJ9fSx7a2V5OlwiX2lzSW1hZ2VcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5tYXRjaCgvKF5kYXRhOmltYWdlXFwvLiosKXwoXFwuKGpwKGV8Z3xlZyl8Z2lmfHBuZ3xibXB8d2VicHxzdmcpKChcXD98IykuKik/JCkvaSl9fSx7a2V5OlwiX2NvbnRhaW5lclRvVXNlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLGI9dGhpcy5fJGxpZ2h0Ym94Qm9keVR3byxjPXRoaXMuXyRsaWdodGJveEJvZHlPbmU7cmV0dXJuIHRoaXMuXyRsaWdodGJveEJvZHlUd28uaGFzQ2xhc3MoXCJpblwiKSYmKGI9dGhpcy5fJGxpZ2h0Ym94Qm9keU9uZSxjPXRoaXMuXyRsaWdodGJveEJvZHlUd28pLGMucmVtb3ZlQ2xhc3MoXCJpbiBzaG93XCIpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXthLl8kbGlnaHRib3hCb2R5VHdvLmhhc0NsYXNzKFwiaW5cIil8fGEuXyRsaWdodGJveEJvZHlUd28uZW1wdHkoKSxhLl8kbGlnaHRib3hCb2R5T25lLmhhc0NsYXNzKFwiaW5cIil8fGEuXyRsaWdodGJveEJvZHlPbmUuZW1wdHkoKX0sNTAwKSxiLmFkZENsYXNzKFwiaW4gc2hvd1wiKSxifX0se2tleTpcIl9oYW5kbGVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2NvbnRhaW5lclRvVXNlKCk7dGhpcy5fdXBkYXRlVGl0bGVBbmRGb290ZXIoKTt2YXIgYj10aGlzLl8kZWxlbWVudC5hdHRyKFwiZGF0YS1yZW1vdGVcIil8fHRoaXMuXyRlbGVtZW50LmF0dHIoXCJocmVmXCIpLGM9dGhpcy5fZGV0ZWN0UmVtb3RlVHlwZShiLHRoaXMuXyRlbGVtZW50LmF0dHIoXCJkYXRhLXR5cGVcIil8fCExKTtpZihbXCJpbWFnZVwiLFwieW91dHViZVwiLFwidmltZW9cIixcImluc3RhZ3JhbVwiLFwidmlkZW9cIixcInVybFwiXS5pbmRleE9mKGMpPDApcmV0dXJuIHRoaXMuX2Vycm9yKHRoaXMuX2NvbmZpZy5zdHJpbmdzLnR5cGUpO3N3aXRjaChjKXtjYXNlXCJpbWFnZVwiOnRoaXMuX3ByZWxvYWRJbWFnZShiLGEpLHRoaXMuX3ByZWxvYWRJbWFnZUJ5SW5kZXgodGhpcy5fZ2FsbGVyeUluZGV4LDMpO2JyZWFrO2Nhc2VcInlvdXR1YmVcIjp0aGlzLl9zaG93WW91dHViZVZpZGVvKGIsYSk7YnJlYWs7Y2FzZVwidmltZW9cIjp0aGlzLl9zaG93VmltZW9WaWRlbyh0aGlzLl9nZXRWaW1lb0lkKGIpLGEpO2JyZWFrO2Nhc2VcImluc3RhZ3JhbVwiOnRoaXMuX3Nob3dJbnN0YWdyYW1WaWRlbyh0aGlzLl9nZXRJbnN0YWdyYW1JZChiKSxhKTticmVhaztjYXNlXCJ2aWRlb1wiOnRoaXMuX3Nob3dIdG1sNVZpZGVvKGIsYSk7YnJlYWs7ZGVmYXVsdDp0aGlzLl9sb2FkUmVtb3RlQ29udGVudChiLGEpfXJldHVybiB0aGlzfX0se2tleTpcIl9nZXRZb3V0dWJlSWRcIix2YWx1ZTpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt2YXIgYj1hLm1hdGNoKC9eLiooeW91dHUuYmVcXC98dlxcL3x1XFwvXFx3XFwvfGVtYmVkXFwvfHdhdGNoXFw/dj18XFwmdj0pKFteI1xcJlxcP10qKS4qLyk7cmV0dXJuISghYnx8MTEhPT1iWzJdLmxlbmd0aCkmJmJbMl19fSx7a2V5OlwiX2dldFZpbWVvSWRcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4hIShhJiZhLmluZGV4T2YoXCJ2aW1lb1wiKT4wKSYmYX19LHtrZXk6XCJfZ2V0SW5zdGFncmFtSWRcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4hIShhJiZhLmluZGV4T2YoXCJpbnN0YWdyYW1cIik+MCkmJmF9fSx7a2V5OlwiX3RvZ2dsZUxvYWRpbmdcIix2YWx1ZTpmdW5jdGlvbihiKXtyZXR1cm4gYj1ifHwhMSxiPyh0aGlzLl8kbW9kYWxEaWFsb2cuY3NzKFwiZGlzcGxheVwiLFwibm9uZVwiKSx0aGlzLl8kbW9kYWwucmVtb3ZlQ2xhc3MoXCJpbiBzaG93XCIpLGEoXCIubW9kYWwtYmFja2Ryb3BcIikuYXBwZW5kKHRoaXMuX2NvbmZpZy5sb2FkaW5nTWVzc2FnZSkpOih0aGlzLl8kbW9kYWxEaWFsb2cuY3NzKFwiZGlzcGxheVwiLFwiYmxvY2tcIiksdGhpcy5fJG1vZGFsLmFkZENsYXNzKFwiaW4gc2hvd1wiKSxhKFwiLm1vZGFsLWJhY2tkcm9wXCIpLmZpbmQoXCIuZWtrby1saWdodGJveC1sb2FkZXJcIikucmVtb3ZlKCkpLHRoaXN9fSx7a2V5OlwiX2NhbGN1bGF0ZUJvcmRlcnNcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0b3A6dGhpcy5fdG90YWxDc3NCeUF0dHJpYnV0ZShcImJvcmRlci10b3Atd2lkdGhcIikscmlnaHQ6dGhpcy5fdG90YWxDc3NCeUF0dHJpYnV0ZShcImJvcmRlci1yaWdodC13aWR0aFwiKSxib3R0b206dGhpcy5fdG90YWxDc3NCeUF0dHJpYnV0ZShcImJvcmRlci1ib3R0b20td2lkdGhcIiksbGVmdDp0aGlzLl90b3RhbENzc0J5QXR0cmlidXRlKFwiYm9yZGVyLWxlZnQtd2lkdGhcIil9fX0se2tleTpcIl9jYWxjdWxhdGVQYWRkaW5nXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dG9wOnRoaXMuX3RvdGFsQ3NzQnlBdHRyaWJ1dGUoXCJwYWRkaW5nLXRvcFwiKSxyaWdodDp0aGlzLl90b3RhbENzc0J5QXR0cmlidXRlKFwicGFkZGluZy1yaWdodFwiKSxib3R0b206dGhpcy5fdG90YWxDc3NCeUF0dHJpYnV0ZShcInBhZGRpbmctYm90dG9tXCIpLGxlZnQ6dGhpcy5fdG90YWxDc3NCeUF0dHJpYnV0ZShcInBhZGRpbmctbGVmdFwiKX19fSx7a2V5OlwiX3RvdGFsQ3NzQnlBdHRyaWJ1dGVcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gcGFyc2VJbnQodGhpcy5fJG1vZGFsRGlhbG9nLmNzcyhhKSwxMCkrcGFyc2VJbnQodGhpcy5fJG1vZGFsQ29udGVudC5jc3MoYSksMTApK3BhcnNlSW50KHRoaXMuXyRtb2RhbEJvZHkuY3NzKGEpLDEwKX19LHtrZXk6XCJfdXBkYXRlVGl0bGVBbmRGb290ZXJcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuXyRlbGVtZW50LmRhdGEoXCJ0aXRsZVwiKXx8XCJcIixiPXRoaXMuXyRlbGVtZW50LmRhdGEoXCJmb290ZXJcIil8fFwiXCI7cmV0dXJuIHRoaXMuX3RpdGxlSXNTaG93bj0hMSxhfHx0aGlzLl9jb25maWcuYWx3YXlzU2hvd0Nsb3NlPyh0aGlzLl90aXRsZUlzU2hvd249ITAsdGhpcy5fJG1vZGFsSGVhZGVyLmNzcyhcImRpc3BsYXlcIixcIlwiKS5maW5kKFwiLm1vZGFsLXRpdGxlXCIpLmh0bWwoYXx8XCImbmJzcDtcIikpOnRoaXMuXyRtb2RhbEhlYWRlci5jc3MoXCJkaXNwbGF5XCIsXCJub25lXCIpLHRoaXMuX2Zvb3RlcklzU2hvd249ITEsYj8odGhpcy5fZm9vdGVySXNTaG93bj0hMCx0aGlzLl8kbW9kYWxGb290ZXIuY3NzKFwiZGlzcGxheVwiLFwiXCIpLmh0bWwoYikpOnRoaXMuXyRtb2RhbEZvb3Rlci5jc3MoXCJkaXNwbGF5XCIsXCJub25lXCIpLHRoaXN9fSx7a2V5OlwiX3Nob3dZb3V0dWJlVmlkZW9cIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX2dldFlvdXR1YmVJZChhKSxkPWEuaW5kZXhPZihcIiZcIik+MD9hLnN1YnN0cihhLmluZGV4T2YoXCImXCIpKTpcIlwiLGU9dGhpcy5fJGVsZW1lbnQuZGF0YShcIndpZHRoXCIpfHw1NjAsZj10aGlzLl8kZWxlbWVudC5kYXRhKFwiaGVpZ2h0XCIpfHxlLyg1NjAvMzE1KTtyZXR1cm4gdGhpcy5fc2hvd1ZpZGVvSWZyYW1lKFwiLy93d3cueW91dHViZS5jb20vZW1iZWQvXCIrYytcIj9iYWRnZT0wJmF1dG9wbGF5PTEmaHRtbDU9MVwiK2QsZSxmLGIpfX0se2tleTpcIl9zaG93VmltZW9WaWRlb1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fJGVsZW1lbnQuZGF0YShcIndpZHRoXCIpfHw1MDAsZD10aGlzLl8kZWxlbWVudC5kYXRhKFwiaGVpZ2h0XCIpfHxjLyg1NjAvMzE1KTtyZXR1cm4gdGhpcy5fc2hvd1ZpZGVvSWZyYW1lKGErXCI/YXV0b3BsYXk9MVwiLGMsZCxiKX19LHtrZXk6XCJfc2hvd0luc3RhZ3JhbVZpZGVvXCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl8kZWxlbWVudC5kYXRhKFwid2lkdGhcIil8fDYxMixkPWMrODA7cmV0dXJuIGE9XCIvXCIhPT1hLnN1YnN0cigtMSk/YStcIi9cIjphLGIuaHRtbCgnPGlmcmFtZSB3aWR0aD1cIicrYysnXCIgaGVpZ2h0PVwiJytkKydcIiBzcmM9XCInK2ErJ2VtYmVkL1wiIGZyYW1lYm9yZGVyPVwiMFwiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4nKSx0aGlzLl9yZXNpemUoYyxkKSx0aGlzLl9jb25maWcub25Db250ZW50TG9hZGVkLmNhbGwodGhpcyksdGhpcy5fJG1vZGFsQXJyb3dzJiZ0aGlzLl8kbW9kYWxBcnJvd3MuY3NzKFwiZGlzcGxheVwiLFwibm9uZVwiKSx0aGlzLl90b2dnbGVMb2FkaW5nKCExKSx0aGlzfX0se2tleTpcIl9zaG93VmlkZW9JZnJhbWVcIix2YWx1ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYz1jfHxiLGQuaHRtbCgnPGRpdiBjbGFzcz1cImVtYmVkLXJlc3BvbnNpdmUgZW1iZWQtcmVzcG9uc2l2ZS0xNmJ5OVwiPjxpZnJhbWUgd2lkdGg9XCInK2IrJ1wiIGhlaWdodD1cIicrYysnXCIgc3JjPVwiJythKydcIiBmcmFtZWJvcmRlcj1cIjBcIiBhbGxvd2Z1bGxzY3JlZW4gY2xhc3M9XCJlbWJlZC1yZXNwb25zaXZlLWl0ZW1cIj48L2lmcmFtZT48L2Rpdj4nKSx0aGlzLl9yZXNpemUoYixjKSx0aGlzLl9jb25maWcub25Db250ZW50TG9hZGVkLmNhbGwodGhpcyksdGhpcy5fJG1vZGFsQXJyb3dzJiZ0aGlzLl8kbW9kYWxBcnJvd3MuY3NzKFwiZGlzcGxheVwiLFwibm9uZVwiKSx0aGlzLl90b2dnbGVMb2FkaW5nKCExKSx0aGlzfX0se2tleTpcIl9zaG93SHRtbDVWaWRlb1wiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fJGVsZW1lbnQuZGF0YShcIndpZHRoXCIpfHw1NjAsZD10aGlzLl8kZWxlbWVudC5kYXRhKFwiaGVpZ2h0XCIpfHxjLyg1NjAvMzE1KTtyZXR1cm4gYi5odG1sKCc8ZGl2IGNsYXNzPVwiZW1iZWQtcmVzcG9uc2l2ZSBlbWJlZC1yZXNwb25zaXZlLTE2Ynk5XCI+PHZpZGVvIHdpZHRoPVwiJytjKydcIiBoZWlnaHQ9XCInK2QrJ1wiIHNyYz1cIicrYSsnXCIgcHJlbG9hZD1cImF1dG9cIiBhdXRvcGxheSBjb250cm9scyBjbGFzcz1cImVtYmVkLXJlc3BvbnNpdmUtaXRlbVwiPjwvdmlkZW8+PC9kaXY+JyksdGhpcy5fcmVzaXplKGMsZCksdGhpcy5fY29uZmlnLm9uQ29udGVudExvYWRlZC5jYWxsKHRoaXMpLHRoaXMuXyRtb2RhbEFycm93cyYmdGhpcy5fJG1vZGFsQXJyb3dzLmNzcyhcImRpc3BsYXlcIixcIm5vbmVcIiksdGhpcy5fdG9nZ2xlTG9hZGluZyghMSksdGhpc319LHtrZXk6XCJfbG9hZFJlbW90ZUNvbnRlbnRcIix2YWx1ZTpmdW5jdGlvbihiLGMpe3ZhciBkPXRoaXMsZT10aGlzLl8kZWxlbWVudC5kYXRhKFwid2lkdGhcIil8fDU2MCxmPXRoaXMuXyRlbGVtZW50LmRhdGEoXCJoZWlnaHRcIil8fDU2MCxnPXRoaXMuXyRlbGVtZW50LmRhdGEoXCJkaXNhYmxlRXh0ZXJuYWxDaGVja1wiKXx8ITE7cmV0dXJuIHRoaXMuX3RvZ2dsZUxvYWRpbmcoITEpLGd8fHRoaXMuX2lzRXh0ZXJuYWwoYik/KGMuaHRtbCgnPGlmcmFtZSBzcmM9XCInK2IrJ1wiIGZyYW1lYm9yZGVyPVwiMFwiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4nKSx0aGlzLl9jb25maWcub25Db250ZW50TG9hZGVkLmNhbGwodGhpcykpOmMubG9hZChiLGEucHJveHkoZnVuY3Rpb24oKXtyZXR1cm4gZC5fJGVsZW1lbnQudHJpZ2dlcihcImxvYWRlZC5icy5tb2RhbFwiKX0pKSx0aGlzLl8kbW9kYWxBcnJvd3MmJnRoaXMuXyRtb2RhbEFycm93cy5jc3MoXCJkaXNwbGF5XCIsXCJub25lXCIpLHRoaXMuX3Jlc2l6ZShlLGYpLHRoaXN9fSx7a2V5OlwiX2lzRXh0ZXJuYWxcIix2YWx1ZTpmdW5jdGlvbihhKXt2YXIgYj1hLm1hdGNoKC9eKFteOlxcLz8jXSs6KT8oPzpcXC9cXC8oW15cXC8/I10qKSk/KFtePyNdKyk/KFxcP1teI10qKT8oIy4qKT8vKTtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgYlsxXSYmYlsxXS5sZW5ndGg+MCYmYlsxXS50b0xvd2VyQ2FzZSgpIT09bG9jYXRpb24ucHJvdG9jb2x8fFwic3RyaW5nXCI9PXR5cGVvZiBiWzJdJiZiWzJdLmxlbmd0aD4wJiZiWzJdLnJlcGxhY2UobmV3IFJlZ0V4cChcIjooXCIre1wiaHR0cDpcIjo4MCxcImh0dHBzOlwiOjQ0M31bbG9jYXRpb24ucHJvdG9jb2xdK1wiKT8kXCIpLFwiXCIpIT09bG9jYXRpb24uaG9zdH19LHtrZXk6XCJfZXJyb3JcIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gY29uc29sZS5lcnJvcihhKSx0aGlzLl9jb250YWluZXJUb1VzZSgpLmh0bWwoYSksdGhpcy5fcmVzaXplKDMwMCwzMDApLHRoaXN9fSx7a2V5OlwiX3ByZWxvYWRJbWFnZUJ5SW5kZXhcIix2YWx1ZTpmdW5jdGlvbihiLGMpe2lmKHRoaXMuXyRnYWxsZXJ5SXRlbXMpe3ZhciBkPWEodGhpcy5fJGdhbGxlcnlJdGVtcy5nZXQoYiksITEpO2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBkKXt2YXIgZT1kLmF0dHIoXCJkYXRhLXJlbW90ZVwiKXx8ZC5hdHRyKFwiaHJlZlwiKTtyZXR1cm4oXCJpbWFnZVwiPT09ZC5hdHRyKFwiZGF0YS10eXBlXCIpfHx0aGlzLl9pc0ltYWdlKGUpKSYmdGhpcy5fcHJlbG9hZEltYWdlKGUsITEpLGM+MD90aGlzLl9wcmVsb2FkSW1hZ2VCeUluZGV4KGIrMSxjLTEpOnZvaWQgMH19fX0se2tleTpcIl9wcmVsb2FkSW1hZ2VcIix2YWx1ZTpmdW5jdGlvbihiLGMpe3ZhciBkPXRoaXM7Yz1jfHwhMTt2YXIgZT1uZXcgSW1hZ2U7cmV0dXJuIGMmJiFmdW5jdGlvbigpe3ZhciBmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtjLmFwcGVuZChkLl9jb25maWcubG9hZGluZ01lc3NhZ2UpfSwyMDApO2Uub25sb2FkPWZ1bmN0aW9uKCl7ZiYmY2xlYXJUaW1lb3V0KGYpLGY9bnVsbDt2YXIgYj1hKFwiPGltZyAvPlwiKTtyZXR1cm4gYi5hdHRyKFwic3JjXCIsZS5zcmMpLGIuYWRkQ2xhc3MoXCJpbWctZmx1aWRcIiksYi5jc3MoXCJ3aWR0aFwiLFwiMTAwJVwiKSxjLmh0bWwoYiksZC5fJG1vZGFsQXJyb3dzJiZkLl8kbW9kYWxBcnJvd3MuY3NzKFwiZGlzcGxheVwiLFwiXCIpLGQuX3Jlc2l6ZShlLndpZHRoLGUuaGVpZ2h0KSxkLl90b2dnbGVMb2FkaW5nKCExKSxkLl9jb25maWcub25Db250ZW50TG9hZGVkLmNhbGwoZCl9LGUub25lcnJvcj1mdW5jdGlvbigpe3JldHVybiBkLl90b2dnbGVMb2FkaW5nKCExKSxkLl9lcnJvcihkLl9jb25maWcuc3RyaW5ncy5mYWlsKyhcIiAgXCIrYikpfX0oKSxlLnNyYz1iLGV9fSx7a2V5OlwiX3N3aXBlR2VzdXJlXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdG91Y2hlbmRYPHRoaXMuX3RvdWNoc3RhcnRYP3RoaXMubmF2aWdhdGVSaWdodCgpOnRoaXMuX3RvdWNoZW5kWD50aGlzLl90b3VjaHN0YXJ0WD90aGlzLm5hdmlnYXRlTGVmdCgpOnZvaWQgMH19LHtrZXk6XCJfcmVzaXplXCIsdmFsdWU6ZnVuY3Rpb24oYixjKXtjPWN8fGIsdGhpcy5fd2FudGVkV2lkdGg9Yix0aGlzLl93YW50ZWRIZWlnaHQ9Yzt2YXIgZD10aGlzLl9wYWRkaW5nLmxlZnQrdGhpcy5fcGFkZGluZy5yaWdodCt0aGlzLl9ib3JkZXIubGVmdCt0aGlzLl9ib3JkZXIucmlnaHQsZT1NYXRoLm1pbihiK2QsdGhpcy5fY29uZmlnLmRvYy5ib2R5LmNsaWVudFdpZHRoKTtiK2Q+ZT8oYz0oZS1kKS9iKmMsYj1lKTpiKz1kO3ZhciBmPTAsZz0wO3RoaXMuX2Zvb3RlcklzU2hvd24mJihnPXRoaXMuXyRtb2RhbEZvb3Rlci5vdXRlckhlaWdodCghMCl8fDU1KSx0aGlzLl90aXRsZUlzU2hvd24mJihmPXRoaXMuXyRtb2RhbEhlYWRlci5vdXRlckhlaWdodCghMCl8fDY3KTt2YXIgaD10aGlzLl9wYWRkaW5nLnRvcCt0aGlzLl9wYWRkaW5nLmJvdHRvbSt0aGlzLl9ib3JkZXIuYm90dG9tK3RoaXMuX2JvcmRlci50b3AsaT1wYXJzZUZsb2F0KHRoaXMuXyRtb2RhbERpYWxvZy5jc3MoXCJtYXJnaW4tdG9wXCIpKStwYXJzZUZsb2F0KHRoaXMuXyRtb2RhbERpYWxvZy5jc3MoXCJtYXJnaW4tYm90dG9tXCIpKSxqPU1hdGgubWluKGMsYSh3aW5kb3cpLmhlaWdodCgpLWgtaS1mLWcpO2lmKGM+ail7dmFyIGs9TWF0aC5taW4oai9jLDEpO2I9TWF0aC5jZWlsKGsqYil9dGhpcy5fJGxpZ2h0Ym94Q29udGFpbmVyLmNzcyhcImhlaWdodFwiLGopLHRoaXMuXyRtb2RhbERpYWxvZy5jc3MoXCJ3aWR0aFwiLFwiYXV0b1wiKS5jc3MoXCJtYXhXaWR0aFwiLGIpO3ZhciBsPXRoaXMuXyRtb2RhbC5kYXRhKFwiYnMubW9kYWxcIik7aWYobCl0cnl7bC5faGFuZGxlVXBkYXRlKCl9Y2F0Y2gobSl7bC5oYW5kbGVVcGRhdGUoKX1yZXR1cm4gdGhpc319XSxbe2tleTpcIl9qUXVlcnlJbnRlcmZhY2VcIix2YWx1ZTpmdW5jdGlvbihiKXt2YXIgYz10aGlzO3JldHVybiBiPWJ8fHt9LHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPWEoYyksZj1hLmV4dGVuZCh7fSxkLkRlZmF1bHQsZS5kYXRhKCksXCJvYmplY3RcIj09dHlwZW9mIGImJmIpO25ldyBkKGMsZil9KX19XSksZH0oKTtyZXR1cm4gYS5mbltkXT1nLl9qUXVlcnlJbnRlcmZhY2UsYS5mbltkXS5Db25zdHJ1Y3Rvcj1nLGEuZm5bZF0ubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuW2RdPWUsZy5falF1ZXJ5SW50ZXJmYWNlfSxnfSkoalF1ZXJ5KX0oalF1ZXJ5KTtcclxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWtrby1saWdodGJveC5taW4uanMubWFwIl0sImZpbGUiOiJtYWluLmpzIn0=
;
/**
 * Created by dko on 8/3/2017.
 */

!function ($) {
    "use strict";

    var Helper = function () { };

    Helper.prototype.ajax = function (url, parameters, successCallback, method) {
        var data = "";
        if (typeof parameters === 'undefined' || parameters === null) {

        } else {
            try {
                data = JSON.stringify(parameters)
            }
            catch (e) {
				console.log('================================');
				console.log('JSON.stringify error for parameters: ' + parameters + "' of request for url: '" + url + "'");
				console.log('typeof parameters: ' + typeof parameters);
				logToConsole(parameters, "parameters");
            }
        }
        return jQuery.ajax({
            type: (typeof method === 'undefined' || method === null) ? "POST" : method,
            url: url,
            contentType: 'application/json;',
            dataType: 'json',
            data: data,
            success: successCallback,
            error: function (xhr, textStatus, errorThrown) {
                console.log('ajax call error for url: ' + url);
            }
        });
    };
	
	var logToConsoleProperties = function(objectToLog, spaces, depth){
		if(!spaces){
			spaces = "";
		}
		if(!depth){
			depth = 0;
		}
		depth = depth + 1;
		if(depth > 4){
			return;
		}
		if(objectToLog != null){
			for (var prop in objectToLog) {
				// skip loop if the property is from prototype
				if (!objectToLog.hasOwnProperty(prop)){
					continue;
				}
				var obj = objectToLog[prop];
				
				if(typeof obj === 'object'){
					console.log(spaces + prop + ":");
					logToConsoleProperties(obj, spaces + "   ",depth);
				}else{
					if (objectToLog.hasOwnProperty(prop)){
						console.log(spaces + prop + " = " + obj);
					}
				}
				
			}
		}
	}
	
	var logToConsole = function (objectToLog, message) {
		if(!message){
			message = "Helper.logToConsole";
		}
		console.log('================ ' + message + ' ================');
		logToConsoleProperties(objectToLog);
		console.log('================================');
	}
	
	Helper.prototype.logToConsole = function (objectToLog, message) {
		logToConsole(objectToLog, message)
	}

	var updateQueryStringParameter = function(uri, key, value) {
		
		
        
		
		var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
        var separator = uri.indexOf('?') !== -1 ? "&" : "?";
        if (uri.match(re)) {
            if (value && value.length > 0) {
                return uri.replace(re, '$1' + key + "=" + value + '$2');
            } else {
                return removeURLParameter(uri, key);
                //return uri.replace(re, '$1' + '$2');
            }

        }
        else {
            if (value && value.length > 0) {
                return uri + separator + key + "=" + value;
            } else {
                return uri;
            }

        }
    }

    var removeURLParameter = function(url, parameter) {
        var urlparts = url.split('?');
        if (urlparts.length >= 2) {

            var prefix = encodeURIComponent(parameter) + '=';
            var pars = urlparts[1].split(/[&;]/g);
            for (var i = pars.length; i-- > 0;) {
                if (pars[i].lastIndexOf(prefix, 0) !== -1) {
                    pars.splice(i, 1);
                }
            }

            url = urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : "");
            return url;
        } else {
            return url;
        }
    }
    
    Helper.prototype.updateUrl = function(parameter, value) {
        window.history.pushState('', '', updateQueryStringParameter(window.location.href, parameter, value));
    }

    Helper.prototype.reloadUrl = function (model) {
      var params = ""

      if (model.SearchBoxQuery && model.SearchBoxQuery.length > 0) {
        params = "?q=" + model.SearchBoxQuery;
      }

      for (var i = 0; i < model.Filters.length; i++) {
        if (model.Filters[i].FieldValue && model.Filters[i].FieldValue.length > 0) {
		
		  var fieldValue = model.Filters[i].FieldValue;
		  // We need to replace '&reg;' because '&', see: https://jira.kuehlhaus.com/browse/KVT-46
		  fieldValue = fieldValue.replace('&reg;','-reg-');
		  
          if (i == 0 && params.indexOf('?') === -1) {
            params = "?" + model.Filters[i].FieldName + "=" + fieldValue;
          } else {
            params = params + "&" + model.Filters[i].FieldName + "=" + fieldValue;
          }
        }
      }
      window.history.pushState('', '', window.location.href.split('?')[0] + params);
    }

    $.helper = new Helper, $.helper.Constructor = Helper;

}(window.jQuery)

$(document).ready(function () {

});
//Pager
!function ($) {
    "use strict";

    var Pager = function () { };

    var handlebarPagerTempateSelector = "#paging-template";

    Pager.prototype.build = function (e) {

		if(e && e.Elements && e.Elements.length > 1){
			var pagerTemplate = jQuery(handlebarPagerTempateSelector).html();
			var handleBarPagerTeplate = Handlebars.compile(pagerTemplate);
			$("#pager-container").html(handleBarPagerTeplate(e))

			console.log("pager is rendered");
		}   else{
			$("#pager-container").empty();
		}			
    }

    Pager.prototype.reset = function (newPage) {
		if(!newPage){
			newPage = 1;
		}
        $("#pager-current-page").val(newPage);
    }

    Pager.prototype.currentPage = function () {
        var currentPage = $("#pager-current-page").val();
        return currentPage;
    }

    var initCommonEvents = function () {
        $(document).on("click", ".pagination .page-link", function (e) {
            var sender = $(this);
            if(sender.find("span").length > 0 || sender.parent().hasClass('disabled')){
                return false;
            }
            var page = sender.attr("data-requestpage");
            $("#pager-current-page").val(page);
            $(window).trigger("pager:selected");
			return false;
        });
    };

    //initilizing
    Pager.prototype.init = function () {
        initCommonEvents();
    };

    $.pager = new Pager, $.pager.Constructor = Pager;

}(window.jQuery),

    //initializing main application module
    function ($) {
        "use strict";
        if($('#pager-container').length > 0){
            $.pager.init();
        }
    }(window.jQuery);
//Analytics
! function($) {
    "use strict";

    var Analytics = function() {};

    Analytics.prototype.init = function() {

    };

    var registerSearchEvent = function(searchKeywords) {
        if (searchKeywords != "") {
            console.log("Analytics:registerSearchEvent: '" + searchKeywords + "';");
            var request = new XMLHttpRequest;
            var eventData = "Search,,," + encodeURIComponent(searchKeywords);
            request.open("GET", window.location.href.split('?')[0] + "/?sc_trk=" + eventData, true);
            request.send();
        }
    };

    Analytics.prototype.registerProductSearchEvent = function(searchKeywords, category, brand) {
        var data = "";
        var counter = 0;
        if (searchKeywords != null && searchKeywords != '' && searchKeywords != 0) {
            data = data + searchKeywords + " ";
            counter = counter + 1;
            registerSearchEvent(searchKeywords);
        }
        if (category != null && category != '' && category != 0) {
            data = data + category + " ";
            counter = counter + 1;
            registerSearchEvent(category);
        }
        if (brand != null && brand != '' && brand != 0) {
            data = data + brand + " ";
            counter = counter + 1;
            registerSearchEvent(brand);
        }
        if (data != "" && counter > 1) {
            registerSearchEvent(data);
        }
    };

    Analytics.prototype.registerSearchEvent = function(searchKeywords) {
        registerSearchEvent(searchKeywords);
    };

    $.analytics = new Analytics, $.analytics.Constructor = Analytics;

}(window.jQuery),

//initializing main application module
function($) {
    "use strict";
    $.analytics.init();
}(window.jQuery);
//$(window).resize(addMobileNavigation);

jQuery(document).ready(function () {
  setCookieBanner();
  jQuery('.slider-holder').each(function () {
    var slideInRow = jQuery(this).data('value');
    var mobileValue = jQuery(this).data('mobile-view');
    var tabletValue = jQuery(this).data('tablet-view');
    var rows = 1;
    if (this.id == "ourBrands") {
      rows = 2;
    }
    jQuery(this).slick({
      infinite: true,
      dots: true,
      slidesToShow: slideInRow,
      slidesToScroll: slideInRow,
      rows: 1,
      slidesPerRow: 1,
      autoplay: true,
      autoplaySpeed: 5000,
      responsive: [{
          breakpoint: 767,
          settings: {
            rows: rows,
            slidesPerRow: 1,
            slidesToShow: mobileValue,
            slidesToScroll: mobileValue

          }
        },
        {
          breakpoint: 992,
          settings: {
            slidesToShow: tabletValue,
            slidesToScroll: tabletValue
          }
        }

      ]
    });

    if(jQuery(this).hasClass('videoSlider')) {

      var $currentSlide = jQuery(this).find(".slick-current");
      var $yFrame = $currentSlide.find("iframe");
      if($yFrame){
        var $url = $yFrame.attr('src') + '&autoplay=1';
        $yFrame.attr('src', $url);
      }

      jQuery(this).on("beforeChange", function (event, slick, currentSlide, nextSlide) {

        var $currentVideo = jQuery(this).find("[data-slick-index='" + currentSlide +"'] video");
        var $nextVideo = jQuery(this).find("[data-slick-index='" + nextSlide +"'] video");

        var $currentIframe = jQuery(this).find("[data-slick-index='" + currentSlide +"'] iframe");
        var $nextIframe =  jQuery(this).find("[data-slick-index='" + nextSlide +"'] iframe");
        
        if($currentIframe.length) {
          $currentIframe[0].contentWindow.postMessage('{"event":"command","func":"' + 'pauseVideo' + '","args":""}', '*');
        }
        if ($nextIframe.length) {
          $nextIframe[0].contentWindow.postMessage('{"event":"command","func":"' + 'playVideo' + '","args":""}', '*');
        }
     
        if($currentVideo.length) {
          $currentVideo[0].pause();
        }
        if ($nextVideo.length) {
          $nextVideo[0].play()
        }
      })
    }
    
  });

  //addMobileNavigation();
  jQuery('.js-slideout-mobile').on('click', function () {
    jQuery(this).toggleClass('open');
    jQuery('body, html').toggleClass('noscroll');
    jQuery('header').toggleClass('mobile-open');

  });

  jQuery('.contactsCall__label').on('click', function () {
    jQuery(this).parent('.contactsCall').toggleClass('active');
  });
  jQuery('select.form-control').selectpicker({});
  showMobileNavigation();
  jQuery('.subnavClose').on('click', function () {
    jQuery('.collapseSubNav').removeClass('collapseSubNav');
  });
  jQuery('body').on('click', '.js-slideout-mobile', function () {
    jQuery('.mobile-open').removeClass('.mobile-open');
    jQuery('.collapseSubNav').removeClass('collapseSubNav');
  });
  showMobileNavigation();
  openFooterNavigation();
  relatedProductsSlider();
  $(window).resize(function () {
    showMobileNavigation();
    openFooterNavigation();
    // relatedProductsSlider();
  });
  jQuery('.showLanguageList').on('click', function () {
    var currenState = jQuery(this).parent('.selectCountryBlock__list-item').hasClass('open');
    jQuery('.selectCountryBlock__list-item').removeClass('open');

    if (currenState) {} else {
      jQuery(this).parent('.selectCountryBlock__list-item').addClass('open');
    }
  });
  if (jQuery('.productImageSlider').length != 0) {
    addProdectSlider();
  }
  jQuery('body').on('click', '.dropdownToggle', function () {
    var parent = jQuery(this).parent('.dropdownTarget');
    if (parent.hasClass("locationList__item")) {
      jQuery(".locationList__item.dropdownTarget.open").not(parent).removeClass("open");
      parent.toggleClass("open");
    } else {
      parent.toggleClass('open');
    }
  });
  jQuery('.glossaryValues li').on('click', function () {
    jQuery('.glossaryList__item[data-value="' + jQuery(this).data('target') + '"]').addClass('open');
  });
  // if(jQuery('.searchResults').length != 0) {
  // $.getJSON( "data/search.json", function( data ) {
  // printSearchResults(data);
  // })
  // }
  jQuery('.showVideoPopup').on('click', function () {
    var url = jQuery(this).data('url');
    jQuery('#videoModal .modal-dialog').append(
      '<iframe src = "' + url + '" width="100%" ></iframe>'
    )
  });
  $('#videoModal').on('hidden.bs.modal', function () {
    jQuery('#videoModal').find('iframe').remove();
  })
  headerSerach();
  useCaseSlider();

  //printDownloadResults();
  filterCareerPage();

  $('body').on("click", "[data-track-goal]", function () {
    var id = $(this).attr('data-track-goal');
    var pushData = {
     id : id
    };
    $.helper.ajax("/ajax/common/trackgoal", pushData, function(e){ });
  });


});


function setCookieBanner() {
  var COOKIE_NAME = 'kvt_cookie';
  var createCookie = function createCookie(name, value, days) {
    document.cookie = name + "=" + encodeURIComponent(value) + ";path=/;domain=" + document.location.hostname + ";max-age=" + 60 * 60 * 24 * days;
    $('.cookies-policy').remove();
  };
  var cookiesInfo = function cookiesInfo() {
    return createCookie(COOKIE_NAME, '1', 30);
  };

  if (document.cookie.indexOf(COOKIE_NAME) !== -1) {
    $('.cookies-policy').remove();
  }

  $('.cookies-policy button').on('click', cookiesInfo);
};

function filterCareerPage() {
  jQuery('.careerFilter').on('change', function () {
    var curentFilter = jQuery(".careerFilter :selected").data('target');
    if (curentFilter != 0) {
      jQuery('.careerListing__item').removeClass('active');
      jQuery('.careerListing__item[data-attr="' + curentFilter + '"]').addClass('active');
    } else {
      jQuery('.careerListing__item').removeClass('active');
      jQuery('.careerListing__item').addClass('active');
    }
  })
}

function useCaseSlider() {
  $('.useCaseSlider__descriptions').slick({
    slidesToShow: 1,
    slidesToScroll: 1,
    arrows: true,
    fade: false,
    dots: false,
    asNavFor: '.useCaseSlider__row',
    prevArrow: $('.useCaseSlider__navigation .prev'),
    nextArrow: $('.useCaseSlider__navigation .next')
  });

  $('.useCaseSlider__row').slick({
    slidesToShow: 1,
    slidesToScroll: 1,
    asNavFor: '.useCaseSlider__descriptions',

    arrows: false,
    infinite: true,
    dots: false,
    centerMode: true,
    focusOnSelect: true,
    variableWidth: true,
    responsive: [{
      breakpoint: 1024,
      settings: {
        // infinite: false,
        variableWidth: false,
        focusOnSelect: false
      }
    }]
  });

  $('.useCaseSlider__descriptions').on('beforeChange', function (event, slick, currentSlide, nextSlide) {
    var mySlideNumber = nextSlide;
    $('.useCaseSlider__row .slick-slide').removeClass('slick-active');
    $('.useCaseSlider__row .slick-slide').eq(mySlideNumber).addClass('slick-active');
  });


  $('.useCaseSlider__descriptions').on('afterChange', function (event, slick, currentSlide) {
    $('.useCaseAbout').hide().removeClass('active');
    $('.useCaseAbout[data-id=' + (currentSlide + 1) + ']').show().addClass('active');
  });

}

function printDownloadResults() {
  /*$.getJSON( "data/download.json", function( data ) {
   var template = jQuery('#downloadList').html();
   var handleBarTeplate = Handlebars.compile(template);
   jQuery('.downloadList').html(handleBarTeplate(data));
   });*/
}

function headerSerach() {}

function checkSlickNoSlide() {
  var elm = $('.slick-nav'),
    getSlick = elm.slick('getSlick');

  if (getSlick.slideCount <= getSlick.options.slidesToShow) {
    elm.addClass('slick-no-slide');
  } else {
    elm.removeClass('slick-no-slide');
  }
}

function printSearchResults(data) {
  var template = jQuery('#allResults').html();
  var handleBarTeplate = Handlebars.compile(template);
  var subTemplate = jQuery('#resultsList').html();
  Handlebars.registerPartial('resultsList', subTemplate);
  jQuery('.searchResults').html(handleBarTeplate(data));
}

function relatedProductsSlider() {
  if (jQuery('.relatedProducts__row').length != 0) {
    jQuery('.relatedProducts__row').slick({
      infinite: true,
      dots: true,
      arrows: true,
      slidesToShow: 3,
      slidesToScroll: 3
    })
  }
}

function addProdectSlider() {
  $('.slider-for').slick({
    slidesToShow: 1,
    slidesToScroll: 1,
    fade: true,
    arrows: false,
    asNavFor: '.slider-nav',
    responsive: [{
      breakpoint: 767,
      settings: {
        asNavFor: false,
        arrows: true
      }
    }]
  });
  $('.slider-nav').slick({
    slidesToShow: 4,
    slidesToScroll: 1,
    asNavFor: '.slider-for',
    dots: true,
    vertical: true,
    centerMode: true,
    focusOnSelect: true,
    responsive: [

      {
        breakpoint: 767,
        settings: {
          asNavFor: false,
          vertical: false,
          centerMode: false,
          unslick: true
        }
      },
      {
        breakpoint: 992,
        settings: {
          vertical: false,
          centerMode: false

        }
      }
    ]
  });
}

function showMobileNavigation() {
  if (jQuery(window).width() < 1024) {
    jQuery('.header__main-links .dropdown > a').on('click', function (e) {
      e.preventDefault();
      jQuery('.js-slideout-mobile').addClass('open');
      jQuery(this).parent('.dropdown').addClass('collapseSubNav');
      jQuery('header.mobile-open').addClass('collapseSubNav');
      jQuery('.mobileNavigationPanel').addClass('collapseSubNav');
    })
  }
}

function openFooterNavigation() {
  if (jQuery(window).width() < 768) {
    jQuery('.footerNavigation h4 a').on('click', function (e) {
      e.preventDefault();
      jQuery(this).closest('.footerNavigation').toggleClass('open')
    });
  }
}
jQuery('.productInfo__tab p').on('click', function () {
  jQuery('.productInfo__tab p, .productInfo__info > div').removeClass('active');
  jQuery('.productInfo__info > div').eq(jQuery(this).index()).addClass('active');
  jQuery(this).addClass('active');
});
jQuery(document).ready(function() {

    initDynamicForms();

});

function initDynamicForms() {
    $('form[data-wffm]').each(function() {
        setDefaultValues($(this));
    });
}

function setDefaultValues($form) {
    var search = window.location.search;
    var params = getSearchParameters(search);

    for (let prop in params) {
        if (prop != "") {
            var propValue = params[prop];

            if (params.hasOwnProperty(prop) && propValue) {
                var elementName = prop.toLowerCase();
                try {
                    var elements = $form.find(`[data-sc-field-name="${elementName}"]`);
                    elements.each((i, e) => {
                        var element = $(e);
                        var type = element.attr('type');
                        var value = element.val();

                        if (element.prop('tagName') === 'SELECT') {
                            element.val(propValue);
                            element.data('selectpicker').refresh();
                        } else {
                            switch (type) {
                                case 'radio':
                                    if (value === propValue) {
                                        element.prop('checked', true);
                                    }
                                    break;
                                case 'checkbox':
                                    element.prop('checked', propValue == "true");
                                    break;
                                default:
                                    element.val(propValue);
                            }
                        }
                    });
                } catch (e) {}
            }
        }
    }
}

function getSearchParameters(search) {
    if (!search) {
        return {};
    }

    return (/^[?#]/.test(search) ? search.slice(1) : search)
        .split('&')
        .reduce((params, param) => {
            let [key, value] = param.split('=');
            let val = value ? decodeURIComponent(value.replace(/\+/g, ' ')) : '';
            key = decodeURI(key);
            if (val && val.indexOf(',') !== -1) {
                params[key] = val.split(',');
            } else {
                params[key] = val;
            }

            return params;
        }, {});
}
//News Center Page
!function ($) {
    "use strict";
	
	var productsLastChangedFilters = [];

    var NewsCenterPage = function () { };

    var handlebarResultTempateSelector = "#result-template";
    var handlebarFiltersTempateSelector = "#filter-template";

    var reloadResults = function (lastChangedFilterName) {
		if(typeof lastChangedFilterName != "string"){
			lastChangedFilterName = "";
		}

        var pushData = {
            model: {
                SearchBoxQuery: $("#news-filter-query").val(),
				LastChangedFilterName: (lastChangedFilterName || "") + "",
                Filters: [],
                Page: $.pager.currentPage()
            },
            configuration: $("#source-id").val()
        };

        $(".productsFilter select").each(function(i, el){
            var value = $(el).val();
            if(value != "0"){
                var fieldname = $(el).attr("data-fieldname");
                var filter = {
                    FieldName: fieldname,
                    FieldValue: value
                }

                pushData.model.Filters.push(filter);
            }
        });

        $(".productsFilter .default").each(function (i, el) {
            var value = $(el).val();
            if (value != "0") {
                var fieldName = $(el).attr("data-fieldname");
                var filter = {
                    FieldName: fieldName,
                    FieldValue: value
                }

                pushData.model.Filters.push(filter);
            }
        });

        $.helper.reloadUrl(pushData.model)

       $.helper.ajax("/ajax/news/filter",pushData,renderResult);
    }

    var renderResult = function (e) {
        var template = jQuery(handlebarResultTempateSelector).html();
        var handleBarTeplate = Handlebars.compile(template);
        $("#news-result-list").html(handleBarTeplate(e))

        var filtersTemplate = jQuery(handlebarFiltersTempateSelector).html();
        var handleBarFiltersTeplate = Handlebars.compile(filtersTemplate);
		jQuery('#new-filters-container .search-box').siblings('div').remove();
        $('#new-filters-container .search-box').after(handleBarFiltersTeplate(e))

        $.pager.build(e.Pager);

        jQuery('#new-filters-container select.form-control').selectpicker({});

        //jQuery("#news-filter-query").val(e.SearchBoxQuery);
        console.log("page is rendered");
    }

    var resetFilters = function (e) {
        $(".productsFilter select").each(function(i, el){
            $(el).val(0);
            $(el).data('selectpicker').refresh()
        });

        $.pager.reset();

        $("#news-filter-query").val("");

        reloadResults();

        e.preventDefault();
    }

    var initCommonEvents = function () {
        $(window).on("pager:selected", reloadResults);

        $(document).on( "change", ".productsFilter select", function(){
			$.pager.reset();
            var lastChangedFilterName = jQuery(this).attr("data-fieldname");
			if (jQuery(this).val() != "0") {
				productsLastChangedFilters.push(lastChangedFilterName);
			} else {
				productsLastChangedFilters.pop();
			}
			if (productsLastChangedFilters.length > 0) {
				var lastArrayElement = productsLastChangedFilters[productsLastChangedFilters.length - 1];
				reloadResults(lastArrayElement);
			} else 
			{
				reloadResults();
			}
        } );

        $(document).on("click", "#news-filters-reset", resetFilters);

        $(document).on("keypress", "#news-filter-query", function (e) {
            if (e.keyCode == 13) {
				$.pager.reset();
                reloadResults();
                return false;
            }
        });

		var timeoutId = 0;
        $(document).on("keyup", "#news-filter-query", function(){
			clearTimeout(timeoutId);
			
            if( this.value.length < 4 ){
				return;
			}
            
			var execureRequest = function(){
				$.pager.reset();
				reloadResults();
			}
			
			timeoutId = setTimeout(execureRequest, 500);
			return false;
        } );

        $(document).on("click", "#news-query-submit", reloadResults);
    };

    //initilizing
    NewsCenterPage.prototype.init = function () {
        initCommonEvents();
        reloadResults();
    };

    $.newsCenterPage = new NewsCenterPage, $.newsCenterPage.Constructor = NewsCenterPage;

}(window.jQuery),

    //initializing main application module
function ($) {
	"use strict";
	if($('#news-center-page').length > 0){
		$.newsCenterPage.init();
	}
}(window.jQuery);
$(document).on('click', '[data-toggle="lightbox"]', function(event) {
    event.preventDefault();
    $(this).ekkoLightbox({
        alwaysShowClose: true
    });
});
//Download Center Page
!function ($) {
    "use strict";
	
	var productsLastChangedFilters = [];

    var DownloadCenterPage = function () { };

    var FilterQueryId = "DownloadCenterFilterQuery";
    var FilterContainer = "DownloadCenterFilterContainer";
    var FilterReset = "DownloadCenterFilterReset";
    var FilterCheckboxClass = "FilterCheckbox";
    var FilterCheckboxAllClass = "FilterCheckboxAll";
    var FiltersWrapperId = "DownloadCenterFiltersWrapper";
    var DownloadListContainerId = "DownloadListContainer";

    var FilterTemplateId = "DownloadFilterTemplate";
    var DownloadListTemplateId = "DownloadListTemplate";

    var reloadResults = function (lastChangedFilterName) {
		if(typeof lastChangedFilterName != "string"){
			lastChangedFilterName = "";
		}

        var pushData = {
            model: {
                SearchBoxQuery: $("#" + FilterQueryId).val(),
				LastChangedFilterName: (lastChangedFilterName || "") + "",
                Filters: [],
                Page: 1,
                MediaTypeFilters: [],
                CurrentItemId: $("#CurrentItemId").val()
            },
            configurationId: $("#SearchConfigurationId").val()

        };

        $("#" + FilterContainer + " select").each(function (i, el) {
            var value = $(el).val();
            if (value != "0") {
                var fieldname = $(el).attr("data-fieldname");
                var filter = {
                    FieldName: fieldname,
                    FieldValue: value
                }

                pushData.model.Filters.push(filter);
            }
        });

        $(".productsFilter .default").each(function (i, el) {
            var value = $(el).val();
            if (value != "0") {
                var fieldName = $(el).attr("data-fieldname");
                var filter = {
                    FieldName: fieldName,
                    FieldValue: value
                }

                pushData.model.Filters.push(filter);
            }
        });

        $("." + FilterCheckboxClass).each(function (i, el) {
            var value = $(el).attr("data-value");
            var fieldname = $(el).attr("data-fieldname");
            if (value != "0" && $(el).prop('checked')) {
                var filter = {
                    FieldName: fieldname,
                    FieldValue: value
                }

                pushData.model.Filters.push(filter);
            }
        });

        $.helper.reloadUrl(pushData.model)

        $.helper.ajax("/ajax/downloads/filter", pushData, renderResult);
    }

    var setAllSelectedForFieldNameIfAllMarked = function (fieldname){
		if(fieldname){
			var selected = $("." + FilterCheckboxClass + "[data-fieldname='" + fieldname + "']:checked").length;
			var exists = $("." + FilterCheckboxClass + "[data-fieldname='" + fieldname + "']").length;
			var allChecked = $("." + FilterCheckboxAllClass + "[data-fieldname='" + fieldname + "']").prop('checked');

			if (exists == selected || ((exists - 1) == selected) && !allChecked) {
				$("." + FilterCheckboxAllClass + "[data-fieldname='" + fieldname + "']").prop('checked', true);
			}
		}
    }

    var renderResult = function (e) {
        var downloadListTemplate = jQuery("#" + DownloadListTemplateId).html();
        var handleBarDownloadListTemplate = Handlebars.compile(downloadListTemplate);
        jQuery('#' + DownloadListContainerId).empty();
        jQuery("#" + DownloadListContainerId).html(handleBarDownloadListTemplate(e))

        var filtersTemplate = jQuery("#" + FilterTemplateId).html();
        var handleBarFiltersTeplate = Handlebars.compile(filtersTemplate);
        jQuery('#' + FiltersWrapperId).empty();
        jQuery('#' + FiltersWrapperId).html(handleBarFiltersTeplate(e))

        jQuery('#' + FiltersWrapperId + ' select.form-control').selectpicker({});

        jQuery("#" + FilterQueryId).val(e.SearchBoxQuery);
		
		$("." + FilterCheckboxAllClass).each(function (i, el) {
            var fieldname = $(el).attr("data-fieldname");
            setAllSelectedForFieldNameIfAllMarked(fieldname);
        });
		
        console.log("DownloadCenterPage is rendered");
    }

    var resetFilters = function (e) {
		if (window.location.search == "") {
			$("#" + FilterContainer + " select").each(function (i, el) {
				$(el).val(0);
				$(el).data('selectpicker').refresh()
			});

			$("#" + FilterQueryId).val("");

			$("." + FilterCheckboxClass).each(function (i, el) {
				var value = $(el).attr("data-value");
				if (value == "0") {
					$(el).prop('checked', true);
				} else {
					$(el).prop('checked', false);
				}
			});

			reloadResults();
		} else {
            window.location.href = [location.protocol, '//', location.host, location.pathname].join('');
        }

        e.preventDefault();
    }

    var initCommonEvents = function () {
        $(document).on("change", "#" + FilterContainer + " select", function () {
			$.pager.reset();
            var lastChangedFilterName = jQuery(this).attr("data-fieldname");
			if (jQuery(this).val() != "0") {
				productsLastChangedFilters.push(lastChangedFilterName);
			} else {
				productsLastChangedFilters.pop();
			}
			if (productsLastChangedFilters.length > 0) {
				var lastArrayElement = productsLastChangedFilters[productsLastChangedFilters.length - 1];
				reloadResults(lastArrayElement);
			} else 
			{
				reloadResults();
			}
        });

        $(document).on("click", "#" + FilterReset, resetFilters);


        $(document).on("change", "." + FilterCheckboxClass, function () {
            var value = $(this).attr("data-value");
            var fieldname = $(this).attr("data-fieldname");
            if (value == "0") {
                //set all checkboxes selected
                $("." + FilterCheckboxClass + "[data-fieldname='" + fieldname + "']").prop('checked', $(this).prop('checked'));
            } else {
                //set All checkbox unselected
                $("." + FilterCheckboxAllClass + "[data-fieldname='" + fieldname + "']").prop('checked', false);
            }

            reloadResults(fieldname);
        });

        $(document).on("keypress", "#" + FilterQueryId, function (e) {
            if (e.keyCode == 13) {
				$.pager.reset();
                reloadResults();
                return false;
            }
        });

		var timeoutId = 0;
        $(document).on("keyup", "#" + FilterQueryId, function () {
			clearTimeout(timeoutId);
			
			var execureRequest = function(){
				reloadResults();
			}
			
			timeoutId = setTimeout(execureRequest, 500);
			return false;
        });

        $(document).on("click", "#" + FilterQueryId, reloadResults);
    };

    //initilizing
    DownloadCenterPage.prototype.init = function () {
        initCommonEvents();
        reloadResults();
    };

    $.downloadCenterPage = new DownloadCenterPage, $.downloadCenterPage.Constructor = DownloadCenterPage;

}(window.jQuery),

    //initializing main application module
function ($) {
	"use strict";
	if ($('#DownloadCenterPage').length > 0) {
		$.downloadCenterPage.init();
	}
}(window.jQuery);
! function($) {
    "use strict";

    var productsLastChangedFilters = [];

    var ProductsOverviewPage = function() {};

    var handlebarResultTempateSelector = "#result-template";
    var handlebarFiltersTempateSelector = "#filter-template";
    var handlebarDescriptionTempateSelector = "#description-template"

    var reloadResults = function(lastChangedFilterName) {

        if (typeof lastChangedFilterName != "string") {
            lastChangedFilterName = "";
        }

        var pushData = {
            model: {
                SearchBoxQuery: $("#filter-query").val(),
                LastChangedFilterName: (lastChangedFilterName || "") + "",
                Filters: [],
                Page: $.pager.currentPage()
            },
            configuration: $("#source-id").val()
        };

        $(".productsFilter select").each(function(i, el) {
            var value = $(el).val();
            if (value != "0") {
                var fieldName = $(el).attr("data-fieldname");
                if (fieldName != "") {
                    var filter = {
                        FieldName: fieldName,
                        FieldValue: value
                    }

                    pushData.model.Filters.push(filter);
                }
            }
        });

        $(".productsFilter .default").each(function(i, el) {
            var value = $(el).val();
            if (value != "0") {
                var fieldName = $(el).attr("data-fieldname");
                var filter = {
                    FieldName: fieldName,
                    FieldValue: value
                }

                pushData.model.Filters.push(filter);
            }
        });

        $.helper.reloadUrl(pushData.model)
        $.helper.ajax("/ajax/product/information", pushData, rebderDescription);
        $.helper.ajax("/ajax/product/filter", pushData, renderResult);

        var category = "";
        if ($("#product_category").length > 0) {
            category = $("#product_category").val();
        } else if ($("#product_subcategory").length > 0) {
            category = $("#product_subcategory").val();
        }
        $.analytics.registerProductSearchEvent(pushData.model.SearchBoxQuery, category, $("#product_brand").val());

    }
    var rebderDescription = function(resultModel) {
        var template = jQuery(handlebarDescriptionTempateSelector).html();
        var handleBarTeplate = Handlebars.compile(template);
        if (resultModel && !resultModel.IsEmpty) {
            $('.companyDescriptionView').html(handleBarTeplate(resultModel));
            $(".companyDescriptionView").show();
            $(".companyDescriptionRendering").hide();
        } else {

            $(".companyDescriptionView").hide();
            $(".companyDescriptionRendering").show();
        }
    }
    var renderResult = function(resultModel) {
        if ((resultModel.SearchBoxQuery == null || resultModel.SearchBoxQuery == "") && (resultModel.Filters == null || resultModel.Filters.length == 0)) {
            console.log("render brand ranges");
            $("#pager-container").hide();
            $("#ProductsListWrapper").hide();
            //$(".companyDescriptionRendering").show(); //infobox
            $("#BrandsList").show();
        } else {
            console.log("render products");
            $("#pager-container").show();
            $("#ProductsListWrapper").show();
            //$(".companyDescriptionRendering").hide(); //infobox
            $("#BrandsList").hide();

            var template = jQuery(handlebarResultTempateSelector).html();
            var handleBarTeplate = Handlebars.compile(template);
            $("#ProductsListWrapper").html(handleBarTeplate(resultModel))

            $.pager.build(resultModel.Pager);
            //jQuery("#filter-query").val(resultModel.SearchBoxQuery);
        }

        var filtersTemplate = jQuery(handlebarFiltersTempateSelector).html();
        var handleBarFiltersTeplate = Handlebars.compile(filtersTemplate);
        jQuery('#search-filters-container .search-box').siblings('div.facetFilter').remove();
        $('#search-filters-container .search-box').after(handleBarFiltersTeplate(resultModel))

        jQuery('#search-filters-container select.form-control').selectpicker({});

        console.log("ProductsOverviewPage is rendered");
    }

    var resetFilters = function(e) {
        e.preventDefault();
        if (window.location.search == "") {
            $(".productsFilter select").each(function(i, el) {
                $(el).val(0);
                $(el).data('selectpicker').refresh()
            });

            $.pager.reset();

            $("#filter-query").val("");

            reloadResults();
        } else {
            window.location.href = [location.protocol, '//', location.host, location.pathname].join('');
        }
    }

    var initCommonEvents = function() {
        $(window).on("pager:selected", reloadResults);

        $(document).on("change", ".productsFilter .facetFilter select", function() {
            $.pager.reset();
            var lastChangedFilterName = jQuery(this).attr("data-fieldname");
            if (jQuery(this).val() != "0") {
                productsLastChangedFilters.push(lastChangedFilterName);
            } else {
                productsLastChangedFilters.pop();
            }
            if (productsLastChangedFilters.length > 0) {
                var lastArrayElement = productsLastChangedFilters[productsLastChangedFilters.length - 1];
                reloadResults(lastArrayElement);
            } else {
                reloadResults();
            }


        });

        $(document).on("change", "#ProductsSearchPredefinedQuerySelector", function() {
            $.pager.reset();
            var currentValue = $(this).val();
            if (currentValue == "0") {
                $("#filter-query").val("");
            } else {
                $("#filter-query").val(currentValue);
            }
            reloadResults();
        });

        $(document).on("click", "#filters-reset", resetFilters);

        $(document).on("keypress", "#filter-query", function(e) {
            if (e.keyCode == 13) {
                $.pager.reset();
                reloadResults();
                return false;
            }
        });

        var timeoutId = 0;
        $(document).on("keyup", "#filter-query", function() {
            var selector = $("#ProductsSearchPredefinedQuerySelector");
            if (selector.length > 0 && selector.val() != "0") {
                selector.val("0");
                selector.data('selectpicker').refresh()
            }

            clearTimeout(timeoutId);

            if (this.value.length < 4) {
                return;
            }
            var execureRequest = function() {
                $.pager.reset();
                reloadResults();
            }

            timeoutId = setTimeout(execureRequest, 500);
            return false;
        });
    };

    //initilizing
    ProductsOverviewPage.prototype.init = function() {
        initCommonEvents();
        reloadResults();
    };

    $.productsOverviewPage = new ProductsOverviewPage, $.productsOverviewPage.Constructor = ProductsOverviewPage;

}(window.jQuery),

//initializing main application module
function($) {
    "use strict";
    if ($('#product-overview-page').length > 0) {
        $.productsOverviewPage.init();
    }
}(window.jQuery);
//Download Center Page
!function ($) {
    "use strict";

    var LocationsPage = function () { };


    var initCommonEvents = function () {
        $('#locationsPage').on('click', '.locationList__item .dropdownToggle', function () {
            var targetItem = $(this).parent('.dropdownTarget');
            var currentImageUrl = targetItem.attr('data-country-image');
            var commonImageUrl = $("#MapContainer").attr('data-common-image');
            var imageUrl = commonImageUrl;
            if (currentImageUrl != "") {
                imageUrl = currentImageUrl;
            }

            var opening = !targetItem.hasClass("open");
            var closing = !opening;

            var openedNow = $(".locationList__item.dropdownTarget.open").length;
            if ((openedNow == 0 || openedNow == 1) && closing) {
                $("#MapImage").attr("src", commonImageUrl);
            } else if (openedNow == 0 && opening) {
                $("#MapImage").attr("src", imageUrl);
            } else if (openedNow == 2 && closing) {
                var value = targetItem.attr("data-value");
                var openedImageUrl = $(".locationList__item.dropdownTarget.open:not([data-value='" + value + "'])").attr("data-country-image");
                if (openedImageUrl == "") {
                    openedImageUrl = commonImageUrl;
                }
                $("#MapImage").attr("src", openedImageUrl);
            } else if (opening) {
                $("#MapImage").attr("src", imageUrl);
            } else {
                $("#MapImage").attr("src", commonImageUrl);
            }

        });
    };

    //initilizing
    LocationsPage.prototype.init = function () {
        initCommonEvents();
    };

    $.locationsPage = new LocationsPage, $.locationsPage.Constructor = LocationsPage;

}(window.jQuery),

    //initializing main application module
    function ($) {
        "use strict";
        if ($('#locationsPage').length > 0) {
            $.locationsPage.init();
        }
    }(window.jQuery);
! function($) {
    "use strict";

    var productsLastChangedFilters = [];

    var SiteSearchPage = function() {};

    var handlebarResultTempateSelector = "#result-template";
    var handlebarFiltersTempateSelector = "#filter-template";

    var FilterCheckboxClass = "FilterCheckbox";
    var FilterCheckboxAllClass = "FilterCheckboxAll";

    var reloadResults = function(lastChangedFilterName, initPushData) {

        if (typeof lastChangedFilterName != "string") {
            lastChangedFilterName = "";
        }

        var pushData = {
            model: {
                SearchBoxQuery: $("#filter-query").val(),
                LastChangedFilterName: (lastChangedFilterName || "") + "",
                Filters: [],
                Page: $.pager.currentPage()
            },
            configuration: $("#source-id").val()
        };

        $(".productsFilter select").each(function(i, el) {
            var value = $(el).val();
            if (value != "0") {
                var fieldName = $(el).attr("data-fieldname");
                var filter = {
                    FieldName: fieldName,
                    FieldValue: value
                }

                pushData.model.Filters.push(filter);
            }
        });

        $(".productsFilter .default").each(function(i, el) {
            var value = $(el).val();
            if (value != "0") {
                var fieldName = $(el).attr("data-fieldname");
                var filter = {
                    FieldName: fieldName,
                    FieldValue: value
                }

                pushData.model.Filters.push(filter);
            }
        });

        $("." + FilterCheckboxClass).each(function(i, el) {
            var value = $(el).attr("data-value");
            var fieldname = $(el).attr("data-fieldname");
            if (value != "0" && $(el).prop('checked')) {
                var filter = {
                    FieldName: fieldname,
                    FieldValue: value
                }

                pushData.model.Filters.push(filter);
            }
        });


        $.helper.logToConsole(pushData, "Data values:");
        $.helper.reloadUrl(pushData.model)

        $.helper.ajax("/ajax/site/search", pushData, renderResult);

        $.analytics.registerSearchEvent(pushData.model.SearchBoxQuery);
    }

    var setAllSelectedForFieldNameIfAllMarked = function(fieldname) {
        var selected = $("." + FilterCheckboxClass + "[data-fieldname='" + fieldname + "']:checked").length;
        var exists = $("." + FilterCheckboxClass + "[data-fieldname='" + fieldname + "']").length;
        var allChecked = $("." + FilterCheckboxAllClass + "[data-fieldname='" + fieldname + "']").prop('checked');

        if (exists == selected || ((exists - 1) == selected) && !allChecked) {
            $("." + FilterCheckboxAllClass + "[data-fieldname='" + fieldname + "']").prop('checked', true);
        }
    }

    var renderResult = function(e) {
        var template = jQuery(handlebarResultTempateSelector).html();
        var handleBarTeplate = Handlebars.compile(template);
        $("#search-result-list").html(handleBarTeplate(e))


        var filtersTemplate = jQuery(handlebarFiltersTempateSelector).html();
        var handleBarFiltersTeplate = Handlebars.compile(filtersTemplate);
        jQuery('#search-filters-container').empty();
        $('#search-filters-container').html(handleBarFiltersTeplate(e))

        $.pager.build(e.Pager);

        jQuery('#search-filters-container select.form-control').selectpicker({});

        //jQuery("#filter-query").val(e.SearchBoxQuery);

        $("." + FilterCheckboxAllClass).each(function(i, el) {
            var fieldname = $(el).attr("data-fieldname");
            setAllSelectedForFieldNameIfAllMarked(fieldname);
        });

        console.log("SiteSearchPage is rendered");
    }

    var resetFilters = function(e) {
        if (window.location.search == "") {

            $(".productsFilter select").each(function(i, el) {
                $(el).val(0);
                $(el).data('selectpicker').refresh()
            });

            $.pager.reset();

            $("." + FilterCheckboxClass).each(function(i, el) {
                var value = $(el).attr("data-value");
                if (value == "0") {
                    $(el).prop('checked', true);
                } else {
                    $(el).prop('checked', false);
                }
            });

            reloadResults();

            e.preventDefault();
        } else {
            window.location.href = [location.protocol, '//', location.host, location.pathname].join('');
        }
    }

    var initCommonEvents = function() {
        $(window).on("pager:selected", reloadResults);

        $(document).on("change", ".productsFilter select", function() {
            $.pager.reset();
            var lastChangedFilterName = jQuery(this).attr("data-fieldname");
            var value = jQuery(this).val();
            if (value != "0") {
                productsLastChangedFilters.push(lastChangedFilterName);
            } else {
                productsLastChangedFilters.pop();
            }
            if (productsLastChangedFilters.length > 0) {
                var lastArrayElement = productsLastChangedFilters[productsLastChangedFilters.length - 1];
                reloadResults(lastArrayElement);
            } else {
                reloadResults();
            }
        });

        $(document).on("click", "#filters-reset", resetFilters);

        $(document).on("change", "." + FilterCheckboxClass, function() {
            var value = $(this).attr("data-value");
            var fieldname = $(this).attr("data-fieldname");
            var checked = $(this).prop('checked');
            if (value == "0") {

                //set all checkboxes selected
                $("." + FilterCheckboxClass + "[data-fieldname='" + fieldname + "']").prop('checked', $(this).prop('checked'));
            } else {
                //set All checkBOX unselected
                $("." + FilterCheckboxAllClass + "[data-fieldname='" + fieldname + "']").prop('checked', false);
            }
            $.pager.reset();
            reloadResults(fieldname);
        });

        $(document).on("keypress", "#filter-query", function(e) {
            if (e.keyCode == 13) {
                $.pager.reset();
                reloadResults();
                return false;
            }
        });

        var timeoutId = 0;
        $(document).on("keyup", "#filter-query", function() {
            clearTimeout(timeoutId); // doesn't matter if it's 0
            var value = this.value;
            var execureRequest = function() {
                if (value.length < 4) {
                    return;
                }
                $.pager.reset();
                reloadResults();
            }

            timeoutId = setTimeout(execureRequest, 500);
        });

        $("#filter-query-button").click(function() {
            $.pager.reset();
            reloadResults();
        });
    };

    //initilizing
    SiteSearchPage.prototype.init = function() {
        initCommonEvents();
        reloadResults();
    };

    $.siteSearchPage = new SiteSearchPage, $.siteSearchPage.Constructor = SiteSearchPage;


}(window.jQuery),

//initializing main application module
function($) {
    "use strict";
    if ($('#site-search-page').length > 0) {
        Handlebars.registerHelper('if_eq', function(a, b, opts) {
            if (a == b) {
                return opts.fn(this);
            } else {
                return opts.inverse(this);
            }
        });
        $.siteSearchPage.init();
    }
}(window.jQuery);
! function($) {
    "use strict";

    var productsLastChangedFilters = [];

    var BasicProductSearch = function() {};

    var handlebarFiltersTempateSelector = "#filter-template";

    var reloadResults = function(lastChangedFilterName) {
        if (typeof lastChangedFilterName != "string") {
            lastChangedFilterName = "";
        }

        var pushData = {
            model: {
                SearchBoxQuery: $("#filter-query").val(),
                LastChangedFilterName: (lastChangedFilterName || "") + "",
                Filters: [],
                Page: 1
            },
            configuration: $("#source-id").val()
        };

        $(".basicProductSearch select").each(function(i, el) {
            var value = $(el).val();
            if (value != "0") {
                var fieldName = $(el).attr("data-fieldname");
                var filter = {
                    FieldName: fieldName,
                    FieldValue: value
                }

                pushData.model.Filters.push(filter);
            }
        });

        $.helper.ajax("/ajax/product/basic", pushData, renderResult);
    }

    var redirect = function() {
        var pushData = {};

        var isHasProperties = false;

        var sb = $("#filter-query").val();
        if (sb && sb.length >= 3) {
            pushData["q"] = sb;
            isHasProperties = true;
        }

        $(".basicProductSearch select").each(function(i, el) {
            var value = $(el).val();
            if (value != "0") {
                var fieldName = $(el).attr("data-fieldname");
                pushData[fieldName] = value;
                isHasProperties = true;
            }
        });
        var queryString = $.param(pushData);

        var url = $(".productSearch .showMore").attr("href");

        if (isHasProperties) {
            url = url + "?" + queryString;
        }
        console.log(url);
        window.location.href = url;
    }


    var renderResult = function(e) {

        var filtersTemplate = jQuery(handlebarFiltersTempateSelector).html();
        var handleBarFiltersTeplate = Handlebars.compile(filtersTemplate);
        jQuery('.basicProductSearch').empty();
        $('.basicProductSearch').html(handleBarFiltersTeplate(e))

        jQuery('.basicProductSearch select.form-control').selectpicker({});

        //jQuery("#filter-query").val(e.SearchBoxQuery);
        console.log("BasicProductSearch is rendered");
    }

    var initCommonEvents = function() {
        $(document).on("change", ".basicProductSearch select", function() {
            $.pager.reset();
            var lastChangedFilterName = jQuery(this).attr("data-fieldname");
            if (jQuery(this).val() != "0") {
                productsLastChangedFilters.push(lastChangedFilterName);
            } else {
                productsLastChangedFilters.pop();
            }
            if (productsLastChangedFilters.length > 0) {
                var lastArrayElement = productsLastChangedFilters[productsLastChangedFilters.length - 1];
                reloadResults(lastArrayElement);
            } else {
                reloadResults();
            }
        });

        $(document).on("keypress", "#filter-query", function(e) {
            if (e.keyCode == 13) {
                redirect();
                return false;
            }
        });

        $(document).on("click", ".searchSubmit", function(e) {
            redirect();
            return false;
        });

        var timeoutId = 0;
        $(document).on("keyup", "#filter-query", function() {
            if (this.value.length < 4) {
                return;
            }
            clearTimeout(timeoutId);

            var execureRequest = function() {
                reloadResults();
            }

            timeoutId = setTimeout(execureRequest, 500);
            return false;
        });

        //fix enormous height of block
        var sizeCheckTimer = 0;
        var sizeCheckTimerCount = 0;
        var sizeCheck = function() {
            sizeCheckTimerCount = sizeCheckTimerCount + 1;
            //console.log(sizeCheckTimerCount);
            if ($(".basicProductSearch").height() > 250) {
                $(".basic.productSearch .searchBlock>h2").after('<h6 style="color: #cfe3f4;height: 45px;">-</h6>');
                setTimeout(function() { $(".basic.productSearch .searchBlock>h6").remove(); }, 0);
                clearInterval(sizeCheckTimer);
            } else if (sizeCheckTimerCount > 10) {
                clearInterval(sizeCheckTimer);
            }
        }
        sizeCheckTimer = setInterval(sizeCheck, 30);

    };

    //initilizing
    BasicProductSearch.prototype.init = function() {
        initCommonEvents();
    };

    $.basicProductSearch = new BasicProductSearch, $.basicProductSearch.Constructor = BasicProductSearch;

}(window.jQuery),

//initializing main application module
function($) {
    "use strict";
    if ($('.basic.productSearch').length > 0) {
        $.basicProductSearch.init();
    }
}(window.jQuery);
! function($) {
    "use strict";

    var HeaderSearch = function() {};

    var FilterChangegEventName = "searchHeader:changed";
    var handlebarRelatedResultsTempateSelector = "#site-search-results-template";
    var handlebarRelatedResultsInProductsTempateSelector = "#product-search-results-template";

    var reloadSearchResults = function() {

        var pushData = {
            model: {
                SearchBoxQuery: $("#headerSearch").val(),
                Filters: [],
                Page: 1
            },
            configuration: $("#site-search-source-id").val()
        };

        $.helper.ajax("/ajax/site/search", pushData, renderSiteSearchResult);
    }
    var reloadProductsResults = function() {

        var pushData = {
            model: {
                SearchBoxQuery: $("#headerSearch").val(),
                Filters: [],
                Page: 1
            },
            configuration: $("#product-search-source-id").val()
        };

        $.helper.ajax("/ajax/product/filter", pushData, renderProductSearchResult);
        $.analytics.registerSearchEvent(pushData.model.SearchBoxQuery);
    }


    var renderSiteSearchResult = function(e) {

        var filtersTemplate = jQuery(handlebarRelatedResultsTempateSelector).html();
        var handleBarFiltersTeplate = Handlebars.compile(filtersTemplate);
        jQuery('.search-box__results-categories h3').siblings('div').remove();
        jQuery('.search-box__results-categories h3').siblings('a').remove();
        $('.search-box__results-categories h3').after(handleBarFiltersTeplate(e));

        if ($(".search-box__results-products .productsResults__row").length > 0) {
            $('.search-box__results').addClass('open')
        }
    }

    var renderProductSearchResult = function(e) {
        var template = jQuery(handlebarRelatedResultsInProductsTempateSelector).html();
        var handleBarTeplate = Handlebars.compile(template);
        jQuery('.search-box__results-products h3').siblings('div').remove();
        jQuery('.search-box__results-products h3').siblings('a').remove();
        $('.search-box__results-products h3').after(handleBarTeplate(e));

        if ($(".search-box__results-categories .categoriesResults__row").length > 0) {
            $('.search-box__results').addClass('open')
        }
    }

    var reloadPage = function() {
        setTimeout(function() {
            window.location.reload(true);
        }, 200);
    };


    var initCommonEvents = function() {
        $(window).on(FilterChangegEventName, reloadSearchResults);
        $(window).on(FilterChangegEventName, reloadProductsResults);

        $(document).on("keypress", "#headerSearch", function(e) {
            if (e.keyCode == 13) {
                window.location.href = $("#headerSearch").attr("data-search-page-url") + "?q=" + jQuery('#headerSearch').val();
                return false;
            }
        });

        var searchBox = jQuery('#headerSearch');
        var searchTarget = jQuery('.search-box__results');

        $("body").click(function() {
            $(".search-box__results").removeClass("open");
        });

        //=======================Warning=================================
        $(".search-box__results, .search-box").click(function(e) {
            var source = event.target || event.srcElement;
            if (!$(source).hasClass("goToLink")) {
                e.stopPropagation();
            }
        });
        //========================================================

        searchBox.focusin(function() {
            if (jQuery(this).val().length > 2) {
                searchTarget.addClass('open')
            }
        })

        $("#headerSearchButton").click(function() {
            window.location.href = searchBox.attr("data-search-page-url") + "?q=" + jQuery('#headerSearch').val();
        });

        var timeoutId = 0;
        $(document).on("keyup", "#headerSearch", function() {
            clearTimeout(timeoutId); // doesn't matter if it's 0

            var value = this.value;
            if (value.length < 3) {
                searchTarget.removeClass('open');
                return;
            }
            var execureRequest = function() {
                $(window).trigger(FilterChangegEventName);
                //searchTarget.addClass('open')
            }
            timeoutId = setTimeout(execureRequest, 500);
            return false;
        });

        $('body').on('click', '.goToLink', function(e) {
            e.preventDefault();
            var url = $(this).attr("href");
            window.location.href = url;
            reloadPage();

            return false;
        });
    };

    //initilizing
    HeaderSearch.prototype.init = function() {
        initCommonEvents();
    };

    $.headerSearch = new HeaderSearch, $.headerSearch.Constructor = HeaderSearch;

}(window.jQuery),

//initializing main application module
function($) {
    "use strict";
    if ($('#header-search-box').length > 0) {
        Handlebars.registerHelper('ifCond', function(v1, operator, v2, options) {
            switch (operator) {
                case '==':
                    return (v1 == v2) ? options.fn(this) : options.inverse(this);
                case '===':
                    return (v1 === v2) ? options.fn(this) : options.inverse(this);
                case '!=':
                    return (v1 != v2) ? options.fn(this) : options.inverse(this);
                case '!==':
                    return (v1 !== v2) ? options.fn(this) : options.inverse(this);
                case '<':
                    return (v1 < v2) ? options.fn(this) : options.inverse(this);
                case '<=':
                    return (v1 <= v2) ? options.fn(this) : options.inverse(this);
                case '>':
                    return (v1 > v2) ? options.fn(this) : options.inverse(this);
                case '>=':
                    return (v1 >= v2) ? options.fn(this) : options.inverse(this);
                case '&&':
                    return (v1 && v2) ? options.fn(this) : options.inverse(this);
                case '||':
                    return (v1 || v2) ? options.fn(this) : options.inverse(this);
                default:
                    return options.inverse(this);
            }
        });
        $.headerSearch.init();
    }
}(window.jQuery);
!function ($) {
    "use strict";
	
	var productsLastChangedFilters = [];

    var ProductsOverviewPage = function () { };

    var handlebarResultTempateSelector = "#result-template";
    var handlebarFiltersTempateSelector = "#filter-template";

    var reloadResults = function (lastChangedFilterName) {
		if(typeof lastChangedFilterName != "string"){
			lastChangedFilterName = "";
		}

        var pushData = {
            model: {
                SearchBoxQuery: $("#filter-query").val(),
				LastChangedFilterName: (lastChangedFilterName || "") + "",
                Filters: [],
                Page: $.pager.currentPage()
            },
            configuration: $("#source-id").val()
        };

        $(".productsFilter select").each(function(i, el){
            var value = $(el).val();
            if(value != "0"){
                var fieldname = $(el).attr("data-fieldname");
                var filter = {
                    FieldName: fieldname,
                    FieldValue: value
                }

                pushData.model.Filters.push(filter);
            }
        });

        $(".productsFilter .default").each(function(i, el){
            var value = $(el).val();
            if(value != "0"){
                var fieldname = $(el).attr("data-fieldname");
                var filter = {
                    FieldName: fieldname,
                    FieldValue: value
                }

                pushData.model.Filters.push(filter);
            }
        });

        $.helper.reloadUrl(pushData.model)

       $.helper.ajax("/ajax/product/brands",pushData,renderResult);
    }

    var renderResult = function (e) {
        var template = jQuery(handlebarResultTempateSelector).html();
        var handleBarTeplate = Handlebars.compile(template);
        $("#search-result-list").html(handleBarTeplate(e))

        var filtersTemplate = jQuery(handlebarFiltersTempateSelector).html();
        var handleBarFiltersTeplate = Handlebars.compile(filtersTemplate);
		jQuery('#search-filters-container .search-box').siblings('div').remove();
        $('#search-filters-container .search-box').after(handleBarFiltersTeplate(e))

        $.pager.build(e.Pager);

        jQuery('#search-filters-container select.form-control').selectpicker({});

        console.log("BrandsOverview is rendered");
    }

    var resetFilters = function (e) {
        $(".productsFilter select").each(function(i, el){
            $(el).val(0);
            $(el).data('selectpicker').refresh()
        });

        $.pager.reset();

        $("#filter-query").val("");

        reloadResults();

        e.preventDefault();
    }

    var initCommonEvents = function () {
        $(window).on("pager:selected", reloadResults);

        $(document).on( "change", ".productsFilter select", function(){
			$.pager.reset();
            var lastChangedFilterName = jQuery(this).attr("data-fieldname");
			if (jQuery(this).val() != "0") {
				productsLastChangedFilters.push(lastChangedFilterName);
			} else {
				productsLastChangedFilters.pop();
			}
			if (productsLastChangedFilters.length > 0) {
				var lastArrayElement = productsLastChangedFilters[productsLastChangedFilters.length - 1];
				reloadResults(lastArrayElement);
			} else 
			{
				reloadResults();
			}
        } );

        $(document).on("click", "#filters-reset", resetFilters);

        $(document).on("keypress", "#filter-query", function (e) {
            if (e.keyCode == 13) {
				$.pager.reset();
                reloadResults();
                return false;
            }
        });

		var timeoutId = 0;
        $(document).on("keyup", "#filter-query", function(){
			clearTimeout(timeoutId);
			
            if( this.value.length < 4 ){
				return;
			}
			var execureRequest = function(){
				$.pager.reset();
				reloadResults();
			}
			
			timeoutId = setTimeout(execureRequest, 500);
			return false;
        } );
    };

    //initilizing
    ProductsOverviewPage.prototype.init = function () {
        initCommonEvents();
        reloadResults();
    };

    $.productsOverviewPage = new ProductsOverviewPage, $.productsOverviewPage.Constructor = ProductsOverviewPage;

}(window.jQuery),

    //initializing main application module
function ($) {
	"use strict";
	if($('#brands-overview-page').length > 0){
		$.productsOverviewPage.init();
	}
}(window.jQuery);
! function($) {
    "use strict";

    var SecuredContainer = function() {};

    var initContainer = function() {
        $(".SecuredContainer").each(function(index) {
            var container = $(this);
            var checkAccess = function() {
                var passwordInput = $("input[type=text]", container);
                var pushData = {
                    password: passwordInput.val(),
                    containerSourceId: passwordInput.data("source-id"),
                };

                var checkAccessResponce = function(result) {
                    if (result.allowed) {
                        $("span", container).hide();
                        window.location.reload(true);
                    } else {
                        $("span", container).show();
                    }
                }

                $.helper.ajax("/ajax/secured/showcontent", pushData, checkAccessResponce);
            };

            $("input[type=text]", container).keypress(function(e) {
                if (e.keyCode == 13) {
                    checkAccess();
                    return false;
                }
            });

            $(".button", container).click(function() {
                checkAccess();
            });
        });
        console.log("SecuredContainer is rendered");
    };

    SecuredContainer.prototype.init = function() {
        initContainer();
    };

    $.securedContainer = new SecuredContainer, $.securedContainer.Constructor = SecuredContainer;

}(window.jQuery),

//initializing main application module
function($) {
    "use strict";
    if ($('.SecuredContainer').length > 0) {
        $.securedContainer.init();
    }
}(window.jQuery);
jQuery(document).ready(function() {
    var hash = decodeURIComponent(window.location.hash.split('#')[1]).replace(/-/g, ' ').toLowerCase();
    $('.popup').each(function() {
        var popup = $(this);
        if (popup.hasClass("html-popup")) {
            if (hash == popup.data("popupkey").toLowerCase()) {
                popup.modal('show');
            }
        } else {
            setTimeout(function() {
                popup.modal('show');
            }, popup.data('delay') * 1000);
        }
    });

    $("a").on("click", function() {
        var link = $(this);
        var url = link.attr("href");
        if (url != null && url.indexOf('#') != -1) {
            var urlHash = decodeURIComponent(url.split('#')[1]).replace(/-/g, ' ').toLowerCase();
            if (urlHash != "") {
                $('.html-popup').each(function() {
                    var popup = $(this);
                    if (urlHash == popup.data("popupkey").toLowerCase()) {
                        popup.modal('show');
                    }
                });
            }
        }
    });
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlcyI6WyJhcHAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENyZWF0ZWQgYnkgZGtvIG9uIDgvMy8yMDE3LlxyXG4gKi9cclxuXHJcbiFmdW5jdGlvbiAoJCkge1xyXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XHJcblxyXG4gICAgdmFyIEhlbHBlciA9IGZ1bmN0aW9uICgpIHsgfTtcclxuXHJcbiAgICBIZWxwZXIucHJvdG90eXBlLmFqYXggPSBmdW5jdGlvbiAodXJsLCBwYXJhbWV0ZXJzLCBzdWNjZXNzQ2FsbGJhY2ssIG1ldGhvZCkge1xyXG4gICAgICAgIHZhciBkYXRhID0gXCJcIjtcclxuICAgICAgICBpZiAodHlwZW9mIHBhcmFtZXRlcnMgPT09ICd1bmRlZmluZWQnIHx8IHBhcmFtZXRlcnMgPT09IG51bGwpIHtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnN0cmluZ2lmeShwYXJhbWV0ZXJzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Jyk7XHJcblx0XHRcdFx0Y29uc29sZS5sb2coJ0pTT04uc3RyaW5naWZ5IGVycm9yIGZvciBwYXJhbWV0ZXJzOiAnICsgcGFyYW1ldGVycyArIFwiJyBvZiByZXF1ZXN0IGZvciB1cmw6ICdcIiArIHVybCArIFwiJ1wiKTtcclxuXHRcdFx0XHRjb25zb2xlLmxvZygndHlwZW9mIHBhcmFtZXRlcnM6ICcgKyB0eXBlb2YgcGFyYW1ldGVycyk7XHJcblx0XHRcdFx0bG9nVG9Db25zb2xlKHBhcmFtZXRlcnMsIFwicGFyYW1ldGVyc1wiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4galF1ZXJ5LmFqYXgoe1xyXG4gICAgICAgICAgICB0eXBlOiAodHlwZW9mIG1ldGhvZCA9PT0gJ3VuZGVmaW5lZCcgfHwgbWV0aG9kID09PSBudWxsKSA/IFwiUE9TVFwiIDogbWV0aG9kLFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uOycsXHJcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGEsXHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHN1Y2Nlc3NDYWxsYmFjayxcclxuICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uICh4aHIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnYWpheCBjYWxsIGVycm9yIGZvciB1cmw6ICcgKyB1cmwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cdFxyXG5cdHZhciBsb2dUb0NvbnNvbGVQcm9wZXJ0aWVzID0gZnVuY3Rpb24ob2JqZWN0VG9Mb2csIHNwYWNlcywgZGVwdGgpe1xyXG5cdFx0aWYoIXNwYWNlcyl7XHJcblx0XHRcdHNwYWNlcyA9IFwiXCI7XHJcblx0XHR9XHJcblx0XHRpZighZGVwdGgpe1xyXG5cdFx0XHRkZXB0aCA9IDA7XHJcblx0XHR9XHJcblx0XHRkZXB0aCA9IGRlcHRoICsgMTtcclxuXHRcdGlmKGRlcHRoID4gNCl7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHRcdGlmKG9iamVjdFRvTG9nICE9IG51bGwpe1xyXG5cdFx0XHRmb3IgKHZhciBwcm9wIGluIG9iamVjdFRvTG9nKSB7XHJcblx0XHRcdFx0Ly8gc2tpcCBsb29wIGlmIHRoZSBwcm9wZXJ0eSBpcyBmcm9tIHByb3RvdHlwZVxyXG5cdFx0XHRcdGlmICghb2JqZWN0VG9Mb2cuaGFzT3duUHJvcGVydHkocHJvcCkpe1xyXG5cdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHZhciBvYmogPSBvYmplY3RUb0xvZ1twcm9wXTtcclxuXHRcdFx0XHRcclxuXHRcdFx0XHRpZih0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jyl7XHJcblx0XHRcdFx0XHRjb25zb2xlLmxvZyhzcGFjZXMgKyBwcm9wICsgXCI6XCIpO1xyXG5cdFx0XHRcdFx0bG9nVG9Db25zb2xlUHJvcGVydGllcyhvYmosIHNwYWNlcyArIFwiICAgXCIsZGVwdGgpO1xyXG5cdFx0XHRcdH1lbHNle1xyXG5cdFx0XHRcdFx0aWYgKG9iamVjdFRvTG9nLmhhc093blByb3BlcnR5KHByb3ApKXtcclxuXHRcdFx0XHRcdFx0Y29uc29sZS5sb2coc3BhY2VzICsgcHJvcCArIFwiID0gXCIgKyBvYmopO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHRcclxuXHR2YXIgbG9nVG9Db25zb2xlID0gZnVuY3Rpb24gKG9iamVjdFRvTG9nLCBtZXNzYWdlKSB7XHJcblx0XHRpZighbWVzc2FnZSl7XHJcblx0XHRcdG1lc3NhZ2UgPSBcIkhlbHBlci5sb2dUb0NvbnNvbGVcIjtcclxuXHRcdH1cclxuXHRcdGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09ICcgKyBtZXNzYWdlICsgJyA9PT09PT09PT09PT09PT09Jyk7XHJcblx0XHRsb2dUb0NvbnNvbGVQcm9wZXJ0aWVzKG9iamVjdFRvTG9nKTtcclxuXHRcdGNvbnNvbGUubG9nKCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PScpO1xyXG5cdH1cclxuXHRcclxuXHRIZWxwZXIucHJvdG90eXBlLmxvZ1RvQ29uc29sZSA9IGZ1bmN0aW9uIChvYmplY3RUb0xvZywgbWVzc2FnZSkge1xyXG5cdFx0bG9nVG9Db25zb2xlKG9iamVjdFRvTG9nLCBtZXNzYWdlKVxyXG5cdH1cclxuXHJcblx0dmFyIHVwZGF0ZVF1ZXJ5U3RyaW5nUGFyYW1ldGVyID0gZnVuY3Rpb24odXJpLCBrZXksIHZhbHVlKSB7XHJcblx0XHRcclxuXHRcdFxyXG4gICAgICAgIFxyXG5cdFx0XHJcblx0XHR2YXIgcmUgPSBuZXcgUmVnRXhwKFwiKFs/Jl0pXCIgKyBrZXkgKyBcIj0uKj8oJnwkKVwiLCBcImlcIik7XHJcbiAgICAgICAgdmFyIHNlcGFyYXRvciA9IHVyaS5pbmRleE9mKCc/JykgIT09IC0xID8gXCImXCIgOiBcIj9cIjtcclxuICAgICAgICBpZiAodXJpLm1hdGNoKHJlKSkge1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVyaS5yZXBsYWNlKHJlLCAnJDEnICsga2V5ICsgXCI9XCIgKyB2YWx1ZSArICckMicpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZVVSTFBhcmFtZXRlcih1cmksIGtleSk7XHJcbiAgICAgICAgICAgICAgICAvL3JldHVybiB1cmkucmVwbGFjZShyZSwgJyQxJyArICckMicpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1cmkgKyBzZXBhcmF0b3IgKyBrZXkgKyBcIj1cIiArIHZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVyaTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHJlbW92ZVVSTFBhcmFtZXRlciA9IGZ1bmN0aW9uKHVybCwgcGFyYW1ldGVyKSB7XHJcbiAgICAgICAgdmFyIHVybHBhcnRzID0gdXJsLnNwbGl0KCc/Jyk7XHJcbiAgICAgICAgaWYgKHVybHBhcnRzLmxlbmd0aCA+PSAyKSB7XHJcblxyXG4gICAgICAgICAgICB2YXIgcHJlZml4ID0gZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlcikgKyAnPSc7XHJcbiAgICAgICAgICAgIHZhciBwYXJzID0gdXJscGFydHNbMV0uc3BsaXQoL1smO10vZyk7XHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBwYXJzLmxlbmd0aDsgaS0tID4gMDspIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJzW2ldLmxhc3RJbmRleE9mKHByZWZpeCwgMCkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFycy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHVybCA9IHVybHBhcnRzWzBdICsgKHBhcnMubGVuZ3RoID4gMCA/ICc/JyArIHBhcnMuam9pbignJicpIDogXCJcIik7XHJcbiAgICAgICAgICAgIHJldHVybiB1cmw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVybDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIEhlbHBlci5wcm90b3R5cGUudXBkYXRlVXJsID0gZnVuY3Rpb24ocGFyYW1ldGVyLCB2YWx1ZSkge1xyXG4gICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSgnJywgJycsIHVwZGF0ZVF1ZXJ5U3RyaW5nUGFyYW1ldGVyKHdpbmRvdy5sb2NhdGlvbi5ocmVmLCBwYXJhbWV0ZXIsIHZhbHVlKSk7XHJcbiAgICB9XHJcblxyXG4gICAgSGVscGVyLnByb3RvdHlwZS5yZWxvYWRVcmwgPSBmdW5jdGlvbiAobW9kZWwpIHtcclxuICAgICAgdmFyIHBhcmFtcyA9IFwiXCJcclxuXHJcbiAgICAgIGlmIChtb2RlbC5TZWFyY2hCb3hRdWVyeSAmJiBtb2RlbC5TZWFyY2hCb3hRdWVyeS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcGFyYW1zID0gXCI/cT1cIiArIG1vZGVsLlNlYXJjaEJveFF1ZXJ5O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsLkZpbHRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAobW9kZWwuRmlsdGVyc1tpXS5GaWVsZFZhbHVlICYmIG1vZGVsLkZpbHRlcnNbaV0uRmllbGRWYWx1ZS5sZW5ndGggPiAwKSB7XHJcblx0XHRcclxuXHRcdCAgdmFyIGZpZWxkVmFsdWUgPSBtb2RlbC5GaWx0ZXJzW2ldLkZpZWxkVmFsdWU7XHJcblx0XHQgIC8vIFdlIG5lZWQgdG8gcmVwbGFjZSAnJnJlZzsnIGJlY2F1c2UgJyYnLCBzZWU6IGh0dHBzOi8vamlyYS5rdWVobGhhdXMuY29tL2Jyb3dzZS9LVlQtNDZcclxuXHRcdCAgZmllbGRWYWx1ZSA9IGZpZWxkVmFsdWUucmVwbGFjZSgnJnJlZzsnLCctcmVnLScpO1xyXG5cdFx0ICBcclxuICAgICAgICAgIGlmIChpID09IDAgJiYgcGFyYW1zLmluZGV4T2YoJz8nKSA9PT0gLTEpIHtcclxuICAgICAgICAgICAgcGFyYW1zID0gXCI/XCIgKyBtb2RlbC5GaWx0ZXJzW2ldLkZpZWxkTmFtZSArIFwiPVwiICsgZmllbGRWYWx1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcyArIFwiJlwiICsgbW9kZWwuRmlsdGVyc1tpXS5GaWVsZE5hbWUgKyBcIj1cIiArIGZpZWxkVmFsdWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSgnJywgJycsIHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCc/JylbMF0gKyBwYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgICQuaGVscGVyID0gbmV3IEhlbHBlciwgJC5oZWxwZXIuQ29uc3RydWN0b3IgPSBIZWxwZXI7XHJcblxyXG59KHdpbmRvdy5qUXVlcnkpXHJcblxyXG4kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XHJcblxyXG59KTtcclxuLy9QYWdlclxyXG4hZnVuY3Rpb24gKCQpIHtcclxuICAgIFwidXNlIHN0cmljdFwiO1xyXG5cclxuICAgIHZhciBQYWdlciA9IGZ1bmN0aW9uICgpIHsgfTtcclxuXHJcbiAgICB2YXIgaGFuZGxlYmFyUGFnZXJUZW1wYXRlU2VsZWN0b3IgPSBcIiNwYWdpbmctdGVtcGxhdGVcIjtcclxuXHJcbiAgICBQYWdlci5wcm90b3R5cGUuYnVpbGQgPSBmdW5jdGlvbiAoZSkge1xyXG5cclxuXHRcdGlmKGUgJiYgZS5FbGVtZW50cyAmJiBlLkVsZW1lbnRzLmxlbmd0aCA+IDEpe1xyXG5cdFx0XHR2YXIgcGFnZXJUZW1wbGF0ZSA9IGpRdWVyeShoYW5kbGViYXJQYWdlclRlbXBhdGVTZWxlY3RvcikuaHRtbCgpO1xyXG5cdFx0XHR2YXIgaGFuZGxlQmFyUGFnZXJUZXBsYXRlID0gSGFuZGxlYmFycy5jb21waWxlKHBhZ2VyVGVtcGxhdGUpO1xyXG5cdFx0XHQkKFwiI3BhZ2VyLWNvbnRhaW5lclwiKS5odG1sKGhhbmRsZUJhclBhZ2VyVGVwbGF0ZShlKSlcclxuXHJcblx0XHRcdGNvbnNvbGUubG9nKFwicGFnZXIgaXMgcmVuZGVyZWRcIik7XHJcblx0XHR9ICAgZWxzZXtcclxuXHRcdFx0JChcIiNwYWdlci1jb250YWluZXJcIikuZW1wdHkoKTtcclxuXHRcdH1cdFx0XHRcclxuICAgIH1cclxuXHJcbiAgICBQYWdlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAobmV3UGFnZSkge1xyXG5cdFx0aWYoIW5ld1BhZ2Upe1xyXG5cdFx0XHRuZXdQYWdlID0gMTtcclxuXHRcdH1cclxuICAgICAgICAkKFwiI3BhZ2VyLWN1cnJlbnQtcGFnZVwiKS52YWwobmV3UGFnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgUGFnZXIucHJvdG90eXBlLmN1cnJlbnRQYWdlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBjdXJyZW50UGFnZSA9ICQoXCIjcGFnZXItY3VycmVudC1wYWdlXCIpLnZhbCgpO1xyXG4gICAgICAgIHJldHVybiBjdXJyZW50UGFnZTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgaW5pdENvbW1vbkV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIFwiLnBhZ2luYXRpb24gLnBhZ2UtbGlua1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICB2YXIgc2VuZGVyID0gJCh0aGlzKTtcclxuICAgICAgICAgICAgaWYoc2VuZGVyLmZpbmQoXCJzcGFuXCIpLmxlbmd0aCA+IDAgfHwgc2VuZGVyLnBhcmVudCgpLmhhc0NsYXNzKCdkaXNhYmxlZCcpKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB2YXIgcGFnZSA9IHNlbmRlci5hdHRyKFwiZGF0YS1yZXF1ZXN0cGFnZVwiKTtcclxuICAgICAgICAgICAgJChcIiNwYWdlci1jdXJyZW50LXBhZ2VcIikudmFsKHBhZ2UpO1xyXG4gICAgICAgICAgICAkKHdpbmRvdykudHJpZ2dlcihcInBhZ2VyOnNlbGVjdGVkXCIpO1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vaW5pdGlsaXppbmdcclxuICAgIFBhZ2VyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGluaXRDb21tb25FdmVudHMoKTtcclxuICAgIH07XHJcblxyXG4gICAgJC5wYWdlciA9IG5ldyBQYWdlciwgJC5wYWdlci5Db25zdHJ1Y3RvciA9IFBhZ2VyO1xyXG5cclxufSh3aW5kb3cualF1ZXJ5KSxcclxuXHJcbiAgICAvL2luaXRpYWxpemluZyBtYWluIGFwcGxpY2F0aW9uIG1vZHVsZVxyXG4gICAgZnVuY3Rpb24gKCQpIHtcclxuICAgICAgICBcInVzZSBzdHJpY3RcIjtcclxuICAgICAgICBpZigkKCcjcGFnZXItY29udGFpbmVyJykubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgICQucGFnZXIuaW5pdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH0od2luZG93LmpRdWVyeSk7XHJcbi8vQW5hbHl0aWNzXHJcbiEgZnVuY3Rpb24oJCkge1xyXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XHJcblxyXG4gICAgdmFyIEFuYWx5dGljcyA9IGZ1bmN0aW9uKCkge307XHJcblxyXG4gICAgQW5hbHl0aWNzLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKSB7XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICB2YXIgcmVnaXN0ZXJTZWFyY2hFdmVudCA9IGZ1bmN0aW9uKHNlYXJjaEtleXdvcmRzKSB7XHJcbiAgICAgICAgaWYgKHNlYXJjaEtleXdvcmRzICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJBbmFseXRpY3M6cmVnaXN0ZXJTZWFyY2hFdmVudDogJ1wiICsgc2VhcmNoS2V5d29yZHMgKyBcIic7XCIpO1xyXG4gICAgICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdDtcclxuICAgICAgICAgICAgdmFyIGV2ZW50RGF0YSA9IFwiU2VhcmNoLCwsXCIgKyBlbmNvZGVVUklDb21wb25lbnQoc2VhcmNoS2V5d29yZHMpO1xyXG4gICAgICAgICAgICByZXF1ZXN0Lm9wZW4oXCJHRVRcIiwgd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVswXSArIFwiLz9zY190cms9XCIgKyBldmVudERhdGEsIHRydWUpO1xyXG4gICAgICAgICAgICByZXF1ZXN0LnNlbmQoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIEFuYWx5dGljcy5wcm90b3R5cGUucmVnaXN0ZXJQcm9kdWN0U2VhcmNoRXZlbnQgPSBmdW5jdGlvbihzZWFyY2hLZXl3b3JkcywgY2F0ZWdvcnksIGJyYW5kKSB7XHJcbiAgICAgICAgdmFyIGRhdGEgPSBcIlwiO1xyXG4gICAgICAgIHZhciBjb3VudGVyID0gMDtcclxuICAgICAgICBpZiAoc2VhcmNoS2V5d29yZHMgIT0gbnVsbCAmJiBzZWFyY2hLZXl3b3JkcyAhPSAnJyAmJiBzZWFyY2hLZXl3b3JkcyAhPSAwKSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBkYXRhICsgc2VhcmNoS2V5d29yZHMgKyBcIiBcIjtcclxuICAgICAgICAgICAgY291bnRlciA9IGNvdW50ZXIgKyAxO1xyXG4gICAgICAgICAgICByZWdpc3RlclNlYXJjaEV2ZW50KHNlYXJjaEtleXdvcmRzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNhdGVnb3J5ICE9IG51bGwgJiYgY2F0ZWdvcnkgIT0gJycgJiYgY2F0ZWdvcnkgIT0gMCkge1xyXG4gICAgICAgICAgICBkYXRhID0gZGF0YSArIGNhdGVnb3J5ICsgXCIgXCI7XHJcbiAgICAgICAgICAgIGNvdW50ZXIgPSBjb3VudGVyICsgMTtcclxuICAgICAgICAgICAgcmVnaXN0ZXJTZWFyY2hFdmVudChjYXRlZ29yeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChicmFuZCAhPSBudWxsICYmIGJyYW5kICE9ICcnICYmIGJyYW5kICE9IDApIHtcclxuICAgICAgICAgICAgZGF0YSA9IGRhdGEgKyBicmFuZCArIFwiIFwiO1xyXG4gICAgICAgICAgICBjb3VudGVyID0gY291bnRlciArIDE7XHJcbiAgICAgICAgICAgIHJlZ2lzdGVyU2VhcmNoRXZlbnQoYnJhbmQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF0YSAhPSBcIlwiICYmIGNvdW50ZXIgPiAxKSB7XHJcbiAgICAgICAgICAgIHJlZ2lzdGVyU2VhcmNoRXZlbnQoZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBBbmFseXRpY3MucHJvdG90eXBlLnJlZ2lzdGVyU2VhcmNoRXZlbnQgPSBmdW5jdGlvbihzZWFyY2hLZXl3b3Jkcykge1xyXG4gICAgICAgIHJlZ2lzdGVyU2VhcmNoRXZlbnQoc2VhcmNoS2V5d29yZHMpO1xyXG4gICAgfTtcclxuXHJcbiAgICAkLmFuYWx5dGljcyA9IG5ldyBBbmFseXRpY3MsICQuYW5hbHl0aWNzLkNvbnN0cnVjdG9yID0gQW5hbHl0aWNzO1xyXG5cclxufSh3aW5kb3cualF1ZXJ5KSxcclxuXHJcbi8vaW5pdGlhbGl6aW5nIG1haW4gYXBwbGljYXRpb24gbW9kdWxlXHJcbmZ1bmN0aW9uKCQpIHtcclxuICAgIFwidXNlIHN0cmljdFwiO1xyXG4gICAgJC5hbmFseXRpY3MuaW5pdCgpO1xyXG59KHdpbmRvdy5qUXVlcnkpO1xyXG4vLyQod2luZG93KS5yZXNpemUoYWRkTW9iaWxlTmF2aWdhdGlvbik7XHJcblxyXG5qUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcclxuICBzZXRDb29raWVCYW5uZXIoKTtcclxuICBqUXVlcnkoJy5zbGlkZXItaG9sZGVyJykuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgc2xpZGVJblJvdyA9IGpRdWVyeSh0aGlzKS5kYXRhKCd2YWx1ZScpO1xyXG4gICAgdmFyIG1vYmlsZVZhbHVlID0galF1ZXJ5KHRoaXMpLmRhdGEoJ21vYmlsZS12aWV3Jyk7XHJcbiAgICB2YXIgdGFibGV0VmFsdWUgPSBqUXVlcnkodGhpcykuZGF0YSgndGFibGV0LXZpZXcnKTtcclxuICAgIHZhciByb3dzID0gMTtcclxuICAgIGlmICh0aGlzLmlkID09IFwib3VyQnJhbmRzXCIpIHtcclxuICAgICAgcm93cyA9IDI7XHJcbiAgICB9XHJcbiAgICBqUXVlcnkodGhpcykuc2xpY2soe1xyXG4gICAgICBpbmZpbml0ZTogdHJ1ZSxcclxuICAgICAgZG90czogdHJ1ZSxcclxuICAgICAgc2xpZGVzVG9TaG93OiBzbGlkZUluUm93LFxyXG4gICAgICBzbGlkZXNUb1Njcm9sbDogc2xpZGVJblJvdyxcclxuICAgICAgcm93czogMSxcclxuICAgICAgc2xpZGVzUGVyUm93OiAxLFxyXG4gICAgICBhdXRvcGxheTogdHJ1ZSxcclxuICAgICAgYXV0b3BsYXlTcGVlZDogNTAwMCxcclxuICAgICAgcmVzcG9uc2l2ZTogW3tcclxuICAgICAgICAgIGJyZWFrcG9pbnQ6IDc2NyxcclxuICAgICAgICAgIHNldHRpbmdzOiB7XHJcbiAgICAgICAgICAgIHJvd3M6IHJvd3MsXHJcbiAgICAgICAgICAgIHNsaWRlc1BlclJvdzogMSxcclxuICAgICAgICAgICAgc2xpZGVzVG9TaG93OiBtb2JpbGVWYWx1ZSxcclxuICAgICAgICAgICAgc2xpZGVzVG9TY3JvbGw6IG1vYmlsZVZhbHVlXHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgYnJlYWtwb2ludDogOTkyLFxyXG4gICAgICAgICAgc2V0dGluZ3M6IHtcclxuICAgICAgICAgICAgc2xpZGVzVG9TaG93OiB0YWJsZXRWYWx1ZSxcclxuICAgICAgICAgICAgc2xpZGVzVG9TY3JvbGw6IHRhYmxldFZhbHVlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgXVxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYoalF1ZXJ5KHRoaXMpLmhhc0NsYXNzKCd2aWRlb1NsaWRlcicpKSB7XHJcblxyXG4gICAgICB2YXIgJGN1cnJlbnRTbGlkZSA9IGpRdWVyeSh0aGlzKS5maW5kKFwiLnNsaWNrLWN1cnJlbnRcIik7XHJcbiAgICAgIHZhciAkeUZyYW1lID0gJGN1cnJlbnRTbGlkZS5maW5kKFwiaWZyYW1lXCIpO1xyXG4gICAgICBpZigkeUZyYW1lKXtcclxuICAgICAgICB2YXIgJHVybCA9ICR5RnJhbWUuYXR0cignc3JjJykgKyAnJmF1dG9wbGF5PTEnO1xyXG4gICAgICAgICR5RnJhbWUuYXR0cignc3JjJywgJHVybCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGpRdWVyeSh0aGlzKS5vbihcImJlZm9yZUNoYW5nZVwiLCBmdW5jdGlvbiAoZXZlbnQsIHNsaWNrLCBjdXJyZW50U2xpZGUsIG5leHRTbGlkZSkge1xyXG5cclxuICAgICAgICB2YXIgJGN1cnJlbnRWaWRlbyA9IGpRdWVyeSh0aGlzKS5maW5kKFwiW2RhdGEtc2xpY2staW5kZXg9J1wiICsgY3VycmVudFNsaWRlICtcIiddIHZpZGVvXCIpO1xyXG4gICAgICAgIHZhciAkbmV4dFZpZGVvID0galF1ZXJ5KHRoaXMpLmZpbmQoXCJbZGF0YS1zbGljay1pbmRleD0nXCIgKyBuZXh0U2xpZGUgK1wiJ10gdmlkZW9cIik7XHJcblxyXG4gICAgICAgIHZhciAkY3VycmVudElmcmFtZSA9IGpRdWVyeSh0aGlzKS5maW5kKFwiW2RhdGEtc2xpY2staW5kZXg9J1wiICsgY3VycmVudFNsaWRlICtcIiddIGlmcmFtZVwiKTtcclxuICAgICAgICB2YXIgJG5leHRJZnJhbWUgPSAgalF1ZXJ5KHRoaXMpLmZpbmQoXCJbZGF0YS1zbGljay1pbmRleD0nXCIgKyBuZXh0U2xpZGUgK1wiJ10gaWZyYW1lXCIpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGlmKCRjdXJyZW50SWZyYW1lLmxlbmd0aCkge1xyXG4gICAgICAgICAgJGN1cnJlbnRJZnJhbWVbMF0uY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgne1wiZXZlbnRcIjpcImNvbW1hbmRcIixcImZ1bmNcIjpcIicgKyAncGF1c2VWaWRlbycgKyAnXCIsXCJhcmdzXCI6XCJcIn0nLCAnKicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoJG5leHRJZnJhbWUubGVuZ3RoKSB7XHJcbiAgICAgICAgICAkbmV4dElmcmFtZVswXS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCd7XCJldmVudFwiOlwiY29tbWFuZFwiLFwiZnVuY1wiOlwiJyArICdwbGF5VmlkZW8nICsgJ1wiLFwiYXJnc1wiOlwiXCJ9JywgJyonKTtcclxuICAgICAgICB9XHJcbiAgICAgXHJcbiAgICAgICAgaWYoJGN1cnJlbnRWaWRlby5sZW5ndGgpIHtcclxuICAgICAgICAgICRjdXJyZW50VmlkZW9bMF0ucGF1c2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCRuZXh0VmlkZW8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAkbmV4dFZpZGVvWzBdLnBsYXkoKVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIFxyXG4gIH0pO1xyXG5cclxuICAvL2FkZE1vYmlsZU5hdmlnYXRpb24oKTtcclxuICBqUXVlcnkoJy5qcy1zbGlkZW91dC1tb2JpbGUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBqUXVlcnkodGhpcykudG9nZ2xlQ2xhc3MoJ29wZW4nKTtcclxuICAgIGpRdWVyeSgnYm9keSwgaHRtbCcpLnRvZ2dsZUNsYXNzKCdub3Njcm9sbCcpO1xyXG4gICAgalF1ZXJ5KCdoZWFkZXInKS50b2dnbGVDbGFzcygnbW9iaWxlLW9wZW4nKTtcclxuXHJcbiAgfSk7XHJcblxyXG4gIGpRdWVyeSgnLmNvbnRhY3RzQ2FsbF9fbGFiZWwnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBqUXVlcnkodGhpcykucGFyZW50KCcuY29udGFjdHNDYWxsJykudG9nZ2xlQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gIH0pO1xyXG4gIGpRdWVyeSgnc2VsZWN0LmZvcm0tY29udHJvbCcpLnNlbGVjdHBpY2tlcih7fSk7XHJcbiAgc2hvd01vYmlsZU5hdmlnYXRpb24oKTtcclxuICBqUXVlcnkoJy5zdWJuYXZDbG9zZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgIGpRdWVyeSgnLmNvbGxhcHNlU3ViTmF2JykucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlU3ViTmF2Jyk7XHJcbiAgfSk7XHJcbiAgalF1ZXJ5KCdib2R5Jykub24oJ2NsaWNrJywgJy5qcy1zbGlkZW91dC1tb2JpbGUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBqUXVlcnkoJy5tb2JpbGUtb3BlbicpLnJlbW92ZUNsYXNzKCcubW9iaWxlLW9wZW4nKTtcclxuICAgIGpRdWVyeSgnLmNvbGxhcHNlU3ViTmF2JykucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlU3ViTmF2Jyk7XHJcbiAgfSk7XHJcbiAgc2hvd01vYmlsZU5hdmlnYXRpb24oKTtcclxuICBvcGVuRm9vdGVyTmF2aWdhdGlvbigpO1xyXG4gIHJlbGF0ZWRQcm9kdWN0c1NsaWRlcigpO1xyXG4gICQod2luZG93KS5yZXNpemUoZnVuY3Rpb24gKCkge1xyXG4gICAgc2hvd01vYmlsZU5hdmlnYXRpb24oKTtcclxuICAgIG9wZW5Gb290ZXJOYXZpZ2F0aW9uKCk7XHJcbiAgICAvLyByZWxhdGVkUHJvZHVjdHNTbGlkZXIoKTtcclxuICB9KTtcclxuICBqUXVlcnkoJy5zaG93TGFuZ3VhZ2VMaXN0Jykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGN1cnJlblN0YXRlID0galF1ZXJ5KHRoaXMpLnBhcmVudCgnLnNlbGVjdENvdW50cnlCbG9ja19fbGlzdC1pdGVtJykuaGFzQ2xhc3MoJ29wZW4nKTtcclxuICAgIGpRdWVyeSgnLnNlbGVjdENvdW50cnlCbG9ja19fbGlzdC1pdGVtJykucmVtb3ZlQ2xhc3MoJ29wZW4nKTtcclxuXHJcbiAgICBpZiAoY3VycmVuU3RhdGUpIHt9IGVsc2Uge1xyXG4gICAgICBqUXVlcnkodGhpcykucGFyZW50KCcuc2VsZWN0Q291bnRyeUJsb2NrX19saXN0LWl0ZW0nKS5hZGRDbGFzcygnb3BlbicpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG4gIGlmIChqUXVlcnkoJy5wcm9kdWN0SW1hZ2VTbGlkZXInKS5sZW5ndGggIT0gMCkge1xyXG4gICAgYWRkUHJvZGVjdFNsaWRlcigpO1xyXG4gIH1cclxuICBqUXVlcnkoJ2JvZHknKS5vbignY2xpY2snLCAnLmRyb3Bkb3duVG9nZ2xlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIHBhcmVudCA9IGpRdWVyeSh0aGlzKS5wYXJlbnQoJy5kcm9wZG93blRhcmdldCcpO1xyXG4gICAgaWYgKHBhcmVudC5oYXNDbGFzcyhcImxvY2F0aW9uTGlzdF9faXRlbVwiKSkge1xyXG4gICAgICBqUXVlcnkoXCIubG9jYXRpb25MaXN0X19pdGVtLmRyb3Bkb3duVGFyZ2V0Lm9wZW5cIikubm90KHBhcmVudCkucmVtb3ZlQ2xhc3MoXCJvcGVuXCIpO1xyXG4gICAgICBwYXJlbnQudG9nZ2xlQ2xhc3MoXCJvcGVuXCIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcGFyZW50LnRvZ2dsZUNsYXNzKCdvcGVuJyk7XHJcbiAgICB9XHJcbiAgfSk7XHJcbiAgalF1ZXJ5KCcuZ2xvc3NhcnlWYWx1ZXMgbGknKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBqUXVlcnkoJy5nbG9zc2FyeUxpc3RfX2l0ZW1bZGF0YS12YWx1ZT1cIicgKyBqUXVlcnkodGhpcykuZGF0YSgndGFyZ2V0JykgKyAnXCJdJykuYWRkQ2xhc3MoJ29wZW4nKTtcclxuICB9KTtcclxuICAvLyBpZihqUXVlcnkoJy5zZWFyY2hSZXN1bHRzJykubGVuZ3RoICE9IDApIHtcclxuICAvLyAkLmdldEpTT04oIFwiZGF0YS9zZWFyY2guanNvblwiLCBmdW5jdGlvbiggZGF0YSApIHtcclxuICAvLyBwcmludFNlYXJjaFJlc3VsdHMoZGF0YSk7XHJcbiAgLy8gfSlcclxuICAvLyB9XHJcbiAgalF1ZXJ5KCcuc2hvd1ZpZGVvUG9wdXAnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgdXJsID0galF1ZXJ5KHRoaXMpLmRhdGEoJ3VybCcpO1xyXG4gICAgalF1ZXJ5KCcjdmlkZW9Nb2RhbCAubW9kYWwtZGlhbG9nJykuYXBwZW5kKFxyXG4gICAgICAnPGlmcmFtZSBzcmMgPSBcIicgKyB1cmwgKyAnXCIgd2lkdGg9XCIxMDAlXCIgPjwvaWZyYW1lPidcclxuICAgIClcclxuICB9KTtcclxuICAkKCcjdmlkZW9Nb2RhbCcpLm9uKCdoaWRkZW4uYnMubW9kYWwnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICBqUXVlcnkoJyN2aWRlb01vZGFsJykuZmluZCgnaWZyYW1lJykucmVtb3ZlKCk7XHJcbiAgfSlcclxuICBoZWFkZXJTZXJhY2goKTtcclxuICB1c2VDYXNlU2xpZGVyKCk7XHJcblxyXG4gIC8vcHJpbnREb3dubG9hZFJlc3VsdHMoKTtcclxuICBmaWx0ZXJDYXJlZXJQYWdlKCk7XHJcblxyXG4gICQoJ2JvZHknKS5vbihcImNsaWNrXCIsIFwiW2RhdGEtdHJhY2stZ29hbF1cIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGlkID0gJCh0aGlzKS5hdHRyKCdkYXRhLXRyYWNrLWdvYWwnKTtcclxuICAgIHZhciBwdXNoRGF0YSA9IHtcclxuICAgICBpZCA6IGlkXHJcbiAgICB9O1xyXG4gICAgJC5oZWxwZXIuYWpheChcIi9hamF4L2NvbW1vbi90cmFja2dvYWxcIiwgcHVzaERhdGEsIGZ1bmN0aW9uKGUpeyB9KTtcclxuICB9KTtcclxuXHJcblxyXG59KTtcclxuXHJcblxyXG5mdW5jdGlvbiBzZXRDb29raWVCYW5uZXIoKSB7XHJcbiAgdmFyIENPT0tJRV9OQU1FID0gJ2t2dF9jb29raWUnO1xyXG4gIHZhciBjcmVhdGVDb29raWUgPSBmdW5jdGlvbiBjcmVhdGVDb29raWUobmFtZSwgdmFsdWUsIGRheXMpIHtcclxuICAgIGRvY3VtZW50LmNvb2tpZSA9IG5hbWUgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkgKyBcIjtwYXRoPS87ZG9tYWluPVwiICsgZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUgKyBcIjttYXgtYWdlPVwiICsgNjAgKiA2MCAqIDI0ICogZGF5cztcclxuICAgICQoJy5jb29raWVzLXBvbGljeScpLnJlbW92ZSgpO1xyXG4gIH07XHJcbiAgdmFyIGNvb2tpZXNJbmZvID0gZnVuY3Rpb24gY29va2llc0luZm8oKSB7XHJcbiAgICByZXR1cm4gY3JlYXRlQ29va2llKENPT0tJRV9OQU1FLCAnMScsIDMwKTtcclxuICB9O1xyXG5cclxuICBpZiAoZG9jdW1lbnQuY29va2llLmluZGV4T2YoQ09PS0lFX05BTUUpICE9PSAtMSkge1xyXG4gICAgJCgnLmNvb2tpZXMtcG9saWN5JykucmVtb3ZlKCk7XHJcbiAgfVxyXG5cclxuICAkKCcuY29va2llcy1wb2xpY3kgYnV0dG9uJykub24oJ2NsaWNrJywgY29va2llc0luZm8pO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gZmlsdGVyQ2FyZWVyUGFnZSgpIHtcclxuICBqUXVlcnkoJy5jYXJlZXJGaWx0ZXInKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGN1cmVudEZpbHRlciA9IGpRdWVyeShcIi5jYXJlZXJGaWx0ZXIgOnNlbGVjdGVkXCIpLmRhdGEoJ3RhcmdldCcpO1xyXG4gICAgaWYgKGN1cmVudEZpbHRlciAhPSAwKSB7XHJcbiAgICAgIGpRdWVyeSgnLmNhcmVlckxpc3RpbmdfX2l0ZW0nKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XHJcbiAgICAgIGpRdWVyeSgnLmNhcmVlckxpc3RpbmdfX2l0ZW1bZGF0YS1hdHRyPVwiJyArIGN1cmVudEZpbHRlciArICdcIl0nKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBqUXVlcnkoJy5jYXJlZXJMaXN0aW5nX19pdGVtJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgICBqUXVlcnkoJy5jYXJlZXJMaXN0aW5nX19pdGVtJykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgfVxyXG4gIH0pXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVzZUNhc2VTbGlkZXIoKSB7XHJcbiAgJCgnLnVzZUNhc2VTbGlkZXJfX2Rlc2NyaXB0aW9ucycpLnNsaWNrKHtcclxuICAgIHNsaWRlc1RvU2hvdzogMSxcclxuICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxyXG4gICAgYXJyb3dzOiB0cnVlLFxyXG4gICAgZmFkZTogZmFsc2UsXHJcbiAgICBkb3RzOiBmYWxzZSxcclxuICAgIGFzTmF2Rm9yOiAnLnVzZUNhc2VTbGlkZXJfX3JvdycsXHJcbiAgICBwcmV2QXJyb3c6ICQoJy51c2VDYXNlU2xpZGVyX19uYXZpZ2F0aW9uIC5wcmV2JyksXHJcbiAgICBuZXh0QXJyb3c6ICQoJy51c2VDYXNlU2xpZGVyX19uYXZpZ2F0aW9uIC5uZXh0JylcclxuICB9KTtcclxuXHJcbiAgJCgnLnVzZUNhc2VTbGlkZXJfX3JvdycpLnNsaWNrKHtcclxuICAgIHNsaWRlc1RvU2hvdzogMSxcclxuICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxyXG4gICAgYXNOYXZGb3I6ICcudXNlQ2FzZVNsaWRlcl9fZGVzY3JpcHRpb25zJyxcclxuXHJcbiAgICBhcnJvd3M6IGZhbHNlLFxyXG4gICAgaW5maW5pdGU6IHRydWUsXHJcbiAgICBkb3RzOiBmYWxzZSxcclxuICAgIGNlbnRlck1vZGU6IHRydWUsXHJcbiAgICBmb2N1c09uU2VsZWN0OiB0cnVlLFxyXG4gICAgdmFyaWFibGVXaWR0aDogdHJ1ZSxcclxuICAgIHJlc3BvbnNpdmU6IFt7XHJcbiAgICAgIGJyZWFrcG9pbnQ6IDEwMjQsXHJcbiAgICAgIHNldHRpbmdzOiB7XHJcbiAgICAgICAgLy8gaW5maW5pdGU6IGZhbHNlLFxyXG4gICAgICAgIHZhcmlhYmxlV2lkdGg6IGZhbHNlLFxyXG4gICAgICAgIGZvY3VzT25TZWxlY3Q6IGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH1dXHJcbiAgfSk7XHJcblxyXG4gICQoJy51c2VDYXNlU2xpZGVyX19kZXNjcmlwdGlvbnMnKS5vbignYmVmb3JlQ2hhbmdlJywgZnVuY3Rpb24gKGV2ZW50LCBzbGljaywgY3VycmVudFNsaWRlLCBuZXh0U2xpZGUpIHtcclxuICAgIHZhciBteVNsaWRlTnVtYmVyID0gbmV4dFNsaWRlO1xyXG4gICAgJCgnLnVzZUNhc2VTbGlkZXJfX3JvdyAuc2xpY2stc2xpZGUnKS5yZW1vdmVDbGFzcygnc2xpY2stYWN0aXZlJyk7XHJcbiAgICAkKCcudXNlQ2FzZVNsaWRlcl9fcm93IC5zbGljay1zbGlkZScpLmVxKG15U2xpZGVOdW1iZXIpLmFkZENsYXNzKCdzbGljay1hY3RpdmUnKTtcclxuICB9KTtcclxuXHJcblxyXG4gICQoJy51c2VDYXNlU2xpZGVyX19kZXNjcmlwdGlvbnMnKS5vbignYWZ0ZXJDaGFuZ2UnLCBmdW5jdGlvbiAoZXZlbnQsIHNsaWNrLCBjdXJyZW50U2xpZGUpIHtcclxuICAgICQoJy51c2VDYXNlQWJvdXQnKS5oaWRlKCkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gICAgJCgnLnVzZUNhc2VBYm91dFtkYXRhLWlkPScgKyAoY3VycmVudFNsaWRlICsgMSkgKyAnXScpLnNob3coKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcbiAgfSk7XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBwcmludERvd25sb2FkUmVzdWx0cygpIHtcclxuICAvKiQuZ2V0SlNPTiggXCJkYXRhL2Rvd25sb2FkLmpzb25cIiwgZnVuY3Rpb24oIGRhdGEgKSB7XHJcbiAgIHZhciB0ZW1wbGF0ZSA9IGpRdWVyeSgnI2Rvd25sb2FkTGlzdCcpLmh0bWwoKTtcclxuICAgdmFyIGhhbmRsZUJhclRlcGxhdGUgPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpO1xyXG4gICBqUXVlcnkoJy5kb3dubG9hZExpc3QnKS5odG1sKGhhbmRsZUJhclRlcGxhdGUoZGF0YSkpO1xyXG4gICB9KTsqL1xyXG59XHJcblxyXG5mdW5jdGlvbiBoZWFkZXJTZXJhY2goKSB7fVxyXG5cclxuZnVuY3Rpb24gY2hlY2tTbGlja05vU2xpZGUoKSB7XHJcbiAgdmFyIGVsbSA9ICQoJy5zbGljay1uYXYnKSxcclxuICAgIGdldFNsaWNrID0gZWxtLnNsaWNrKCdnZXRTbGljaycpO1xyXG5cclxuICBpZiAoZ2V0U2xpY2suc2xpZGVDb3VudCA8PSBnZXRTbGljay5vcHRpb25zLnNsaWRlc1RvU2hvdykge1xyXG4gICAgZWxtLmFkZENsYXNzKCdzbGljay1uby1zbGlkZScpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBlbG0ucmVtb3ZlQ2xhc3MoJ3NsaWNrLW5vLXNsaWRlJyk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwcmludFNlYXJjaFJlc3VsdHMoZGF0YSkge1xyXG4gIHZhciB0ZW1wbGF0ZSA9IGpRdWVyeSgnI2FsbFJlc3VsdHMnKS5odG1sKCk7XHJcbiAgdmFyIGhhbmRsZUJhclRlcGxhdGUgPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpO1xyXG4gIHZhciBzdWJUZW1wbGF0ZSA9IGpRdWVyeSgnI3Jlc3VsdHNMaXN0JykuaHRtbCgpO1xyXG4gIEhhbmRsZWJhcnMucmVnaXN0ZXJQYXJ0aWFsKCdyZXN1bHRzTGlzdCcsIHN1YlRlbXBsYXRlKTtcclxuICBqUXVlcnkoJy5zZWFyY2hSZXN1bHRzJykuaHRtbChoYW5kbGVCYXJUZXBsYXRlKGRhdGEpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gcmVsYXRlZFByb2R1Y3RzU2xpZGVyKCkge1xyXG4gIGlmIChqUXVlcnkoJy5yZWxhdGVkUHJvZHVjdHNfX3JvdycpLmxlbmd0aCAhPSAwKSB7XHJcbiAgICBqUXVlcnkoJy5yZWxhdGVkUHJvZHVjdHNfX3JvdycpLnNsaWNrKHtcclxuICAgICAgaW5maW5pdGU6IHRydWUsXHJcbiAgICAgIGRvdHM6IHRydWUsXHJcbiAgICAgIGFycm93czogdHJ1ZSxcclxuICAgICAgc2xpZGVzVG9TaG93OiAzLFxyXG4gICAgICBzbGlkZXNUb1Njcm9sbDogM1xyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFkZFByb2RlY3RTbGlkZXIoKSB7XHJcbiAgJCgnLnNsaWRlci1mb3InKS5zbGljayh7XHJcbiAgICBzbGlkZXNUb1Nob3c6IDEsXHJcbiAgICBzbGlkZXNUb1Njcm9sbDogMSxcclxuICAgIGZhZGU6IHRydWUsXHJcbiAgICBhcnJvd3M6IGZhbHNlLFxyXG4gICAgYXNOYXZGb3I6ICcuc2xpZGVyLW5hdicsXHJcbiAgICByZXNwb25zaXZlOiBbe1xyXG4gICAgICBicmVha3BvaW50OiA3NjcsXHJcbiAgICAgIHNldHRpbmdzOiB7XHJcbiAgICAgICAgYXNOYXZGb3I6IGZhbHNlLFxyXG4gICAgICAgIGFycm93czogdHJ1ZVxyXG4gICAgICB9XHJcbiAgICB9XVxyXG4gIH0pO1xyXG4gICQoJy5zbGlkZXItbmF2Jykuc2xpY2soe1xyXG4gICAgc2xpZGVzVG9TaG93OiA0LFxyXG4gICAgc2xpZGVzVG9TY3JvbGw6IDEsXHJcbiAgICBhc05hdkZvcjogJy5zbGlkZXItZm9yJyxcclxuICAgIGRvdHM6IHRydWUsXHJcbiAgICB2ZXJ0aWNhbDogdHJ1ZSxcclxuICAgIGNlbnRlck1vZGU6IHRydWUsXHJcbiAgICBmb2N1c09uU2VsZWN0OiB0cnVlLFxyXG4gICAgcmVzcG9uc2l2ZTogW1xyXG5cclxuICAgICAge1xyXG4gICAgICAgIGJyZWFrcG9pbnQ6IDc2NyxcclxuICAgICAgICBzZXR0aW5nczoge1xyXG4gICAgICAgICAgYXNOYXZGb3I6IGZhbHNlLFxyXG4gICAgICAgICAgdmVydGljYWw6IGZhbHNlLFxyXG4gICAgICAgICAgY2VudGVyTW9kZTogZmFsc2UsXHJcbiAgICAgICAgICB1bnNsaWNrOiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgYnJlYWtwb2ludDogOTkyLFxyXG4gICAgICAgIHNldHRpbmdzOiB7XHJcbiAgICAgICAgICB2ZXJ0aWNhbDogZmFsc2UsXHJcbiAgICAgICAgICBjZW50ZXJNb2RlOiBmYWxzZVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIF1cclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd01vYmlsZU5hdmlnYXRpb24oKSB7XHJcbiAgaWYgKGpRdWVyeSh3aW5kb3cpLndpZHRoKCkgPCAxMDI0KSB7XHJcbiAgICBqUXVlcnkoJy5oZWFkZXJfX21haW4tbGlua3MgLmRyb3Bkb3duID4gYScpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgalF1ZXJ5KCcuanMtc2xpZGVvdXQtbW9iaWxlJykuYWRkQ2xhc3MoJ29wZW4nKTtcclxuICAgICAgalF1ZXJ5KHRoaXMpLnBhcmVudCgnLmRyb3Bkb3duJykuYWRkQ2xhc3MoJ2NvbGxhcHNlU3ViTmF2Jyk7XHJcbiAgICAgIGpRdWVyeSgnaGVhZGVyLm1vYmlsZS1vcGVuJykuYWRkQ2xhc3MoJ2NvbGxhcHNlU3ViTmF2Jyk7XHJcbiAgICAgIGpRdWVyeSgnLm1vYmlsZU5hdmlnYXRpb25QYW5lbCcpLmFkZENsYXNzKCdjb2xsYXBzZVN1Yk5hdicpO1xyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG9wZW5Gb290ZXJOYXZpZ2F0aW9uKCkge1xyXG4gIGlmIChqUXVlcnkod2luZG93KS53aWR0aCgpIDwgNzY4KSB7XHJcbiAgICBqUXVlcnkoJy5mb290ZXJOYXZpZ2F0aW9uIGg0IGEnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGpRdWVyeSh0aGlzKS5jbG9zZXN0KCcuZm9vdGVyTmF2aWdhdGlvbicpLnRvZ2dsZUNsYXNzKCdvcGVuJylcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5qUXVlcnkoJy5wcm9kdWN0SW5mb19fdGFiIHAnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XHJcbiAgalF1ZXJ5KCcucHJvZHVjdEluZm9fX3RhYiBwLCAucHJvZHVjdEluZm9fX2luZm8gPiBkaXYnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XHJcbiAgalF1ZXJ5KCcucHJvZHVjdEluZm9fX2luZm8gPiBkaXYnKS5lcShqUXVlcnkodGhpcykuaW5kZXgoKSkuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xyXG4gIGpRdWVyeSh0aGlzKS5hZGRDbGFzcygnYWN0aXZlJyk7XHJcbn0pO1xyXG5qUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIGluaXREeW5hbWljRm9ybXMoKTtcclxuXHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gaW5pdER5bmFtaWNGb3JtcygpIHtcclxuICAgICQoJ2Zvcm1bZGF0YS13ZmZtXScpLmVhY2goZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgc2V0RGVmYXVsdFZhbHVlcygkKHRoaXMpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZXREZWZhdWx0VmFsdWVzKCRmb3JtKSB7XHJcbiAgICB2YXIgc2VhcmNoID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaDtcclxuICAgIHZhciBwYXJhbXMgPSBnZXRTZWFyY2hQYXJhbWV0ZXJzKHNlYXJjaCk7XHJcblxyXG4gICAgZm9yIChsZXQgcHJvcCBpbiBwYXJhbXMpIHtcclxuICAgICAgICBpZiAocHJvcCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgIHZhciBwcm9wVmFsdWUgPSBwYXJhbXNbcHJvcF07XHJcblxyXG4gICAgICAgICAgICBpZiAocGFyYW1zLmhhc093blByb3BlcnR5KHByb3ApICYmIHByb3BWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnROYW1lID0gcHJvcC50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudHMgPSAkZm9ybS5maW5kKGBbZGF0YS1zYy1maWVsZC1uYW1lPVwiJHtlbGVtZW50TmFtZX1cIl1gKTtcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5lYWNoKChpLCBlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gJChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBlbGVtZW50LmF0dHIoJ3R5cGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gZWxlbWVudC52YWwoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnByb3AoJ3RhZ05hbWUnKSA9PT0gJ1NFTEVDVCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsKHByb3BWYWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRhdGEoJ3NlbGVjdHBpY2tlcicpLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JhZGlvJzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBwcm9wVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wKCdjaGVja2VkJywgcHJvcFZhbHVlID09IFwidHJ1ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC52YWwocHJvcFZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0U2VhcmNoUGFyYW1ldGVycyhzZWFyY2gpIHtcclxuICAgIGlmICghc2VhcmNoKSB7XHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAoL15bPyNdLy50ZXN0KHNlYXJjaCkgPyBzZWFyY2guc2xpY2UoMSkgOiBzZWFyY2gpXHJcbiAgICAgICAgLnNwbGl0KCcmJylcclxuICAgICAgICAucmVkdWNlKChwYXJhbXMsIHBhcmFtKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBba2V5LCB2YWx1ZV0gPSBwYXJhbS5zcGxpdCgnPScpO1xyXG4gICAgICAgICAgICBsZXQgdmFsID0gdmFsdWUgPyBkZWNvZGVVUklDb21wb25lbnQodmFsdWUucmVwbGFjZSgvXFwrL2csICcgJykpIDogJyc7XHJcbiAgICAgICAgICAgIGtleSA9IGRlY29kZVVSSShrZXkpO1xyXG4gICAgICAgICAgICBpZiAodmFsICYmIHZhbC5pbmRleE9mKCcsJykgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXNba2V5XSA9IHZhbC5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zW2tleV0gPSB2YWw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwYXJhbXM7XHJcbiAgICAgICAgfSwge30pO1xyXG59XHJcbi8vTmV3cyBDZW50ZXIgUGFnZVxyXG4hZnVuY3Rpb24gKCQpIHtcclxuICAgIFwidXNlIHN0cmljdFwiO1xyXG5cdFxyXG5cdHZhciBwcm9kdWN0c0xhc3RDaGFuZ2VkRmlsdGVycyA9IFtdO1xyXG5cclxuICAgIHZhciBOZXdzQ2VudGVyUGFnZSA9IGZ1bmN0aW9uICgpIHsgfTtcclxuXHJcbiAgICB2YXIgaGFuZGxlYmFyUmVzdWx0VGVtcGF0ZVNlbGVjdG9yID0gXCIjcmVzdWx0LXRlbXBsYXRlXCI7XHJcbiAgICB2YXIgaGFuZGxlYmFyRmlsdGVyc1RlbXBhdGVTZWxlY3RvciA9IFwiI2ZpbHRlci10ZW1wbGF0ZVwiO1xyXG5cclxuICAgIHZhciByZWxvYWRSZXN1bHRzID0gZnVuY3Rpb24gKGxhc3RDaGFuZ2VkRmlsdGVyTmFtZSkge1xyXG5cdFx0aWYodHlwZW9mIGxhc3RDaGFuZ2VkRmlsdGVyTmFtZSAhPSBcInN0cmluZ1wiKXtcclxuXHRcdFx0bGFzdENoYW5nZWRGaWx0ZXJOYW1lID0gXCJcIjtcclxuXHRcdH1cclxuXHJcbiAgICAgICAgdmFyIHB1c2hEYXRhID0ge1xyXG4gICAgICAgICAgICBtb2RlbDoge1xyXG4gICAgICAgICAgICAgICAgU2VhcmNoQm94UXVlcnk6ICQoXCIjbmV3cy1maWx0ZXItcXVlcnlcIikudmFsKCksXHJcblx0XHRcdFx0TGFzdENoYW5nZWRGaWx0ZXJOYW1lOiAobGFzdENoYW5nZWRGaWx0ZXJOYW1lIHx8IFwiXCIpICsgXCJcIixcclxuICAgICAgICAgICAgICAgIEZpbHRlcnM6IFtdLFxyXG4gICAgICAgICAgICAgICAgUGFnZTogJC5wYWdlci5jdXJyZW50UGFnZSgpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246ICQoXCIjc291cmNlLWlkXCIpLnZhbCgpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgJChcIi5wcm9kdWN0c0ZpbHRlciBzZWxlY3RcIikuZWFjaChmdW5jdGlvbihpLCBlbCl7XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9ICQoZWwpLnZhbCgpO1xyXG4gICAgICAgICAgICBpZih2YWx1ZSAhPSBcIjBcIil7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmllbGRuYW1lID0gJChlbCkuYXR0cihcImRhdGEtZmllbGRuYW1lXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGZpbHRlciA9IHtcclxuICAgICAgICAgICAgICAgICAgICBGaWVsZE5hbWU6IGZpZWxkbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBGaWVsZFZhbHVlOiB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHB1c2hEYXRhLm1vZGVsLkZpbHRlcnMucHVzaChmaWx0ZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoXCIucHJvZHVjdHNGaWx0ZXIgLmRlZmF1bHRcIikuZWFjaChmdW5jdGlvbiAoaSwgZWwpIHtcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gJChlbCkudmFsKCk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBcIjBcIikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkTmFtZSA9ICQoZWwpLmF0dHIoXCJkYXRhLWZpZWxkbmFtZVwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgRmllbGROYW1lOiBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgRmllbGRWYWx1ZTogdmFsdWVcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBwdXNoRGF0YS5tb2RlbC5GaWx0ZXJzLnB1c2goZmlsdGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkLmhlbHBlci5yZWxvYWRVcmwocHVzaERhdGEubW9kZWwpXHJcblxyXG4gICAgICAgJC5oZWxwZXIuYWpheChcIi9hamF4L25ld3MvZmlsdGVyXCIscHVzaERhdGEscmVuZGVyUmVzdWx0KTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgcmVuZGVyUmVzdWx0ID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICB2YXIgdGVtcGxhdGUgPSBqUXVlcnkoaGFuZGxlYmFyUmVzdWx0VGVtcGF0ZVNlbGVjdG9yKS5odG1sKCk7XHJcbiAgICAgICAgdmFyIGhhbmRsZUJhclRlcGxhdGUgPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpO1xyXG4gICAgICAgICQoXCIjbmV3cy1yZXN1bHQtbGlzdFwiKS5odG1sKGhhbmRsZUJhclRlcGxhdGUoZSkpXHJcblxyXG4gICAgICAgIHZhciBmaWx0ZXJzVGVtcGxhdGUgPSBqUXVlcnkoaGFuZGxlYmFyRmlsdGVyc1RlbXBhdGVTZWxlY3RvcikuaHRtbCgpO1xyXG4gICAgICAgIHZhciBoYW5kbGVCYXJGaWx0ZXJzVGVwbGF0ZSA9IEhhbmRsZWJhcnMuY29tcGlsZShmaWx0ZXJzVGVtcGxhdGUpO1xyXG5cdFx0alF1ZXJ5KCcjbmV3LWZpbHRlcnMtY29udGFpbmVyIC5zZWFyY2gtYm94Jykuc2libGluZ3MoJ2RpdicpLnJlbW92ZSgpO1xyXG4gICAgICAgICQoJyNuZXctZmlsdGVycy1jb250YWluZXIgLnNlYXJjaC1ib3gnKS5hZnRlcihoYW5kbGVCYXJGaWx0ZXJzVGVwbGF0ZShlKSlcclxuXHJcbiAgICAgICAgJC5wYWdlci5idWlsZChlLlBhZ2VyKTtcclxuXHJcbiAgICAgICAgalF1ZXJ5KCcjbmV3LWZpbHRlcnMtY29udGFpbmVyIHNlbGVjdC5mb3JtLWNvbnRyb2wnKS5zZWxlY3RwaWNrZXIoe30pO1xyXG5cclxuICAgICAgICAvL2pRdWVyeShcIiNuZXdzLWZpbHRlci1xdWVyeVwiKS52YWwoZS5TZWFyY2hCb3hRdWVyeSk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJwYWdlIGlzIHJlbmRlcmVkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciByZXNldEZpbHRlcnMgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICQoXCIucHJvZHVjdHNGaWx0ZXIgc2VsZWN0XCIpLmVhY2goZnVuY3Rpb24oaSwgZWwpe1xyXG4gICAgICAgICAgICAkKGVsKS52YWwoMCk7XHJcbiAgICAgICAgICAgICQoZWwpLmRhdGEoJ3NlbGVjdHBpY2tlcicpLnJlZnJlc2goKVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkLnBhZ2VyLnJlc2V0KCk7XHJcblxyXG4gICAgICAgICQoXCIjbmV3cy1maWx0ZXItcXVlcnlcIikudmFsKFwiXCIpO1xyXG5cclxuICAgICAgICByZWxvYWRSZXN1bHRzKCk7XHJcblxyXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgaW5pdENvbW1vbkV2ZW50cyA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkKHdpbmRvdykub24oXCJwYWdlcjpzZWxlY3RlZFwiLCByZWxvYWRSZXN1bHRzKTtcclxuXHJcbiAgICAgICAgJChkb2N1bWVudCkub24oIFwiY2hhbmdlXCIsIFwiLnByb2R1Y3RzRmlsdGVyIHNlbGVjdFwiLCBmdW5jdGlvbigpe1xyXG5cdFx0XHQkLnBhZ2VyLnJlc2V0KCk7XHJcbiAgICAgICAgICAgIHZhciBsYXN0Q2hhbmdlZEZpbHRlck5hbWUgPSBqUXVlcnkodGhpcykuYXR0cihcImRhdGEtZmllbGRuYW1lXCIpO1xyXG5cdFx0XHRpZiAoalF1ZXJ5KHRoaXMpLnZhbCgpICE9IFwiMFwiKSB7XHJcblx0XHRcdFx0cHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnMucHVzaChsYXN0Q2hhbmdlZEZpbHRlck5hbWUpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHByb2R1Y3RzTGFzdENoYW5nZWRGaWx0ZXJzLnBvcCgpO1xyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChwcm9kdWN0c0xhc3RDaGFuZ2VkRmlsdGVycy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0dmFyIGxhc3RBcnJheUVsZW1lbnQgPSBwcm9kdWN0c0xhc3RDaGFuZ2VkRmlsdGVyc1twcm9kdWN0c0xhc3RDaGFuZ2VkRmlsdGVycy5sZW5ndGggLSAxXTtcclxuXHRcdFx0XHRyZWxvYWRSZXN1bHRzKGxhc3RBcnJheUVsZW1lbnQpO1xyXG5cdFx0XHR9IGVsc2UgXHJcblx0XHRcdHtcclxuXHRcdFx0XHRyZWxvYWRSZXN1bHRzKCk7XHJcblx0XHRcdH1cclxuICAgICAgICB9ICk7XHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgXCIjbmV3cy1maWx0ZXJzLXJlc2V0XCIsIHJlc2V0RmlsdGVycyk7XHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwia2V5cHJlc3NcIiwgXCIjbmV3cy1maWx0ZXItcXVlcnlcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMykge1xyXG5cdFx0XHRcdCQucGFnZXIucmVzZXQoKTtcclxuICAgICAgICAgICAgICAgIHJlbG9hZFJlc3VsdHMoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHRcdHZhciB0aW1lb3V0SWQgPSAwO1xyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwia2V5dXBcIiwgXCIjbmV3cy1maWx0ZXItcXVlcnlcIiwgZnVuY3Rpb24oKXtcclxuXHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XHJcblx0XHRcdFxyXG4gICAgICAgICAgICBpZiggdGhpcy52YWx1ZS5sZW5ndGggPCA0ICl7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcbiAgICAgICAgICAgIFxyXG5cdFx0XHR2YXIgZXhlY3VyZVJlcXVlc3QgPSBmdW5jdGlvbigpe1xyXG5cdFx0XHRcdCQucGFnZXIucmVzZXQoKTtcclxuXHRcdFx0XHRyZWxvYWRSZXN1bHRzKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0XHJcblx0XHRcdHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZXhlY3VyZVJlcXVlc3QsIDUwMCk7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuICAgICAgICB9ICk7XHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgXCIjbmV3cy1xdWVyeS1zdWJtaXRcIiwgcmVsb2FkUmVzdWx0cyk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vaW5pdGlsaXppbmdcclxuICAgIE5ld3NDZW50ZXJQYWdlLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGluaXRDb21tb25FdmVudHMoKTtcclxuICAgICAgICByZWxvYWRSZXN1bHRzKCk7XHJcbiAgICB9O1xyXG5cclxuICAgICQubmV3c0NlbnRlclBhZ2UgPSBuZXcgTmV3c0NlbnRlclBhZ2UsICQubmV3c0NlbnRlclBhZ2UuQ29uc3RydWN0b3IgPSBOZXdzQ2VudGVyUGFnZTtcclxuXHJcbn0od2luZG93LmpRdWVyeSksXHJcblxyXG4gICAgLy9pbml0aWFsaXppbmcgbWFpbiBhcHBsaWNhdGlvbiBtb2R1bGVcclxuZnVuY3Rpb24gKCQpIHtcclxuXHRcInVzZSBzdHJpY3RcIjtcclxuXHRpZigkKCcjbmV3cy1jZW50ZXItcGFnZScpLmxlbmd0aCA+IDApe1xyXG5cdFx0JC5uZXdzQ2VudGVyUGFnZS5pbml0KCk7XHJcblx0fVxyXG59KHdpbmRvdy5qUXVlcnkpO1xyXG4kKGRvY3VtZW50KS5vbignY2xpY2snLCAnW2RhdGEtdG9nZ2xlPVwibGlnaHRib3hcIl0nLCBmdW5jdGlvbihldmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICQodGhpcykuZWtrb0xpZ2h0Ym94KHtcclxuICAgICAgICBhbHdheXNTaG93Q2xvc2U6IHRydWVcclxuICAgIH0pO1xyXG59KTtcclxuLy9Eb3dubG9hZCBDZW50ZXIgUGFnZVxyXG4hZnVuY3Rpb24gKCQpIHtcclxuICAgIFwidXNlIHN0cmljdFwiO1xyXG5cdFxyXG5cdHZhciBwcm9kdWN0c0xhc3RDaGFuZ2VkRmlsdGVycyA9IFtdO1xyXG5cclxuICAgIHZhciBEb3dubG9hZENlbnRlclBhZ2UgPSBmdW5jdGlvbiAoKSB7IH07XHJcblxyXG4gICAgdmFyIEZpbHRlclF1ZXJ5SWQgPSBcIkRvd25sb2FkQ2VudGVyRmlsdGVyUXVlcnlcIjtcclxuICAgIHZhciBGaWx0ZXJDb250YWluZXIgPSBcIkRvd25sb2FkQ2VudGVyRmlsdGVyQ29udGFpbmVyXCI7XHJcbiAgICB2YXIgRmlsdGVyUmVzZXQgPSBcIkRvd25sb2FkQ2VudGVyRmlsdGVyUmVzZXRcIjtcclxuICAgIHZhciBGaWx0ZXJDaGVja2JveENsYXNzID0gXCJGaWx0ZXJDaGVja2JveFwiO1xyXG4gICAgdmFyIEZpbHRlckNoZWNrYm94QWxsQ2xhc3MgPSBcIkZpbHRlckNoZWNrYm94QWxsXCI7XHJcbiAgICB2YXIgRmlsdGVyc1dyYXBwZXJJZCA9IFwiRG93bmxvYWRDZW50ZXJGaWx0ZXJzV3JhcHBlclwiO1xyXG4gICAgdmFyIERvd25sb2FkTGlzdENvbnRhaW5lcklkID0gXCJEb3dubG9hZExpc3RDb250YWluZXJcIjtcclxuXHJcbiAgICB2YXIgRmlsdGVyVGVtcGxhdGVJZCA9IFwiRG93bmxvYWRGaWx0ZXJUZW1wbGF0ZVwiO1xyXG4gICAgdmFyIERvd25sb2FkTGlzdFRlbXBsYXRlSWQgPSBcIkRvd25sb2FkTGlzdFRlbXBsYXRlXCI7XHJcblxyXG4gICAgdmFyIHJlbG9hZFJlc3VsdHMgPSBmdW5jdGlvbiAobGFzdENoYW5nZWRGaWx0ZXJOYW1lKSB7XHJcblx0XHRpZih0eXBlb2YgbGFzdENoYW5nZWRGaWx0ZXJOYW1lICE9IFwic3RyaW5nXCIpe1xyXG5cdFx0XHRsYXN0Q2hhbmdlZEZpbHRlck5hbWUgPSBcIlwiO1xyXG5cdFx0fVxyXG5cclxuICAgICAgICB2YXIgcHVzaERhdGEgPSB7XHJcbiAgICAgICAgICAgIG1vZGVsOiB7XHJcbiAgICAgICAgICAgICAgICBTZWFyY2hCb3hRdWVyeTogJChcIiNcIiArIEZpbHRlclF1ZXJ5SWQpLnZhbCgpLFxyXG5cdFx0XHRcdExhc3RDaGFuZ2VkRmlsdGVyTmFtZTogKGxhc3RDaGFuZ2VkRmlsdGVyTmFtZSB8fCBcIlwiKSArIFwiXCIsXHJcbiAgICAgICAgICAgICAgICBGaWx0ZXJzOiBbXSxcclxuICAgICAgICAgICAgICAgIFBhZ2U6IDEsXHJcbiAgICAgICAgICAgICAgICBNZWRpYVR5cGVGaWx0ZXJzOiBbXSxcclxuICAgICAgICAgICAgICAgIEN1cnJlbnRJdGVtSWQ6ICQoXCIjQ3VycmVudEl0ZW1JZFwiKS52YWwoKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uSWQ6ICQoXCIjU2VhcmNoQ29uZmlndXJhdGlvbklkXCIpLnZhbCgpXHJcblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgICQoXCIjXCIgKyBGaWx0ZXJDb250YWluZXIgKyBcIiBzZWxlY3RcIikuZWFjaChmdW5jdGlvbiAoaSwgZWwpIHtcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gJChlbCkudmFsKCk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBcIjBcIikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkbmFtZSA9ICQoZWwpLmF0dHIoXCJkYXRhLWZpZWxkbmFtZVwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgRmllbGROYW1lOiBmaWVsZG5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgRmllbGRWYWx1ZTogdmFsdWVcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBwdXNoRGF0YS5tb2RlbC5GaWx0ZXJzLnB1c2goZmlsdGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKFwiLnByb2R1Y3RzRmlsdGVyIC5kZWZhdWx0XCIpLmVhY2goZnVuY3Rpb24gKGksIGVsKSB7XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9ICQoZWwpLnZhbCgpO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSAkKGVsKS5hdHRyKFwiZGF0YS1maWVsZG5hbWVcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsdGVyID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkTmFtZTogZmllbGROYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkVmFsdWU6IHZhbHVlXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcHVzaERhdGEubW9kZWwuRmlsdGVycy5wdXNoKGZpbHRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJChcIi5cIiArIEZpbHRlckNoZWNrYm94Q2xhc3MpLmVhY2goZnVuY3Rpb24gKGksIGVsKSB7XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9ICQoZWwpLmF0dHIoXCJkYXRhLXZhbHVlXCIpO1xyXG4gICAgICAgICAgICB2YXIgZmllbGRuYW1lID0gJChlbCkuYXR0cihcImRhdGEtZmllbGRuYW1lXCIpO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gXCIwXCIgJiYgJChlbCkucHJvcCgnY2hlY2tlZCcpKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsdGVyID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkTmFtZTogZmllbGRuYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkVmFsdWU6IHZhbHVlXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcHVzaERhdGEubW9kZWwuRmlsdGVycy5wdXNoKGZpbHRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJC5oZWxwZXIucmVsb2FkVXJsKHB1c2hEYXRhLm1vZGVsKVxyXG5cclxuICAgICAgICAkLmhlbHBlci5hamF4KFwiL2FqYXgvZG93bmxvYWRzL2ZpbHRlclwiLCBwdXNoRGF0YSwgcmVuZGVyUmVzdWx0KTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgc2V0QWxsU2VsZWN0ZWRGb3JGaWVsZE5hbWVJZkFsbE1hcmtlZCA9IGZ1bmN0aW9uIChmaWVsZG5hbWUpe1xyXG5cdFx0aWYoZmllbGRuYW1lKXtcclxuXHRcdFx0dmFyIHNlbGVjdGVkID0gJChcIi5cIiArIEZpbHRlckNoZWNrYm94Q2xhc3MgKyBcIltkYXRhLWZpZWxkbmFtZT0nXCIgKyBmaWVsZG5hbWUgKyBcIiddOmNoZWNrZWRcIikubGVuZ3RoO1xyXG5cdFx0XHR2YXIgZXhpc3RzID0gJChcIi5cIiArIEZpbHRlckNoZWNrYm94Q2xhc3MgKyBcIltkYXRhLWZpZWxkbmFtZT0nXCIgKyBmaWVsZG5hbWUgKyBcIiddXCIpLmxlbmd0aDtcclxuXHRcdFx0dmFyIGFsbENoZWNrZWQgPSAkKFwiLlwiICsgRmlsdGVyQ2hlY2tib3hBbGxDbGFzcyArIFwiW2RhdGEtZmllbGRuYW1lPSdcIiArIGZpZWxkbmFtZSArIFwiJ11cIikucHJvcCgnY2hlY2tlZCcpO1xyXG5cclxuXHRcdFx0aWYgKGV4aXN0cyA9PSBzZWxlY3RlZCB8fCAoKGV4aXN0cyAtIDEpID09IHNlbGVjdGVkKSAmJiAhYWxsQ2hlY2tlZCkge1xyXG5cdFx0XHRcdCQoXCIuXCIgKyBGaWx0ZXJDaGVja2JveEFsbENsYXNzICsgXCJbZGF0YS1maWVsZG5hbWU9J1wiICsgZmllbGRuYW1lICsgXCInXVwiKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuICAgIH1cclxuXHJcbiAgICB2YXIgcmVuZGVyUmVzdWx0ID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICB2YXIgZG93bmxvYWRMaXN0VGVtcGxhdGUgPSBqUXVlcnkoXCIjXCIgKyBEb3dubG9hZExpc3RUZW1wbGF0ZUlkKS5odG1sKCk7XHJcbiAgICAgICAgdmFyIGhhbmRsZUJhckRvd25sb2FkTGlzdFRlbXBsYXRlID0gSGFuZGxlYmFycy5jb21waWxlKGRvd25sb2FkTGlzdFRlbXBsYXRlKTtcclxuICAgICAgICBqUXVlcnkoJyMnICsgRG93bmxvYWRMaXN0Q29udGFpbmVySWQpLmVtcHR5KCk7XHJcbiAgICAgICAgalF1ZXJ5KFwiI1wiICsgRG93bmxvYWRMaXN0Q29udGFpbmVySWQpLmh0bWwoaGFuZGxlQmFyRG93bmxvYWRMaXN0VGVtcGxhdGUoZSkpXHJcblxyXG4gICAgICAgIHZhciBmaWx0ZXJzVGVtcGxhdGUgPSBqUXVlcnkoXCIjXCIgKyBGaWx0ZXJUZW1wbGF0ZUlkKS5odG1sKCk7XHJcbiAgICAgICAgdmFyIGhhbmRsZUJhckZpbHRlcnNUZXBsYXRlID0gSGFuZGxlYmFycy5jb21waWxlKGZpbHRlcnNUZW1wbGF0ZSk7XHJcbiAgICAgICAgalF1ZXJ5KCcjJyArIEZpbHRlcnNXcmFwcGVySWQpLmVtcHR5KCk7XHJcbiAgICAgICAgalF1ZXJ5KCcjJyArIEZpbHRlcnNXcmFwcGVySWQpLmh0bWwoaGFuZGxlQmFyRmlsdGVyc1RlcGxhdGUoZSkpXHJcblxyXG4gICAgICAgIGpRdWVyeSgnIycgKyBGaWx0ZXJzV3JhcHBlcklkICsgJyBzZWxlY3QuZm9ybS1jb250cm9sJykuc2VsZWN0cGlja2VyKHt9KTtcclxuXHJcbiAgICAgICAgalF1ZXJ5KFwiI1wiICsgRmlsdGVyUXVlcnlJZCkudmFsKGUuU2VhcmNoQm94UXVlcnkpO1xyXG5cdFx0XHJcblx0XHQkKFwiLlwiICsgRmlsdGVyQ2hlY2tib3hBbGxDbGFzcykuZWFjaChmdW5jdGlvbiAoaSwgZWwpIHtcclxuICAgICAgICAgICAgdmFyIGZpZWxkbmFtZSA9ICQoZWwpLmF0dHIoXCJkYXRhLWZpZWxkbmFtZVwiKTtcclxuICAgICAgICAgICAgc2V0QWxsU2VsZWN0ZWRGb3JGaWVsZE5hbWVJZkFsbE1hcmtlZChmaWVsZG5hbWUpO1xyXG4gICAgICAgIH0pO1xyXG5cdFx0XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJEb3dubG9hZENlbnRlclBhZ2UgaXMgcmVuZGVyZWRcIik7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHJlc2V0RmlsdGVycyA9IGZ1bmN0aW9uIChlKSB7XHJcblx0XHRpZiAod2luZG93LmxvY2F0aW9uLnNlYXJjaCA9PSBcIlwiKSB7XHJcblx0XHRcdCQoXCIjXCIgKyBGaWx0ZXJDb250YWluZXIgKyBcIiBzZWxlY3RcIikuZWFjaChmdW5jdGlvbiAoaSwgZWwpIHtcclxuXHRcdFx0XHQkKGVsKS52YWwoMCk7XHJcblx0XHRcdFx0JChlbCkuZGF0YSgnc2VsZWN0cGlja2VyJykucmVmcmVzaCgpXHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0JChcIiNcIiArIEZpbHRlclF1ZXJ5SWQpLnZhbChcIlwiKTtcclxuXHJcblx0XHRcdCQoXCIuXCIgKyBGaWx0ZXJDaGVja2JveENsYXNzKS5lYWNoKGZ1bmN0aW9uIChpLCBlbCkge1xyXG5cdFx0XHRcdHZhciB2YWx1ZSA9ICQoZWwpLmF0dHIoXCJkYXRhLXZhbHVlXCIpO1xyXG5cdFx0XHRcdGlmICh2YWx1ZSA9PSBcIjBcIikge1xyXG5cdFx0XHRcdFx0JChlbCkucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQkKGVsKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRyZWxvYWRSZXN1bHRzKCk7XHJcblx0XHR9IGVsc2Uge1xyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IFtsb2NhdGlvbi5wcm90b2NvbCwgJy8vJywgbG9jYXRpb24uaG9zdCwgbG9jYXRpb24ucGF0aG5hbWVdLmpvaW4oJycpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBpbml0Q29tbW9uRXZlbnRzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwiY2hhbmdlXCIsIFwiI1wiICsgRmlsdGVyQ29udGFpbmVyICsgXCIgc2VsZWN0XCIsIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0JC5wYWdlci5yZXNldCgpO1xyXG4gICAgICAgICAgICB2YXIgbGFzdENoYW5nZWRGaWx0ZXJOYW1lID0galF1ZXJ5KHRoaXMpLmF0dHIoXCJkYXRhLWZpZWxkbmFtZVwiKTtcclxuXHRcdFx0aWYgKGpRdWVyeSh0aGlzKS52YWwoKSAhPSBcIjBcIikge1xyXG5cdFx0XHRcdHByb2R1Y3RzTGFzdENoYW5nZWRGaWx0ZXJzLnB1c2gobGFzdENoYW5nZWRGaWx0ZXJOYW1lKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRwcm9kdWN0c0xhc3RDaGFuZ2VkRmlsdGVycy5wb3AoKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAocHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHRcdHZhciBsYXN0QXJyYXlFbGVtZW50ID0gcHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnNbcHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnMubGVuZ3RoIC0gMV07XHJcblx0XHRcdFx0cmVsb2FkUmVzdWx0cyhsYXN0QXJyYXlFbGVtZW50KTtcclxuXHRcdFx0fSBlbHNlIFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0cmVsb2FkUmVzdWx0cygpO1xyXG5cdFx0XHR9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgXCIjXCIgKyBGaWx0ZXJSZXNldCwgcmVzZXRGaWx0ZXJzKTtcclxuXHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwiY2hhbmdlXCIsIFwiLlwiICsgRmlsdGVyQ2hlY2tib3hDbGFzcywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSAkKHRoaXMpLmF0dHIoXCJkYXRhLXZhbHVlXCIpO1xyXG4gICAgICAgICAgICB2YXIgZmllbGRuYW1lID0gJCh0aGlzKS5hdHRyKFwiZGF0YS1maWVsZG5hbWVcIik7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIjBcIikge1xyXG4gICAgICAgICAgICAgICAgLy9zZXQgYWxsIGNoZWNrYm94ZXMgc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgICQoXCIuXCIgKyBGaWx0ZXJDaGVja2JveENsYXNzICsgXCJbZGF0YS1maWVsZG5hbWU9J1wiICsgZmllbGRuYW1lICsgXCInXVwiKS5wcm9wKCdjaGVja2VkJywgJCh0aGlzKS5wcm9wKCdjaGVja2VkJykpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9zZXQgQWxsIGNoZWNrYm94IHVuc2VsZWN0ZWRcclxuICAgICAgICAgICAgICAgICQoXCIuXCIgKyBGaWx0ZXJDaGVja2JveEFsbENsYXNzICsgXCJbZGF0YS1maWVsZG5hbWU9J1wiICsgZmllbGRuYW1lICsgXCInXVwiKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZWxvYWRSZXN1bHRzKGZpZWxkbmFtZSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwia2V5cHJlc3NcIiwgXCIjXCIgKyBGaWx0ZXJRdWVyeUlkLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09IDEzKSB7XHJcblx0XHRcdFx0JC5wYWdlci5yZXNldCgpO1xyXG4gICAgICAgICAgICAgICAgcmVsb2FkUmVzdWx0cygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG5cdFx0dmFyIHRpbWVvdXRJZCA9IDA7XHJcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJrZXl1cFwiLCBcIiNcIiArIEZpbHRlclF1ZXJ5SWQsIGZ1bmN0aW9uICgpIHtcclxuXHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XHJcblx0XHRcdFxyXG5cdFx0XHR2YXIgZXhlY3VyZVJlcXVlc3QgPSBmdW5jdGlvbigpe1xyXG5cdFx0XHRcdHJlbG9hZFJlc3VsdHMoKTtcclxuXHRcdFx0fVxyXG5cdFx0XHRcclxuXHRcdFx0dGltZW91dElkID0gc2V0VGltZW91dChleGVjdXJlUmVxdWVzdCwgNTAwKTtcclxuXHRcdFx0cmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIFwiI1wiICsgRmlsdGVyUXVlcnlJZCwgcmVsb2FkUmVzdWx0cyk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vaW5pdGlsaXppbmdcclxuICAgIERvd25sb2FkQ2VudGVyUGFnZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpbml0Q29tbW9uRXZlbnRzKCk7XHJcbiAgICAgICAgcmVsb2FkUmVzdWx0cygpO1xyXG4gICAgfTtcclxuXHJcbiAgICAkLmRvd25sb2FkQ2VudGVyUGFnZSA9IG5ldyBEb3dubG9hZENlbnRlclBhZ2UsICQuZG93bmxvYWRDZW50ZXJQYWdlLkNvbnN0cnVjdG9yID0gRG93bmxvYWRDZW50ZXJQYWdlO1xyXG5cclxufSh3aW5kb3cualF1ZXJ5KSxcclxuXHJcbiAgICAvL2luaXRpYWxpemluZyBtYWluIGFwcGxpY2F0aW9uIG1vZHVsZVxyXG5mdW5jdGlvbiAoJCkge1xyXG5cdFwidXNlIHN0cmljdFwiO1xyXG5cdGlmICgkKCcjRG93bmxvYWRDZW50ZXJQYWdlJykubGVuZ3RoID4gMCkge1xyXG5cdFx0JC5kb3dubG9hZENlbnRlclBhZ2UuaW5pdCgpO1xyXG5cdH1cclxufSh3aW5kb3cualF1ZXJ5KTtcclxuISBmdW5jdGlvbigkKSB7XHJcbiAgICBcInVzZSBzdHJpY3RcIjtcclxuXHJcbiAgICB2YXIgcHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnMgPSBbXTtcclxuXHJcbiAgICB2YXIgUHJvZHVjdHNPdmVydmlld1BhZ2UgPSBmdW5jdGlvbigpIHt9O1xyXG5cclxuICAgIHZhciBoYW5kbGViYXJSZXN1bHRUZW1wYXRlU2VsZWN0b3IgPSBcIiNyZXN1bHQtdGVtcGxhdGVcIjtcclxuICAgIHZhciBoYW5kbGViYXJGaWx0ZXJzVGVtcGF0ZVNlbGVjdG9yID0gXCIjZmlsdGVyLXRlbXBsYXRlXCI7XHJcbiAgICB2YXIgaGFuZGxlYmFyRGVzY3JpcHRpb25UZW1wYXRlU2VsZWN0b3IgPSBcIiNkZXNjcmlwdGlvbi10ZW1wbGF0ZVwiXHJcblxyXG4gICAgdmFyIHJlbG9hZFJlc3VsdHMgPSBmdW5jdGlvbihsYXN0Q2hhbmdlZEZpbHRlck5hbWUpIHtcclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiBsYXN0Q2hhbmdlZEZpbHRlck5hbWUgIT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICBsYXN0Q2hhbmdlZEZpbHRlck5hbWUgPSBcIlwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHB1c2hEYXRhID0ge1xyXG4gICAgICAgICAgICBtb2RlbDoge1xyXG4gICAgICAgICAgICAgICAgU2VhcmNoQm94UXVlcnk6ICQoXCIjZmlsdGVyLXF1ZXJ5XCIpLnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgTGFzdENoYW5nZWRGaWx0ZXJOYW1lOiAobGFzdENoYW5nZWRGaWx0ZXJOYW1lIHx8IFwiXCIpICsgXCJcIixcclxuICAgICAgICAgICAgICAgIEZpbHRlcnM6IFtdLFxyXG4gICAgICAgICAgICAgICAgUGFnZTogJC5wYWdlci5jdXJyZW50UGFnZSgpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246ICQoXCIjc291cmNlLWlkXCIpLnZhbCgpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgJChcIi5wcm9kdWN0c0ZpbHRlciBzZWxlY3RcIikuZWFjaChmdW5jdGlvbihpLCBlbCkge1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSAkKGVsKS52YWwoKTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlICE9IFwiMFwiKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmllbGROYW1lID0gJChlbCkuYXR0cihcImRhdGEtZmllbGRuYW1lXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkTmFtZSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbHRlciA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgRmllbGROYW1lOiBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkVmFsdWU6IHZhbHVlXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBwdXNoRGF0YS5tb2RlbC5GaWx0ZXJzLnB1c2goZmlsdGVyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKFwiLnByb2R1Y3RzRmlsdGVyIC5kZWZhdWx0XCIpLmVhY2goZnVuY3Rpb24oaSwgZWwpIHtcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gJChlbCkudmFsKCk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBcIjBcIikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkTmFtZSA9ICQoZWwpLmF0dHIoXCJkYXRhLWZpZWxkbmFtZVwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgRmllbGROYW1lOiBmaWVsZE5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgRmllbGRWYWx1ZTogdmFsdWVcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBwdXNoRGF0YS5tb2RlbC5GaWx0ZXJzLnB1c2goZmlsdGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkLmhlbHBlci5yZWxvYWRVcmwocHVzaERhdGEubW9kZWwpXHJcbiAgICAgICAgJC5oZWxwZXIuYWpheChcIi9hamF4L3Byb2R1Y3QvaW5mb3JtYXRpb25cIiwgcHVzaERhdGEsIHJlYmRlckRlc2NyaXB0aW9uKTtcclxuICAgICAgICAkLmhlbHBlci5hamF4KFwiL2FqYXgvcHJvZHVjdC9maWx0ZXJcIiwgcHVzaERhdGEsIHJlbmRlclJlc3VsdCk7XHJcblxyXG4gICAgICAgIHZhciBjYXRlZ29yeSA9IFwiXCI7XHJcbiAgICAgICAgaWYgKCQoXCIjcHJvZHVjdF9jYXRlZ29yeVwiKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNhdGVnb3J5ID0gJChcIiNwcm9kdWN0X2NhdGVnb3J5XCIpLnZhbCgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoJChcIiNwcm9kdWN0X3N1YmNhdGVnb3J5XCIpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY2F0ZWdvcnkgPSAkKFwiI3Byb2R1Y3Rfc3ViY2F0ZWdvcnlcIikudmFsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICQuYW5hbHl0aWNzLnJlZ2lzdGVyUHJvZHVjdFNlYXJjaEV2ZW50KHB1c2hEYXRhLm1vZGVsLlNlYXJjaEJveFF1ZXJ5LCBjYXRlZ29yeSwgJChcIiNwcm9kdWN0X2JyYW5kXCIpLnZhbCgpKTtcclxuXHJcbiAgICB9XHJcbiAgICB2YXIgcmViZGVyRGVzY3JpcHRpb24gPSBmdW5jdGlvbihyZXN1bHRNb2RlbCkge1xyXG4gICAgICAgIHZhciB0ZW1wbGF0ZSA9IGpRdWVyeShoYW5kbGViYXJEZXNjcmlwdGlvblRlbXBhdGVTZWxlY3RvcikuaHRtbCgpO1xyXG4gICAgICAgIHZhciBoYW5kbGVCYXJUZXBsYXRlID0gSGFuZGxlYmFycy5jb21waWxlKHRlbXBsYXRlKTtcclxuICAgICAgICBpZiAocmVzdWx0TW9kZWwgJiYgIXJlc3VsdE1vZGVsLklzRW1wdHkpIHtcclxuICAgICAgICAgICAgJCgnLmNvbXBhbnlEZXNjcmlwdGlvblZpZXcnKS5odG1sKGhhbmRsZUJhclRlcGxhdGUocmVzdWx0TW9kZWwpKTtcclxuICAgICAgICAgICAgJChcIi5jb21wYW55RGVzY3JpcHRpb25WaWV3XCIpLnNob3coKTtcclxuICAgICAgICAgICAgJChcIi5jb21wYW55RGVzY3JpcHRpb25SZW5kZXJpbmdcIikuaGlkZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgICAkKFwiLmNvbXBhbnlEZXNjcmlwdGlvblZpZXdcIikuaGlkZSgpO1xyXG4gICAgICAgICAgICAkKFwiLmNvbXBhbnlEZXNjcmlwdGlvblJlbmRlcmluZ1wiKS5zaG93KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgdmFyIHJlbmRlclJlc3VsdCA9IGZ1bmN0aW9uKHJlc3VsdE1vZGVsKSB7XHJcbiAgICAgICAgaWYgKChyZXN1bHRNb2RlbC5TZWFyY2hCb3hRdWVyeSA9PSBudWxsIHx8IHJlc3VsdE1vZGVsLlNlYXJjaEJveFF1ZXJ5ID09IFwiXCIpICYmIChyZXN1bHRNb2RlbC5GaWx0ZXJzID09IG51bGwgfHwgcmVzdWx0TW9kZWwuRmlsdGVycy5sZW5ndGggPT0gMCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJyZW5kZXIgYnJhbmQgcmFuZ2VzXCIpO1xyXG4gICAgICAgICAgICAkKFwiI3BhZ2VyLWNvbnRhaW5lclwiKS5oaWRlKCk7XHJcbiAgICAgICAgICAgICQoXCIjUHJvZHVjdHNMaXN0V3JhcHBlclwiKS5oaWRlKCk7XHJcbiAgICAgICAgICAgIC8vJChcIi5jb21wYW55RGVzY3JpcHRpb25SZW5kZXJpbmdcIikuc2hvdygpOyAvL2luZm9ib3hcclxuICAgICAgICAgICAgJChcIiNCcmFuZHNMaXN0XCIpLnNob3coKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInJlbmRlciBwcm9kdWN0c1wiKTtcclxuICAgICAgICAgICAgJChcIiNwYWdlci1jb250YWluZXJcIikuc2hvdygpO1xyXG4gICAgICAgICAgICAkKFwiI1Byb2R1Y3RzTGlzdFdyYXBwZXJcIikuc2hvdygpO1xyXG4gICAgICAgICAgICAvLyQoXCIuY29tcGFueURlc2NyaXB0aW9uUmVuZGVyaW5nXCIpLmhpZGUoKTsgLy9pbmZvYm94XHJcbiAgICAgICAgICAgICQoXCIjQnJhbmRzTGlzdFwiKS5oaWRlKCk7XHJcblxyXG4gICAgICAgICAgICB2YXIgdGVtcGxhdGUgPSBqUXVlcnkoaGFuZGxlYmFyUmVzdWx0VGVtcGF0ZVNlbGVjdG9yKS5odG1sKCk7XHJcbiAgICAgICAgICAgIHZhciBoYW5kbGVCYXJUZXBsYXRlID0gSGFuZGxlYmFycy5jb21waWxlKHRlbXBsYXRlKTtcclxuICAgICAgICAgICAgJChcIiNQcm9kdWN0c0xpc3RXcmFwcGVyXCIpLmh0bWwoaGFuZGxlQmFyVGVwbGF0ZShyZXN1bHRNb2RlbCkpXHJcblxyXG4gICAgICAgICAgICAkLnBhZ2VyLmJ1aWxkKHJlc3VsdE1vZGVsLlBhZ2VyKTtcclxuICAgICAgICAgICAgLy9qUXVlcnkoXCIjZmlsdGVyLXF1ZXJ5XCIpLnZhbChyZXN1bHRNb2RlbC5TZWFyY2hCb3hRdWVyeSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZmlsdGVyc1RlbXBsYXRlID0galF1ZXJ5KGhhbmRsZWJhckZpbHRlcnNUZW1wYXRlU2VsZWN0b3IpLmh0bWwoKTtcclxuICAgICAgICB2YXIgaGFuZGxlQmFyRmlsdGVyc1RlcGxhdGUgPSBIYW5kbGViYXJzLmNvbXBpbGUoZmlsdGVyc1RlbXBsYXRlKTtcclxuICAgICAgICBqUXVlcnkoJyNzZWFyY2gtZmlsdGVycy1jb250YWluZXIgLnNlYXJjaC1ib3gnKS5zaWJsaW5ncygnZGl2LmZhY2V0RmlsdGVyJykucmVtb3ZlKCk7XHJcbiAgICAgICAgJCgnI3NlYXJjaC1maWx0ZXJzLWNvbnRhaW5lciAuc2VhcmNoLWJveCcpLmFmdGVyKGhhbmRsZUJhckZpbHRlcnNUZXBsYXRlKHJlc3VsdE1vZGVsKSlcclxuXHJcbiAgICAgICAgalF1ZXJ5KCcjc2VhcmNoLWZpbHRlcnMtY29udGFpbmVyIHNlbGVjdC5mb3JtLWNvbnRyb2wnKS5zZWxlY3RwaWNrZXIoe30pO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcIlByb2R1Y3RzT3ZlcnZpZXdQYWdlIGlzIHJlbmRlcmVkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciByZXNldEZpbHRlcnMgPSBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uc2VhcmNoID09IFwiXCIpIHtcclxuICAgICAgICAgICAgJChcIi5wcm9kdWN0c0ZpbHRlciBzZWxlY3RcIikuZWFjaChmdW5jdGlvbihpLCBlbCkge1xyXG4gICAgICAgICAgICAgICAgJChlbCkudmFsKDApO1xyXG4gICAgICAgICAgICAgICAgJChlbCkuZGF0YSgnc2VsZWN0cGlja2VyJykucmVmcmVzaCgpXHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJC5wYWdlci5yZXNldCgpO1xyXG5cclxuICAgICAgICAgICAgJChcIiNmaWx0ZXItcXVlcnlcIikudmFsKFwiXCIpO1xyXG5cclxuICAgICAgICAgICAgcmVsb2FkUmVzdWx0cygpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gW2xvY2F0aW9uLnByb3RvY29sLCAnLy8nLCBsb2NhdGlvbi5ob3N0LCBsb2NhdGlvbi5wYXRobmFtZV0uam9pbignJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhciBpbml0Q29tbW9uRXZlbnRzID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgJCh3aW5kb3cpLm9uKFwicGFnZXI6c2VsZWN0ZWRcIiwgcmVsb2FkUmVzdWx0cyk7XHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwiY2hhbmdlXCIsIFwiLnByb2R1Y3RzRmlsdGVyIC5mYWNldEZpbHRlciBzZWxlY3RcIiwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICQucGFnZXIucmVzZXQoKTtcclxuICAgICAgICAgICAgdmFyIGxhc3RDaGFuZ2VkRmlsdGVyTmFtZSA9IGpRdWVyeSh0aGlzKS5hdHRyKFwiZGF0YS1maWVsZG5hbWVcIik7XHJcbiAgICAgICAgICAgIGlmIChqUXVlcnkodGhpcykudmFsKCkgIT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgICAgIHByb2R1Y3RzTGFzdENoYW5nZWRGaWx0ZXJzLnB1c2gobGFzdENoYW5nZWRGaWx0ZXJOYW1lKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHByb2R1Y3RzTGFzdENoYW5nZWRGaWx0ZXJzLnBvcCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChwcm9kdWN0c0xhc3RDaGFuZ2VkRmlsdGVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbGFzdEFycmF5RWxlbWVudCA9IHByb2R1Y3RzTGFzdENoYW5nZWRGaWx0ZXJzW3Byb2R1Y3RzTGFzdENoYW5nZWRGaWx0ZXJzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgcmVsb2FkUmVzdWx0cyhsYXN0QXJyYXlFbGVtZW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlbG9hZFJlc3VsdHMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwiY2hhbmdlXCIsIFwiI1Byb2R1Y3RzU2VhcmNoUHJlZGVmaW5lZFF1ZXJ5U2VsZWN0b3JcIiwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICQucGFnZXIucmVzZXQoKTtcclxuICAgICAgICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9ICQodGhpcykudmFsKCk7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjZmlsdGVyLXF1ZXJ5XCIpLnZhbChcIlwiKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoXCIjZmlsdGVyLXF1ZXJ5XCIpLnZhbChjdXJyZW50VmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJlbG9hZFJlc3VsdHMoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIiNmaWx0ZXJzLXJlc2V0XCIsIHJlc2V0RmlsdGVycyk7XHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwia2V5cHJlc3NcIiwgXCIjZmlsdGVyLXF1ZXJ5XCIsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMykge1xyXG4gICAgICAgICAgICAgICAgJC5wYWdlci5yZXNldCgpO1xyXG4gICAgICAgICAgICAgICAgcmVsb2FkUmVzdWx0cygpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHZhciB0aW1lb3V0SWQgPSAwO1xyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwia2V5dXBcIiwgXCIjZmlsdGVyLXF1ZXJ5XCIsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSAkKFwiI1Byb2R1Y3RzU2VhcmNoUHJlZGVmaW5lZFF1ZXJ5U2VsZWN0b3JcIik7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwICYmIHNlbGVjdG9yLnZhbCgpICE9IFwiMFwiKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rvci52YWwoXCIwXCIpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0b3IuZGF0YSgnc2VsZWN0cGlja2VyJykucmVmcmVzaCgpXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUubGVuZ3RoIDwgNCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBleGVjdXJlUmVxdWVzdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgJC5wYWdlci5yZXNldCgpO1xyXG4gICAgICAgICAgICAgICAgcmVsb2FkUmVzdWx0cygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGV4ZWN1cmVSZXF1ZXN0LCA1MDApO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vaW5pdGlsaXppbmdcclxuICAgIFByb2R1Y3RzT3ZlcnZpZXdQYWdlLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaW5pdENvbW1vbkV2ZW50cygpO1xyXG4gICAgICAgIHJlbG9hZFJlc3VsdHMoKTtcclxuICAgIH07XHJcblxyXG4gICAgJC5wcm9kdWN0c092ZXJ2aWV3UGFnZSA9IG5ldyBQcm9kdWN0c092ZXJ2aWV3UGFnZSwgJC5wcm9kdWN0c092ZXJ2aWV3UGFnZS5Db25zdHJ1Y3RvciA9IFByb2R1Y3RzT3ZlcnZpZXdQYWdlO1xyXG5cclxufSh3aW5kb3cualF1ZXJ5KSxcclxuXHJcbi8vaW5pdGlhbGl6aW5nIG1haW4gYXBwbGljYXRpb24gbW9kdWxlXHJcbmZ1bmN0aW9uKCQpIHtcclxuICAgIFwidXNlIHN0cmljdFwiO1xyXG4gICAgaWYgKCQoJyNwcm9kdWN0LW92ZXJ2aWV3LXBhZ2UnKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgJC5wcm9kdWN0c092ZXJ2aWV3UGFnZS5pbml0KCk7XHJcbiAgICB9XHJcbn0od2luZG93LmpRdWVyeSk7XHJcbi8vRG93bmxvYWQgQ2VudGVyIFBhZ2VcclxuIWZ1bmN0aW9uICgkKSB7XHJcbiAgICBcInVzZSBzdHJpY3RcIjtcclxuXHJcbiAgICB2YXIgTG9jYXRpb25zUGFnZSA9IGZ1bmN0aW9uICgpIHsgfTtcclxuXHJcblxyXG4gICAgdmFyIGluaXRDb21tb25FdmVudHMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgJCgnI2xvY2F0aW9uc1BhZ2UnKS5vbignY2xpY2snLCAnLmxvY2F0aW9uTGlzdF9faXRlbSAuZHJvcGRvd25Ub2dnbGUnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciB0YXJnZXRJdGVtID0gJCh0aGlzKS5wYXJlbnQoJy5kcm9wZG93blRhcmdldCcpO1xyXG4gICAgICAgICAgICB2YXIgY3VycmVudEltYWdlVXJsID0gdGFyZ2V0SXRlbS5hdHRyKCdkYXRhLWNvdW50cnktaW1hZ2UnKTtcclxuICAgICAgICAgICAgdmFyIGNvbW1vbkltYWdlVXJsID0gJChcIiNNYXBDb250YWluZXJcIikuYXR0cignZGF0YS1jb21tb24taW1hZ2UnKTtcclxuICAgICAgICAgICAgdmFyIGltYWdlVXJsID0gY29tbW9uSW1hZ2VVcmw7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50SW1hZ2VVcmwgIT0gXCJcIikge1xyXG4gICAgICAgICAgICAgICAgaW1hZ2VVcmwgPSBjdXJyZW50SW1hZ2VVcmw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBvcGVuaW5nID0gIXRhcmdldEl0ZW0uaGFzQ2xhc3MoXCJvcGVuXCIpO1xyXG4gICAgICAgICAgICB2YXIgY2xvc2luZyA9ICFvcGVuaW5nO1xyXG5cclxuICAgICAgICAgICAgdmFyIG9wZW5lZE5vdyA9ICQoXCIubG9jYXRpb25MaXN0X19pdGVtLmRyb3Bkb3duVGFyZ2V0Lm9wZW5cIikubGVuZ3RoO1xyXG4gICAgICAgICAgICBpZiAoKG9wZW5lZE5vdyA9PSAwIHx8IG9wZW5lZE5vdyA9PSAxKSAmJiBjbG9zaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAkKFwiI01hcEltYWdlXCIpLmF0dHIoXCJzcmNcIiwgY29tbW9uSW1hZ2VVcmwpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wZW5lZE5vdyA9PSAwICYmIG9wZW5pbmcpIHtcclxuICAgICAgICAgICAgICAgICQoXCIjTWFwSW1hZ2VcIikuYXR0cihcInNyY1wiLCBpbWFnZVVybCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3BlbmVkTm93ID09IDIgJiYgY2xvc2luZykge1xyXG4gICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGFyZ2V0SXRlbS5hdHRyKFwiZGF0YS12YWx1ZVwiKTtcclxuICAgICAgICAgICAgICAgIHZhciBvcGVuZWRJbWFnZVVybCA9ICQoXCIubG9jYXRpb25MaXN0X19pdGVtLmRyb3Bkb3duVGFyZ2V0Lm9wZW46bm90KFtkYXRhLXZhbHVlPSdcIiArIHZhbHVlICsgXCInXSlcIikuYXR0cihcImRhdGEtY291bnRyeS1pbWFnZVwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChvcGVuZWRJbWFnZVVybCA9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3BlbmVkSW1hZ2VVcmwgPSBjb21tb25JbWFnZVVybDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICQoXCIjTWFwSW1hZ2VcIikuYXR0cihcInNyY1wiLCBvcGVuZWRJbWFnZVVybCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3BlbmluZykge1xyXG4gICAgICAgICAgICAgICAgJChcIiNNYXBJbWFnZVwiKS5hdHRyKFwic3JjXCIsIGltYWdlVXJsKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoXCIjTWFwSW1hZ2VcIikuYXR0cihcInNyY1wiLCBjb21tb25JbWFnZVVybCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vaW5pdGlsaXppbmdcclxuICAgIExvY2F0aW9uc1BhZ2UucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaW5pdENvbW1vbkV2ZW50cygpO1xyXG4gICAgfTtcclxuXHJcbiAgICAkLmxvY2F0aW9uc1BhZ2UgPSBuZXcgTG9jYXRpb25zUGFnZSwgJC5sb2NhdGlvbnNQYWdlLkNvbnN0cnVjdG9yID0gTG9jYXRpb25zUGFnZTtcclxuXHJcbn0od2luZG93LmpRdWVyeSksXHJcblxyXG4gICAgLy9pbml0aWFsaXppbmcgbWFpbiBhcHBsaWNhdGlvbiBtb2R1bGVcclxuICAgIGZ1bmN0aW9uICgkKSB7XHJcbiAgICAgICAgXCJ1c2Ugc3RyaWN0XCI7XHJcbiAgICAgICAgaWYgKCQoJyNsb2NhdGlvbnNQYWdlJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAkLmxvY2F0aW9uc1BhZ2UuaW5pdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH0od2luZG93LmpRdWVyeSk7XHJcbiEgZnVuY3Rpb24oJCkge1xyXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XHJcblxyXG4gICAgdmFyIHByb2R1Y3RzTGFzdENoYW5nZWRGaWx0ZXJzID0gW107XHJcblxyXG4gICAgdmFyIFNpdGVTZWFyY2hQYWdlID0gZnVuY3Rpb24oKSB7fTtcclxuXHJcbiAgICB2YXIgaGFuZGxlYmFyUmVzdWx0VGVtcGF0ZVNlbGVjdG9yID0gXCIjcmVzdWx0LXRlbXBsYXRlXCI7XHJcbiAgICB2YXIgaGFuZGxlYmFyRmlsdGVyc1RlbXBhdGVTZWxlY3RvciA9IFwiI2ZpbHRlci10ZW1wbGF0ZVwiO1xyXG5cclxuICAgIHZhciBGaWx0ZXJDaGVja2JveENsYXNzID0gXCJGaWx0ZXJDaGVja2JveFwiO1xyXG4gICAgdmFyIEZpbHRlckNoZWNrYm94QWxsQ2xhc3MgPSBcIkZpbHRlckNoZWNrYm94QWxsXCI7XHJcblxyXG4gICAgdmFyIHJlbG9hZFJlc3VsdHMgPSBmdW5jdGlvbihsYXN0Q2hhbmdlZEZpbHRlck5hbWUsIGluaXRQdXNoRGF0YSkge1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIGxhc3RDaGFuZ2VkRmlsdGVyTmFtZSAhPSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgICAgIGxhc3RDaGFuZ2VkRmlsdGVyTmFtZSA9IFwiXCI7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgcHVzaERhdGEgPSB7XHJcbiAgICAgICAgICAgIG1vZGVsOiB7XHJcbiAgICAgICAgICAgICAgICBTZWFyY2hCb3hRdWVyeTogJChcIiNmaWx0ZXItcXVlcnlcIikudmFsKCksXHJcbiAgICAgICAgICAgICAgICBMYXN0Q2hhbmdlZEZpbHRlck5hbWU6IChsYXN0Q2hhbmdlZEZpbHRlck5hbWUgfHwgXCJcIikgKyBcIlwiLFxyXG4gICAgICAgICAgICAgICAgRmlsdGVyczogW10sXHJcbiAgICAgICAgICAgICAgICBQYWdlOiAkLnBhZ2VyLmN1cnJlbnRQYWdlKClcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgY29uZmlndXJhdGlvbjogJChcIiNzb3VyY2UtaWRcIikudmFsKClcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAkKFwiLnByb2R1Y3RzRmlsdGVyIHNlbGVjdFwiKS5lYWNoKGZ1bmN0aW9uKGksIGVsKSB7XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9ICQoZWwpLnZhbCgpO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSAkKGVsKS5hdHRyKFwiZGF0YS1maWVsZG5hbWVcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsdGVyID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkTmFtZTogZmllbGROYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkVmFsdWU6IHZhbHVlXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcHVzaERhdGEubW9kZWwuRmlsdGVycy5wdXNoKGZpbHRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJChcIi5wcm9kdWN0c0ZpbHRlciAuZGVmYXVsdFwiKS5lYWNoKGZ1bmN0aW9uKGksIGVsKSB7XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9ICQoZWwpLnZhbCgpO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSAkKGVsKS5hdHRyKFwiZGF0YS1maWVsZG5hbWVcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsdGVyID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkTmFtZTogZmllbGROYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkVmFsdWU6IHZhbHVlXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcHVzaERhdGEubW9kZWwuRmlsdGVycy5wdXNoKGZpbHRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJChcIi5cIiArIEZpbHRlckNoZWNrYm94Q2xhc3MpLmVhY2goZnVuY3Rpb24oaSwgZWwpIHtcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gJChlbCkuYXR0cihcImRhdGEtdmFsdWVcIik7XHJcbiAgICAgICAgICAgIHZhciBmaWVsZG5hbWUgPSAkKGVsKS5hdHRyKFwiZGF0YS1maWVsZG5hbWVcIik7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBcIjBcIiAmJiAkKGVsKS5wcm9wKCdjaGVja2VkJykpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWx0ZXIgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgRmllbGROYW1lOiBmaWVsZG5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgRmllbGRWYWx1ZTogdmFsdWVcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBwdXNoRGF0YS5tb2RlbC5GaWx0ZXJzLnB1c2goZmlsdGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuXHJcbiAgICAgICAgJC5oZWxwZXIubG9nVG9Db25zb2xlKHB1c2hEYXRhLCBcIkRhdGEgdmFsdWVzOlwiKTtcclxuICAgICAgICAkLmhlbHBlci5yZWxvYWRVcmwocHVzaERhdGEubW9kZWwpXHJcblxyXG4gICAgICAgICQuaGVscGVyLmFqYXgoXCIvYWpheC9zaXRlL3NlYXJjaFwiLCBwdXNoRGF0YSwgcmVuZGVyUmVzdWx0KTtcclxuXHJcbiAgICAgICAgJC5hbmFseXRpY3MucmVnaXN0ZXJTZWFyY2hFdmVudChwdXNoRGF0YS5tb2RlbC5TZWFyY2hCb3hRdWVyeSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHNldEFsbFNlbGVjdGVkRm9yRmllbGROYW1lSWZBbGxNYXJrZWQgPSBmdW5jdGlvbihmaWVsZG5hbWUpIHtcclxuICAgICAgICB2YXIgc2VsZWN0ZWQgPSAkKFwiLlwiICsgRmlsdGVyQ2hlY2tib3hDbGFzcyArIFwiW2RhdGEtZmllbGRuYW1lPSdcIiArIGZpZWxkbmFtZSArIFwiJ106Y2hlY2tlZFwiKS5sZW5ndGg7XHJcbiAgICAgICAgdmFyIGV4aXN0cyA9ICQoXCIuXCIgKyBGaWx0ZXJDaGVja2JveENsYXNzICsgXCJbZGF0YS1maWVsZG5hbWU9J1wiICsgZmllbGRuYW1lICsgXCInXVwiKS5sZW5ndGg7XHJcbiAgICAgICAgdmFyIGFsbENoZWNrZWQgPSAkKFwiLlwiICsgRmlsdGVyQ2hlY2tib3hBbGxDbGFzcyArIFwiW2RhdGEtZmllbGRuYW1lPSdcIiArIGZpZWxkbmFtZSArIFwiJ11cIikucHJvcCgnY2hlY2tlZCcpO1xyXG5cclxuICAgICAgICBpZiAoZXhpc3RzID09IHNlbGVjdGVkIHx8ICgoZXhpc3RzIC0gMSkgPT0gc2VsZWN0ZWQpICYmICFhbGxDaGVja2VkKSB7XHJcbiAgICAgICAgICAgICQoXCIuXCIgKyBGaWx0ZXJDaGVja2JveEFsbENsYXNzICsgXCJbZGF0YS1maWVsZG5hbWU9J1wiICsgZmllbGRuYW1lICsgXCInXVwiKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhciByZW5kZXJSZXN1bHQgPSBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgdmFyIHRlbXBsYXRlID0galF1ZXJ5KGhhbmRsZWJhclJlc3VsdFRlbXBhdGVTZWxlY3RvcikuaHRtbCgpO1xyXG4gICAgICAgIHZhciBoYW5kbGVCYXJUZXBsYXRlID0gSGFuZGxlYmFycy5jb21waWxlKHRlbXBsYXRlKTtcclxuICAgICAgICAkKFwiI3NlYXJjaC1yZXN1bHQtbGlzdFwiKS5odG1sKGhhbmRsZUJhclRlcGxhdGUoZSkpXHJcblxyXG5cclxuICAgICAgICB2YXIgZmlsdGVyc1RlbXBsYXRlID0galF1ZXJ5KGhhbmRsZWJhckZpbHRlcnNUZW1wYXRlU2VsZWN0b3IpLmh0bWwoKTtcclxuICAgICAgICB2YXIgaGFuZGxlQmFyRmlsdGVyc1RlcGxhdGUgPSBIYW5kbGViYXJzLmNvbXBpbGUoZmlsdGVyc1RlbXBsYXRlKTtcclxuICAgICAgICBqUXVlcnkoJyNzZWFyY2gtZmlsdGVycy1jb250YWluZXInKS5lbXB0eSgpO1xyXG4gICAgICAgICQoJyNzZWFyY2gtZmlsdGVycy1jb250YWluZXInKS5odG1sKGhhbmRsZUJhckZpbHRlcnNUZXBsYXRlKGUpKVxyXG5cclxuICAgICAgICAkLnBhZ2VyLmJ1aWxkKGUuUGFnZXIpO1xyXG5cclxuICAgICAgICBqUXVlcnkoJyNzZWFyY2gtZmlsdGVycy1jb250YWluZXIgc2VsZWN0LmZvcm0tY29udHJvbCcpLnNlbGVjdHBpY2tlcih7fSk7XHJcblxyXG4gICAgICAgIC8valF1ZXJ5KFwiI2ZpbHRlci1xdWVyeVwiKS52YWwoZS5TZWFyY2hCb3hRdWVyeSk7XHJcblxyXG4gICAgICAgICQoXCIuXCIgKyBGaWx0ZXJDaGVja2JveEFsbENsYXNzKS5lYWNoKGZ1bmN0aW9uKGksIGVsKSB7XHJcbiAgICAgICAgICAgIHZhciBmaWVsZG5hbWUgPSAkKGVsKS5hdHRyKFwiZGF0YS1maWVsZG5hbWVcIik7XHJcbiAgICAgICAgICAgIHNldEFsbFNlbGVjdGVkRm9yRmllbGROYW1lSWZBbGxNYXJrZWQoZmllbGRuYW1lKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJTaXRlU2VhcmNoUGFnZSBpcyByZW5kZXJlZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgcmVzZXRGaWx0ZXJzID0gZnVuY3Rpb24oZSkge1xyXG4gICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uc2VhcmNoID09IFwiXCIpIHtcclxuXHJcbiAgICAgICAgICAgICQoXCIucHJvZHVjdHNGaWx0ZXIgc2VsZWN0XCIpLmVhY2goZnVuY3Rpb24oaSwgZWwpIHtcclxuICAgICAgICAgICAgICAgICQoZWwpLnZhbCgwKTtcclxuICAgICAgICAgICAgICAgICQoZWwpLmRhdGEoJ3NlbGVjdHBpY2tlcicpLnJlZnJlc2goKVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICQucGFnZXIucmVzZXQoKTtcclxuXHJcbiAgICAgICAgICAgICQoXCIuXCIgKyBGaWx0ZXJDaGVja2JveENsYXNzKS5lYWNoKGZ1bmN0aW9uKGksIGVsKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSAkKGVsKS5hdHRyKFwiZGF0YS12YWx1ZVwiKTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIjBcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICQoZWwpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJChlbCkucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZWxvYWRSZXN1bHRzKCk7XHJcblxyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBbbG9jYXRpb24ucHJvdG9jb2wsICcvLycsIGxvY2F0aW9uLmhvc3QsIGxvY2F0aW9uLnBhdGhuYW1lXS5qb2luKCcnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGluaXRDb21tb25FdmVudHMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAkKHdpbmRvdykub24oXCJwYWdlcjpzZWxlY3RlZFwiLCByZWxvYWRSZXN1bHRzKTtcclxuXHJcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJjaGFuZ2VcIiwgXCIucHJvZHVjdHNGaWx0ZXIgc2VsZWN0XCIsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAkLnBhZ2VyLnJlc2V0KCk7XHJcbiAgICAgICAgICAgIHZhciBsYXN0Q2hhbmdlZEZpbHRlck5hbWUgPSBqUXVlcnkodGhpcykuYXR0cihcImRhdGEtZmllbGRuYW1lXCIpO1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBqUXVlcnkodGhpcykudmFsKCk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBcIjBcIikge1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnMucHVzaChsYXN0Q2hhbmdlZEZpbHRlck5hbWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnMucG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHByb2R1Y3RzTGFzdENoYW5nZWRGaWx0ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciBsYXN0QXJyYXlFbGVtZW50ID0gcHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnNbcHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICByZWxvYWRSZXN1bHRzKGxhc3RBcnJheUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVsb2FkUmVzdWx0cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgXCIjZmlsdGVycy1yZXNldFwiLCByZXNldEZpbHRlcnMpO1xyXG5cclxuICAgICAgICAkKGRvY3VtZW50KS5vbihcImNoYW5nZVwiLCBcIi5cIiArIEZpbHRlckNoZWNrYm94Q2xhc3MsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSAkKHRoaXMpLmF0dHIoXCJkYXRhLXZhbHVlXCIpO1xyXG4gICAgICAgICAgICB2YXIgZmllbGRuYW1lID0gJCh0aGlzKS5hdHRyKFwiZGF0YS1maWVsZG5hbWVcIik7XHJcbiAgICAgICAgICAgIHZhciBjaGVja2VkID0gJCh0aGlzKS5wcm9wKCdjaGVja2VkJyk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIjBcIikge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vc2V0IGFsbCBjaGVja2JveGVzIHNlbGVjdGVkXHJcbiAgICAgICAgICAgICAgICAkKFwiLlwiICsgRmlsdGVyQ2hlY2tib3hDbGFzcyArIFwiW2RhdGEtZmllbGRuYW1lPSdcIiArIGZpZWxkbmFtZSArIFwiJ11cIikucHJvcCgnY2hlY2tlZCcsICQodGhpcykucHJvcCgnY2hlY2tlZCcpKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vc2V0IEFsbCBjaGVja0JPWCB1bnNlbGVjdGVkXHJcbiAgICAgICAgICAgICAgICAkKFwiLlwiICsgRmlsdGVyQ2hlY2tib3hBbGxDbGFzcyArIFwiW2RhdGEtZmllbGRuYW1lPSdcIiArIGZpZWxkbmFtZSArIFwiJ11cIikucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAkLnBhZ2VyLnJlc2V0KCk7XHJcbiAgICAgICAgICAgIHJlbG9hZFJlc3VsdHMoZmllbGRuYW1lKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJrZXlwcmVzc1wiLCBcIiNmaWx0ZXItcXVlcnlcIiwgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09IDEzKSB7XHJcbiAgICAgICAgICAgICAgICAkLnBhZ2VyLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICByZWxvYWRSZXN1bHRzKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFyIHRpbWVvdXRJZCA9IDA7XHJcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJrZXl1cFwiLCBcIiNmaWx0ZXItcXVlcnlcIiwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpOyAvLyBkb2Vzbid0IG1hdHRlciBpZiBpdCdzIDBcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcclxuICAgICAgICAgICAgdmFyIGV4ZWN1cmVSZXF1ZXN0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoIDwgNCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICQucGFnZXIucmVzZXQoKTtcclxuICAgICAgICAgICAgICAgIHJlbG9hZFJlc3VsdHMoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChleGVjdXJlUmVxdWVzdCwgNTAwKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJChcIiNmaWx0ZXItcXVlcnktYnV0dG9uXCIpLmNsaWNrKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAkLnBhZ2VyLnJlc2V0KCk7XHJcbiAgICAgICAgICAgIHJlbG9hZFJlc3VsdHMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgLy9pbml0aWxpemluZ1xyXG4gICAgU2l0ZVNlYXJjaFBhZ2UucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBpbml0Q29tbW9uRXZlbnRzKCk7XHJcbiAgICAgICAgcmVsb2FkUmVzdWx0cygpO1xyXG4gICAgfTtcclxuXHJcbiAgICAkLnNpdGVTZWFyY2hQYWdlID0gbmV3IFNpdGVTZWFyY2hQYWdlLCAkLnNpdGVTZWFyY2hQYWdlLkNvbnN0cnVjdG9yID0gU2l0ZVNlYXJjaFBhZ2U7XHJcblxyXG5cclxufSh3aW5kb3cualF1ZXJ5KSxcclxuXHJcbi8vaW5pdGlhbGl6aW5nIG1haW4gYXBwbGljYXRpb24gbW9kdWxlXHJcbmZ1bmN0aW9uKCQpIHtcclxuICAgIFwidXNlIHN0cmljdFwiO1xyXG4gICAgaWYgKCQoJyNzaXRlLXNlYXJjaC1wYWdlJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIEhhbmRsZWJhcnMucmVnaXN0ZXJIZWxwZXIoJ2lmX2VxJywgZnVuY3Rpb24oYSwgYiwgb3B0cykge1xyXG4gICAgICAgICAgICBpZiAoYSA9PSBiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5mbih0aGlzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBvcHRzLmludmVyc2UodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAkLnNpdGVTZWFyY2hQYWdlLmluaXQoKTtcclxuICAgIH1cclxufSh3aW5kb3cualF1ZXJ5KTtcclxuISBmdW5jdGlvbigkKSB7XHJcbiAgICBcInVzZSBzdHJpY3RcIjtcclxuXHJcbiAgICB2YXIgcHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnMgPSBbXTtcclxuXHJcbiAgICB2YXIgQmFzaWNQcm9kdWN0U2VhcmNoID0gZnVuY3Rpb24oKSB7fTtcclxuXHJcbiAgICB2YXIgaGFuZGxlYmFyRmlsdGVyc1RlbXBhdGVTZWxlY3RvciA9IFwiI2ZpbHRlci10ZW1wbGF0ZVwiO1xyXG5cclxuICAgIHZhciByZWxvYWRSZXN1bHRzID0gZnVuY3Rpb24obGFzdENoYW5nZWRGaWx0ZXJOYW1lKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBsYXN0Q2hhbmdlZEZpbHRlck5hbWUgIT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICBsYXN0Q2hhbmdlZEZpbHRlck5hbWUgPSBcIlwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHB1c2hEYXRhID0ge1xyXG4gICAgICAgICAgICBtb2RlbDoge1xyXG4gICAgICAgICAgICAgICAgU2VhcmNoQm94UXVlcnk6ICQoXCIjZmlsdGVyLXF1ZXJ5XCIpLnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgTGFzdENoYW5nZWRGaWx0ZXJOYW1lOiAobGFzdENoYW5nZWRGaWx0ZXJOYW1lIHx8IFwiXCIpICsgXCJcIixcclxuICAgICAgICAgICAgICAgIEZpbHRlcnM6IFtdLFxyXG4gICAgICAgICAgICAgICAgUGFnZTogMVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjb25maWd1cmF0aW9uOiAkKFwiI3NvdXJjZS1pZFwiKS52YWwoKVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgICQoXCIuYmFzaWNQcm9kdWN0U2VhcmNoIHNlbGVjdFwiKS5lYWNoKGZ1bmN0aW9uKGksIGVsKSB7XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9ICQoZWwpLnZhbCgpO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSAkKGVsKS5hdHRyKFwiZGF0YS1maWVsZG5hbWVcIik7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmlsdGVyID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkTmFtZTogZmllbGROYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIEZpZWxkVmFsdWU6IHZhbHVlXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcHVzaERhdGEubW9kZWwuRmlsdGVycy5wdXNoKGZpbHRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJC5oZWxwZXIuYWpheChcIi9hamF4L3Byb2R1Y3QvYmFzaWNcIiwgcHVzaERhdGEsIHJlbmRlclJlc3VsdCk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHJlZGlyZWN0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgdmFyIHB1c2hEYXRhID0ge307XHJcblxyXG4gICAgICAgIHZhciBpc0hhc1Byb3BlcnRpZXMgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdmFyIHNiID0gJChcIiNmaWx0ZXItcXVlcnlcIikudmFsKCk7XHJcbiAgICAgICAgaWYgKHNiICYmIHNiLmxlbmd0aCA+PSAzKSB7XHJcbiAgICAgICAgICAgIHB1c2hEYXRhW1wicVwiXSA9IHNiO1xyXG4gICAgICAgICAgICBpc0hhc1Byb3BlcnRpZXMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgJChcIi5iYXNpY1Byb2R1Y3RTZWFyY2ggc2VsZWN0XCIpLmVhY2goZnVuY3Rpb24oaSwgZWwpIHtcclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gJChlbCkudmFsKCk7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBcIjBcIikge1xyXG4gICAgICAgICAgICAgICAgdmFyIGZpZWxkTmFtZSA9ICQoZWwpLmF0dHIoXCJkYXRhLWZpZWxkbmFtZVwiKTtcclxuICAgICAgICAgICAgICAgIHB1c2hEYXRhW2ZpZWxkTmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIGlzSGFzUHJvcGVydGllcyA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB2YXIgcXVlcnlTdHJpbmcgPSAkLnBhcmFtKHB1c2hEYXRhKTtcclxuXHJcbiAgICAgICAgdmFyIHVybCA9ICQoXCIucHJvZHVjdFNlYXJjaCAuc2hvd01vcmVcIikuYXR0cihcImhyZWZcIik7XHJcblxyXG4gICAgICAgIGlmIChpc0hhc1Byb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgdXJsID0gdXJsICsgXCI/XCIgKyBxdWVyeVN0cmluZztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5sb2codXJsKTtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgdmFyIHJlbmRlclJlc3VsdCA9IGZ1bmN0aW9uKGUpIHtcclxuXHJcbiAgICAgICAgdmFyIGZpbHRlcnNUZW1wbGF0ZSA9IGpRdWVyeShoYW5kbGViYXJGaWx0ZXJzVGVtcGF0ZVNlbGVjdG9yKS5odG1sKCk7XHJcbiAgICAgICAgdmFyIGhhbmRsZUJhckZpbHRlcnNUZXBsYXRlID0gSGFuZGxlYmFycy5jb21waWxlKGZpbHRlcnNUZW1wbGF0ZSk7XHJcbiAgICAgICAgalF1ZXJ5KCcuYmFzaWNQcm9kdWN0U2VhcmNoJykuZW1wdHkoKTtcclxuICAgICAgICAkKCcuYmFzaWNQcm9kdWN0U2VhcmNoJykuaHRtbChoYW5kbGVCYXJGaWx0ZXJzVGVwbGF0ZShlKSlcclxuXHJcbiAgICAgICAgalF1ZXJ5KCcuYmFzaWNQcm9kdWN0U2VhcmNoIHNlbGVjdC5mb3JtLWNvbnRyb2wnKS5zZWxlY3RwaWNrZXIoe30pO1xyXG5cclxuICAgICAgICAvL2pRdWVyeShcIiNmaWx0ZXItcXVlcnlcIikudmFsKGUuU2VhcmNoQm94UXVlcnkpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiQmFzaWNQcm9kdWN0U2VhcmNoIGlzIHJlbmRlcmVkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBpbml0Q29tbW9uRXZlbnRzID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJjaGFuZ2VcIiwgXCIuYmFzaWNQcm9kdWN0U2VhcmNoIHNlbGVjdFwiLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgJC5wYWdlci5yZXNldCgpO1xyXG4gICAgICAgICAgICB2YXIgbGFzdENoYW5nZWRGaWx0ZXJOYW1lID0galF1ZXJ5KHRoaXMpLmF0dHIoXCJkYXRhLWZpZWxkbmFtZVwiKTtcclxuICAgICAgICAgICAgaWYgKGpRdWVyeSh0aGlzKS52YWwoKSAhPSBcIjBcIikge1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnMucHVzaChsYXN0Q2hhbmdlZEZpbHRlck5hbWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnMucG9wKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHByb2R1Y3RzTGFzdENoYW5nZWRGaWx0ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHZhciBsYXN0QXJyYXlFbGVtZW50ID0gcHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnNbcHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICAgICAgICByZWxvYWRSZXN1bHRzKGxhc3RBcnJheUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVsb2FkUmVzdWx0cygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwia2V5cHJlc3NcIiwgXCIjZmlsdGVyLXF1ZXJ5XCIsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMykge1xyXG4gICAgICAgICAgICAgICAgcmVkaXJlY3QoKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKGRvY3VtZW50KS5vbihcImNsaWNrXCIsIFwiLnNlYXJjaFN1Ym1pdFwiLCBmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgIHJlZGlyZWN0KCk7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFyIHRpbWVvdXRJZCA9IDA7XHJcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJrZXl1cFwiLCBcIiNmaWx0ZXItcXVlcnlcIiwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlLmxlbmd0aCA8IDQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKTtcclxuXHJcbiAgICAgICAgICAgIHZhciBleGVjdXJlUmVxdWVzdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgcmVsb2FkUmVzdWx0cygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGV4ZWN1cmVSZXF1ZXN0LCA1MDApO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vZml4IGVub3Jtb3VzIGhlaWdodCBvZiBibG9ja1xyXG4gICAgICAgIHZhciBzaXplQ2hlY2tUaW1lciA9IDA7XHJcbiAgICAgICAgdmFyIHNpemVDaGVja1RpbWVyQ291bnQgPSAwO1xyXG4gICAgICAgIHZhciBzaXplQ2hlY2sgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgc2l6ZUNoZWNrVGltZXJDb3VudCA9IHNpemVDaGVja1RpbWVyQ291bnQgKyAxO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHNpemVDaGVja1RpbWVyQ291bnQpO1xyXG4gICAgICAgICAgICBpZiAoJChcIi5iYXNpY1Byb2R1Y3RTZWFyY2hcIikuaGVpZ2h0KCkgPiAyNTApIHtcclxuICAgICAgICAgICAgICAgICQoXCIuYmFzaWMucHJvZHVjdFNlYXJjaCAuc2VhcmNoQmxvY2s+aDJcIikuYWZ0ZXIoJzxoNiBzdHlsZT1cImNvbG9yOiAjY2ZlM2Y0O2hlaWdodDogNDVweDtcIj4tPC9oNj4nKTtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7ICQoXCIuYmFzaWMucHJvZHVjdFNlYXJjaCAuc2VhcmNoQmxvY2s+aDZcIikucmVtb3ZlKCk7IH0sIDApO1xyXG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChzaXplQ2hlY2tUaW1lcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l6ZUNoZWNrVGltZXJDb3VudCA+IDEwKSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHNpemVDaGVja1RpbWVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBzaXplQ2hlY2tUaW1lciA9IHNldEludGVydmFsKHNpemVDaGVjaywgMzApO1xyXG5cclxuICAgIH07XHJcblxyXG4gICAgLy9pbml0aWxpemluZ1xyXG4gICAgQmFzaWNQcm9kdWN0U2VhcmNoLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaW5pdENvbW1vbkV2ZW50cygpO1xyXG4gICAgfTtcclxuXHJcbiAgICAkLmJhc2ljUHJvZHVjdFNlYXJjaCA9IG5ldyBCYXNpY1Byb2R1Y3RTZWFyY2gsICQuYmFzaWNQcm9kdWN0U2VhcmNoLkNvbnN0cnVjdG9yID0gQmFzaWNQcm9kdWN0U2VhcmNoO1xyXG5cclxufSh3aW5kb3cualF1ZXJ5KSxcclxuXHJcbi8vaW5pdGlhbGl6aW5nIG1haW4gYXBwbGljYXRpb24gbW9kdWxlXHJcbmZ1bmN0aW9uKCQpIHtcclxuICAgIFwidXNlIHN0cmljdFwiO1xyXG4gICAgaWYgKCQoJy5iYXNpYy5wcm9kdWN0U2VhcmNoJykubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICQuYmFzaWNQcm9kdWN0U2VhcmNoLmluaXQoKTtcclxuICAgIH1cclxufSh3aW5kb3cualF1ZXJ5KTtcclxuISBmdW5jdGlvbigkKSB7XHJcbiAgICBcInVzZSBzdHJpY3RcIjtcclxuXHJcbiAgICB2YXIgSGVhZGVyU2VhcmNoID0gZnVuY3Rpb24oKSB7fTtcclxuXHJcbiAgICB2YXIgRmlsdGVyQ2hhbmdlZ0V2ZW50TmFtZSA9IFwic2VhcmNoSGVhZGVyOmNoYW5nZWRcIjtcclxuICAgIHZhciBoYW5kbGViYXJSZWxhdGVkUmVzdWx0c1RlbXBhdGVTZWxlY3RvciA9IFwiI3NpdGUtc2VhcmNoLXJlc3VsdHMtdGVtcGxhdGVcIjtcclxuICAgIHZhciBoYW5kbGViYXJSZWxhdGVkUmVzdWx0c0luUHJvZHVjdHNUZW1wYXRlU2VsZWN0b3IgPSBcIiNwcm9kdWN0LXNlYXJjaC1yZXN1bHRzLXRlbXBsYXRlXCI7XHJcblxyXG4gICAgdmFyIHJlbG9hZFNlYXJjaFJlc3VsdHMgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIHB1c2hEYXRhID0ge1xyXG4gICAgICAgICAgICBtb2RlbDoge1xyXG4gICAgICAgICAgICAgICAgU2VhcmNoQm94UXVlcnk6ICQoXCIjaGVhZGVyU2VhcmNoXCIpLnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgRmlsdGVyczogW10sXHJcbiAgICAgICAgICAgICAgICBQYWdlOiAxXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246ICQoXCIjc2l0ZS1zZWFyY2gtc291cmNlLWlkXCIpLnZhbCgpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgJC5oZWxwZXIuYWpheChcIi9hamF4L3NpdGUvc2VhcmNoXCIsIHB1c2hEYXRhLCByZW5kZXJTaXRlU2VhcmNoUmVzdWx0KTtcclxuICAgIH1cclxuICAgIHZhciByZWxvYWRQcm9kdWN0c1Jlc3VsdHMgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICAgICAgdmFyIHB1c2hEYXRhID0ge1xyXG4gICAgICAgICAgICBtb2RlbDoge1xyXG4gICAgICAgICAgICAgICAgU2VhcmNoQm94UXVlcnk6ICQoXCIjaGVhZGVyU2VhcmNoXCIpLnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgRmlsdGVyczogW10sXHJcbiAgICAgICAgICAgICAgICBQYWdlOiAxXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246ICQoXCIjcHJvZHVjdC1zZWFyY2gtc291cmNlLWlkXCIpLnZhbCgpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgJC5oZWxwZXIuYWpheChcIi9hamF4L3Byb2R1Y3QvZmlsdGVyXCIsIHB1c2hEYXRhLCByZW5kZXJQcm9kdWN0U2VhcmNoUmVzdWx0KTtcclxuICAgICAgICAkLmFuYWx5dGljcy5yZWdpc3RlclNlYXJjaEV2ZW50KHB1c2hEYXRhLm1vZGVsLlNlYXJjaEJveFF1ZXJ5KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgdmFyIHJlbmRlclNpdGVTZWFyY2hSZXN1bHQgPSBmdW5jdGlvbihlKSB7XHJcblxyXG4gICAgICAgIHZhciBmaWx0ZXJzVGVtcGxhdGUgPSBqUXVlcnkoaGFuZGxlYmFyUmVsYXRlZFJlc3VsdHNUZW1wYXRlU2VsZWN0b3IpLmh0bWwoKTtcclxuICAgICAgICB2YXIgaGFuZGxlQmFyRmlsdGVyc1RlcGxhdGUgPSBIYW5kbGViYXJzLmNvbXBpbGUoZmlsdGVyc1RlbXBsYXRlKTtcclxuICAgICAgICBqUXVlcnkoJy5zZWFyY2gtYm94X19yZXN1bHRzLWNhdGVnb3JpZXMgaDMnKS5zaWJsaW5ncygnZGl2JykucmVtb3ZlKCk7XHJcbiAgICAgICAgalF1ZXJ5KCcuc2VhcmNoLWJveF9fcmVzdWx0cy1jYXRlZ29yaWVzIGgzJykuc2libGluZ3MoJ2EnKS5yZW1vdmUoKTtcclxuICAgICAgICAkKCcuc2VhcmNoLWJveF9fcmVzdWx0cy1jYXRlZ29yaWVzIGgzJykuYWZ0ZXIoaGFuZGxlQmFyRmlsdGVyc1RlcGxhdGUoZSkpO1xyXG5cclxuICAgICAgICBpZiAoJChcIi5zZWFyY2gtYm94X19yZXN1bHRzLXByb2R1Y3RzIC5wcm9kdWN0c1Jlc3VsdHNfX3Jvd1wiKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICQoJy5zZWFyY2gtYm94X19yZXN1bHRzJykuYWRkQ2xhc3MoJ29wZW4nKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YXIgcmVuZGVyUHJvZHVjdFNlYXJjaFJlc3VsdCA9IGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICB2YXIgdGVtcGxhdGUgPSBqUXVlcnkoaGFuZGxlYmFyUmVsYXRlZFJlc3VsdHNJblByb2R1Y3RzVGVtcGF0ZVNlbGVjdG9yKS5odG1sKCk7XHJcbiAgICAgICAgdmFyIGhhbmRsZUJhclRlcGxhdGUgPSBIYW5kbGViYXJzLmNvbXBpbGUodGVtcGxhdGUpO1xyXG4gICAgICAgIGpRdWVyeSgnLnNlYXJjaC1ib3hfX3Jlc3VsdHMtcHJvZHVjdHMgaDMnKS5zaWJsaW5ncygnZGl2JykucmVtb3ZlKCk7XHJcbiAgICAgICAgalF1ZXJ5KCcuc2VhcmNoLWJveF9fcmVzdWx0cy1wcm9kdWN0cyBoMycpLnNpYmxpbmdzKCdhJykucmVtb3ZlKCk7XHJcbiAgICAgICAgJCgnLnNlYXJjaC1ib3hfX3Jlc3VsdHMtcHJvZHVjdHMgaDMnKS5hZnRlcihoYW5kbGVCYXJUZXBsYXRlKGUpKTtcclxuXHJcbiAgICAgICAgaWYgKCQoXCIuc2VhcmNoLWJveF9fcmVzdWx0cy1jYXRlZ29yaWVzIC5jYXRlZ29yaWVzUmVzdWx0c19fcm93XCIpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgJCgnLnNlYXJjaC1ib3hfX3Jlc3VsdHMnKS5hZGRDbGFzcygnb3BlbicpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhciByZWxvYWRQYWdlID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKTtcclxuICAgICAgICB9LCAyMDApO1xyXG4gICAgfTtcclxuXHJcblxyXG4gICAgdmFyIGluaXRDb21tb25FdmVudHMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAkKHdpbmRvdykub24oRmlsdGVyQ2hhbmdlZ0V2ZW50TmFtZSwgcmVsb2FkU2VhcmNoUmVzdWx0cyk7XHJcbiAgICAgICAgJCh3aW5kb3cpLm9uKEZpbHRlckNoYW5nZWdFdmVudE5hbWUsIHJlbG9hZFByb2R1Y3RzUmVzdWx0cyk7XHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwia2V5cHJlc3NcIiwgXCIjaGVhZGVyU2VhcmNoXCIsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PSAxMykge1xyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAkKFwiI2hlYWRlclNlYXJjaFwiKS5hdHRyKFwiZGF0YS1zZWFyY2gtcGFnZS11cmxcIikgKyBcIj9xPVwiICsgalF1ZXJ5KCcjaGVhZGVyU2VhcmNoJykudmFsKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdmFyIHNlYXJjaEJveCA9IGpRdWVyeSgnI2hlYWRlclNlYXJjaCcpO1xyXG4gICAgICAgIHZhciBzZWFyY2hUYXJnZXQgPSBqUXVlcnkoJy5zZWFyY2gtYm94X19yZXN1bHRzJyk7XHJcblxyXG4gICAgICAgICQoXCJib2R5XCIpLmNsaWNrKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAkKFwiLnNlYXJjaC1ib3hfX3Jlc3VsdHNcIikucmVtb3ZlQ2xhc3MoXCJvcGVuXCIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09V2FybmluZz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgICAgICQoXCIuc2VhcmNoLWJveF9fcmVzdWx0cywgLnNlYXJjaC1ib3hcIikuY2xpY2soZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICB2YXIgc291cmNlID0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmICghJChzb3VyY2UpLmhhc0NsYXNzKFwiZ29Ub0xpbmtcIikpIHtcclxuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gICAgICAgIHNlYXJjaEJveC5mb2N1c2luKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZiAoalF1ZXJ5KHRoaXMpLnZhbCgpLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgICAgICAgIHNlYXJjaFRhcmdldC5hZGRDbGFzcygnb3BlbicpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICAkKFwiI2hlYWRlclNlYXJjaEJ1dHRvblwiKS5jbGljayhmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBzZWFyY2hCb3guYXR0cihcImRhdGEtc2VhcmNoLXBhZ2UtdXJsXCIpICsgXCI/cT1cIiArIGpRdWVyeSgnI2hlYWRlclNlYXJjaCcpLnZhbCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB2YXIgdGltZW91dElkID0gMDtcclxuICAgICAgICAkKGRvY3VtZW50KS5vbihcImtleXVwXCIsIFwiI2hlYWRlclNlYXJjaFwiLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7IC8vIGRvZXNuJ3QgbWF0dGVyIGlmIGl0J3MgMFxyXG5cclxuICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IDMpIHtcclxuICAgICAgICAgICAgICAgIHNlYXJjaFRhcmdldC5yZW1vdmVDbGFzcygnb3BlbicpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHZhciBleGVjdXJlUmVxdWVzdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgJCh3aW5kb3cpLnRyaWdnZXIoRmlsdGVyQ2hhbmdlZ0V2ZW50TmFtZSk7XHJcbiAgICAgICAgICAgICAgICAvL3NlYXJjaFRhcmdldC5hZGRDbGFzcygnb3BlbicpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChleGVjdXJlUmVxdWVzdCwgNTAwKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkKCdib2R5Jykub24oJ2NsaWNrJywgJy5nb1RvTGluaycsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB2YXIgdXJsID0gJCh0aGlzKS5hdHRyKFwiaHJlZlwiKTtcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XHJcbiAgICAgICAgICAgIHJlbG9hZFBhZ2UoKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgLy9pbml0aWxpemluZ1xyXG4gICAgSGVhZGVyU2VhcmNoLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaW5pdENvbW1vbkV2ZW50cygpO1xyXG4gICAgfTtcclxuXHJcbiAgICAkLmhlYWRlclNlYXJjaCA9IG5ldyBIZWFkZXJTZWFyY2gsICQuaGVhZGVyU2VhcmNoLkNvbnN0cnVjdG9yID0gSGVhZGVyU2VhcmNoO1xyXG5cclxufSh3aW5kb3cualF1ZXJ5KSxcclxuXHJcbi8vaW5pdGlhbGl6aW5nIG1haW4gYXBwbGljYXRpb24gbW9kdWxlXHJcbmZ1bmN0aW9uKCQpIHtcclxuICAgIFwidXNlIHN0cmljdFwiO1xyXG4gICAgaWYgKCQoJyNoZWFkZXItc2VhcmNoLWJveCcpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKCdpZkNvbmQnLCBmdW5jdGlvbih2MSwgb3BlcmF0b3IsIHYyLCBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJz09JzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHYxID09IHYyKSA/IG9wdGlvbnMuZm4odGhpcykgOiBvcHRpb25zLmludmVyc2UodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICc9PT0nOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAodjEgPT09IHYyKSA/IG9wdGlvbnMuZm4odGhpcykgOiBvcHRpb25zLmludmVyc2UodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICchPSc6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2MSAhPSB2MikgPyBvcHRpb25zLmZuKHRoaXMpIDogb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnIT09JzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHYxICE9PSB2MikgPyBvcHRpb25zLmZuKHRoaXMpIDogb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnPCc6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2MSA8IHYyKSA/IG9wdGlvbnMuZm4odGhpcykgOiBvcHRpb25zLmludmVyc2UodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICc8PSc6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2MSA8PSB2MikgPyBvcHRpb25zLmZuKHRoaXMpIDogb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnPic6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2MSA+IHYyKSA/IG9wdGlvbnMuZm4odGhpcykgOiBvcHRpb25zLmludmVyc2UodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBjYXNlICc+PSc6XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2MSA+PSB2MikgPyBvcHRpb25zLmZuKHRoaXMpIDogb3B0aW9ucy5pbnZlcnNlKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnJiYnOlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAodjEgJiYgdjIpID8gb3B0aW9ucy5mbih0aGlzKSA6IG9wdGlvbnMuaW52ZXJzZSh0aGlzKTtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3x8JzpcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHYxIHx8IHYyKSA/IG9wdGlvbnMuZm4odGhpcykgOiBvcHRpb25zLmludmVyc2UodGhpcyk7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICAkLmhlYWRlclNlYXJjaC5pbml0KCk7XHJcbiAgICB9XHJcbn0od2luZG93LmpRdWVyeSk7XHJcbiFmdW5jdGlvbiAoJCkge1xyXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XHJcblx0XHJcblx0dmFyIHByb2R1Y3RzTGFzdENoYW5nZWRGaWx0ZXJzID0gW107XHJcblxyXG4gICAgdmFyIFByb2R1Y3RzT3ZlcnZpZXdQYWdlID0gZnVuY3Rpb24gKCkgeyB9O1xyXG5cclxuICAgIHZhciBoYW5kbGViYXJSZXN1bHRUZW1wYXRlU2VsZWN0b3IgPSBcIiNyZXN1bHQtdGVtcGxhdGVcIjtcclxuICAgIHZhciBoYW5kbGViYXJGaWx0ZXJzVGVtcGF0ZVNlbGVjdG9yID0gXCIjZmlsdGVyLXRlbXBsYXRlXCI7XHJcblxyXG4gICAgdmFyIHJlbG9hZFJlc3VsdHMgPSBmdW5jdGlvbiAobGFzdENoYW5nZWRGaWx0ZXJOYW1lKSB7XHJcblx0XHRpZih0eXBlb2YgbGFzdENoYW5nZWRGaWx0ZXJOYW1lICE9IFwic3RyaW5nXCIpe1xyXG5cdFx0XHRsYXN0Q2hhbmdlZEZpbHRlck5hbWUgPSBcIlwiO1xyXG5cdFx0fVxyXG5cclxuICAgICAgICB2YXIgcHVzaERhdGEgPSB7XHJcbiAgICAgICAgICAgIG1vZGVsOiB7XHJcbiAgICAgICAgICAgICAgICBTZWFyY2hCb3hRdWVyeTogJChcIiNmaWx0ZXItcXVlcnlcIikudmFsKCksXHJcblx0XHRcdFx0TGFzdENoYW5nZWRGaWx0ZXJOYW1lOiAobGFzdENoYW5nZWRGaWx0ZXJOYW1lIHx8IFwiXCIpICsgXCJcIixcclxuICAgICAgICAgICAgICAgIEZpbHRlcnM6IFtdLFxyXG4gICAgICAgICAgICAgICAgUGFnZTogJC5wYWdlci5jdXJyZW50UGFnZSgpXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246ICQoXCIjc291cmNlLWlkXCIpLnZhbCgpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgJChcIi5wcm9kdWN0c0ZpbHRlciBzZWxlY3RcIikuZWFjaChmdW5jdGlvbihpLCBlbCl7XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9ICQoZWwpLnZhbCgpO1xyXG4gICAgICAgICAgICBpZih2YWx1ZSAhPSBcIjBcIil7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmllbGRuYW1lID0gJChlbCkuYXR0cihcImRhdGEtZmllbGRuYW1lXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGZpbHRlciA9IHtcclxuICAgICAgICAgICAgICAgICAgICBGaWVsZE5hbWU6IGZpZWxkbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBGaWVsZFZhbHVlOiB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHB1c2hEYXRhLm1vZGVsLkZpbHRlcnMucHVzaChmaWx0ZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQoXCIucHJvZHVjdHNGaWx0ZXIgLmRlZmF1bHRcIikuZWFjaChmdW5jdGlvbihpLCBlbCl7XHJcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9ICQoZWwpLnZhbCgpO1xyXG4gICAgICAgICAgICBpZih2YWx1ZSAhPSBcIjBcIil7XHJcbiAgICAgICAgICAgICAgICB2YXIgZmllbGRuYW1lID0gJChlbCkuYXR0cihcImRhdGEtZmllbGRuYW1lXCIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGZpbHRlciA9IHtcclxuICAgICAgICAgICAgICAgICAgICBGaWVsZE5hbWU6IGZpZWxkbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICBGaWVsZFZhbHVlOiB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHB1c2hEYXRhLm1vZGVsLkZpbHRlcnMucHVzaChmaWx0ZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICQuaGVscGVyLnJlbG9hZFVybChwdXNoRGF0YS5tb2RlbClcclxuXHJcbiAgICAgICAkLmhlbHBlci5hamF4KFwiL2FqYXgvcHJvZHVjdC9icmFuZHNcIixwdXNoRGF0YSxyZW5kZXJSZXN1bHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciByZW5kZXJSZXN1bHQgPSBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgIHZhciB0ZW1wbGF0ZSA9IGpRdWVyeShoYW5kbGViYXJSZXN1bHRUZW1wYXRlU2VsZWN0b3IpLmh0bWwoKTtcclxuICAgICAgICB2YXIgaGFuZGxlQmFyVGVwbGF0ZSA9IEhhbmRsZWJhcnMuY29tcGlsZSh0ZW1wbGF0ZSk7XHJcbiAgICAgICAgJChcIiNzZWFyY2gtcmVzdWx0LWxpc3RcIikuaHRtbChoYW5kbGVCYXJUZXBsYXRlKGUpKVxyXG5cclxuICAgICAgICB2YXIgZmlsdGVyc1RlbXBsYXRlID0galF1ZXJ5KGhhbmRsZWJhckZpbHRlcnNUZW1wYXRlU2VsZWN0b3IpLmh0bWwoKTtcclxuICAgICAgICB2YXIgaGFuZGxlQmFyRmlsdGVyc1RlcGxhdGUgPSBIYW5kbGViYXJzLmNvbXBpbGUoZmlsdGVyc1RlbXBsYXRlKTtcclxuXHRcdGpRdWVyeSgnI3NlYXJjaC1maWx0ZXJzLWNvbnRhaW5lciAuc2VhcmNoLWJveCcpLnNpYmxpbmdzKCdkaXYnKS5yZW1vdmUoKTtcclxuICAgICAgICAkKCcjc2VhcmNoLWZpbHRlcnMtY29udGFpbmVyIC5zZWFyY2gtYm94JykuYWZ0ZXIoaGFuZGxlQmFyRmlsdGVyc1RlcGxhdGUoZSkpXHJcblxyXG4gICAgICAgICQucGFnZXIuYnVpbGQoZS5QYWdlcik7XHJcblxyXG4gICAgICAgIGpRdWVyeSgnI3NlYXJjaC1maWx0ZXJzLWNvbnRhaW5lciBzZWxlY3QuZm9ybS1jb250cm9sJykuc2VsZWN0cGlja2VyKHt9KTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJCcmFuZHNPdmVydmlldyBpcyByZW5kZXJlZFwiKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgcmVzZXRGaWx0ZXJzID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAkKFwiLnByb2R1Y3RzRmlsdGVyIHNlbGVjdFwiKS5lYWNoKGZ1bmN0aW9uKGksIGVsKXtcclxuICAgICAgICAgICAgJChlbCkudmFsKDApO1xyXG4gICAgICAgICAgICAkKGVsKS5kYXRhKCdzZWxlY3RwaWNrZXInKS5yZWZyZXNoKClcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgJC5wYWdlci5yZXNldCgpO1xyXG5cclxuICAgICAgICAkKFwiI2ZpbHRlci1xdWVyeVwiKS52YWwoXCJcIik7XHJcblxyXG4gICAgICAgIHJlbG9hZFJlc3VsdHMoKTtcclxuXHJcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBpbml0Q29tbW9uRXZlbnRzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICQod2luZG93KS5vbihcInBhZ2VyOnNlbGVjdGVkXCIsIHJlbG9hZFJlc3VsdHMpO1xyXG5cclxuICAgICAgICAkKGRvY3VtZW50KS5vbiggXCJjaGFuZ2VcIiwgXCIucHJvZHVjdHNGaWx0ZXIgc2VsZWN0XCIsIGZ1bmN0aW9uKCl7XHJcblx0XHRcdCQucGFnZXIucmVzZXQoKTtcclxuICAgICAgICAgICAgdmFyIGxhc3RDaGFuZ2VkRmlsdGVyTmFtZSA9IGpRdWVyeSh0aGlzKS5hdHRyKFwiZGF0YS1maWVsZG5hbWVcIik7XHJcblx0XHRcdGlmIChqUXVlcnkodGhpcykudmFsKCkgIT0gXCIwXCIpIHtcclxuXHRcdFx0XHRwcm9kdWN0c0xhc3RDaGFuZ2VkRmlsdGVycy5wdXNoKGxhc3RDaGFuZ2VkRmlsdGVyTmFtZSk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0cHJvZHVjdHNMYXN0Q2hhbmdlZEZpbHRlcnMucG9wKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKHByb2R1Y3RzTGFzdENoYW5nZWRGaWx0ZXJzLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHR2YXIgbGFzdEFycmF5RWxlbWVudCA9IHByb2R1Y3RzTGFzdENoYW5nZWRGaWx0ZXJzW3Byb2R1Y3RzTGFzdENoYW5nZWRGaWx0ZXJzLmxlbmd0aCAtIDFdO1xyXG5cdFx0XHRcdHJlbG9hZFJlc3VsdHMobGFzdEFycmF5RWxlbWVudCk7XHJcblx0XHRcdH0gZWxzZSBcclxuXHRcdFx0e1xyXG5cdFx0XHRcdHJlbG9hZFJlc3VsdHMoKTtcclxuXHRcdFx0fVxyXG4gICAgICAgIH0gKTtcclxuXHJcbiAgICAgICAgJChkb2N1bWVudCkub24oXCJjbGlja1wiLCBcIiNmaWx0ZXJzLXJlc2V0XCIsIHJlc2V0RmlsdGVycyk7XHJcblxyXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKFwia2V5cHJlc3NcIiwgXCIjZmlsdGVyLXF1ZXJ5XCIsIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMpIHtcclxuXHRcdFx0XHQkLnBhZ2VyLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICByZWxvYWRSZXN1bHRzKCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblx0XHR2YXIgdGltZW91dElkID0gMDtcclxuICAgICAgICAkKGRvY3VtZW50KS5vbihcImtleXVwXCIsIFwiI2ZpbHRlci1xdWVyeVwiLCBmdW5jdGlvbigpe1xyXG5cdFx0XHRjbGVhclRpbWVvdXQodGltZW91dElkKTtcclxuXHRcdFx0XHJcbiAgICAgICAgICAgIGlmKCB0aGlzLnZhbHVlLmxlbmd0aCA8IDQgKXtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHRcdFx0dmFyIGV4ZWN1cmVSZXF1ZXN0ID0gZnVuY3Rpb24oKXtcclxuXHRcdFx0XHQkLnBhZ2VyLnJlc2V0KCk7XHJcblx0XHRcdFx0cmVsb2FkUmVzdWx0cygpO1xyXG5cdFx0XHR9XHJcblx0XHRcdFxyXG5cdFx0XHR0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGV4ZWN1cmVSZXF1ZXN0LCA1MDApO1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSApO1xyXG4gICAgfTtcclxuXHJcbiAgICAvL2luaXRpbGl6aW5nXHJcbiAgICBQcm9kdWN0c092ZXJ2aWV3UGFnZS5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpbml0Q29tbW9uRXZlbnRzKCk7XHJcbiAgICAgICAgcmVsb2FkUmVzdWx0cygpO1xyXG4gICAgfTtcclxuXHJcbiAgICAkLnByb2R1Y3RzT3ZlcnZpZXdQYWdlID0gbmV3IFByb2R1Y3RzT3ZlcnZpZXdQYWdlLCAkLnByb2R1Y3RzT3ZlcnZpZXdQYWdlLkNvbnN0cnVjdG9yID0gUHJvZHVjdHNPdmVydmlld1BhZ2U7XHJcblxyXG59KHdpbmRvdy5qUXVlcnkpLFxyXG5cclxuICAgIC8vaW5pdGlhbGl6aW5nIG1haW4gYXBwbGljYXRpb24gbW9kdWxlXHJcbmZ1bmN0aW9uICgkKSB7XHJcblx0XCJ1c2Ugc3RyaWN0XCI7XHJcblx0aWYoJCgnI2JyYW5kcy1vdmVydmlldy1wYWdlJykubGVuZ3RoID4gMCl7XHJcblx0XHQkLnByb2R1Y3RzT3ZlcnZpZXdQYWdlLmluaXQoKTtcclxuXHR9XHJcbn0od2luZG93LmpRdWVyeSk7XHJcbiEgZnVuY3Rpb24oJCkge1xyXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XHJcblxyXG4gICAgdmFyIFNlY3VyZWRDb250YWluZXIgPSBmdW5jdGlvbigpIHt9O1xyXG5cclxuICAgIHZhciBpbml0Q29udGFpbmVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgJChcIi5TZWN1cmVkQ29udGFpbmVyXCIpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHtcclxuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9ICQodGhpcyk7XHJcbiAgICAgICAgICAgIHZhciBjaGVja0FjY2VzcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgdmFyIHBhc3N3b3JkSW5wdXQgPSAkKFwiaW5wdXRbdHlwZT10ZXh0XVwiLCBjb250YWluZXIpO1xyXG4gICAgICAgICAgICAgICAgdmFyIHB1c2hEYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZElucHV0LnZhbCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclNvdXJjZUlkOiBwYXNzd29yZElucHV0LmRhdGEoXCJzb3VyY2UtaWRcIiksXHJcbiAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBjaGVja0FjY2Vzc1Jlc3BvbmNlID0gZnVuY3Rpb24ocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5hbGxvd2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoXCJzcGFuXCIsIGNvbnRhaW5lcikuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICQoXCJzcGFuXCIsIGNvbnRhaW5lcikuc2hvdygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAkLmhlbHBlci5hamF4KFwiL2FqYXgvc2VjdXJlZC9zaG93Y29udGVudFwiLCBwdXNoRGF0YSwgY2hlY2tBY2Nlc3NSZXNwb25jZSk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAkKFwiaW5wdXRbdHlwZT10ZXh0XVwiLCBjb250YWluZXIpLmtleXByZXNzKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja0FjY2VzcygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAkKFwiLmJ1dHRvblwiLCBjb250YWluZXIpLmNsaWNrKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgY2hlY2tBY2Nlc3MoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJTZWN1cmVkQ29udGFpbmVyIGlzIHJlbmRlcmVkXCIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBTZWN1cmVkQ29udGFpbmVyLnByb3RvdHlwZS5pbml0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaW5pdENvbnRhaW5lcigpO1xyXG4gICAgfTtcclxuXHJcbiAgICAkLnNlY3VyZWRDb250YWluZXIgPSBuZXcgU2VjdXJlZENvbnRhaW5lciwgJC5zZWN1cmVkQ29udGFpbmVyLkNvbnN0cnVjdG9yID0gU2VjdXJlZENvbnRhaW5lcjtcclxuXHJcbn0od2luZG93LmpRdWVyeSksXHJcblxyXG4vL2luaXRpYWxpemluZyBtYWluIGFwcGxpY2F0aW9uIG1vZHVsZVxyXG5mdW5jdGlvbigkKSB7XHJcbiAgICBcInVzZSBzdHJpY3RcIjtcclxuICAgIGlmICgkKCcuU2VjdXJlZENvbnRhaW5lcicpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAkLnNlY3VyZWRDb250YWluZXIuaW5pdCgpO1xyXG4gICAgfVxyXG59KHdpbmRvdy5qUXVlcnkpO1xyXG5qUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkge1xyXG4gICAgdmFyIGhhc2ggPSBkZWNvZGVVUklDb21wb25lbnQod2luZG93LmxvY2F0aW9uLmhhc2guc3BsaXQoJyMnKVsxXSkucmVwbGFjZSgvLS9nLCAnICcpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAkKCcucG9wdXAnKS5lYWNoKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHZhciBwb3B1cCA9ICQodGhpcyk7XHJcbiAgICAgICAgaWYgKHBvcHVwLmhhc0NsYXNzKFwiaHRtbC1wb3B1cFwiKSkge1xyXG4gICAgICAgICAgICBpZiAoaGFzaCA9PSBwb3B1cC5kYXRhKFwicG9wdXBrZXlcIikudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgcG9wdXAubW9kYWwoJ3Nob3cnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICBwb3B1cC5tb2RhbCgnc2hvdycpO1xyXG4gICAgICAgICAgICB9LCBwb3B1cC5kYXRhKCdkZWxheScpICogMTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgJChcImFcIikub24oXCJjbGlja1wiLCBmdW5jdGlvbigpIHtcclxuICAgICAgICB2YXIgbGluayA9ICQodGhpcyk7XHJcbiAgICAgICAgdmFyIHVybCA9IGxpbmsuYXR0cihcImhyZWZcIik7XHJcbiAgICAgICAgaWYgKHVybCAhPSBudWxsICYmIHVybC5pbmRleE9mKCcjJykgIT0gLTEpIHtcclxuICAgICAgICAgICAgdmFyIHVybEhhc2ggPSBkZWNvZGVVUklDb21wb25lbnQodXJsLnNwbGl0KCcjJylbMV0pLnJlcGxhY2UoLy0vZywgJyAnKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICBpZiAodXJsSGFzaCAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgICAkKCcuaHRtbC1wb3B1cCcpLmVhY2goZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBvcHVwID0gJCh0aGlzKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXJsSGFzaCA9PSBwb3B1cC5kYXRhKFwicG9wdXBrZXlcIikudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3B1cC5tb2RhbCgnc2hvdycpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcbn0pOyJdLCJmaWxlIjoiYXBwLmpzIn0=
;
