From 42224b883bdb5414b80c4fe55adff21acbad3d69 Mon Sep 17 00:00:00 2001 From: Tejas Chari Date: Wed, 22 Nov 2023 13:02:51 +0530 Subject: [PATCH] fix: offcanvas menu show/hide and overlay issue --- _dev/js/theme.js | 30 +- assets/js/theme.js | 6446 ++++++++++++++++-- templates/catalog/_partials/facets.tpl | 2 + templates/catalog/_partials/products-top.tpl | 17 +- 4 files changed, 6041 insertions(+), 454 deletions(-) diff --git a/_dev/js/theme.js b/_dev/js/theme.js index e64d3c8..8d67436 100644 --- a/_dev/js/theme.js +++ b/_dev/js/theme.js @@ -85,17 +85,25 @@ $(function () { allowPageScroll: "vertical", }); - // $("#products_top_sidebar").offcanvas({ - // effect: "slide-in-over", - // overlay: true, - // classes: { - // element: "absolute top-0 z-50", - // }, - // }); - // - // $("#show_filters").on("click", function () { - // $("#products_top_sidebar").offcanvas("toggle"); - // }); + $("#product-list-top-filters").offcanvas({ + effect: "slide-in-over", + overlay: true, + classes: { + element: "absolute top-0 z-50", + }, + }); + + $("#show-filters").on("click.offcanvas", function () { + $("#product-list-top-filters").offcanvas("toggle"); + }); + + $("#product-list-top-filters").on("shown.offcanvas", function () { + $("#product-list-top-filters").show(); + }); + + $("#product-list-top-filters").on("hide.offcanvas", function () { + $("#product-list-top-filters").hide(); + }); function ThAccordion() {} diff --git a/assets/js/theme.js b/assets/js/theme.js index 8c36fe8..49432f0 100644 --- a/assets/js/theme.js +++ b/assets/js/theme.js @@ -1,438 +1,6016 @@ -(function(i,b){"use strict";function en(l){return l&&l.__esModule&&Object.prototype.hasOwnProperty.call(l,"default")?l.default:l}var Et={exports:{}};Et.exports,function(l){function n(t){"@babel/helpers - typeof";return n=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(w){return typeof w}:function(w){return w&&typeof Symbol=="function"&&w.constructor===Symbol&&w!==Symbol.prototype?"symbol":typeof w},n(t)}(function(t){n(l)==="object"&&l.exports?l.exports=function(w,s){return s===void 0&&(typeof window<"u"?s=i:s=i(w)),t(s),s}:t(jQuery)})(function(t){var w=0;t.fn.TouchSpin=function(s){var k={min:0,max:100,initval:"",replacementval:"",firstclickvalueifempty:null,step:1,decimals:0,stepinterval:100,forcestepdivisibility:"round",stepintervaldelay:500,verticalbuttons:!1,verticalup:"+",verticaldown:"−",verticalupclass:"",verticaldownclass:"",prefix:"",postfix:"",prefix_extraclass:"",postfix_extraclass:"",booster:!0,boostat:10,maxboostedstep:!1,mousewheel:!0,buttondown_class:"btn btn-primary",buttonup_class:"btn btn-primary",buttondown_txt:"−",buttonup_txt:"+",callback_before_calculation:function(p){return p},callback_after_calculation:function(p){return p}},C={min:"min",max:"max",initval:"init-val",replacementval:"replacement-val",firstclickvalueifempty:"first-click-value-if-empty",step:"step",decimals:"decimals",stepinterval:"step-interval",verticalbuttons:"vertical-buttons",verticalupclass:"vertical-up-class",verticaldownclass:"vertical-down-class",forcestepdivisibility:"force-step-divisibility",stepintervaldelay:"step-interval-delay",prefix:"prefix",postfix:"postfix",prefix_extraclass:"prefix-extra-class",postfix_extraclass:"postfix-extra-class",booster:"booster",boostat:"boostat",maxboostedstep:"max-boosted-step",mousewheel:"mouse-wheel",buttondown_class:"button-down-class",buttonup_class:"button-up-class",buttondown_txt:"button-down-txt",buttonup_txt:"button-up-txt"};return this.each(function(){var o,p=t(this),Q=p.data(),_,u,S,d,V,O,A,c,N,G,ie=0,ce=!1;Le();function Le(){if(!p.data("alreadyinitialized")){if(p.data("alreadyinitialized",!0),w+=1,p.data("spinnerid",w),!p.is("input")){console.log("Must be an input.");return}f(),Ue(),y(),Ae(),a(),z(),r(),F(),m(),x()}}function Ue(){o.initval!==""&&p.val()===""&&p.val(o.initval)}function be(g){qe(g),y();var q=d.input.val();q!==""&&(q=parseFloat(o.callback_before_calculation(d.input.val())),d.input.val(o.callback_after_calculation(parseFloat(q).toFixed(o.decimals))))}function f(){if(o=t.extend({},k,Q,Me(),s),parseFloat(o.step)!==1){var g;g=o.max%o.step,g!==0&&(o.max=parseFloat(o.max)-g),g=o.min%o.step,g!==0&&(o.min=parseFloat(o.min)+(parseFloat(o.step)-g))}}function Me(){var g={};return t.each(C,function(q,ee){var pe="bts-"+ee;p.is("[data-"+pe+"]")&&(g[q]=p.data(pe))}),t.each(["min","max","step"],function(q,ee){p.is("["+ee+"]")&&(g[ee]!==void 0&&console.warn('Both the "data-bts-'+ee+'" data attribute and the "'+ee+'" individual attribute were specified, the individual attribute will take precedence on: ',p),g[ee]=p.attr(ee))}),g}function ze(){var g=p.parent();Z(),p.off(".touchspin"),g.hasClass("bootstrap-touchspin-injected")?(p.siblings().remove(),p.unwrap()):(t(".bootstrap-touchspin-injected",g).remove(),g.removeClass("bootstrap-touchspin")),p.data("alreadyinitialized",!1)}function qe(g){if(o=t.extend({},o,g),g.postfix){var q=p.parent().find(".bootstrap-touchspin-postfix");q.length===0&&u.insertAfter(p),p.parent().find(".bootstrap-touchspin-postfix .input-group-text").text(g.postfix)}if(g.prefix){var ee=p.parent().find(".bootstrap-touchspin-prefix");ee.length===0&&_.insertBefore(p),p.parent().find(".bootstrap-touchspin-prefix .input-group-text").text(g.prefix)}r()}function Ae(){var g=p.val(),q=p.parent();g!==""&&(g=o.callback_before_calculation(g),g=o.callback_after_calculation(parseFloat(g).toFixed(o.decimals))),p.data("initvalue",g).val(g),p.addClass("form-control"),V=` - - - - - - - `),q.hasClass("input-group")?ft(q):e()}function ft(g){g.addClass("bootstrap-touchspin");var q=p.prev(),ee=p.next(),pe,Y,Pe=` - - `.concat(o.prefix,` - - `),Ne=` - - `.concat(o.postfix,` - - `);o.verticalbuttons?t(V).insertAfter(p):(q.hasClass("input-group-btn")||q.hasClass("input-group-prepend")?(pe=` - - `),q.append(pe)):(pe=` - - - - `),t(pe).insertBefore(p)),ee.hasClass("input-group-btn")||ee.hasClass("input-group-append")?(Y=` - - `),ee.prepend(Y)):(Y=` - - - - `),t(Y).insertAfter(p))),t(Pe).insertBefore(p),t(Ne).insertAfter(p),S=g}function e(){var g,q="";p.hasClass("input-sm")||p.hasClass("form-control-sm")?q="input-group-sm":(p.hasClass("input-lg")||p.hasClass("form-control-lg"))&&(q="input-group-lg"),o.verticalbuttons?g=` -
- - `).concat(o.prefix,` - - - `).concat(o.postfix,` - - `).concat(V,` -
- `):g=` -
- - - - - `).concat(o.prefix,` - - - `).concat(o.postfix,` - - - - -
`),S=t(g).insertBefore(p),t(".bootstrap-touchspin-prefix",S).after(p),p.hasClass("input-sm")||p.hasClass("form-control-sm")?S.addClass("input-group-sm"):(p.hasClass("input-lg")||p.hasClass("form-control-lg"))&&S.addClass("input-group-lg")}function a(){d={down:t(".bootstrap-touchspin-down",S),up:t(".bootstrap-touchspin-up",S),input:t("input",S),prefix:t(".bootstrap-touchspin-prefix",S).addClass(o.prefix_extraclass),postfix:t(".bootstrap-touchspin-postfix",S).addClass(o.postfix_extraclass)}}function r(){o.prefix===""&&(_=d.prefix.detach()),o.postfix===""&&(u=d.postfix.detach())}function m(){p.on("keydown.touchspin",function(g){var q=g.keyCode||g.which;q===38?(ce!=="up"&&(D(),re()),g.preventDefault()):q===40?(ce!=="down"&&(U(),W()),g.preventDefault()):(q===9||q===13)&&y()}),p.on("keyup.touchspin",function(g){var q=g.keyCode||g.which;(q===38||q===40)&&Z()}),t(document).on("mousedown touchstart",function(g){t(g.target).is(p)||y()}),p.on("blur.touchspin",function(){y()}),d.down.on("keydown",function(g){var q=g.keyCode||g.which;(q===32||q===13)&&(ce!=="down"&&(U(),W()),g.preventDefault())}),d.down.on("keyup.touchspin",function(g){var q=g.keyCode||g.which;(q===32||q===13)&&Z()}),d.up.on("keydown.touchspin",function(g){var q=g.keyCode||g.which;(q===32||q===13)&&(ce!=="up"&&(D(),re()),g.preventDefault())}),d.up.on("keyup.touchspin",function(g){var q=g.keyCode||g.which;(q===32||q===13)&&Z()}),d.down.on("mousedown.touchspin",function(g){d.down.off("touchstart.touchspin"),!p.is(":disabled,[readonly]")&&(U(),W(),g.preventDefault(),g.stopPropagation())}),d.down.on("touchstart.touchspin",function(g){d.down.off("mousedown.touchspin"),!p.is(":disabled,[readonly]")&&(U(),W(),g.preventDefault(),g.stopPropagation())}),d.up.on("mousedown.touchspin",function(g){d.up.off("touchstart.touchspin"),!p.is(":disabled,[readonly]")&&(D(),re(),g.preventDefault(),g.stopPropagation())}),d.up.on("touchstart.touchspin",function(g){d.up.off("mousedown.touchspin"),!p.is(":disabled,[readonly]")&&(D(),re(),g.preventDefault(),g.stopPropagation())}),d.up.on("mouseup.touchspin mouseout.touchspin touchleave.touchspin touchend.touchspin touchcancel.touchspin",function(g){ce&&(g.stopPropagation(),Z())}),d.down.on("mouseup.touchspin mouseout.touchspin touchleave.touchspin touchend.touchspin touchcancel.touchspin",function(g){ce&&(g.stopPropagation(),Z())}),d.down.on("mousemove.touchspin touchmove.touchspin",function(g){ce&&(g.stopPropagation(),g.preventDefault())}),d.up.on("mousemove.touchspin touchmove.touchspin",function(g){ce&&(g.stopPropagation(),g.preventDefault())}),p.on("mousewheel.touchspin DOMMouseScroll.touchspin",function(g){if(!(!o.mousewheel||!p.is(":focus"))){var q=g.originalEvent.wheelDelta||-g.originalEvent.deltaY||-g.originalEvent.detail;g.stopPropagation(),g.preventDefault(),q<0?U():D()}})}function x(){p.on("touchspin.destroy",function(){ze()}),p.on("touchspin.uponce",function(){Z(),D()}),p.on("touchspin.downonce",function(){Z(),U()}),p.on("touchspin.startupspin",function(){re()}),p.on("touchspin.startdownspin",function(){W()}),p.on("touchspin.stopspin",function(){Z()}),p.on("touchspin.updatesettings",function(g,q){be(q)})}function F(){if(typeof MutationObserver<"u"){var g=new MutationObserver(function(q){q.forEach(function(ee){ee.type==="attributes"&&(ee.attributeName==="disabled"||ee.attributeName==="readonly")&&z()})});g.observe(p[0],{attributes:!0})}}function T(g){switch(o.forcestepdivisibility){case"round":return(Math.round(g/o.step)*o.step).toFixed(o.decimals);case"floor":return(Math.floor(g/o.step)*o.step).toFixed(o.decimals);case"ceil":return(Math.ceil(g/o.step)*o.step).toFixed(o.decimals);default:return g.toFixed(o.decimals)}}function y(){var g,q,ee;if(g=o.callback_before_calculation(p.val()),g===""){o.replacementval!==""&&(p.val(o.replacementval),p.trigger("change"));return}o.decimals>0&&g==="."||(q=parseFloat(g),isNaN(q)&&(o.replacementval!==""?q=o.replacementval:q=0),ee=q,q.toString()!==g&&(ee=q),ee=T(q),o.min!==null&&qo.max&&(ee=o.max),parseFloat(q).toString()!==parseFloat(ee).toString()&&p.val(ee),p.val(o.callback_after_calculation(parseFloat(ee).toFixed(o.decimals))))}function E(){if(o.booster){var g=Math.pow(2,Math.floor(ie/o.boostat))*o.step;return o.maxboostedstep&&g>o.maxboostedstep&&(g=o.maxboostedstep,O=Math.round(O/g)*g),Math.max(o.step,g)}else return o.step}function I(){return typeof o.firstclickvalueifempty=="number"?o.firstclickvalueifempty:(o.min+o.max)/2}function z(){var g=p.is(":disabled,[readonly]");d.up.prop("disabled",g),d.down.prop("disabled",g),g&&Z()}function D(){if(!p.is(":disabled,[readonly]")){y(),O=parseFloat(o.callback_before_calculation(d.input.val()));var g=O,q;isNaN(O)?O=I():(q=E(),O=O+q),o.max!==null&&O>=o.max&&(O=o.max,p.trigger("touchspin.on.max"),Z()),d.input.val(o.callback_after_calculation(parseFloat(O).toFixed(o.decimals))),g!==O&&p.trigger("change")}}function U(){if(!p.is(":disabled,[readonly]")){y(),O=parseFloat(o.callback_before_calculation(d.input.val()));var g=O,q;isNaN(O)?O=I():(q=E(),O=O-q),o.min!==null&&O<=o.min&&(O=o.min,p.trigger("touchspin.on.min"),Z()),d.input.val(o.callback_after_calculation(parseFloat(O).toFixed(o.decimals))),g!==O&&p.trigger("change")}}function W(){p.is(":disabled,[readonly]")||(Z(),ie=0,ce="down",p.trigger("touchspin.on.startspin"),p.trigger("touchspin.on.startdownspin"),N=setTimeout(function(){A=setInterval(function(){ie++,U()},o.stepinterval)},o.stepintervaldelay))}function re(){p.is(":disabled,[readonly]")||(Z(),ie=0,ce="up",p.trigger("touchspin.on.startspin"),p.trigger("touchspin.on.startupspin"),G=setTimeout(function(){c=setInterval(function(){ie++,D()},o.stepinterval)},o.stepintervaldelay))}function Z(){switch(clearTimeout(N),clearTimeout(G),clearInterval(A),clearInterval(c),ce){case"up":p.trigger("touchspin.on.stopupspin"),p.trigger("touchspin.on.stopspin");break;case"down":p.trigger("touchspin.on.stopdownspin"),p.trigger("touchspin.on.stopspin");break}ie=0,ce=!1}})}})}(Et),Et.exports;var tn={exports:{}};/*! - * @fileOverview TouchSwipe - jQuery Plugin - * @version 1.6.18 - * - * @author Matt Bryson http://www.github.com/mattbryson - * @see https://github.com/mattbryson/TouchSwipe-Jquery-Plugin - * @see http://labs.rampinteractive.co.uk/touchSwipe/ - * @see http://plugins.jquery.com/project/touchSwipe - * @license - * Copyright (c) 2010-2015 Matt Bryson - * Dual licensed under the MIT or GPL Version 2 licenses. - * - */(function(l){(function(n){n(l.exports?i:jQuery)})(function(n){function t(e){return!e||e.allowPageScroll!==void 0||e.swipe===void 0&&e.swipeStatus===void 0||(e.allowPageScroll=u),e.click!==void 0&&e.tap===void 0&&(e.tap=e.click),e||(e={}),e=n.extend({},n.fn.swipe.defaults,e),this.each(function(){var a=n(this),r=a.data(Ae);r||(r=new w(this,e),a.data(Ae,r))})}function w(e,v){function r(h){if(!(Be()||n(h.target).closest(v.excludedElements,R).length>0)){var L=h.originalEvent?h.originalEvent:h;if(!L.pointerType||L.pointerType!="mouse"||v.fallbackToMouseEvents!=0){var j,J=L.touches,ve=J?J[0]:L;return X=Le,J?oe=J.length:v.preventDefaultEvents!==!1&&h.preventDefault(),le=0,ge=null,de=null,Se=null,ue=0,Ve=0,Ye=0,xe=1,Te=0,Ze=At(),te(),Qe(0,ve),!J||oe===v.fingers||v.fingers===ie||q()?(De=nt(),oe==2&&(Qe(1,J[1]),Ve=Ye=pt(B[0].start,B[1].start)),(v.swipeStatus||v.pinchStatus)&&(j=I(L,X))):j=!1,j===!1?(X=f,I(L,X),j):(v.hold&&(rt=setTimeout(n.proxy(function(){R.trigger("hold",[L.target]),v.hold&&(j=v.hold.call(R,L,L.target))},this),v.longTapThreshold)),tt(!0),null)}}}function m(h){var L=h.originalEvent?h.originalEvent:h;if(X!==be&&X!==f&&!me()){var j,J=L.touches,ve=J?J[0]:L,we=vt(ve);if(Ge=nt(),J&&(oe=J.length),v.hold&&clearTimeout(rt),X=Ue,oe==2&&(Ve==0?(Qe(1,J[1]),Ve=Ye=pt(B[0].start,B[1].start)):(vt(J[1]),Ye=pt(B[0].end,B[1].end),Se=kt(B[0].end,B[1].end)),xe=ht(Ve,Ye),Te=Math.abs(Ve-Ye)),oe===v.fingers||v.fingers===ie||!J||q()){if(ge=wt(we.start,we.end),de=wt(we.last,we.end),Z(h,de),le=_t(we.start,we.end),ue=dt(),je(ge,le),j=I(L,X),!v.triggerOnTouchEnd||v.triggerOnTouchLeave){var Ke=!0;if(v.triggerOnTouchLeave){var Xe=Ct(this);Ke=at(we.end,Xe)}!v.triggerOnTouchEnd&&Ke?X=E(Ue):v.triggerOnTouchLeave&&!Ke&&(X=E(be)),X!=f&&X!=be||I(L,X)}}else X=f,I(L,X);j===!1&&(X=f,I(L,X))}}function x(h){var L=h.originalEvent?h.originalEvent:h,j=L.touches;if(j){if(j.length&&!me())return We(L),!0;if(j.length&&me())return!0}return me()&&(oe=gt),Ge=nt(),ue=dt(),U()||!D()?(X=f,I(L,X)):v.triggerOnTouchEnd||v.triggerOnTouchEnd===!1&&X===Ue?(v.preventDefaultEvents!==!1&&h.cancelable!==!1&&h.preventDefault(),X=be,I(L,X)):!v.triggerOnTouchEnd&&Oe()?(X=be,z(L,X,O)):X===Ue&&(X=f,I(L,X)),tt(!1),null}function F(){oe=0,Ge=0,De=0,Ve=0,Ye=0,xe=1,te(),tt(!1)}function T(h){var L=h.originalEvent?h.originalEvent:h;v.triggerOnTouchLeave&&(X=E(be),I(L,X))}function y(){R.off(ye,r),R.off(ne,F),R.off(Ee,m),R.off(K,x),ot&&R.off(ot,T),tt(!1)}function E(h){var L=h,j=re(),J=D(),ve=U();return!j||ve?L=f:!J||h!=Ue||v.triggerOnTouchEnd&&!v.triggerOnTouchLeave?!J&&h==be&&v.triggerOnTouchLeave&&(L=f):L=be,L}function I(h,L){var j,J=h.touches;return(Pe()||Y())&&(j=z(h,L,d)),(ee()||q())&&j!==!1&&(j=z(h,L,V)),_e()&&j!==!1?j=z(h,L,A):Ce()&&j!==!1?j=z(h,L,c):he()&&j!==!1&&(j=z(h,L,O)),L===f&&F(),L===be&&(J&&J.length||F()),j}function z(h,L,j){var J;if(j==d){if(R.trigger("swipeStatus",[L,ge||null,le||0,ue||0,oe,B,de]),v.swipeStatus&&(J=v.swipeStatus.call(R,h,L,ge||null,le||0,ue||0,oe,B,de),J===!1))return!1;if(L==be&&pe()){if(clearTimeout(Re),clearTimeout(rt),R.trigger("swipe",[ge,le,ue,oe,B,de]),v.swipe&&(J=v.swipe.call(R,h,ge,le,ue,oe,B,de),J===!1))return!1;switch(ge){case k:R.trigger("swipeLeft",[ge,le,ue,oe,B,de]),v.swipeLeft&&(J=v.swipeLeft.call(R,h,ge,le,ue,oe,B,de));break;case C:R.trigger("swipeRight",[ge,le,ue,oe,B,de]),v.swipeRight&&(J=v.swipeRight.call(R,h,ge,le,ue,oe,B,de));break;case o:R.trigger("swipeUp",[ge,le,ue,oe,B,de]),v.swipeUp&&(J=v.swipeUp.call(R,h,ge,le,ue,oe,B,de));break;case p:R.trigger("swipeDown",[ge,le,ue,oe,B,de]),v.swipeDown&&(J=v.swipeDown.call(R,h,ge,le,ue,oe,B,de))}}}if(j==V){if(R.trigger("pinchStatus",[L,Se||null,Te||0,ue||0,oe,xe,B]),v.pinchStatus&&(J=v.pinchStatus.call(R,h,L,Se||null,Te||0,ue||0,oe,xe,B),J===!1))return!1;if(L==be&&g())switch(Se){case Q:R.trigger("pinchIn",[Se||null,Te||0,ue||0,oe,xe,B]),v.pinchIn&&(J=v.pinchIn.call(R,h,Se||null,Te||0,ue||0,oe,xe,B));break;case _:R.trigger("pinchOut",[Se||null,Te||0,ue||0,oe,xe,B]),v.pinchOut&&(J=v.pinchOut.call(R,h,Se||null,Te||0,ue||0,oe,xe,B))}}return j==O?L!==f&&L!==be||(clearTimeout(Re),clearTimeout(rt),ke()&&!P()?(Je=nt(),Re=setTimeout(n.proxy(function(){Je=null,R.trigger("tap",[h.target]),v.tap&&(J=v.tap.call(R,h,h.target))},this),v.doubleTapThreshold)):(Je=null,R.trigger("tap",[h.target]),v.tap&&(J=v.tap.call(R,h,h.target)))):j==A?L!==f&&L!==be||(clearTimeout(Re),clearTimeout(rt),Je=null,R.trigger("doubletap",[h.target]),v.doubleTap&&(J=v.doubleTap.call(R,h,h.target))):j==c&&(L!==f&&L!==be||(clearTimeout(Re),Je=null,R.trigger("longtap",[h.target]),v.longTap&&(J=v.longTap.call(R,h,h.target)))),J}function D(){var h=!0;return v.threshold!==null&&(h=le>=v.threshold),h}function U(){var h=!1;return v.cancelThreshold!==null&&ge!==null&&(h=Tt(ge)-le>=v.cancelThreshold),h}function W(){return v.pinchThreshold!==null?Te>=v.pinchThreshold:!0}function re(){return v.maxTimeThreshold?!(ue>=v.maxTimeThreshold):!0}function Z(h,L){if(v.preventDefaultEvents!==!1)if(v.allowPageScroll===u)h.preventDefault();else{var j=v.allowPageScroll===S;switch(L){case k:(v.swipeLeft&&j||!j&&v.allowPageScroll!=N)&&h.preventDefault();break;case C:(v.swipeRight&&j||!j&&v.allowPageScroll!=N)&&h.preventDefault();break;case o:(v.swipeUp&&j||!j&&v.allowPageScroll!=G)&&h.preventDefault();break;case p:(v.swipeDown&&j||!j&&v.allowPageScroll!=G)&&h.preventDefault();break}}}function g(){var h=Ne(),L=et(),j=W();return h&&L&&j}function q(){return!!(v.pinchStatus||v.pinchIn||v.pinchOut)}function ee(){return!(!g()||!q())}function pe(){var h=re(),L=D(),j=Ne(),J=et(),ve=U(),we=!ve&&J&&j&&L&&h;return we}function Y(){return!!(v.swipe||v.swipeStatus||v.swipeLeft||v.swipeRight||v.swipeUp||v.swipeDown)}function Pe(){return!(!pe()||!Y())}function Ne(){return oe===v.fingers||v.fingers===ie||!Me}function et(){return B[0].end.x!==0}function Oe(){return!!v.tap}function ke(){return!!v.doubleTap}function M(){return!!v.longTap}function H(){if(Je==null)return!1;var h=nt();return ke()&&h-Je<=v.doubleTapThreshold}function P(){return H()}function se(){return(oe===1||!Me)&&(isNaN(le)||lev.longTapThreshold&&ce>le}function he(){return!(!se()||!Oe())}function _e(){return!(!H()||!ke())}function Ce(){return!(!ae()||!M())}function We(h){it=nt(),gt=h.touches.length+1}function te(){it=0,gt=0}function me(){var h=!1;if(it){var L=nt()-it;L<=v.fingerReleaseThreshold&&(h=!0)}return h}function Be(){return R.data(Ae+"_intouch")===!0}function tt(h){R&&(h===!0?(R.on(Ee,m),R.on(K,x),ot&&R.on(ot,T)):(R.off(Ee,m,!1),R.off(K,x,!1),ot&&R.off(ot,T,!1)),R.data(Ae+"_intouch",h===!0))}function Qe(h,L){var j={start:{x:0,y:0},last:{x:0,y:0},end:{x:0,y:0}};return j.start.x=j.last.x=j.end.x=L.pageX||L.clientX,j.start.y=j.last.y=j.end.y=L.pageY||L.clientY,B[h]=j,j}function vt(h){var L=h.identifier!==void 0?h.identifier:0,j=bt(L);return j===null&&(j=Qe(L,h)),j.last.x=j.end.x,j.last.y=j.end.y,j.end.x=h.pageX||h.clientX,j.end.y=h.pageY||h.clientY,j}function bt(h){return B[h]||null}function je(h,L){h!=u&&(L=Math.max(L,Tt(h)),Ze[h].distance=L)}function Tt(h){return Ze[h]?Ze[h].distance:void 0}function At(){var h={};return h[k]=st(k),h[C]=st(C),h[o]=st(o),h[p]=st(p),h}function st(h){return{direction:h,distance:0}}function dt(){return Ge-De}function pt(h,L){var j=Math.abs(h.x-L.x),J=Math.abs(h.y-L.y);return Math.round(Math.sqrt(j*j+J*J))}function ht(h,L){var j=L/h*1;return j.toFixed(2)}function kt(){return 1>xe?_:Q}function _t(h,L){return Math.round(Math.sqrt(Math.pow(L.x-h.x,2)+Math.pow(L.y-h.y,2)))}function Pt(h,L){var j=h.x-L.x,J=L.y-h.y,ve=Math.atan2(J,j),we=Math.round(180*ve/Math.PI);return 0>we&&(we=360-Math.abs(we)),we}function wt(h,L){if(yt(h,L))return u;var j=Pt(h,L);return 45>=j&&j>=0||360>=j&&j>=315?k:j>=135&&225>=j?C:j>45&&135>j?p:o}function nt(){var h=new Date;return h.getTime()}function Ct(h){h=n(h);var L=h.offset(),j={left:L.left,right:L.left+h.outerWidth(),top:L.top,bottom:L.top+h.outerHeight()};return j}function at(h,L){return h.x>L.left&&h.xL.top&&h.y - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */const nn={template:"#password-feedback",hint:".js-hint-password",container:".password-strength-feedback",strengthText:".password-strength-text",requirementScore:".password-requirements-score",requirementLength:".password-requirements-length",requirementScoreIcon:".password-requirements-score i",requirementLengthIcon:".password-requirements-length i",progressBar:".progress-bar",inputColumn:".js-input-column"};b.themeSelectors={product:{tabs:".tabs .nav-link",activeNavClass:"js-product-nav-active",activeTabClass:"js-product-tab-active",activeTabs:".tabs .nav-link.active, .js-product-nav-active",imagesModal:".js-product-images-modal",thumb:".js-thumb",thumbContainer:".thumb-container, .js-thumb-container",arrows:".js-arrows",selected:".selected, .js-thumb-selected",modalProductCover:".js-modal-product-cover",cover:".js-qv-product-cover",customizationModal:".js-customization-modal"},listing:{searchFilterToggler:"#search_filter_toggler, .js-search-toggler",searchFiltersWrapper:"#search_filters_wrapper",searchFilterControls:"#search_filter_controls",searchFilters:"#search_filters",activeSearchFilters:"#js-active-search-filters",listTop:"#js-product-list-top",product:".js-product",list:"#js-product-list",listBottom:"#js-product-list-bottom",listHeader:"#js-product-list-header",searchFiltersClearAll:".js-search-filters-clear-all",searchLink:".js-search-link"},order:{returnForm:"#order-return-form, .js-order-return-form"},arrowDown:".arrow-down, .js-arrow-down",arrowUp:".arrow-up, .js-arrow-up",clear:".clear",fileInput:".js-file-input",contentWrapper:"#content-wrapper, .js-content-wrapper",footer:"#footer, .js-footer",modalContent:".js-modal-content",modal:"#modal, .js-checkout-modal",touchspin:".js-touchspin",checkout:{termsLink:".js-terms a",giftCheckbox:".js-gift-checkbox",imagesLink:".card-block .cart-summary-products p a, .js-show-details",carrierExtraContent:".carrier-extra-content, .js-carrier-extra-content",btn:".checkout a"},cart:{productLineQty:".js-cart-line-product-quantity",quickview:".quickview",touchspin:".bootstrap-touchspin",promoCode:"#promo-code",displayPromo:".display-promo",promoCodeButton:".promo-code-button",discountCode:".js-discount .code",discountName:"[name=discount_name]",actions:'[data-link-action="delete-from-cart"], [data-link-action="remove-voucher"]'},notifications:{dangerAlert:"#notifications article.alert-danger",container:"#notifications .notifications-container"},passwordPolicy:nn},i(document).ready(()=>{b.emit("themeSelectorsInit")});/** - * Copyright since 2007 PrestaShop SA and Contributors - * PrestaShop is an International Registered Trademark & Property of PrestaShop SA - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License 3.0 (AFL-3.0) - * that is bundled with this package in the file LICENSE.md. - * It is also available through the world-wide-web at this URL: - * https://opensource.org/licenses/AFL-3.0 - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@prestashop.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade PrestaShop to newer - * versions in the future. If you wish to customize PrestaShop for your - * needs please refer to https://devdocs.prestashop.com/ for more information. - * - * @author PrestaShop SA and Contributors - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */b.responsive=b.responsive||{},b.responsive.current_width=window.innerWidth,b.responsive.min_width=768,b.responsive.mobile=b.responsive.current_width{const t=i(`#${n.id.replace("_desktop_","_mobile_")}`);t.length&&jt(i(n),t)}):i("*[id^='_mobile_']").each((l,n)=>{const t=i(`#${n.id.replace("_mobile_","_desktop_")}`);t.length&&jt(i(n),t)}),b.emit("responsive update",{mobile:b.responsive.mobile})}i(window).on("resize",()=>{const l=b.responsive.current_width,n=b.responsive.min_width,t=window.innerWidth,w=l>=n&&t=n;b.responsive.current_width=t,b.responsive.mobile=b.responsive.current_width{b.responsive.mobile&&It()});/** - * Copyright since 2007 PrestaShop SA and Contributors - * PrestaShop is an International Registered Trademark & Property of PrestaShop SA - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License 3.0 (AFL-3.0) - * that is bundled with this package in the file LICENSE.md. - * It is also available through the world-wide-web at this URL: - * https://opensource.org/licenses/AFL-3.0 - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@prestashop.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade PrestaShop to newer - * versions in the future. If you wish to customize PrestaShop for your - * needs please refer to https://devdocs.prestashop.com/ for more information. - * - * @author PrestaShop SA and Contributors - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */function rn(){i(b.themeSelectors.checkout.termsLink).on("click",l=>{l.preventDefault();let n=i(l.target).attr("href");n&&(n+="?content_only=1",i.get(n,t=>{i(b.themeSelectors.modal).find(b.themeSelectors.modalContent).html(i(t).find(".page-cms").contents())}).fail(t=>{b.emit("handleError",{eventType:"clickTerms",resp:t})})),i(b.themeSelectors.modal).modal("show")}),i(b.themeSelectors.checkout.giftCheckbox).on("click",()=>{i("#gift").slideToggle()})}function on(){i(b.themeSelectors.checkout.imagesLink).on("click",function(){const l=i(this).find("i.material-icons");l.text()==="expand_more"?l.text("expand_less"):l.text("expand_more")})}i(document).ready(()=>{i("body#checkout").length===1&&(rn(),on()),b.on("updatedDeliveryForm",l=>{typeof l.deliveryOption>"u"||l.deliveryOption.length===0||(i(b.themeSelectors.checkout.carrierExtraContent).hide(),l.deliveryOption.next(b.themeSelectors.checkout.carrierExtraContent).slideDown())})});/** - * Copyright since 2007 PrestaShop SA and Contributors - * PrestaShop is an International Registered Trademark & Property of PrestaShop SA - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License 3.0 (AFL-3.0) - * that is bundled with this package in the file LICENSE.md. - * It is also available through the world-wide-web at this URL: - * https://opensource.org/licenses/AFL-3.0 - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@prestashop.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade PrestaShop to newer - * versions in the future. If you wish to customize PrestaShop for your - * needs please refer to https://devdocs.prestashop.com/ for more information. - * - * @author PrestaShop SA and Contributors - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */function sn(){i(`${b.themeSelectors.order.returnForm} table thead input[type=checkbox]`).on("click",function(){const l=i(this).prop("checked");i(`${b.themeSelectors.order.returnForm} table tbody input[type=checkbox]`).each((n,t)=>{i(t).prop("checked",l)})})}function an(){i("body#order-detail")&&sn()}i(document).ready(an);var ln={exports:{}};/*! VelocityJS.org (1.5.2). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */(function(l){/*! VelocityJS.org jQuery Shim (1.0.1). (C) 2014 The jQuery Foundation. MIT @license: en.wikipedia.org/wiki/MIT_License. */(function(n){if(n.jQuery)return;var t=function(_,u){return new t.fn.init(_,u)};t.isWindow=function(_){return _&&_===_.window},t.type=function(_){return _?typeof _=="object"||typeof _=="function"?k[o.call(_)]||"object":typeof _:_+""},t.isArray=Array.isArray||function(_){return t.type(_)==="array"};function w(_){var u=_.length,S=t.type(_);return S==="function"||t.isWindow(_)?!1:_.nodeType===1&&u?!0:S==="array"||u===0||typeof u=="number"&&u>0&&u-1 in _}t.isPlainObject=function(_){var u;if(!_||t.type(_)!=="object"||_.nodeType||t.isWindow(_))return!1;try{if(_.constructor&&!C.call(_,"constructor")&&!C.call(_.constructor.prototype,"isPrototypeOf"))return!1}catch{return!1}for(u in _);return u===void 0||C.call(_,u)},t.each=function(_,u,S){var d,V=0,O=_.length,A=w(_);if(S){if(A)for(;V4;e--){var a=w.createElement("div");if(a.innerHTML="",a.getElementsByTagName("span").length)return a=null,e}return s}(),C=function(){var e=0;return t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||function(a){var r=new Date().getTime(),m;return m=Math.max(0,16-(r-e)),e=r+m,setTimeout(function(){a(r+m)},m)}}(),o=function(){var e=t.performance||{};if(typeof e.now!="function"){var a=e.timing&&e.timing.navigationStart?e.timing.navigationStart:new Date().getTime();e.now=function(){return new Date().getTime()-a}}return e}();function p(e){for(var a=-1,r=e?e.length:0,m=[];++a=0?r:Math.max(0,x+r),E=m<0?x+m:Math.min(m,x),I=E-y;if(I>0)if(T=new Array(I),this.charAt)for(F=0;F=0}:function(e,a){for(var r=0;r0?P=ae:H=ae;while(Math.abs(se)>T&&++he=F?ee(M,he):_e===0?he:Y(M,H,H+I)}var Ne=!1;function et(){Ne=!0,(e!==a||r!==m)&&pe()}var Oe=function(M){return Ne||et(),e===a&&r===m?M:M===0?0:M===1?1:g(Pe(M),a,m)};Oe.getControlPoints=function(){return[{x:e,y:a},{x:r,y:m}]};var ke="generateBezier("+[e,a,r,m]+")";return Oe.toString=function(){return ke},Oe}var Ue=function(){function e(m){return-m.tension*m.x-m.friction*m.v}function a(m,x,F){var T={x:m.x+F.dx*x,v:m.v+F.dv*x,tension:m.tension,friction:m.friction};return{dx:T.v,dv:e(T)}}function r(m,x){var F={dx:m.v,dv:e(m)},T=a(m,x*.5,F),y=a(m,x*.5,T),E=a(m,x,y),I=1/6*(F.dx+2*(T.dx+y.dx)+E.dx),z=1/6*(F.dv+2*(T.dv+y.dv)+E.dv);return m.x=m.x+I*x,m.v=m.v+z*x,m}return function m(x,F,T){var y={x:-1,v:0,tension:null,friction:null},E=[0],I=0,z=1/1e4,D=16/1e3,U,W,re;for(x=parseFloat(x)||500,F=parseFloat(F)||20,T=T||null,y.tension=x,y.friction=F,U=T!==null,U?(I=m(x,F),W=I/T*D):W=D;re=r(re||y,W),E.push(1+re.x),I+=16,Math.abs(re.x)>z&&Math.abs(re.v)>z;);return U?function(Z){return E[Z*(E.length-1)|0]}:I}}();c.Easings={linear:function(e){return e},swing:function(e){return .5-Math.cos(e*Math.PI)/2},spring:function(e){return 1-Math.cos(e*4.5*Math.PI)*Math.exp(-e*6)}},d.each([["ease",[.25,.1,.25,1]],["ease-in",[.42,0,1,1]],["ease-out",[0,0,.58,1]],["ease-in-out",[.42,0,.58,1]],["easeInSine",[.47,0,.745,.715]],["easeOutSine",[.39,.575,.565,1]],["easeInOutSine",[.445,.05,.55,.95]],["easeInQuad",[.55,.085,.68,.53]],["easeOutQuad",[.25,.46,.45,.94]],["easeInOutQuad",[.455,.03,.515,.955]],["easeInCubic",[.55,.055,.675,.19]],["easeOutCubic",[.215,.61,.355,1]],["easeInOutCubic",[.645,.045,.355,1]],["easeInQuart",[.895,.03,.685,.22]],["easeOutQuart",[.165,.84,.44,1]],["easeInOutQuart",[.77,0,.175,1]],["easeInQuint",[.755,.05,.855,.06]],["easeOutQuint",[.23,1,.32,1]],["easeInOutQuint",[.86,0,.07,1]],["easeInExpo",[.95,.05,.795,.035]],["easeOutExpo",[.19,1,.22,1]],["easeInOutExpo",[1,0,0,1]],["easeInCirc",[.6,.04,.98,.335]],["easeOutCirc",[.075,.82,.165,1]],["easeInOutCirc",[.785,.135,.15,.86]]],function(e,a){c.Easings[a[0]]=Le.apply(null,a[1])});function be(e,a){var r=e;return S.isString(e)?c.Easings[e]||(r=!1):S.isArray(e)&&e.length===1?r=ce.apply(null,e):S.isArray(e)&&e.length===2?r=Ue.apply(null,e.concat([a])):S.isArray(e)&&e.length===4?r=Le.apply(null,e):r=!1,r===!1&&(c.Easings[c.defaults.easing]?r=c.defaults.easing:r=A),r}var f=c.CSS={RegEx:{isHex:/^#([A-f\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\((.*)\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/ig},Lists:{colors:["fill","stroke","stopColor","color","backgroundColor","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","outlineColor"],transformsBase:["translateX","translateY","scale","scaleX","scaleY","skewX","skewY","rotateZ"],transforms3D:["transformPerspective","translateZ","scaleZ","rotateX","rotateY"],units:["%","em","ex","ch","rem","vw","vh","vmin","vmax","cm","mm","Q","in","pc","pt","px","deg","grad","rad","turn","s","ms"],colorNames:{aliceblue:"240,248,255",antiquewhite:"250,235,215",aquamarine:"127,255,212",aqua:"0,255,255",azure:"240,255,255",beige:"245,245,220",bisque:"255,228,196",black:"0,0,0",blanchedalmond:"255,235,205",blueviolet:"138,43,226",blue:"0,0,255",brown:"165,42,42",burlywood:"222,184,135",cadetblue:"95,158,160",chartreuse:"127,255,0",chocolate:"210,105,30",coral:"255,127,80",cornflowerblue:"100,149,237",cornsilk:"255,248,220",crimson:"220,20,60",cyan:"0,255,255",darkblue:"0,0,139",darkcyan:"0,139,139",darkgoldenrod:"184,134,11",darkgray:"169,169,169",darkgrey:"169,169,169",darkgreen:"0,100,0",darkkhaki:"189,183,107",darkmagenta:"139,0,139",darkolivegreen:"85,107,47",darkorange:"255,140,0",darkorchid:"153,50,204",darkred:"139,0,0",darksalmon:"233,150,122",darkseagreen:"143,188,143",darkslateblue:"72,61,139",darkslategray:"47,79,79",darkturquoise:"0,206,209",darkviolet:"148,0,211",deeppink:"255,20,147",deepskyblue:"0,191,255",dimgray:"105,105,105",dimgrey:"105,105,105",dodgerblue:"30,144,255",firebrick:"178,34,34",floralwhite:"255,250,240",forestgreen:"34,139,34",fuchsia:"255,0,255",gainsboro:"220,220,220",ghostwhite:"248,248,255",gold:"255,215,0",goldenrod:"218,165,32",gray:"128,128,128",grey:"128,128,128",greenyellow:"173,255,47",green:"0,128,0",honeydew:"240,255,240",hotpink:"255,105,180",indianred:"205,92,92",indigo:"75,0,130",ivory:"255,255,240",khaki:"240,230,140",lavenderblush:"255,240,245",lavender:"230,230,250",lawngreen:"124,252,0",lemonchiffon:"255,250,205",lightblue:"173,216,230",lightcoral:"240,128,128",lightcyan:"224,255,255",lightgoldenrodyellow:"250,250,210",lightgray:"211,211,211",lightgrey:"211,211,211",lightgreen:"144,238,144",lightpink:"255,182,193",lightsalmon:"255,160,122",lightseagreen:"32,178,170",lightskyblue:"135,206,250",lightslategray:"119,136,153",lightsteelblue:"176,196,222",lightyellow:"255,255,224",limegreen:"50,205,50",lime:"0,255,0",linen:"250,240,230",magenta:"255,0,255",maroon:"128,0,0",mediumaquamarine:"102,205,170",mediumblue:"0,0,205",mediumorchid:"186,85,211",mediumpurple:"147,112,219",mediumseagreen:"60,179,113",mediumslateblue:"123,104,238",mediumspringgreen:"0,250,154",mediumturquoise:"72,209,204",mediumvioletred:"199,21,133",midnightblue:"25,25,112",mintcream:"245,255,250",mistyrose:"255,228,225",moccasin:"255,228,181",navajowhite:"255,222,173",navy:"0,0,128",oldlace:"253,245,230",olivedrab:"107,142,35",olive:"128,128,0",orangered:"255,69,0",orange:"255,165,0",orchid:"218,112,214",palegoldenrod:"238,232,170",palegreen:"152,251,152",paleturquoise:"175,238,238",palevioletred:"219,112,147",papayawhip:"255,239,213",peachpuff:"255,218,185",peru:"205,133,63",pink:"255,192,203",plum:"221,160,221",powderblue:"176,224,230",purple:"128,0,128",red:"255,0,0",rosybrown:"188,143,143",royalblue:"65,105,225",saddlebrown:"139,69,19",salmon:"250,128,114",sandybrown:"244,164,96",seagreen:"46,139,87",seashell:"255,245,238",sienna:"160,82,45",silver:"192,192,192",skyblue:"135,206,235",slateblue:"106,90,205",slategray:"112,128,144",snow:"255,250,250",springgreen:"0,255,127",steelblue:"70,130,180",tan:"210,180,140",teal:"0,128,128",thistle:"216,191,216",tomato:"255,99,71",turquoise:"64,224,208",violet:"238,130,238",wheat:"245,222,179",whitesmoke:"245,245,245",white:"255,255,255",yellowgreen:"154,205,50",yellow:"255,255,0"}},Hooks:{templates:{textShadow:["Color X Y Blur","black 0px 0px 0px"],boxShadow:["Color X Y Blur Spread","black 0px 0px 0px 0px"],clip:["Top Right Bottom Left","0px 0px 0px 0px"],backgroundPosition:["X Y","0% 0%"],transformOrigin:["X Y Z","50% 50% 0px"],perspectiveOrigin:["X Y","50% 50%"]},registered:{},register:function(){for(var e=0;e=1?"":"alpha(opacity="+parseInt(parseFloat(r)*100,10)+")"}else switch(e){case"name":return"opacity";case"extract":return r;case"inject":return r}}},register:function(){(!k||k>9)&&!c.State.isGingerbread&&(f.Lists.transformsBase=f.Lists.transformsBase.concat(f.Lists.transforms3D));for(var e=0;e8)&&E.split(" ").length===3&&(E+=" 1"),E;case"inject":return/^rgb/.test(y)?y:(k<=8?y.split(" ").length===4&&(y=y.split(/\s+/).slice(0,3).join(" ")):y.split(" ").length===3&&(y+=" 1"),(k<=8?"rgb":"rgba")+"("+y.replace(/\s+/g,",").replace(/\.(\d)+(?=,)/g,"")+")")}}})();function r(x,F,T){var y=f.getPropertyValue(F,"boxSizing").toString().toLowerCase()==="border-box";if(y===(T||!1)){var E,I,z=0,D=x==="width"?["Left","Right"]:["Top","Bottom"],U=["padding"+D[0],"padding"+D[1],"border"+D[0]+"Width","border"+D[1]+"Width"];for(E=0;E=2&&console.log("Get "+a+": "+F),F},setPropertyValue:function(e,a,r,m,x){var F=a;if(a==="scroll")x.container?x.container["scroll"+x.direction]=r:x.direction==="Left"?t.scrollTo(r,x.alternateValue):t.scrollTo(x.alternateValue,r);else if(f.Normalizations.registered[a]&&f.Normalizations.registered[a]("name",e)==="transform")f.Normalizations.registered[a]("inject",e,r),F="transform",r=N(e).transformCache[a];else{if(f.Hooks.registered[a]){var T=a,y=f.Hooks.getRoot(a);m=m||f.getPropertyValue(e,y),r=f.Hooks.injectValue(T,r,m),a=y}if(f.Normalizations.registered[a]&&(r=f.Normalizations.registered[a]("inject",e,r),a=f.Normalizations.registered[a]("name",e)),F=f.Names.prefixCheck(a)[0],k<=8)try{e.style[F]=r}catch{c.debug&&console.log("Browser does not support ["+r+"] for ["+F+"]")}else{var E=N(e);E&&E.isSVG&&f.Names.SVGAttribute(a)?e.setAttribute(a,r):e.style[F]=r}c.debug>=2&&console.log("Set "+a+" ("+F+"): "+r)}return[F,r]},flushTransformCache:function(e){var a="",r=N(e);if((k||c.State.isAndroid&&!c.State.isChrome)&&r&&r.isSVG){var m=function(y){return parseFloat(f.getPropertyValue(e,y))},x={translate:[m("translateX"),m("translateY")],skewX:[m("skewX")],skewY:[m("skewY")],scale:m("scale")!==1?[m("scale"),m("scale")]:[m("scaleX"),m("scaleY")],rotate:[m("rotateZ"),0,0]};d.each(N(e).transformCache,function(y){/^translate/i.test(y)?y="translate":/^scale/i.test(y)?y="scale":/^rotate/i.test(y)&&(y="rotate"),x[y]&&(a+=y+"("+x[y].join(" ")+") ",delete x[y])})}else{var F,T;d.each(N(e).transformCache,function(y){if(F=N(e).transformCache[y],y==="transformPerspective")return T=F,!0;k===9&&y==="rotateZ"&&(y="rotate"),a+=y+F+" "}),T&&(a="perspective"+T+" "+a)}f.setPropertyValue(e,"transform",a)}};f.Hooks.register(),f.Normalizations.register(),c.hook=function(e,a,r){var m;return e=u(e),d.each(e,function(x,F){if(N(F)===s&&c.init(F),r===s)m===s&&(m=f.getPropertyValue(F,a));else{var T=f.setPropertyValue(F,a,r);T[0]==="transform"&&c.CSS.flushTransformCache(F),m=T}}),m};var Me=function(){var e;function a(){return m?I.promise||null:x}var r=arguments[0]&&(arguments[0].p||d.isPlainObject(arguments[0].properties)&&!arguments[0].properties.names||S.isString(arguments[0].properties)),m,x,F,T,y,E;S.isWrapped(this)?(m=!1,F=0,T=this,x=this):(m=!0,F=1,T=r?arguments[0].elements||arguments[0].e:arguments[0]);var I={promise:null,resolver:null,rejecter:null};if(m&&c.Promise&&(I.promise=new c.Promise(function(M,H){I.resolver=M,I.rejecter=H})),r?(y=arguments[0].properties||arguments[0].p,E=arguments[0].options||arguments[0].o):(y=arguments[F],E=arguments[F+1]),T=u(T),!T){I.promise&&(!y||!E||E.promiseRejectEmpty!==!1?I.rejecter():I.resolver());return}var z=T.length,D=0;if(!/^(stop|finish|finishAll|pause|resume)$/i.test(y)&&!d.isPlainObject(E)){var U=F+1;E={};for(var W=U;W=4&&B==="("?R++:(R&&R<5||R>=4&&B===")"&&--R<5)&&(R=0),X===0&&B==="r"||X===1&&B==="g"||X===2&&B==="b"||X===3&&B==="a"||X>=3&&B==="("?(X===3&&B==="a"&&(oe=1),X++):oe&&B===","?++oe>3&&(X=oe=0):(oe&&X<(oe?5:4)||X>=(oe?4:3)&&B===")"&&--X<(oe?5:4))&&(X=oe=0);else{R=0;break}}(xe!==ne.length||Te!==K.length)&&(c.debug&&console.error('Trying to pattern match mis-matched strings ["'+K+'", "'+ne+'"]'),le=s),le&&(Se.length?(c.debug&&console.log('Pattern found "'+le+'" -> ',Se,Ze,"["+ne+","+K+"]"),ne=Se,K=Ze,de=ue=""):le=s)}le||(ge=Ye(v,ne),ne=ge[0],ue=ge[1],ge=Ye(v,K),K=ge[0].replace(/^([+-\/*])=/,function(ve,we){return Ve=we,""}),de=ge[1],ne=parseFloat(ne)||0,K=parseFloat(K)||0,de==="%"&&(/^(fontSize|lineHeight)$/.test(v)?(K=K/100,de="em"):/^scale/.test(v)?(K=K/100,de=""):/(Red|Green|Blue)$/i.test(v)&&(K=K/100*255,de="")));var j=function(){var ve={myParent:M.parentNode||w.body,position:f.getPropertyValue(M,"position"),fontSize:f.getPropertyValue(M,"fontSize")},we=ve.position===Y.lastPosition&&ve.myParent===Y.lastParent,Ke=ve.fontSize===Y.lastFontSize;Y.lastParent=ve.myParent,Y.lastPosition=ve.position,Y.lastFontSize=ve.fontSize;var Xe=100,Fe={};if(!Ke||!we){var Ie=te&&te.isSVG?w.createElementNS("http://www.w3.org/2000/svg","rect"):w.createElement("div");c.init(Ie),ve.myParent.appendChild(Ie),d.each(["overflow","overflowX","overflowY"],function(Tn,Nt){c.CSS.setPropertyValue(Ie,Nt,"hidden")}),c.CSS.setPropertyValue(Ie,"position",ve.position),c.CSS.setPropertyValue(Ie,"fontSize",ve.fontSize),c.CSS.setPropertyValue(Ie,"boxSizing","content-box"),d.each(["minWidth","maxWidth","width","minHeight","maxHeight","height"],function(Tn,Nt){c.CSS.setPropertyValue(Ie,Nt,Xe+"%")}),c.CSS.setPropertyValue(Ie,"paddingLeft",Xe+"em"),Fe.percentToPxWidth=Y.lastPercentToPxWidth=(parseFloat(f.getPropertyValue(Ie,"width",null,!0))||1)/Xe,Fe.percentToPxHeight=Y.lastPercentToPxHeight=(parseFloat(f.getPropertyValue(Ie,"height",null,!0))||1)/Xe,Fe.emToPx=Y.lastEmToPx=(parseFloat(f.getPropertyValue(Ie,"paddingLeft"))||1)/Xe,ve.myParent.removeChild(Ie)}else Fe.emToPx=Y.lastEmToPx,Fe.percentToPxWidth=Y.lastPercentToPxWidth,Fe.percentToPxHeight=Y.lastPercentToPxHeight;return Y.remToPx===null&&(Y.remToPx=parseFloat(f.getPropertyValue(w.body,"fontSize"))||16),Y.vwToPx===null&&(Y.vwToPx=parseFloat(t.innerWidth)/100,Y.vhToPx=parseFloat(t.innerHeight)/100),Fe.remToPx=Y.remToPx,Fe.vwToPx=Y.vwToPx,Fe.vhToPx=Y.vhToPx,c.debug>=1&&console.log("Unit ratios: "+JSON.stringify(Fe),M),Fe};if(/[\/*]/.test(Ve))de=ue;else if(ue!==de&&ne!==0)if(K===0)de=ue;else{ae=ae||j();var J=/margin|padding|left|right|width|text|word|letter/i.test(v)||/X$/.test(v)||v==="x"?"x":"y";switch(ue){case"%":ne*=J==="x"?ae.percentToPxWidth:ae.percentToPxHeight;break;case"px":break;default:ne*=ae[ue+"ToPx"]}switch(de){case"%":ne*=1/(J==="x"?ae.percentToPxWidth:ae.percentToPxHeight);break;case"px":break;default:ne*=1/ae[de+"ToPx"]}}switch(Ve){case"+":K=ne+K;break;case"-":K=ne-K;break;case"*":K=ne*K;break;case"/":K=ne/K;break}se[v]={rootPropertyValue:Ee,startValue:ne,currentValue:ne,endValue:K,unitType:de,easing:ot},le&&(se[v].pattern=le),c.debug&&console.log("tweensContainer ("+v+"): "+JSON.stringify(se[v]),M)};for(var dt in y)if(y.hasOwnProperty(dt)){var pt=f.Names.camelCase(dt),ht=At(y[dt]);if(_(f.Lists.colors)){var kt=ht[0],_t=ht[1],Pt=ht[2];if(f.RegEx.isHex.test(kt)){for(var wt=["Red","Green","Blue"],nt=f.Values.hexToRgb(kt),Ct=Pt?f.Values.hexToRgb(Pt):s,at=0;at1e4&&(c.State.calls=p(c.State.calls),r=c.State.calls.length);for(var m=0;m - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */function Lt(l,n){if(n===void 0)return;const t=i(l).siblings('source[type="image/webp"]'),w=i(l).siblings('source[type="image/avif"]');n.webp!==void 0&&t.length&&t.attr("srcset",n.webp),n.avif!==void 0&&w.length&&w.attr("srcset",n.avif)}/** - * Copyright since 2007 PrestaShop SA and Contributors - * PrestaShop is an International Registered Trademark & Property of PrestaShop SA - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License 3.0 (AFL-3.0) - * that is bundled with this package in the file LICENSE.md. - * It is also available through the world-wide-web at this URL: - * https://opensource.org/licenses/AFL-3.0 - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@prestashop.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade PrestaShop to newer - * versions in the future. If you wish to customize PrestaShop for your - * needs please refer to https://devdocs.prestashop.com/ for more information. - * - * @author PrestaShop SA and Contributors - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */class qt{init(){i(".js-product-miniature").each((n,t)=>{if(i(t).find(".color").length>5){let w=0;i(t).find(".color").each((s,k)=>{s>4&&(i(k).hide(),w+=1)}),i(t).find(".js-count").append(`+${w}`)}})}}/** - * Copyright since 2007 PrestaShop SA and Contributors - * PrestaShop is an International Registered Trademark & Property of PrestaShop SA - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License 3.0 (AFL-3.0) - * that is bundled with this package in the file LICENSE.md. - * It is also available through the world-wide-web at this URL: - * https://opensource.org/licenses/AFL-3.0 - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@prestashop.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade PrestaShop to newer - * versions in the future. If you wish to customize PrestaShop for your - * needs please refer to https://devdocs.prestashop.com/ for more information. - * - * @author PrestaShop SA and Contributors - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */i(document).ready(()=>{const l=s=>{const C=i(".js-qv-product-images"),o=i(".js-qv-product-images li img").height()+20,p=C.position().top;C.velocity({translateY:s==="up"?p+o:p-o},()=>{C.position().top>=0?i(".arrow-up").css("opacity",".2"):C.position().top+C.height()<=i(".js-qv-mask").height()&&i(".arrow-down").css("opacity",".2")})},n=s=>{const C=i(b.themeSelectors.product.arrows),o=s.find(".js-qv-product-images");i(b.themeSelectors.product.thumb).on("click",p=>{i(b.themeSelectors.product.thumb).hasClass("selected")&&i(b.themeSelectors.product.thumb).removeClass("selected"),i(p.currentTarget).addClass("selected"),i(b.themeSelectors.product.cover).attr("src",i(p.target).data("image-large-src")),i(b.themeSelectors.product.cover).attr("alt",i(p.target).attr("alt")),i(b.themeSelectors.product.cover).attr("title",i(p.target).attr("title")),Lt(i(b.themeSelectors.product.cover),i(p.target).data("image-large-sources"))}),o.find("li").length<=4?C.hide():C.on("click",p=>{i(p.target).hasClass("arrow-up")&&i(".js-qv-product-images").position().top<0?(l("up"),i(b.themeSelectors.arrowDown).css("opacity","1")):i(p.target).hasClass("arrow-down")&&o.position().top+o.height()>i(".js-qv-mask").height()&&(l("down"),i(b.themeSelectors.arrowUp).css("opacity","1"))}),s.find(b.selectors.quantityWanted).TouchSpin({verticalbuttons:!0,verticalupclass:"material-icons touchspin-up",verticaldownclass:"material-icons touchspin-down",buttondown_class:"btn btn-touchspin js-touchspin",buttonup_class:"btn btn-touchspin js-touchspin",min:1,max:1e6}),i(b.themeSelectors.touchspin).off("touchstart.touchspin")};b.on("clickQuickView",s=>{const k={action:"quickview",id_product:s.dataset.idProduct,id_product_attribute:s.dataset.idProductAttribute};i.post(b.urls.pages.product,k,null,"json").then(C=>{i("body").append(C.quickview_html);const o=i(`#quickview-modal-${C.product.id}-${C.product.id_product_attribute}`);o.modal("show"),n(o),o.on("hidden.bs.modal",()=>{o.remove()})}).fail(C=>{b.emit("handleError",{eventType:"clickQuickView",resp:C})})}),i("body").on("click",b.themeSelectors.listing.searchFilterToggler,()=>{i(b.themeSelectors.listing.searchFiltersWrapper).removeClass("hidden-sm-down"),i(b.themeSelectors.contentWrapper).addClass("hidden-sm-down"),i(b.themeSelectors.footer).addClass("hidden-sm-down")}),i(`${b.themeSelectors.listing.searchFilterControls} ${b.themeSelectors.clear}`).on("click",()=>{i(b.themeSelectors.listing.searchFiltersWrapper).addClass("hidden-sm-down"),i(b.themeSelectors.contentWrapper).removeClass("hidden-sm-down"),i(b.themeSelectors.footer).removeClass("hidden-sm-down")}),i(`${b.themeSelectors.listing.searchFilterControls} .ok`).on("click",()=>{i(b.themeSelectors.listing.searchFiltersWrapper).addClass("hidden-sm-down"),i(b.themeSelectors.contentWrapper).removeClass("hidden-sm-down"),i(b.themeSelectors.footer).removeClass("hidden-sm-down")});const t=function(s){if(s.target.dataset.searchUrl!==void 0)return s.target.dataset.searchUrl;if(i(s.target).parent()[0].dataset.searchUrl===void 0)throw new Error("Can not parse search URL");return i(s.target).parent()[0].dataset.searchUrl};function w(s){i(b.themeSelectors.listing.searchFilters).replaceWith(s.rendered_facets),i(b.themeSelectors.listing.activeSearchFilters).replaceWith(s.rendered_active_filters),i(b.themeSelectors.listing.listTop).replaceWith(s.rendered_products_top);const k=i(s.rendered_products),C=i(b.themeSelectors.listing.product);C.length>0?C.removeClass().addClass(C.first().attr("class")):C.removeClass().addClass(k.first().attr("class")),i(b.themeSelectors.listing.list).replaceWith(k),i(b.themeSelectors.listing.listBottom).replaceWith(s.rendered_products_bottom),s.rendered_products_header&&i(b.themeSelectors.listing.listHeader).replaceWith(s.rendered_products_header),new qt().init()}i("body").on("change",`${b.themeSelectors.listing.searchFilters} input[data-search-url]`,s=>{b.emit("updateFacets",t(s))}),i("body").on("click",b.themeSelectors.listing.searchFiltersClearAll,s=>{b.emit("updateFacets",t(s))}),i("body").on("click",b.themeSelectors.listing.searchLink,s=>{s.preventDefault(),b.emit("updateFacets",i(s.target).closest("a").get(0).href)}),window.addEventListener("popstate",s=>{s.state&&s.state.current_url&&(window.location.href=s.state.current_url)}),i("body").on("change",`${b.themeSelectors.listing.searchFilters} select`,s=>{const k=i(s.target).closest("form");b.emit("updateFacets",`?${k.serialize()}`)}),b.on("updateProductList",s=>{w(s),window.scrollTo(0,0)})});/** - * Copyright since 2007 PrestaShop SA and Contributors - * PrestaShop is an International Registered Trademark & Property of PrestaShop SA - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License 3.0 (AFL-3.0) - * that is bundled with this package in the file LICENSE.md. - * It is also available through the world-wide-web at this URL: - * https://opensource.org/licenses/AFL-3.0 - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@prestashop.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade PrestaShop to newer - * versions in the future. If you wish to customize PrestaShop for your - * needs please refer to https://devdocs.prestashop.com/ for more information. - * - * @author PrestaShop SA and Contributors - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */class Ht{init(){const t=i(".js-modal-arrows"),w=i(".js-modal-product-images");i("body").on("click",".js-modal-thumb",s=>{i(".js-modal-thumb").hasClass("selected")&&i(".js-modal-thumb").removeClass("selected"),i(s.currentTarget).addClass("selected"),i(prestashop.themeSelectors.product.modalProductCover).attr("src",i(s.target).data("image-large-src")),i(prestashop.themeSelectors.product.modalProductCover).attr("title",i(s.target).attr("title")),i(prestashop.themeSelectors.product.modalProductCover).attr("alt",i(s.target).attr("alt"))}).on("click","aside#thumbnails",s=>{s.target.id==="thumbnails"&&i("#product-modal").modal("hide")}),i(".js-modal-product-images li").length<=5?t.css("opacity",".2"):t.on("click",s=>{i(s.target).hasClass("arrow-up")&&w.position().top<0?(this.move("up"),i(".js-modal-arrow-down").css("opacity","1")):i(s.target).hasClass("arrow-down")&&w.position().top+w.height()>i(".js-modal-mask").height()&&(this.move("down"),i(".js-modal-arrow-up").css("opacity","1"))})}move(n){const w=i(".js-modal-product-images"),s=i(".js-modal-product-images li img").height()+10,k=w.position().top;w.velocity({translateY:n==="up"?k+s:k-s},()=>{w.position().top>=0?i(".js-modal-arrow-up").css("opacity",".2"):w.position().top+w.height()<=i(".js-modal-mask").height()&&i(".js-modal-arrow-down").css("opacity",".2")})}}/** - * Copyright since 2007 PrestaShop SA and Contributors - * PrestaShop is an International Registered Trademark & Property of PrestaShop SA - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License 3.0 (AFL-3.0) - * that is bundled with this package in the file LICENSE.md. - * It is also available through the world-wide-web at this URL: - * https://opensource.org/licenses/AFL-3.0 - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@prestashop.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade PrestaShop to newer - * versions in the future. If you wish to customize PrestaShop for your - * needs please refer to https://devdocs.prestashop.com/ for more information. - * - * @author PrestaShop SA and Contributors - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */i(document).ready(()=>{function l(){const k=i(b.themeSelectors.product.cover),C=i(b.themeSelectors.product.modalProductCover);let o=i(b.themeSelectors.product.selected);const p=(Q,_)=>{const u=_.find(b.themeSelectors.product.thumb);Q.removeClass("selected"),u.addClass("selected"),C.prop("src",u.data("image-large-src")),k.prop("src",u.data("image-medium-src")),k.attr("title",u.attr("title")),C.attr("title",u.attr("title")),k.attr("alt",u.attr("alt")),C.attr("alt",u.attr("alt")),Lt(k,u.data("image-medium-sources")),Lt(C,u.data("image-large-sources"))};i(b.themeSelectors.product.thumb).on("click",Q=>{o=i(b.themeSelectors.product.selected),p(o,i(Q.target).closest(b.themeSelectors.product.thumbContainer))}),k.swipe({swipe:(Q,_)=>{o=i(b.themeSelectors.product.selected);const u=o.closest(b.themeSelectors.product.thumbContainer);_==="right"?u.prev().length>0?p(o,u.prev()):u.next().length>0&&p(o,u.next()):_==="left"&&(u.next().length>0?p(o,u.next()):u.prev().length>0&&p(o,u.prev()))},allowPageScroll:"vertical"})}function n(){i("#main .js-qv-product-images li").length>2?(i("#main .js-qv-mask").addClass("scroll"),i(".scroll-box-arrows").addClass("scroll"),i("#main .js-qv-mask").scrollbox({direction:"h",distance:113,autoPlay:!1}),i(".scroll-box-arrows .left").click(()=>{i("#main .js-qv-mask").trigger("backward")}),i(".scroll-box-arrows .right").click(()=>{i("#main .js-qv-mask").trigger("forward")})):(i("#main .js-qv-mask").removeClass("scroll"),i(".scroll-box-arrows").removeClass("scroll"))}function t(){i(b.themeSelectors.fileInput).on("change",k=>{const C=i(k.currentTarget)[0],o=C?C.files[0]:null;C&&o&&i(C).prev().text(o.name)})}function w(){const k=i(b.selectors.quantityWanted);k.TouchSpin({verticalbuttons:!0,verticalupclass:"material-icons touchspin-up",verticaldownclass:"material-icons touchspin-down",buttondown_class:"btn btn-touchspin js-touchspin",buttonup_class:"btn btn-touchspin js-touchspin",min:parseInt(k.attr("min"),10),max:1e6}),i(b.themeSelectors.touchspin).off("touchstart.touchspin"),k.on("focusout",()=>{(k.val()===""||k.val(){k.val()!==""&&(i(C.currentTarget).trigger("touchspin.stopspin"),b.emit("updateProduct",{eventType:"updatedProductQuantity",event:C}))})}function s(){const k=i(b.themeSelectors.product.tabs);k.on("show.bs.tab",C=>{const o=i(C.target);o.addClass(b.themeSelectors.product.activeNavClass),i(o.attr("href")).addClass(b.themeSelectors.product.activeTabClass)}),k.on("hide.bs.tab",C=>{const o=i(C.target);o.removeClass(b.themeSelectors.product.activeNavClass),i(o.attr("href")).removeClass(b.themeSelectors.product.activeTabClass)})}w(),t(),l(),n(),s(),b.on("updatedProduct",k=>{if(t(),l(),k&&k.product_minimal_quantity){const o=parseInt(k.product_minimal_quantity,10),p=b.selectors.quantityWanted;i(p).trigger("touchspin.updatesettings",{min:o})}n(),i(i(b.themeSelectors.product.activeTabs).attr("href")).addClass("active").removeClass("fade"),i(b.themeSelectors.product.imagesModal).replaceWith(k.product_images_modal),new Ht().init()})});/** - * Copyright since 2007 PrestaShop SA and Contributors - * PrestaShop is an International Registered Trademark & Property of PrestaShop SA - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License 3.0 (AFL-3.0) - * that is bundled with this package in the file LICENSE.md. - * It is also available through the world-wide-web at this URL: - * https://opensource.org/licenses/AFL-3.0 - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@prestashop.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade PrestaShop to newer - * versions in the future. If you wish to customize PrestaShop for your - * needs please refer to https://devdocs.prestashop.com/ for more information. - * - * @author PrestaShop SA and Contributors - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */function cn(l,n=300){let t;return(...w)=>{clearTimeout(t),t=setTimeout(()=>{l.apply(this,w)},n)}}b.cart=b.cart||{},b.cart.active_inputs=null;const Vt='input[name="product-quantity-spin"]';let mt=!1,lt=!1,ct="";const Ot={switchErrorStat:()=>{const l=i(b.themeSelectors.checkout.btn);if((i(b.themeSelectors.notifications.dangerAlert).length||ct!==""&&!mt)&&l.addClass("disabled"),ct!==""){const n=` +(function($$1, prestashop$1) { + "use strict"; + const jquery_offcanvas_min$1 = ""; + var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; + function getDefaultExportFromCjs(x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; + } + var jquery_bootstrapTouchspin = { exports: {} }; + jquery_bootstrapTouchspin.exports; + (function(module) { + function _typeof(obj) { + "@babel/helpers - typeof"; + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj2) { + return typeof obj2; + } : function(obj2) { + return obj2 && "function" == typeof Symbol && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2; + }, _typeof(obj); + } + (function(factory) { + if (_typeof(module) === "object" && module.exports) { + module.exports = function(root, jQuery2) { + if (jQuery2 === void 0) { + if (typeof window !== "undefined") { + jQuery2 = $$1; + } else { + jQuery2 = $$1(root); + } + } + factory(jQuery2); + return jQuery2; + }; + } else { + factory(jQuery); + } + })(function($2) { + var _currentSpinnerId = 0; + $2.fn.TouchSpin = function(options) { + var defaults = { + min: 0, + // If null, there is no minimum enforced + max: 100, + // If null, there is no maximum enforced + initval: "", + replacementval: "", + firstclickvalueifempty: null, + step: 1, + decimals: 0, + stepinterval: 100, + forcestepdivisibility: "round", + // none | floor | round | ceil + stepintervaldelay: 500, + verticalbuttons: false, + verticalup: "+", + verticaldown: "−", + verticalupclass: "", + verticaldownclass: "", + prefix: "", + postfix: "", + prefix_extraclass: "", + postfix_extraclass: "", + booster: true, + boostat: 10, + maxboostedstep: false, + mousewheel: true, + buttondown_class: "btn btn-primary", + buttonup_class: "btn btn-primary", + buttondown_txt: "−", + buttonup_txt: "+", + callback_before_calculation: function callback_before_calculation(value) { + return value; + }, + callback_after_calculation: function callback_after_calculation(value) { + return value; + } + }; + var attributeMap = { + min: "min", + max: "max", + initval: "init-val", + replacementval: "replacement-val", + firstclickvalueifempty: "first-click-value-if-empty", + step: "step", + decimals: "decimals", + stepinterval: "step-interval", + verticalbuttons: "vertical-buttons", + verticalupclass: "vertical-up-class", + verticaldownclass: "vertical-down-class", + forcestepdivisibility: "force-step-divisibility", + stepintervaldelay: "step-interval-delay", + prefix: "prefix", + postfix: "postfix", + prefix_extraclass: "prefix-extra-class", + postfix_extraclass: "postfix-extra-class", + booster: "booster", + boostat: "boostat", + maxboostedstep: "max-boosted-step", + mousewheel: "mouse-wheel", + buttondown_class: "button-down-class", + buttonup_class: "button-up-class", + buttondown_txt: "button-down-txt", + buttonup_txt: "button-up-txt" + }; + return this.each(function() { + var settings, originalinput = $2(this), originalinput_data = originalinput.data(), _detached_prefix, _detached_postfix, container, elements, verticalbuttons_html, value, downSpinTimer, upSpinTimer, downDelayTimeout, upDelayTimeout, spincount = 0, spinning = false; + init(); + function init() { + if (originalinput.data("alreadyinitialized")) { + return; + } + originalinput.data("alreadyinitialized", true); + _currentSpinnerId += 1; + originalinput.data("spinnerid", _currentSpinnerId); + if (!originalinput.is("input")) { + console.log("Must be an input."); + return; + } + _initSettings(); + _setInitval(); + _checkValue(); + _buildHtml(); + _initElements(); + _updateButtonDisabledState(); + _hideEmptyPrefixPostfix(); + _setupMutationObservers(); + _bindEvents(); + _bindEventsInterface(); + } + function _setInitval() { + if (settings.initval !== "" && originalinput.val() === "") { + originalinput.val(settings.initval); + } + } + function changeSettings(newsettings) { + _updateSettings(newsettings); + _checkValue(); + var value2 = elements.input.val(); + if (value2 !== "") { + value2 = parseFloat(settings.callback_before_calculation(elements.input.val())); + elements.input.val(settings.callback_after_calculation(parseFloat(value2).toFixed(settings.decimals))); + } + } + function _initSettings() { + settings = $2.extend({}, defaults, originalinput_data, _parseAttributes(), options); + if (parseFloat(settings.step) !== 1) { + var remainder; + remainder = settings.max % settings.step; + if (remainder !== 0) { + settings.max = parseFloat(settings.max) - remainder; + } + remainder = settings.min % settings.step; + if (remainder !== 0) { + settings.min = parseFloat(settings.min) + (parseFloat(settings.step) - remainder); + } + } + } + function _parseAttributes() { + var data = {}; + $2.each(attributeMap, function(key, value2) { + var attrName = "bts-" + value2; + if (originalinput.is("[data-" + attrName + "]")) { + data[key] = originalinput.data(attrName); + } + }); + $2.each(["min", "max", "step"], function(i, key) { + if (originalinput.is("[" + key + "]")) { + if (data[key] !== void 0) { + console.warn('Both the "data-bts-' + key + '" data attribute and the "' + key + '" individual attribute were specified, the individual attribute will take precedence on: ', originalinput); + } + data[key] = originalinput.attr(key); + } + }); + return data; + } + function _destroy() { + var $parent = originalinput.parent(); + stopSpin(); + originalinput.off(".touchspin"); + if ($parent.hasClass("bootstrap-touchspin-injected")) { + originalinput.siblings().remove(); + originalinput.unwrap(); + } else { + $2(".bootstrap-touchspin-injected", $parent).remove(); + $parent.removeClass("bootstrap-touchspin"); + } + originalinput.data("alreadyinitialized", false); + } + function _updateSettings(newsettings) { + settings = $2.extend({}, settings, newsettings); + if (newsettings.postfix) { + var $postfix = originalinput.parent().find(".bootstrap-touchspin-postfix"); + if ($postfix.length === 0) { + _detached_postfix.insertAfter(originalinput); + } + originalinput.parent().find(".bootstrap-touchspin-postfix .input-group-text").text(newsettings.postfix); + } + if (newsettings.prefix) { + var $prefix = originalinput.parent().find(".bootstrap-touchspin-prefix"); + if ($prefix.length === 0) { + _detached_prefix.insertBefore(originalinput); + } + originalinput.parent().find(".bootstrap-touchspin-prefix .input-group-text").text(newsettings.prefix); + } + _hideEmptyPrefixPostfix(); + } + function _buildHtml() { + var initval = originalinput.val(), parentelement = originalinput.parent(); + if (initval !== "") { + initval = settings.callback_before_calculation(initval); + initval = settings.callback_after_calculation(parseFloat(initval).toFixed(settings.decimals)); + } + originalinput.data("initvalue", initval).val(initval); + originalinput.addClass("form-control"); + verticalbuttons_html = '\n \n \n \n \n \n \n "); + if (parentelement.hasClass("input-group")) { + _advanceInputGroup(parentelement); + } else { + _buildInputGroup(); + } + } + function _advanceInputGroup(parentelement) { + parentelement.addClass("bootstrap-touchspin"); + var prev = originalinput.prev(), next = originalinput.next(); + var downhtml, uphtml, prefixhtml = '\n \n '.concat(settings.prefix, "\n \n "), postfixhtml = '\n \n '.concat(settings.postfix, "\n \n "); + if (settings.verticalbuttons) { + $2(verticalbuttons_html).insertAfter(originalinput); + } else { + if (prev.hasClass("input-group-btn") || prev.hasClass("input-group-prepend")) { + downhtml = '\n \n "); + prev.append(downhtml); + } else { + downhtml = '\n \n \n \n "); + $2(downhtml).insertBefore(originalinput); + } + if (next.hasClass("input-group-btn") || next.hasClass("input-group-append")) { + uphtml = '\n \n "); + next.prepend(uphtml); + } else { + uphtml = '\n \n \n \n "); + $2(uphtml).insertAfter(originalinput); + } + } + $2(prefixhtml).insertBefore(originalinput); + $2(postfixhtml).insertAfter(originalinput); + container = parentelement; + } + function _buildInputGroup() { + var html; + var inputGroupSize = ""; + if (originalinput.hasClass("input-sm") || originalinput.hasClass("form-control-sm")) { + inputGroupSize = "input-group-sm"; + } else if (originalinput.hasClass("input-lg") || originalinput.hasClass("form-control-lg")) { + inputGroupSize = "input-group-lg"; + } + if (settings.verticalbuttons) { + html = '\n
\n \n ').concat(settings.prefix, '\n \n \n ').concat(settings.postfix, "\n \n ").concat(verticalbuttons_html, "\n
\n "); + } else { + html = '\n
\n \n \n \n \n ').concat(settings.prefix, '\n \n \n ').concat(settings.postfix, '\n \n \n \n \n
"); + } + container = $2(html).insertBefore(originalinput); + $2(".bootstrap-touchspin-prefix", container).after(originalinput); + if (originalinput.hasClass("input-sm") || originalinput.hasClass("form-control-sm")) { + container.addClass("input-group-sm"); + } else if (originalinput.hasClass("input-lg") || originalinput.hasClass("form-control-lg")) { + container.addClass("input-group-lg"); + } + } + function _initElements() { + elements = { + down: $2(".bootstrap-touchspin-down", container), + up: $2(".bootstrap-touchspin-up", container), + input: $2("input", container), + prefix: $2(".bootstrap-touchspin-prefix", container).addClass(settings.prefix_extraclass), + postfix: $2(".bootstrap-touchspin-postfix", container).addClass(settings.postfix_extraclass) + }; + } + function _hideEmptyPrefixPostfix() { + if (settings.prefix === "") { + _detached_prefix = elements.prefix.detach(); + } + if (settings.postfix === "") { + _detached_postfix = elements.postfix.detach(); + } + } + function _bindEvents() { + originalinput.on("keydown.touchspin", function(ev) { + var code = ev.keyCode || ev.which; + if (code === 38) { + if (spinning !== "up") { + upOnce(); + startUpSpin(); + } + ev.preventDefault(); + } else if (code === 40) { + if (spinning !== "down") { + downOnce(); + startDownSpin(); + } + ev.preventDefault(); + } else if (code === 9 || code === 13) { + _checkValue(); + } + }); + originalinput.on("keyup.touchspin", function(ev) { + var code = ev.keyCode || ev.which; + if (code === 38) { + stopSpin(); + } else if (code === 40) { + stopSpin(); + } + }); + $2(document).on("mousedown touchstart", function(event) { + if ($2(event.target).is(originalinput)) { + return; + } + _checkValue(); + }); + originalinput.on("blur.touchspin", function() { + _checkValue(); + }); + elements.down.on("keydown", function(ev) { + var code = ev.keyCode || ev.which; + if (code === 32 || code === 13) { + if (spinning !== "down") { + downOnce(); + startDownSpin(); + } + ev.preventDefault(); + } + }); + elements.down.on("keyup.touchspin", function(ev) { + var code = ev.keyCode || ev.which; + if (code === 32 || code === 13) { + stopSpin(); + } + }); + elements.up.on("keydown.touchspin", function(ev) { + var code = ev.keyCode || ev.which; + if (code === 32 || code === 13) { + if (spinning !== "up") { + upOnce(); + startUpSpin(); + } + ev.preventDefault(); + } + }); + elements.up.on("keyup.touchspin", function(ev) { + var code = ev.keyCode || ev.which; + if (code === 32 || code === 13) { + stopSpin(); + } + }); + elements.down.on("mousedown.touchspin", function(ev) { + elements.down.off("touchstart.touchspin"); + if (originalinput.is(":disabled,[readonly]")) { + return; + } + downOnce(); + startDownSpin(); + ev.preventDefault(); + ev.stopPropagation(); + }); + elements.down.on("touchstart.touchspin", function(ev) { + elements.down.off("mousedown.touchspin"); + if (originalinput.is(":disabled,[readonly]")) { + return; + } + downOnce(); + startDownSpin(); + ev.preventDefault(); + ev.stopPropagation(); + }); + elements.up.on("mousedown.touchspin", function(ev) { + elements.up.off("touchstart.touchspin"); + if (originalinput.is(":disabled,[readonly]")) { + return; + } + upOnce(); + startUpSpin(); + ev.preventDefault(); + ev.stopPropagation(); + }); + elements.up.on("touchstart.touchspin", function(ev) { + elements.up.off("mousedown.touchspin"); + if (originalinput.is(":disabled,[readonly]")) { + return; + } + upOnce(); + startUpSpin(); + ev.preventDefault(); + ev.stopPropagation(); + }); + elements.up.on("mouseup.touchspin mouseout.touchspin touchleave.touchspin touchend.touchspin touchcancel.touchspin", function(ev) { + if (!spinning) { + return; + } + ev.stopPropagation(); + stopSpin(); + }); + elements.down.on("mouseup.touchspin mouseout.touchspin touchleave.touchspin touchend.touchspin touchcancel.touchspin", function(ev) { + if (!spinning) { + return; + } + ev.stopPropagation(); + stopSpin(); + }); + elements.down.on("mousemove.touchspin touchmove.touchspin", function(ev) { + if (!spinning) { + return; + } + ev.stopPropagation(); + ev.preventDefault(); + }); + elements.up.on("mousemove.touchspin touchmove.touchspin", function(ev) { + if (!spinning) { + return; + } + ev.stopPropagation(); + ev.preventDefault(); + }); + originalinput.on("mousewheel.touchspin DOMMouseScroll.touchspin", function(ev) { + if (!settings.mousewheel || !originalinput.is(":focus")) { + return; + } + var delta = ev.originalEvent.wheelDelta || -ev.originalEvent.deltaY || -ev.originalEvent.detail; + ev.stopPropagation(); + ev.preventDefault(); + if (delta < 0) { + downOnce(); + } else { + upOnce(); + } + }); + } + function _bindEventsInterface() { + originalinput.on("touchspin.destroy", function() { + _destroy(); + }); + originalinput.on("touchspin.uponce", function() { + stopSpin(); + upOnce(); + }); + originalinput.on("touchspin.downonce", function() { + stopSpin(); + downOnce(); + }); + originalinput.on("touchspin.startupspin", function() { + startUpSpin(); + }); + originalinput.on("touchspin.startdownspin", function() { + startDownSpin(); + }); + originalinput.on("touchspin.stopspin", function() { + stopSpin(); + }); + originalinput.on("touchspin.updatesettings", function(e, newsettings) { + changeSettings(newsettings); + }); + } + function _setupMutationObservers() { + if (typeof MutationObserver !== "undefined") { + var observer = new MutationObserver(function(mutations) { + mutations.forEach(function(mutation) { + if (mutation.type === "attributes" && (mutation.attributeName === "disabled" || mutation.attributeName === "readonly")) { + _updateButtonDisabledState(); + } + }); + }); + observer.observe(originalinput[0], { + attributes: true + }); + } + } + function _forcestepdivisibility(value2) { + switch (settings.forcestepdivisibility) { + case "round": + return (Math.round(value2 / settings.step) * settings.step).toFixed(settings.decimals); + case "floor": + return (Math.floor(value2 / settings.step) * settings.step).toFixed(settings.decimals); + case "ceil": + return (Math.ceil(value2 / settings.step) * settings.step).toFixed(settings.decimals); + default: + return value2.toFixed(settings.decimals); + } + } + function _checkValue() { + var val, parsedval, returnval; + val = settings.callback_before_calculation(originalinput.val()); + if (val === "") { + if (settings.replacementval !== "") { + originalinput.val(settings.replacementval); + originalinput.trigger("change"); + } + return; + } + if (settings.decimals > 0 && val === ".") { + return; + } + parsedval = parseFloat(val); + if (isNaN(parsedval)) { + if (settings.replacementval !== "") { + parsedval = settings.replacementval; + } else { + parsedval = 0; + } + } + returnval = parsedval; + if (parsedval.toString() !== val) { + returnval = parsedval; + } + returnval = _forcestepdivisibility(parsedval); + if (settings.min !== null && parsedval < settings.min) { + returnval = settings.min; + } + if (settings.max !== null && parsedval > settings.max) { + returnval = settings.max; + } + if (parseFloat(parsedval).toString() !== parseFloat(returnval).toString()) { + originalinput.val(returnval); + } + originalinput.val(settings.callback_after_calculation(parseFloat(returnval).toFixed(settings.decimals))); + } + function _getBoostedStep() { + if (!settings.booster) { + return settings.step; + } else { + var boosted = Math.pow(2, Math.floor(spincount / settings.boostat)) * settings.step; + if (settings.maxboostedstep) { + if (boosted > settings.maxboostedstep) { + boosted = settings.maxboostedstep; + value = Math.round(value / boosted) * boosted; + } + } + return Math.max(settings.step, boosted); + } + } + function valueIfIsNaN() { + if (typeof settings.firstclickvalueifempty === "number") { + return settings.firstclickvalueifempty; + } else { + return (settings.min + settings.max) / 2; + } + } + function _updateButtonDisabledState() { + var isDisabled = originalinput.is(":disabled,[readonly]"); + elements.up.prop("disabled", isDisabled); + elements.down.prop("disabled", isDisabled); + if (isDisabled) { + stopSpin(); + } + } + function upOnce() { + if (originalinput.is(":disabled,[readonly]")) { + return; + } + _checkValue(); + value = parseFloat(settings.callback_before_calculation(elements.input.val())); + var initvalue = value; + var boostedstep; + if (isNaN(value)) { + value = valueIfIsNaN(); + } else { + boostedstep = _getBoostedStep(); + value = value + boostedstep; + } + if (settings.max !== null && value >= settings.max) { + value = settings.max; + originalinput.trigger("touchspin.on.max"); + stopSpin(); + } + elements.input.val(settings.callback_after_calculation(parseFloat(value).toFixed(settings.decimals))); + if (initvalue !== value) { + originalinput.trigger("change"); + } + } + function downOnce() { + if (originalinput.is(":disabled,[readonly]")) { + return; + } + _checkValue(); + value = parseFloat(settings.callback_before_calculation(elements.input.val())); + var initvalue = value; + var boostedstep; + if (isNaN(value)) { + value = valueIfIsNaN(); + } else { + boostedstep = _getBoostedStep(); + value = value - boostedstep; + } + if (settings.min !== null && value <= settings.min) { + value = settings.min; + originalinput.trigger("touchspin.on.min"); + stopSpin(); + } + elements.input.val(settings.callback_after_calculation(parseFloat(value).toFixed(settings.decimals))); + if (initvalue !== value) { + originalinput.trigger("change"); + } + } + function startDownSpin() { + if (originalinput.is(":disabled,[readonly]")) { + return; + } + stopSpin(); + spincount = 0; + spinning = "down"; + originalinput.trigger("touchspin.on.startspin"); + originalinput.trigger("touchspin.on.startdownspin"); + downDelayTimeout = setTimeout(function() { + downSpinTimer = setInterval(function() { + spincount++; + downOnce(); + }, settings.stepinterval); + }, settings.stepintervaldelay); + } + function startUpSpin() { + if (originalinput.is(":disabled,[readonly]")) { + return; + } + stopSpin(); + spincount = 0; + spinning = "up"; + originalinput.trigger("touchspin.on.startspin"); + originalinput.trigger("touchspin.on.startupspin"); + upDelayTimeout = setTimeout(function() { + upSpinTimer = setInterval(function() { + spincount++; + upOnce(); + }, settings.stepinterval); + }, settings.stepintervaldelay); + } + function stopSpin() { + clearTimeout(downDelayTimeout); + clearTimeout(upDelayTimeout); + clearInterval(downSpinTimer); + clearInterval(upSpinTimer); + switch (spinning) { + case "up": + originalinput.trigger("touchspin.on.stopupspin"); + originalinput.trigger("touchspin.on.stopspin"); + break; + case "down": + originalinput.trigger("touchspin.on.stopdownspin"); + originalinput.trigger("touchspin.on.stopspin"); + break; + } + spincount = 0; + spinning = false; + } + }); + }; + }); + })(jquery_bootstrapTouchspin); + var jquery_bootstrapTouchspinExports = jquery_bootstrapTouchspin.exports; + const touchspin = /* @__PURE__ */ getDefaultExportFromCjs(jquery_bootstrapTouchspinExports); + var jquery_touchSwipe_min = { exports: {} }; + /*! + * @fileOverview TouchSwipe - jQuery Plugin + * @version 1.6.18 + * + * @author Matt Bryson http://www.github.com/mattbryson + * @see https://github.com/mattbryson/TouchSwipe-Jquery-Plugin + * @see http://labs.rampinteractive.co.uk/touchSwipe/ + * @see http://plugins.jquery.com/project/touchSwipe + * @license + * Copyright (c) 2010-2015 Matt Bryson + * Dual licensed under the MIT or GPL Version 2 licenses. + * + */ + (function(module) { + !function(factory) { + factory(module.exports ? $$1 : jQuery); + }(function($2) { + function init(options) { + return !options || void 0 !== options.allowPageScroll || void 0 === options.swipe && void 0 === options.swipeStatus || (options.allowPageScroll = NONE), void 0 !== options.click && void 0 === options.tap && (options.tap = options.click), options || (options = {}), options = $2.extend({}, $2.fn.swipe.defaults, options), this.each(function() { + var $this = $2(this), plugin = $this.data(PLUGIN_NS); + plugin || (plugin = new TouchSwipe(this, options), $this.data(PLUGIN_NS, plugin)); + }); + } + function TouchSwipe(element, options) { + function touchStart(jqEvent) { + if (!(getTouchInProgress() || $2(jqEvent.target).closest(options.excludedElements, $element).length > 0)) { + var event = jqEvent.originalEvent ? jqEvent.originalEvent : jqEvent; + if (!event.pointerType || "mouse" != event.pointerType || 0 != options.fallbackToMouseEvents) { + var ret, touches = event.touches, evt = touches ? touches[0] : event; + return phase = PHASE_START, touches ? fingerCount = touches.length : options.preventDefaultEvents !== false && jqEvent.preventDefault(), distance = 0, direction = null, currentDirection = null, pinchDirection = null, duration = 0, startTouchesDistance = 0, endTouchesDistance = 0, pinchZoom = 1, pinchDistance = 0, maximumsMap = createMaximumsData(), cancelMultiFingerRelease(), createFingerData(0, evt), !touches || fingerCount === options.fingers || options.fingers === ALL_FINGERS || hasPinches() ? (startTime = getTimeStamp(), 2 == fingerCount && (createFingerData(1, touches[1]), startTouchesDistance = endTouchesDistance = calculateTouchesDistance(fingerData[0].start, fingerData[1].start)), (options.swipeStatus || options.pinchStatus) && (ret = triggerHandler(event, phase))) : ret = false, ret === false ? (phase = PHASE_CANCEL, triggerHandler(event, phase), ret) : (options.hold && (holdTimeout = setTimeout($2.proxy(function() { + $element.trigger("hold", [event.target]), options.hold && (ret = options.hold.call($element, event, event.target)); + }, this), options.longTapThreshold)), setTouchInProgress(true), null); + } + } + } + function touchMove(jqEvent) { + var event = jqEvent.originalEvent ? jqEvent.originalEvent : jqEvent; + if (phase !== PHASE_END && phase !== PHASE_CANCEL && !inMultiFingerRelease()) { + var ret, touches = event.touches, evt = touches ? touches[0] : event, currentFinger = updateFingerData(evt); + if (endTime = getTimeStamp(), touches && (fingerCount = touches.length), options.hold && clearTimeout(holdTimeout), phase = PHASE_MOVE, 2 == fingerCount && (0 == startTouchesDistance ? (createFingerData(1, touches[1]), startTouchesDistance = endTouchesDistance = calculateTouchesDistance(fingerData[0].start, fingerData[1].start)) : (updateFingerData(touches[1]), endTouchesDistance = calculateTouchesDistance(fingerData[0].end, fingerData[1].end), pinchDirection = calculatePinchDirection(fingerData[0].end, fingerData[1].end)), pinchZoom = calculatePinchZoom(startTouchesDistance, endTouchesDistance), pinchDistance = Math.abs(startTouchesDistance - endTouchesDistance)), fingerCount === options.fingers || options.fingers === ALL_FINGERS || !touches || hasPinches()) { + if (direction = calculateDirection(currentFinger.start, currentFinger.end), currentDirection = calculateDirection(currentFinger.last, currentFinger.end), validateDefaultEvent(jqEvent, currentDirection), distance = calculateDistance(currentFinger.start, currentFinger.end), duration = calculateDuration(), setMaxDistance(direction, distance), ret = triggerHandler(event, phase), !options.triggerOnTouchEnd || options.triggerOnTouchLeave) { + var inBounds = true; + if (options.triggerOnTouchLeave) { + var bounds = getbounds(this); + inBounds = isInBounds(currentFinger.end, bounds); + } + !options.triggerOnTouchEnd && inBounds ? phase = getNextPhase(PHASE_MOVE) : options.triggerOnTouchLeave && !inBounds && (phase = getNextPhase(PHASE_END)), phase != PHASE_CANCEL && phase != PHASE_END || triggerHandler(event, phase); + } + } else + phase = PHASE_CANCEL, triggerHandler(event, phase); + ret === false && (phase = PHASE_CANCEL, triggerHandler(event, phase)); + } + } + function touchEnd(jqEvent) { + var event = jqEvent.originalEvent ? jqEvent.originalEvent : jqEvent, touches = event.touches; + if (touches) { + if (touches.length && !inMultiFingerRelease()) + return startMultiFingerRelease(event), true; + if (touches.length && inMultiFingerRelease()) + return true; + } + return inMultiFingerRelease() && (fingerCount = fingerCountAtRelease), endTime = getTimeStamp(), duration = calculateDuration(), didSwipeBackToCancel() || !validateSwipeDistance() ? (phase = PHASE_CANCEL, triggerHandler(event, phase)) : options.triggerOnTouchEnd || options.triggerOnTouchEnd === false && phase === PHASE_MOVE ? (options.preventDefaultEvents !== false && jqEvent.cancelable !== false && jqEvent.preventDefault(), phase = PHASE_END, triggerHandler(event, phase)) : !options.triggerOnTouchEnd && hasTap() ? (phase = PHASE_END, triggerHandlerForGesture(event, phase, TAP)) : phase === PHASE_MOVE && (phase = PHASE_CANCEL, triggerHandler(event, phase)), setTouchInProgress(false), null; + } + function touchCancel() { + fingerCount = 0, endTime = 0, startTime = 0, startTouchesDistance = 0, endTouchesDistance = 0, pinchZoom = 1, cancelMultiFingerRelease(), setTouchInProgress(false); + } + function touchLeave(jqEvent) { + var event = jqEvent.originalEvent ? jqEvent.originalEvent : jqEvent; + options.triggerOnTouchLeave && (phase = getNextPhase(PHASE_END), triggerHandler(event, phase)); + } + function removeListeners() { + $element.off(START_EV, touchStart), $element.off(CANCEL_EV, touchCancel), $element.off(MOVE_EV, touchMove), $element.off(END_EV, touchEnd), LEAVE_EV && $element.off(LEAVE_EV, touchLeave), setTouchInProgress(false); + } + function getNextPhase(currentPhase) { + var nextPhase = currentPhase, validTime = validateSwipeTime(), validDistance = validateSwipeDistance(), didCancel = didSwipeBackToCancel(); + return !validTime || didCancel ? nextPhase = PHASE_CANCEL : !validDistance || currentPhase != PHASE_MOVE || options.triggerOnTouchEnd && !options.triggerOnTouchLeave ? !validDistance && currentPhase == PHASE_END && options.triggerOnTouchLeave && (nextPhase = PHASE_CANCEL) : nextPhase = PHASE_END, nextPhase; + } + function triggerHandler(event, phase2) { + var ret, touches = event.touches; + return (didSwipe() || hasSwipes()) && (ret = triggerHandlerForGesture(event, phase2, SWIPE)), (didPinch() || hasPinches()) && ret !== false && (ret = triggerHandlerForGesture(event, phase2, PINCH)), didDoubleTap() && ret !== false ? ret = triggerHandlerForGesture(event, phase2, DOUBLE_TAP) : didLongTap() && ret !== false ? ret = triggerHandlerForGesture(event, phase2, LONG_TAP) : didTap() && ret !== false && (ret = triggerHandlerForGesture(event, phase2, TAP)), phase2 === PHASE_CANCEL && touchCancel(), phase2 === PHASE_END && (touches ? touches.length || touchCancel() : touchCancel()), ret; + } + function triggerHandlerForGesture(event, phase2, gesture) { + var ret; + if (gesture == SWIPE) { + if ($element.trigger("swipeStatus", [phase2, direction || null, distance || 0, duration || 0, fingerCount, fingerData, currentDirection]), options.swipeStatus && (ret = options.swipeStatus.call($element, event, phase2, direction || null, distance || 0, duration || 0, fingerCount, fingerData, currentDirection), ret === false)) + return false; + if (phase2 == PHASE_END && validateSwipe()) { + if (clearTimeout(singleTapTimeout), clearTimeout(holdTimeout), $element.trigger("swipe", [direction, distance, duration, fingerCount, fingerData, currentDirection]), options.swipe && (ret = options.swipe.call($element, event, direction, distance, duration, fingerCount, fingerData, currentDirection), ret === false)) + return false; + switch (direction) { + case LEFT: + $element.trigger("swipeLeft", [direction, distance, duration, fingerCount, fingerData, currentDirection]), options.swipeLeft && (ret = options.swipeLeft.call($element, event, direction, distance, duration, fingerCount, fingerData, currentDirection)); + break; + case RIGHT: + $element.trigger("swipeRight", [direction, distance, duration, fingerCount, fingerData, currentDirection]), options.swipeRight && (ret = options.swipeRight.call($element, event, direction, distance, duration, fingerCount, fingerData, currentDirection)); + break; + case UP: + $element.trigger("swipeUp", [direction, distance, duration, fingerCount, fingerData, currentDirection]), options.swipeUp && (ret = options.swipeUp.call($element, event, direction, distance, duration, fingerCount, fingerData, currentDirection)); + break; + case DOWN: + $element.trigger("swipeDown", [direction, distance, duration, fingerCount, fingerData, currentDirection]), options.swipeDown && (ret = options.swipeDown.call($element, event, direction, distance, duration, fingerCount, fingerData, currentDirection)); + } + } + } + if (gesture == PINCH) { + if ($element.trigger("pinchStatus", [phase2, pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData]), options.pinchStatus && (ret = options.pinchStatus.call($element, event, phase2, pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData), ret === false)) + return false; + if (phase2 == PHASE_END && validatePinch()) + switch (pinchDirection) { + case IN: + $element.trigger("pinchIn", [pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData]), options.pinchIn && (ret = options.pinchIn.call($element, event, pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData)); + break; + case OUT: + $element.trigger("pinchOut", [pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData]), options.pinchOut && (ret = options.pinchOut.call($element, event, pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData)); + } + } + return gesture == TAP ? phase2 !== PHASE_CANCEL && phase2 !== PHASE_END || (clearTimeout(singleTapTimeout), clearTimeout(holdTimeout), hasDoubleTap() && !inDoubleTap() ? (doubleTapStartTime = getTimeStamp(), singleTapTimeout = setTimeout($2.proxy(function() { + doubleTapStartTime = null, $element.trigger("tap", [event.target]), options.tap && (ret = options.tap.call($element, event, event.target)); + }, this), options.doubleTapThreshold)) : (doubleTapStartTime = null, $element.trigger("tap", [event.target]), options.tap && (ret = options.tap.call($element, event, event.target)))) : gesture == DOUBLE_TAP ? phase2 !== PHASE_CANCEL && phase2 !== PHASE_END || (clearTimeout(singleTapTimeout), clearTimeout(holdTimeout), doubleTapStartTime = null, $element.trigger("doubletap", [event.target]), options.doubleTap && (ret = options.doubleTap.call($element, event, event.target))) : gesture == LONG_TAP && (phase2 !== PHASE_CANCEL && phase2 !== PHASE_END || (clearTimeout(singleTapTimeout), doubleTapStartTime = null, $element.trigger("longtap", [event.target]), options.longTap && (ret = options.longTap.call($element, event, event.target)))), ret; + } + function validateSwipeDistance() { + var valid = true; + return null !== options.threshold && (valid = distance >= options.threshold), valid; + } + function didSwipeBackToCancel() { + var cancelled = false; + return null !== options.cancelThreshold && null !== direction && (cancelled = getMaxDistance(direction) - distance >= options.cancelThreshold), cancelled; + } + function validatePinchDistance() { + return null !== options.pinchThreshold ? pinchDistance >= options.pinchThreshold : true; + } + function validateSwipeTime() { + return options.maxTimeThreshold ? !(duration >= options.maxTimeThreshold) : true; + } + function validateDefaultEvent(jqEvent, direction2) { + if (options.preventDefaultEvents !== false) + if (options.allowPageScroll === NONE) + jqEvent.preventDefault(); + else { + var auto = options.allowPageScroll === AUTO; + switch (direction2) { + case LEFT: + (options.swipeLeft && auto || !auto && options.allowPageScroll != HORIZONTAL) && jqEvent.preventDefault(); + break; + case RIGHT: + (options.swipeRight && auto || !auto && options.allowPageScroll != HORIZONTAL) && jqEvent.preventDefault(); + break; + case UP: + (options.swipeUp && auto || !auto && options.allowPageScroll != VERTICAL) && jqEvent.preventDefault(); + break; + case DOWN: + (options.swipeDown && auto || !auto && options.allowPageScroll != VERTICAL) && jqEvent.preventDefault(); + break; + } + } + } + function validatePinch() { + var hasCorrectFingerCount = validateFingers(), hasEndPoint = validateEndPoint(), hasCorrectDistance = validatePinchDistance(); + return hasCorrectFingerCount && hasEndPoint && hasCorrectDistance; + } + function hasPinches() { + return !!(options.pinchStatus || options.pinchIn || options.pinchOut); + } + function didPinch() { + return !(!validatePinch() || !hasPinches()); + } + function validateSwipe() { + var hasValidTime = validateSwipeTime(), hasValidDistance = validateSwipeDistance(), hasCorrectFingerCount = validateFingers(), hasEndPoint = validateEndPoint(), didCancel = didSwipeBackToCancel(), valid = !didCancel && hasEndPoint && hasCorrectFingerCount && hasValidDistance && hasValidTime; + return valid; + } + function hasSwipes() { + return !!(options.swipe || options.swipeStatus || options.swipeLeft || options.swipeRight || options.swipeUp || options.swipeDown); + } + function didSwipe() { + return !(!validateSwipe() || !hasSwipes()); + } + function validateFingers() { + return fingerCount === options.fingers || options.fingers === ALL_FINGERS || !SUPPORTS_TOUCH; + } + function validateEndPoint() { + return 0 !== fingerData[0].end.x; + } + function hasTap() { + return !!options.tap; + } + function hasDoubleTap() { + return !!options.doubleTap; + } + function hasLongTap() { + return !!options.longTap; + } + function validateDoubleTap() { + if (null == doubleTapStartTime) + return false; + var now = getTimeStamp(); + return hasDoubleTap() && now - doubleTapStartTime <= options.doubleTapThreshold; + } + function inDoubleTap() { + return validateDoubleTap(); + } + function validateTap() { + return (1 === fingerCount || !SUPPORTS_TOUCH) && (isNaN(distance) || distance < options.threshold); + } + function validateLongTap() { + return duration > options.longTapThreshold && DOUBLE_TAP_THRESHOLD > distance; + } + function didTap() { + return !(!validateTap() || !hasTap()); + } + function didDoubleTap() { + return !(!validateDoubleTap() || !hasDoubleTap()); + } + function didLongTap() { + return !(!validateLongTap() || !hasLongTap()); + } + function startMultiFingerRelease(event) { + previousTouchEndTime = getTimeStamp(), fingerCountAtRelease = event.touches.length + 1; + } + function cancelMultiFingerRelease() { + previousTouchEndTime = 0, fingerCountAtRelease = 0; + } + function inMultiFingerRelease() { + var withinThreshold = false; + if (previousTouchEndTime) { + var diff = getTimeStamp() - previousTouchEndTime; + diff <= options.fingerReleaseThreshold && (withinThreshold = true); + } + return withinThreshold; + } + function getTouchInProgress() { + return !($element.data(PLUGIN_NS + "_intouch") !== true); + } + function setTouchInProgress(val) { + $element && (val === true ? ($element.on(MOVE_EV, touchMove), $element.on(END_EV, touchEnd), LEAVE_EV && $element.on(LEAVE_EV, touchLeave)) : ($element.off(MOVE_EV, touchMove, false), $element.off(END_EV, touchEnd, false), LEAVE_EV && $element.off(LEAVE_EV, touchLeave, false)), $element.data(PLUGIN_NS + "_intouch", val === true)); + } + function createFingerData(id, evt) { + var f = { start: { x: 0, y: 0 }, last: { x: 0, y: 0 }, end: { x: 0, y: 0 } }; + return f.start.x = f.last.x = f.end.x = evt.pageX || evt.clientX, f.start.y = f.last.y = f.end.y = evt.pageY || evt.clientY, fingerData[id] = f, f; + } + function updateFingerData(evt) { + var id = void 0 !== evt.identifier ? evt.identifier : 0, f = getFingerData(id); + return null === f && (f = createFingerData(id, evt)), f.last.x = f.end.x, f.last.y = f.end.y, f.end.x = evt.pageX || evt.clientX, f.end.y = evt.pageY || evt.clientY, f; + } + function getFingerData(id) { + return fingerData[id] || null; + } + function setMaxDistance(direction2, distance2) { + direction2 != NONE && (distance2 = Math.max(distance2, getMaxDistance(direction2)), maximumsMap[direction2].distance = distance2); + } + function getMaxDistance(direction2) { + return maximumsMap[direction2] ? maximumsMap[direction2].distance : void 0; + } + function createMaximumsData() { + var maxData = {}; + return maxData[LEFT] = createMaximumVO(LEFT), maxData[RIGHT] = createMaximumVO(RIGHT), maxData[UP] = createMaximumVO(UP), maxData[DOWN] = createMaximumVO(DOWN), maxData; + } + function createMaximumVO(dir) { + return { direction: dir, distance: 0 }; + } + function calculateDuration() { + return endTime - startTime; + } + function calculateTouchesDistance(startPoint, endPoint) { + var diffX = Math.abs(startPoint.x - endPoint.x), diffY = Math.abs(startPoint.y - endPoint.y); + return Math.round(Math.sqrt(diffX * diffX + diffY * diffY)); + } + function calculatePinchZoom(startDistance, endDistance) { + var percent = endDistance / startDistance * 1; + return percent.toFixed(2); + } + function calculatePinchDirection() { + return 1 > pinchZoom ? OUT : IN; + } + function calculateDistance(startPoint, endPoint) { + return Math.round(Math.sqrt(Math.pow(endPoint.x - startPoint.x, 2) + Math.pow(endPoint.y - startPoint.y, 2))); + } + function calculateAngle(startPoint, endPoint) { + var x = startPoint.x - endPoint.x, y = endPoint.y - startPoint.y, r = Math.atan2(y, x), angle = Math.round(180 * r / Math.PI); + return 0 > angle && (angle = 360 - Math.abs(angle)), angle; + } + function calculateDirection(startPoint, endPoint) { + if (comparePoints(startPoint, endPoint)) + return NONE; + var angle = calculateAngle(startPoint, endPoint); + return 45 >= angle && angle >= 0 ? LEFT : 360 >= angle && angle >= 315 ? LEFT : angle >= 135 && 225 >= angle ? RIGHT : angle > 45 && 135 > angle ? DOWN : UP; + } + function getTimeStamp() { + var now = /* @__PURE__ */ new Date(); + return now.getTime(); + } + function getbounds(el) { + el = $2(el); + var offset = el.offset(), bounds = { left: offset.left, right: offset.left + el.outerWidth(), top: offset.top, bottom: offset.top + el.outerHeight() }; + return bounds; + } + function isInBounds(point, bounds) { + return point.x > bounds.left && point.x < bounds.right && point.y > bounds.top && point.y < bounds.bottom; + } + function comparePoints(pointA, pointB) { + return pointA.x == pointB.x && pointA.y == pointB.y; + } + var options = $2.extend({}, options), useTouchEvents = SUPPORTS_TOUCH || SUPPORTS_POINTER || !options.fallbackToMouseEvents, START_EV = useTouchEvents ? SUPPORTS_POINTER ? SUPPORTS_POINTER_IE10 ? "MSPointerDown" : "pointerdown" : "touchstart" : "mousedown", MOVE_EV = useTouchEvents ? SUPPORTS_POINTER ? SUPPORTS_POINTER_IE10 ? "MSPointerMove" : "pointermove" : "touchmove" : "mousemove", END_EV = useTouchEvents ? SUPPORTS_POINTER ? SUPPORTS_POINTER_IE10 ? "MSPointerUp" : "pointerup" : "touchend" : "mouseup", LEAVE_EV = useTouchEvents ? SUPPORTS_POINTER ? "mouseleave" : null : "mouseleave", CANCEL_EV = SUPPORTS_POINTER ? SUPPORTS_POINTER_IE10 ? "MSPointerCancel" : "pointercancel" : "touchcancel", distance = 0, direction = null, currentDirection = null, duration = 0, startTouchesDistance = 0, endTouchesDistance = 0, pinchZoom = 1, pinchDistance = 0, pinchDirection = 0, maximumsMap = null, $element = $2(element), phase = "start", fingerCount = 0, fingerData = {}, startTime = 0, endTime = 0, previousTouchEndTime = 0, fingerCountAtRelease = 0, doubleTapStartTime = 0, singleTapTimeout = null, holdTimeout = null; + try { + $element.on(START_EV, touchStart), $element.on(CANCEL_EV, touchCancel); + } catch (e) { + $2.error("events not supported " + START_EV + "," + CANCEL_EV + " on jQuery.swipe"); + } + this.enable = function() { + return this.disable(), $element.on(START_EV, touchStart), $element.on(CANCEL_EV, touchCancel), $element; + }, this.disable = function() { + return removeListeners(), $element; + }, this.destroy = function() { + removeListeners(), $element.data(PLUGIN_NS, null), $element = null; + }, this.option = function(property, value) { + if ("object" == typeof property) + options = $2.extend(options, property); + else if (void 0 !== options[property]) { + if (void 0 === value) + return options[property]; + options[property] = value; + } else { + if (!property) + return options; + $2.error("Option " + property + " does not exist on jQuery.swipe.options"); + } + return null; + }; + } + var VERSION = "1.6.18", LEFT = "left", RIGHT = "right", UP = "up", DOWN = "down", IN = "in", OUT = "out", NONE = "none", AUTO = "auto", SWIPE = "swipe", PINCH = "pinch", TAP = "tap", DOUBLE_TAP = "doubletap", LONG_TAP = "longtap", HORIZONTAL = "horizontal", VERTICAL = "vertical", ALL_FINGERS = "all", DOUBLE_TAP_THRESHOLD = 10, PHASE_START = "start", PHASE_MOVE = "move", PHASE_END = "end", PHASE_CANCEL = "cancel", SUPPORTS_TOUCH = "ontouchstart" in window, SUPPORTS_POINTER_IE10 = window.navigator.msPointerEnabled && !window.PointerEvent && !SUPPORTS_TOUCH, SUPPORTS_POINTER = (window.PointerEvent || window.navigator.msPointerEnabled) && !SUPPORTS_TOUCH, PLUGIN_NS = "TouchSwipe", defaults = { fingers: 1, threshold: 75, cancelThreshold: null, pinchThreshold: 20, maxTimeThreshold: null, fingerReleaseThreshold: 250, longTapThreshold: 500, doubleTapThreshold: 200, swipe: null, swipeLeft: null, swipeRight: null, swipeUp: null, swipeDown: null, swipeStatus: null, pinchIn: null, pinchOut: null, pinchStatus: null, click: null, tap: null, doubleTap: null, longTap: null, hold: null, triggerOnTouchEnd: true, triggerOnTouchLeave: false, allowPageScroll: "auto", fallbackToMouseEvents: true, excludedElements: ".noSwipe", preventDefaultEvents: true }; + $2.fn.swipe = function(method) { + var $this = $2(this), plugin = $this.data(PLUGIN_NS); + if (plugin && "string" == typeof method) { + if (plugin[method]) + return plugin[method].apply(plugin, Array.prototype.slice.call(arguments, 1)); + $2.error("Method " + method + " does not exist on jQuery.swipe"); + } else if (plugin && "object" == typeof method) + plugin.option.apply(plugin, arguments); + else if (!(plugin || "object" != typeof method && method)) + return init.apply(this, arguments); + return $this; + }, $2.fn.swipe.version = VERSION, $2.fn.swipe.defaults = defaults, $2.fn.swipe.phases = { PHASE_START, PHASE_MOVE, PHASE_END, PHASE_CANCEL }, $2.fn.swipe.directions = { LEFT, RIGHT, UP, DOWN, IN, OUT }, $2.fn.swipe.pageScroll = { NONE, HORIZONTAL, VERTICAL, AUTO }, $2.fn.swipe.fingers = { ONE: 1, TWO: 2, THREE: 3, FOUR: 4, FIVE: 5, ALL: ALL_FINGERS }; + }); + })(jquery_touchSwipe_min); + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + const passwordPolicy = { + template: "#password-feedback", + hint: ".js-hint-password", + container: ".password-strength-feedback", + strengthText: ".password-strength-text", + requirementScore: ".password-requirements-score", + requirementLength: ".password-requirements-length", + requirementScoreIcon: ".password-requirements-score i", + requirementLengthIcon: ".password-requirements-length i", + progressBar: ".progress-bar", + inputColumn: ".js-input-column" + }; + prestashop$1.themeSelectors = { + product: { + tabs: ".tabs .nav-link", + activeNavClass: "js-product-nav-active", + activeTabClass: "js-product-tab-active", + activeTabs: ".tabs .nav-link.active, .js-product-nav-active", + imagesModal: ".js-product-images-modal", + thumb: ".js-thumb", + thumbContainer: ".thumb-container, .js-thumb-container", + arrows: ".js-arrows", + selected: ".selected, .js-thumb-selected", + modalProductCover: ".js-modal-product-cover", + cover: ".js-qv-product-cover", + customizationModal: ".js-customization-modal" + }, + listing: { + searchFilterToggler: "#search_filter_toggler, .js-search-toggler", + searchFiltersWrapper: "#search_filters_wrapper", + searchFilterControls: "#search_filter_controls", + searchFilters: "#search_filters", + activeSearchFilters: "#js-active-search-filters", + listTop: "#js-product-list-top", + product: ".js-product", + list: "#js-product-list", + listBottom: "#js-product-list-bottom", + listHeader: "#js-product-list-header", + searchFiltersClearAll: ".js-search-filters-clear-all", + searchLink: ".js-search-link" + }, + order: { + returnForm: "#order-return-form, .js-order-return-form" + }, + arrowDown: ".arrow-down, .js-arrow-down", + arrowUp: ".arrow-up, .js-arrow-up", + clear: ".clear", + fileInput: ".js-file-input", + contentWrapper: "#content-wrapper, .js-content-wrapper", + footer: "#footer, .js-footer", + modalContent: ".js-modal-content", + modal: "#modal, .js-checkout-modal", + touchspin: ".js-touchspin", + checkout: { + termsLink: ".js-terms a", + giftCheckbox: ".js-gift-checkbox", + imagesLink: ".card-block .cart-summary-products p a, .js-show-details", + carrierExtraContent: ".carrier-extra-content, .js-carrier-extra-content", + btn: ".checkout a" + }, + cart: { + productLineQty: ".js-cart-line-product-quantity", + quickview: ".quickview", + touchspin: ".bootstrap-touchspin", + promoCode: "#promo-code", + displayPromo: ".display-promo", + promoCodeButton: ".promo-code-button", + discountCode: ".js-discount .code", + discountName: "[name=discount_name]", + actions: '[data-link-action="delete-from-cart"], [data-link-action="remove-voucher"]' + }, + notifications: { + dangerAlert: "#notifications article.alert-danger", + container: "#notifications .notifications-container" + }, + passwordPolicy + }; + $$1(document).ready(() => { + prestashop$1.emit("themeSelectorsInit"); + }); + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + prestashop$1.responsive = prestashop$1.responsive || {}; + prestashop$1.responsive.current_width = window.innerWidth; + prestashop$1.responsive.min_width = 768; + prestashop$1.responsive.mobile = prestashop$1.responsive.current_width < prestashop$1.responsive.min_width; + function swapChildren(obj1, obj2) { + const temp = obj2.children().detach(); + obj2.empty().append(obj1.children().detach()); + obj1.append(temp); + } + function toggleMobileStyles() { + if (prestashop$1.responsive.mobile) { + $$1("*[id^='_desktop_']").each((idx, el) => { + const target = $$1(`#${el.id.replace("_desktop_", "_mobile_")}`); + if (target.length) { + swapChildren($$1(el), target); + } + }); + } else { + $$1("*[id^='_mobile_']").each((idx, el) => { + const target = $$1(`#${el.id.replace("_mobile_", "_desktop_")}`); + if (target.length) { + swapChildren($$1(el), target); + } + }); + } + prestashop$1.emit("responsive update", { + mobile: prestashop$1.responsive.mobile + }); + } + $$1(window).on("resize", () => { + const cw = prestashop$1.responsive.current_width; + const mw = prestashop$1.responsive.min_width; + const w = window.innerWidth; + const toggle = cw >= mw && w < mw || cw < mw && w >= mw; + prestashop$1.responsive.current_width = w; + prestashop$1.responsive.mobile = prestashop$1.responsive.current_width < prestashop$1.responsive.min_width; + if (toggle) { + toggleMobileStyles(); + } + }); + $$1(document).ready(() => { + if (prestashop$1.responsive.mobile) { + toggleMobileStyles(); + } + }); + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + function setUpCheckout() { + $$1(prestashop$1.themeSelectors.checkout.termsLink).on("click", (event) => { + event.preventDefault(); + let url = $$1(event.target).attr("href"); + if (url) { + url += "?content_only=1"; + $$1.get(url, (content) => { + $$1(prestashop$1.themeSelectors.modal).find(prestashop$1.themeSelectors.modalContent).html($$1(content).find(".page-cms").contents()); + }).fail((resp) => { + prestashop$1.emit("handleError", { eventType: "clickTerms", resp }); + }); + } + $$1(prestashop$1.themeSelectors.modal).modal("show"); + }); + $$1(prestashop$1.themeSelectors.checkout.giftCheckbox).on("click", () => { + $$1("#gift").slideToggle(); + }); + } + function toggleImage() { + $$1(prestashop$1.themeSelectors.checkout.imagesLink).on("click", function() { + const icon = $$1(this).find("i.material-icons"); + if (icon.text() === "expand_more") { + icon.text("expand_less"); + } else { + icon.text("expand_more"); + } + }); + } + $$1(document).ready(() => { + if ($$1("body#checkout").length === 1) { + setUpCheckout(); + toggleImage(); + } + prestashop$1.on("updatedDeliveryForm", (params) => { + if (typeof params.deliveryOption === "undefined" || params.deliveryOption.length === 0) { + return; + } + $$1(prestashop$1.themeSelectors.checkout.carrierExtraContent).hide(); + params.deliveryOption.next(prestashop$1.themeSelectors.checkout.carrierExtraContent).slideDown(); + }); + }); + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + function initRmaItemSelector() { + $$1(`${prestashop$1.themeSelectors.order.returnForm} table thead input[type=checkbox]`).on("click", function() { + const checked = $$1(this).prop("checked"); + $$1(`${prestashop$1.themeSelectors.order.returnForm} table tbody input[type=checkbox]`).each((_, checkbox) => { + $$1(checkbox).prop("checked", checked); + }); + }); + } + function setupCustomerScripts() { + if ($$1("body#order-detail")) { + initRmaItemSelector(); + } + } + $$1(document).ready(setupCustomerScripts); + var velocity = { exports: {} }; + /*! VelocityJS.org (1.5.2). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */ + (function(module) { + /*! VelocityJS.org jQuery Shim (1.0.1). (C) 2014 The jQuery Foundation. MIT @license: en.wikipedia.org/wiki/MIT_License. */ + (function(window2) { + if (window2.jQuery) { + return; + } + var $2 = function(selector, context) { + return new $2.fn.init(selector, context); + }; + $2.isWindow = function(obj) { + return obj && obj === obj.window; + }; + $2.type = function(obj) { + if (!obj) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : typeof obj; + }; + $2.isArray = Array.isArray || function(obj) { + return $2.type(obj) === "array"; + }; + function isArraylike(obj) { + var length = obj.length, type = $2.type(obj); + if (type === "function" || $2.isWindow(obj)) { + return false; + } + if (obj.nodeType === 1 && length) { + return true; + } + return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj; + } + $2.isPlainObject = function(obj) { + var key; + if (!obj || $2.type(obj) !== "object" || obj.nodeType || $2.isWindow(obj)) { + return false; + } + try { + if (obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { + return false; + } + } catch (e) { + return false; + } + for (key in obj) { + } + return key === void 0 || hasOwn.call(obj, key); + }; + $2.each = function(obj, callback, args) { + var value, i2 = 0, length = obj.length, isArray = isArraylike(obj); + if (args) { + if (isArray) { + for (; i2 < length; i2++) { + value = callback.apply(obj[i2], args); + if (value === false) { + break; + } + } + } else { + for (i2 in obj) { + if (!obj.hasOwnProperty(i2)) { + continue; + } + value = callback.apply(obj[i2], args); + if (value === false) { + break; + } + } + } + } else { + if (isArray) { + for (; i2 < length; i2++) { + value = callback.call(obj[i2], i2, obj[i2]); + if (value === false) { + break; + } + } + } else { + for (i2 in obj) { + if (!obj.hasOwnProperty(i2)) { + continue; + } + value = callback.call(obj[i2], i2, obj[i2]); + if (value === false) { + break; + } + } + } + } + return obj; + }; + $2.data = function(node, key, value) { + if (value === void 0) { + var getId = node[$2.expando], store = getId && cache[getId]; + if (key === void 0) { + return store; + } else if (store) { + if (key in store) { + return store[key]; + } + } + } else if (key !== void 0) { + var setId = node[$2.expando] || (node[$2.expando] = ++$2.uuid); + cache[setId] = cache[setId] || {}; + cache[setId][key] = value; + return value; + } + }; + $2.removeData = function(node, keys) { + var id = node[$2.expando], store = id && cache[id]; + if (store) { + if (!keys) { + delete cache[id]; + } else { + $2.each(keys, function(_, key) { + delete store[key]; + }); + } + } + }; + $2.extend = function() { + var src, copyIsArray, copy, name, options, clone, target = arguments[0] || {}, i2 = 1, length = arguments.length, deep = false; + if (typeof target === "boolean") { + deep = target; + target = arguments[i2] || {}; + i2++; + } + if (typeof target !== "object" && $2.type(target) !== "function") { + target = {}; + } + if (i2 === length) { + target = this; + i2--; + } + for (; i2 < length; i2++) { + if (options = arguments[i2]) { + for (name in options) { + if (!options.hasOwnProperty(name)) { + continue; + } + src = target[name]; + copy = options[name]; + if (target === copy) { + continue; + } + if (deep && copy && ($2.isPlainObject(copy) || (copyIsArray = $2.isArray(copy)))) { + if (copyIsArray) { + copyIsArray = false; + clone = src && $2.isArray(src) ? src : []; + } else { + clone = src && $2.isPlainObject(src) ? src : {}; + } + target[name] = $2.extend(deep, clone, copy); + } else if (copy !== void 0) { + target[name] = copy; + } + } + } + } + return target; + }; + $2.queue = function(elem, type, data) { + function $makeArray(arr, results) { + var ret = results || []; + if (arr) { + if (isArraylike(Object(arr))) { + (function(first, second) { + var len = +second.length, j = 0, i2 = first.length; + while (j < len) { + first[i2++] = second[j++]; + } + if (len !== len) { + while (second[j] !== void 0) { + first[i2++] = second[j++]; + } + } + first.length = i2; + return first; + })(ret, typeof arr === "string" ? [arr] : arr); + } else { + [].push.call(ret, arr); + } + } + return ret; + } + if (!elem) { + return; + } + type = (type || "fx") + "queue"; + var q = $2.data(elem, type); + if (!data) { + return q || []; + } + if (!q || $2.isArray(data)) { + q = $2.data(elem, type, $makeArray(data)); + } else { + q.push(data); + } + return q; + }; + $2.dequeue = function(elems, type) { + $2.each(elems.nodeType ? [elems] : elems, function(i2, elem) { + type = type || "fx"; + var queue = $2.queue(elem, type), fn = queue.shift(); + if (fn === "inprogress") { + fn = queue.shift(); + } + if (fn) { + if (type === "fx") { + queue.unshift("inprogress"); + } + fn.call(elem, function() { + $2.dequeue(elem, type); + }); + } + }); + }; + $2.fn = $2.prototype = { + init: function(selector) { + if (selector.nodeType) { + this[0] = selector; + return this; + } else { + throw new Error("Not a DOM node."); + } + }, + offset: function() { + var box = this[0].getBoundingClientRect ? this[0].getBoundingClientRect() : { top: 0, left: 0 }; + return { + top: box.top + (window2.pageYOffset || document.scrollTop || 0) - (document.clientTop || 0), + left: box.left + (window2.pageXOffset || document.scrollLeft || 0) - (document.clientLeft || 0) + }; + }, + position: function() { + function offsetParentFn(elem2) { + var offsetParent2 = elem2.offsetParent; + while (offsetParent2 && (offsetParent2.nodeName.toLowerCase() !== "html" && offsetParent2.style && offsetParent2.style.position.toLowerCase() === "static")) { + offsetParent2 = offsetParent2.offsetParent; + } + return offsetParent2 || document; + } + var elem = this[0], offsetParent = offsetParentFn(elem), offset = this.offset(), parentOffset = /^(?:body|html)$/i.test(offsetParent.nodeName) ? { top: 0, left: 0 } : $2(offsetParent).offset(); + offset.top -= parseFloat(elem.style.marginTop) || 0; + offset.left -= parseFloat(elem.style.marginLeft) || 0; + if (offsetParent.style) { + parentOffset.top += parseFloat(offsetParent.style.borderTopWidth) || 0; + parentOffset.left += parseFloat(offsetParent.style.borderLeftWidth) || 0; + } + return { + top: offset.top - parentOffset.top, + left: offset.left - parentOffset.left + }; + } + }; + var cache = {}; + $2.expando = "velocity" + (/* @__PURE__ */ new Date()).getTime(); + $2.uuid = 0; + var class2type = {}, hasOwn = class2type.hasOwnProperty, toString = class2type.toString; + var types = "Boolean Number String Function Array Date RegExp Object Error".split(" "); + for (var i = 0; i < types.length; i++) { + class2type["[object " + types[i] + "]"] = types[i].toLowerCase(); + } + $2.fn.init.prototype = $2.fn; + window2.Velocity = { Utilities: $2 }; + })(window); + (function(factory) { + { + module.exports = factory(); + } + })(function() { + return function(global2, window2, document2, undefined$1) { + var IE = function() { + if (document2.documentMode) { + return document2.documentMode; + } else { + for (var i = 7; i > 4; i--) { + var div = document2.createElement("div"); + div.innerHTML = ""; + if (div.getElementsByTagName("span").length) { + div = null; + return i; + } + } + } + return undefined$1; + }(); + var rAFShim = function() { + var timeLast = 0; + return window2.webkitRequestAnimationFrame || window2.mozRequestAnimationFrame || function(callback) { + var timeCurrent = (/* @__PURE__ */ new Date()).getTime(), timeDelta; + timeDelta = Math.max(0, 16 - (timeCurrent - timeLast)); + timeLast = timeCurrent + timeDelta; + return setTimeout(function() { + callback(timeCurrent + timeDelta); + }, timeDelta); + }; + }(); + var performance = function() { + var perf = window2.performance || {}; + if (typeof perf.now !== "function") { + var nowOffset = perf.timing && perf.timing.navigationStart ? perf.timing.navigationStart : (/* @__PURE__ */ new Date()).getTime(); + perf.now = function() { + return (/* @__PURE__ */ new Date()).getTime() - nowOffset; + }; + } + return perf; + }(); + function compactSparseArray(array) { + var index = -1, length = array ? array.length : 0, result = []; + while (++index < length) { + var value = array[index]; + if (value) { + result.push(value); + } + } + return result; + } + var _slice = function() { + var slice = Array.prototype.slice; + try { + slice.call(document2.documentElement); + return slice; + } catch (e) { + return function(begin, end) { + var len = this.length; + if (typeof begin !== "number") { + begin = 0; + } + if (typeof end !== "number") { + end = len; + } + if (this.slice) { + return slice.call(this, begin, end); + } + var i, cloned = [], start = begin >= 0 ? begin : Math.max(0, len + begin), upTo = end < 0 ? len + end : Math.min(end, len), size = upTo - start; + if (size > 0) { + cloned = new Array(size); + if (this.charAt) { + for (i = 0; i < size; i++) { + cloned[i] = this.charAt(start + i); + } + } else { + for (i = 0; i < size; i++) { + cloned[i] = this[start + i]; + } + } + } + return cloned; + }; + } + }(); + var _inArray = function() { + if (Array.prototype.includes) { + return function(arr, val) { + return arr.includes(val); + }; + } + if (Array.prototype.indexOf) { + return function(arr, val) { + return arr.indexOf(val) >= 0; + }; + } + return function(arr, val) { + for (var i = 0; i < arr.length; i++) { + if (arr[i] === val) { + return true; + } + } + return false; + }; + }; + function sanitizeElements(elements) { + if (Type.isWrapped(elements)) { + elements = _slice.call(elements); + } else if (Type.isNode(elements)) { + elements = [elements]; + } + return elements; + } + var Type = { + isNumber: function(variable) { + return typeof variable === "number"; + }, + isString: function(variable) { + return typeof variable === "string"; + }, + isArray: Array.isArray || function(variable) { + return Object.prototype.toString.call(variable) === "[object Array]"; + }, + isFunction: function(variable) { + return Object.prototype.toString.call(variable) === "[object Function]"; + }, + isNode: function(variable) { + return variable && variable.nodeType; + }, + /* Determine if variable is an array-like wrapped jQuery, Zepto or similar element, or even a NodeList etc. */ + /* NOTE: HTMLFormElements also have a length. */ + isWrapped: function(variable) { + return variable && variable !== window2 && Type.isNumber(variable.length) && !Type.isString(variable) && !Type.isFunction(variable) && !Type.isNode(variable) && (variable.length === 0 || Type.isNode(variable[0])); + }, + isSVG: function(variable) { + return window2.SVGElement && variable instanceof window2.SVGElement; + }, + isEmptyObject: function(variable) { + for (var name in variable) { + if (variable.hasOwnProperty(name)) { + return false; + } + } + return true; + } + }; + var $2, isJQuery = false; + if (global2.fn && global2.fn.jquery) { + $2 = global2; + isJQuery = true; + } else { + $2 = window2.Velocity.Utilities; + } + if (IE <= 8 && !isJQuery) { + throw new Error("Velocity: IE8 and below require jQuery to be loaded before Velocity."); + } else if (IE <= 7) { + jQuery.fn.velocity = jQuery.fn.animate; + return; + } + var DURATION_DEFAULT = 400, EASING_DEFAULT = "swing"; + var Velocity = { + /* Container for page-wide Velocity state data. */ + State: { + /* Detect mobile devices to determine if mobileHA should be turned on. */ + isMobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(window2.navigator.userAgent), + /* The mobileHA option's behavior changes on older Android devices (Gingerbread, versions 2.3.3-2.3.7). */ + isAndroid: /Android/i.test(window2.navigator.userAgent), + isGingerbread: /Android 2\.3\.[3-7]/i.test(window2.navigator.userAgent), + isChrome: window2.chrome, + isFirefox: /Firefox/i.test(window2.navigator.userAgent), + /* Create a cached element for re-use when checking for CSS property prefixes. */ + prefixElement: document2.createElement("div"), + /* Cache every prefix match to avoid repeating lookups. */ + prefixMatches: {}, + /* Cache the anchor used for animating window scrolling. */ + scrollAnchor: null, + /* Cache the browser-specific property names associated with the scroll anchor. */ + scrollPropertyLeft: null, + scrollPropertyTop: null, + /* Keep track of whether our RAF tick is running. */ + isTicking: false, + /* Container for every in-progress call to Velocity. */ + calls: [], + delayedElements: { + count: 0 + } + }, + /* Velocity's custom CSS stack. Made global for unit testing. */ + CSS: { + /* Defined below. */ + }, + /* A shim of the jQuery utility functions used by Velocity -- provided by Velocity's optional jQuery shim. */ + Utilities: $2, + /* Container for the user's custom animation redirects that are referenced by name in place of the properties map argument. */ + Redirects: { + /* Manually registered by the user. */ + }, + Easings: { + /* Defined below. */ + }, + /* Attempt to use ES6 Promises by default. Users can override this with a third-party promises library. */ + Promise: window2.Promise, + /* Velocity option defaults, which can be overriden by the user. */ + defaults: { + queue: "", + duration: DURATION_DEFAULT, + easing: EASING_DEFAULT, + begin: undefined$1, + complete: undefined$1, + progress: undefined$1, + display: undefined$1, + visibility: undefined$1, + loop: false, + delay: false, + mobileHA: true, + /* Advanced: Set to false to prevent property values from being cached between consecutive Velocity-initiated chain calls. */ + _cacheValues: true, + /* Advanced: Set to false if the promise should always resolve on empty element lists. */ + promiseRejectEmpty: true + }, + /* A design goal of Velocity is to cache data wherever possible in order to avoid DOM requerying. Accordingly, each element has a data cache. */ + init: function(element) { + $2.data(element, "velocity", { + /* Store whether this is an SVG element, since its properties are retrieved and updated differently than standard HTML elements. */ + isSVG: Type.isSVG(element), + /* Keep track of whether the element is currently being animated by Velocity. + This is used to ensure that property values are not transferred between non-consecutive (stale) calls. */ + isAnimating: false, + /* A reference to the element's live computedStyle object. Learn more here: https://developer.mozilla.org/en/docs/Web/API/window.getComputedStyle */ + computedStyle: null, + /* Tween data is cached for each animation on the element so that data can be passed across calls -- + in particular, end values are used as subsequent start values in consecutive Velocity calls. */ + tweensContainer: null, + /* The full root property values of each CSS hook being animated on this element are cached so that: + 1) Concurrently-animating hooks sharing the same root can have their root values' merged into one while tweening. + 2) Post-hook-injection root values can be transferred over to consecutively chained Velocity calls as starting root values. */ + rootPropertyValueCache: {}, + /* A cache for transform updates, which must be manually flushed via CSS.flushTransformCache(). */ + transformCache: {} + }); + }, + /* A parallel to jQuery's $.css(), used for getting/setting Velocity's hooked CSS properties. */ + hook: null, + /* Defined below. */ + /* Velocity-wide animation time remapping for testing purposes. */ + mock: false, + version: { major: 1, minor: 5, patch: 2 }, + /* Set to 1 or 2 (most verbose) to output debug info to console. */ + debug: false, + /* Use rAF high resolution timestamp when available */ + timestamp: true, + /* Pause all animations */ + pauseAll: function(queueName) { + var currentTime = (/* @__PURE__ */ new Date()).getTime(); + $2.each(Velocity.State.calls, function(i, activeCall) { + if (activeCall) { + if (queueName !== undefined$1 && (activeCall[2].queue !== queueName || activeCall[2].queue === false)) { + return true; + } + activeCall[5] = { + resume: false + }; + } + }); + $2.each(Velocity.State.delayedElements, function(k, element) { + if (!element) { + return; + } + pauseDelayOnElement(element, currentTime); + }); + }, + /* Resume all animations */ + resumeAll: function(queueName) { + (/* @__PURE__ */ new Date()).getTime(); + $2.each(Velocity.State.calls, function(i, activeCall) { + if (activeCall) { + if (queueName !== undefined$1 && (activeCall[2].queue !== queueName || activeCall[2].queue === false)) { + return true; + } + if (activeCall[5]) { + activeCall[5].resume = true; + } + } + }); + $2.each(Velocity.State.delayedElements, function(k, element) { + if (!element) { + return; + } + resumeDelayOnElement(element); + }); + } + }; + if (window2.pageYOffset !== undefined$1) { + Velocity.State.scrollAnchor = window2; + Velocity.State.scrollPropertyLeft = "pageXOffset"; + Velocity.State.scrollPropertyTop = "pageYOffset"; + } else { + Velocity.State.scrollAnchor = document2.documentElement || document2.body.parentNode || document2.body; + Velocity.State.scrollPropertyLeft = "scrollLeft"; + Velocity.State.scrollPropertyTop = "scrollTop"; + } + function Data(element) { + var response = $2.data(element, "velocity"); + return response === null ? undefined$1 : response; + } + function pauseDelayOnElement(element, currentTime) { + var data = Data(element); + if (data && data.delayTimer && !data.delayPaused) { + data.delayRemaining = data.delay - currentTime + data.delayBegin; + data.delayPaused = true; + clearTimeout(data.delayTimer.setTimeout); + } + } + function resumeDelayOnElement(element, currentTime) { + var data = Data(element); + if (data && data.delayTimer && data.delayPaused) { + data.delayPaused = false; + data.delayTimer.setTimeout = setTimeout(data.delayTimer.next, data.delayRemaining); + } + } + function generateStep(steps) { + return function(p) { + return Math.round(p * steps) * (1 / steps); + }; + } + function generateBezier(mX1, mY1, mX2, mY2) { + var NEWTON_ITERATIONS = 4, NEWTON_MIN_SLOPE = 1e-3, SUBDIVISION_PRECISION = 1e-7, SUBDIVISION_MAX_ITERATIONS = 10, kSplineTableSize = 11, kSampleStepSize = 1 / (kSplineTableSize - 1), float32ArraySupported = "Float32Array" in window2; + if (arguments.length !== 4) { + return false; + } + for (var i = 0; i < 4; ++i) { + if (typeof arguments[i] !== "number" || isNaN(arguments[i]) || !isFinite(arguments[i])) { + return false; + } + } + mX1 = Math.min(mX1, 1); + mX2 = Math.min(mX2, 1); + mX1 = Math.max(mX1, 0); + mX2 = Math.max(mX2, 0); + var mSampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize); + function A(aA1, aA2) { + return 1 - 3 * aA2 + 3 * aA1; + } + function B(aA1, aA2) { + return 3 * aA2 - 6 * aA1; + } + function C(aA1) { + return 3 * aA1; + } + function calcBezier(aT, aA1, aA2) { + return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; + } + function getSlope(aT, aA1, aA2) { + return 3 * A(aA1, aA2) * aT * aT + 2 * B(aA1, aA2) * aT + C(aA1); + } + function newtonRaphsonIterate(aX, aGuessT) { + for (var i2 = 0; i2 < NEWTON_ITERATIONS; ++i2) { + var currentSlope = getSlope(aGuessT, mX1, mX2); + if (currentSlope === 0) { + return aGuessT; + } + var currentX = calcBezier(aGuessT, mX1, mX2) - aX; + aGuessT -= currentX / currentSlope; + } + return aGuessT; + } + function calcSampleValues() { + for (var i2 = 0; i2 < kSplineTableSize; ++i2) { + mSampleValues[i2] = calcBezier(i2 * kSampleStepSize, mX1, mX2); + } + } + function binarySubdivide(aX, aA, aB) { + var currentX, currentT, i2 = 0; + do { + currentT = aA + (aB - aA) / 2; + currentX = calcBezier(currentT, mX1, mX2) - aX; + if (currentX > 0) { + aB = currentT; + } else { + aA = currentT; + } + } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i2 < SUBDIVISION_MAX_ITERATIONS); + return currentT; + } + function getTForX(aX) { + var intervalStart = 0, currentSample = 1, lastSample = kSplineTableSize - 1; + for (; currentSample !== lastSample && mSampleValues[currentSample] <= aX; ++currentSample) { + intervalStart += kSampleStepSize; + } + --currentSample; + var dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample + 1] - mSampleValues[currentSample]), guessForT = intervalStart + dist * kSampleStepSize, initialSlope = getSlope(guessForT, mX1, mX2); + if (initialSlope >= NEWTON_MIN_SLOPE) { + return newtonRaphsonIterate(aX, guessForT); + } else if (initialSlope === 0) { + return guessForT; + } else { + return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize); + } + } + var _precomputed = false; + function precompute() { + _precomputed = true; + if (mX1 !== mY1 || mX2 !== mY2) { + calcSampleValues(); + } + } + var f = function(aX) { + if (!_precomputed) { + precompute(); + } + if (mX1 === mY1 && mX2 === mY2) { + return aX; + } + if (aX === 0) { + return 0; + } + if (aX === 1) { + return 1; + } + return calcBezier(getTForX(aX), mY1, mY2); + }; + f.getControlPoints = function() { + return [{ x: mX1, y: mY1 }, { x: mX2, y: mY2 }]; + }; + var str = "generateBezier(" + [mX1, mY1, mX2, mY2] + ")"; + f.toString = function() { + return str; + }; + return f; + } + var generateSpringRK4 = function() { + function springAccelerationForState(state) { + return -state.tension * state.x - state.friction * state.v; + } + function springEvaluateStateWithDerivative(initialState, dt, derivative) { + var state = { + x: initialState.x + derivative.dx * dt, + v: initialState.v + derivative.dv * dt, + tension: initialState.tension, + friction: initialState.friction + }; + return { dx: state.v, dv: springAccelerationForState(state) }; + } + function springIntegrateState(state, dt) { + var a = { + dx: state.v, + dv: springAccelerationForState(state) + }, b = springEvaluateStateWithDerivative(state, dt * 0.5, a), c = springEvaluateStateWithDerivative(state, dt * 0.5, b), d = springEvaluateStateWithDerivative(state, dt, c), dxdt = 1 / 6 * (a.dx + 2 * (b.dx + c.dx) + d.dx), dvdt = 1 / 6 * (a.dv + 2 * (b.dv + c.dv) + d.dv); + state.x = state.x + dxdt * dt; + state.v = state.v + dvdt * dt; + return state; + } + return function springRK4Factory(tension, friction, duration) { + var initState = { + x: -1, + v: 0, + tension: null, + friction: null + }, path = [0], time_lapsed = 0, tolerance = 1 / 1e4, DT = 16 / 1e3, have_duration, dt, last_state; + tension = parseFloat(tension) || 500; + friction = parseFloat(friction) || 20; + duration = duration || null; + initState.tension = tension; + initState.friction = friction; + have_duration = duration !== null; + if (have_duration) { + time_lapsed = springRK4Factory(tension, friction); + dt = time_lapsed / duration * DT; + } else { + dt = DT; + } + while (true) { + last_state = springIntegrateState(last_state || initState, dt); + path.push(1 + last_state.x); + time_lapsed += 16; + if (!(Math.abs(last_state.x) > tolerance && Math.abs(last_state.v) > tolerance)) { + break; + } + } + return !have_duration ? time_lapsed : function(percentComplete) { + return path[percentComplete * (path.length - 1) | 0]; + }; + }; + }(); + Velocity.Easings = { + linear: function(p) { + return p; + }, + swing: function(p) { + return 0.5 - Math.cos(p * Math.PI) / 2; + }, + /* Bonus "spring" easing, which is a less exaggerated version of easeInOutElastic. */ + spring: function(p) { + return 1 - Math.cos(p * 4.5 * Math.PI) * Math.exp(-p * 6); + } + }; + $2.each( + [ + ["ease", [0.25, 0.1, 0.25, 1]], + ["ease-in", [0.42, 0, 1, 1]], + ["ease-out", [0, 0, 0.58, 1]], + ["ease-in-out", [0.42, 0, 0.58, 1]], + ["easeInSine", [0.47, 0, 0.745, 0.715]], + ["easeOutSine", [0.39, 0.575, 0.565, 1]], + ["easeInOutSine", [0.445, 0.05, 0.55, 0.95]], + ["easeInQuad", [0.55, 0.085, 0.68, 0.53]], + ["easeOutQuad", [0.25, 0.46, 0.45, 0.94]], + ["easeInOutQuad", [0.455, 0.03, 0.515, 0.955]], + ["easeInCubic", [0.55, 0.055, 0.675, 0.19]], + ["easeOutCubic", [0.215, 0.61, 0.355, 1]], + ["easeInOutCubic", [0.645, 0.045, 0.355, 1]], + ["easeInQuart", [0.895, 0.03, 0.685, 0.22]], + ["easeOutQuart", [0.165, 0.84, 0.44, 1]], + ["easeInOutQuart", [0.77, 0, 0.175, 1]], + ["easeInQuint", [0.755, 0.05, 0.855, 0.06]], + ["easeOutQuint", [0.23, 1, 0.32, 1]], + ["easeInOutQuint", [0.86, 0, 0.07, 1]], + ["easeInExpo", [0.95, 0.05, 0.795, 0.035]], + ["easeOutExpo", [0.19, 1, 0.22, 1]], + ["easeInOutExpo", [1, 0, 0, 1]], + ["easeInCirc", [0.6, 0.04, 0.98, 0.335]], + ["easeOutCirc", [0.075, 0.82, 0.165, 1]], + ["easeInOutCirc", [0.785, 0.135, 0.15, 0.86]] + ], + function(i, easingArray) { + Velocity.Easings[easingArray[0]] = generateBezier.apply(null, easingArray[1]); + } + ); + function getEasing(value, duration) { + var easing = value; + if (Type.isString(value)) { + if (!Velocity.Easings[value]) { + easing = false; + } + } else if (Type.isArray(value) && value.length === 1) { + easing = generateStep.apply(null, value); + } else if (Type.isArray(value) && value.length === 2) { + easing = generateSpringRK4.apply(null, value.concat([duration])); + } else if (Type.isArray(value) && value.length === 4) { + easing = generateBezier.apply(null, value); + } else { + easing = false; + } + if (easing === false) { + if (Velocity.Easings[Velocity.defaults.easing]) { + easing = Velocity.defaults.easing; + } else { + easing = EASING_DEFAULT; + } + } + return easing; + } + var CSS = Velocity.CSS = { + /************* + RegEx + *************/ + RegEx: { + isHex: /^#([A-f\d]{3}){1,2}$/i, + /* Unwrap a property value's surrounding text, e.g. "rgba(4, 3, 2, 1)" ==> "4, 3, 2, 1" and "rect(4px 3px 2px 1px)" ==> "4px 3px 2px 1px". */ + valueUnwrap: /^[A-z]+\((.*)\)$/i, + wrappedValueAlreadyExtracted: /[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/, + /* Split a multi-value property into an array of subvalues, e.g. "rgba(4, 3, 2, 1) 4px 3px 2px 1px" ==> [ "rgba(4, 3, 2, 1)", "4px", "3px", "2px", "1px" ]. */ + valueSplit: /([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/ig + }, + /************ + Lists + ************/ + Lists: { + colors: ["fill", "stroke", "stopColor", "color", "backgroundColor", "borderColor", "borderTopColor", "borderRightColor", "borderBottomColor", "borderLeftColor", "outlineColor"], + transformsBase: ["translateX", "translateY", "scale", "scaleX", "scaleY", "skewX", "skewY", "rotateZ"], + transforms3D: ["transformPerspective", "translateZ", "scaleZ", "rotateX", "rotateY"], + units: [ + "%", + // relative + "em", + "ex", + "ch", + "rem", + // font relative + "vw", + "vh", + "vmin", + "vmax", + // viewport relative + "cm", + "mm", + "Q", + "in", + "pc", + "pt", + "px", + // absolute lengths + "deg", + "grad", + "rad", + "turn", + // angles + "s", + "ms" + // time + ], + colorNames: { + "aliceblue": "240,248,255", + "antiquewhite": "250,235,215", + "aquamarine": "127,255,212", + "aqua": "0,255,255", + "azure": "240,255,255", + "beige": "245,245,220", + "bisque": "255,228,196", + "black": "0,0,0", + "blanchedalmond": "255,235,205", + "blueviolet": "138,43,226", + "blue": "0,0,255", + "brown": "165,42,42", + "burlywood": "222,184,135", + "cadetblue": "95,158,160", + "chartreuse": "127,255,0", + "chocolate": "210,105,30", + "coral": "255,127,80", + "cornflowerblue": "100,149,237", + "cornsilk": "255,248,220", + "crimson": "220,20,60", + "cyan": "0,255,255", + "darkblue": "0,0,139", + "darkcyan": "0,139,139", + "darkgoldenrod": "184,134,11", + "darkgray": "169,169,169", + "darkgrey": "169,169,169", + "darkgreen": "0,100,0", + "darkkhaki": "189,183,107", + "darkmagenta": "139,0,139", + "darkolivegreen": "85,107,47", + "darkorange": "255,140,0", + "darkorchid": "153,50,204", + "darkred": "139,0,0", + "darksalmon": "233,150,122", + "darkseagreen": "143,188,143", + "darkslateblue": "72,61,139", + "darkslategray": "47,79,79", + "darkturquoise": "0,206,209", + "darkviolet": "148,0,211", + "deeppink": "255,20,147", + "deepskyblue": "0,191,255", + "dimgray": "105,105,105", + "dimgrey": "105,105,105", + "dodgerblue": "30,144,255", + "firebrick": "178,34,34", + "floralwhite": "255,250,240", + "forestgreen": "34,139,34", + "fuchsia": "255,0,255", + "gainsboro": "220,220,220", + "ghostwhite": "248,248,255", + "gold": "255,215,0", + "goldenrod": "218,165,32", + "gray": "128,128,128", + "grey": "128,128,128", + "greenyellow": "173,255,47", + "green": "0,128,0", + "honeydew": "240,255,240", + "hotpink": "255,105,180", + "indianred": "205,92,92", + "indigo": "75,0,130", + "ivory": "255,255,240", + "khaki": "240,230,140", + "lavenderblush": "255,240,245", + "lavender": "230,230,250", + "lawngreen": "124,252,0", + "lemonchiffon": "255,250,205", + "lightblue": "173,216,230", + "lightcoral": "240,128,128", + "lightcyan": "224,255,255", + "lightgoldenrodyellow": "250,250,210", + "lightgray": "211,211,211", + "lightgrey": "211,211,211", + "lightgreen": "144,238,144", + "lightpink": "255,182,193", + "lightsalmon": "255,160,122", + "lightseagreen": "32,178,170", + "lightskyblue": "135,206,250", + "lightslategray": "119,136,153", + "lightsteelblue": "176,196,222", + "lightyellow": "255,255,224", + "limegreen": "50,205,50", + "lime": "0,255,0", + "linen": "250,240,230", + "magenta": "255,0,255", + "maroon": "128,0,0", + "mediumaquamarine": "102,205,170", + "mediumblue": "0,0,205", + "mediumorchid": "186,85,211", + "mediumpurple": "147,112,219", + "mediumseagreen": "60,179,113", + "mediumslateblue": "123,104,238", + "mediumspringgreen": "0,250,154", + "mediumturquoise": "72,209,204", + "mediumvioletred": "199,21,133", + "midnightblue": "25,25,112", + "mintcream": "245,255,250", + "mistyrose": "255,228,225", + "moccasin": "255,228,181", + "navajowhite": "255,222,173", + "navy": "0,0,128", + "oldlace": "253,245,230", + "olivedrab": "107,142,35", + "olive": "128,128,0", + "orangered": "255,69,0", + "orange": "255,165,0", + "orchid": "218,112,214", + "palegoldenrod": "238,232,170", + "palegreen": "152,251,152", + "paleturquoise": "175,238,238", + "palevioletred": "219,112,147", + "papayawhip": "255,239,213", + "peachpuff": "255,218,185", + "peru": "205,133,63", + "pink": "255,192,203", + "plum": "221,160,221", + "powderblue": "176,224,230", + "purple": "128,0,128", + "red": "255,0,0", + "rosybrown": "188,143,143", + "royalblue": "65,105,225", + "saddlebrown": "139,69,19", + "salmon": "250,128,114", + "sandybrown": "244,164,96", + "seagreen": "46,139,87", + "seashell": "255,245,238", + "sienna": "160,82,45", + "silver": "192,192,192", + "skyblue": "135,206,235", + "slateblue": "106,90,205", + "slategray": "112,128,144", + "snow": "255,250,250", + "springgreen": "0,255,127", + "steelblue": "70,130,180", + "tan": "210,180,140", + "teal": "0,128,128", + "thistle": "216,191,216", + "tomato": "255,99,71", + "turquoise": "64,224,208", + "violet": "238,130,238", + "wheat": "245,222,179", + "whitesmoke": "245,245,245", + "white": "255,255,255", + "yellowgreen": "154,205,50", + "yellow": "255,255,0" + } + }, + /************ + Hooks + ************/ + /* Hooks allow a subproperty (e.g. "boxShadowBlur") of a compound-value CSS property + (e.g. "boxShadow: X Y Blur Spread Color") to be animated as if it were a discrete property. */ + /* Note: Beyond enabling fine-grained property animation, hooking is necessary since Velocity only + tweens properties with single numeric values; unlike CSS transitions, Velocity does not interpolate compound-values. */ + Hooks: { + /******************** + Registration + ********************/ + /* Templates are a concise way of indicating which subproperties must be individually registered for each compound-value CSS property. */ + /* Each template consists of the compound-value's base name, its constituent subproperty names, and those subproperties' default values. */ + templates: { + "textShadow": ["Color X Y Blur", "black 0px 0px 0px"], + "boxShadow": ["Color X Y Blur Spread", "black 0px 0px 0px 0px"], + "clip": ["Top Right Bottom Left", "0px 0px 0px 0px"], + "backgroundPosition": ["X Y", "0% 0%"], + "transformOrigin": ["X Y Z", "50% 50% 0px"], + "perspectiveOrigin": ["X Y", "50% 50%"] + }, + /* A "registered" hook is one that has been converted from its template form into a live, + tweenable property. It contains data to associate it with its root property. */ + registered: { + /* Note: A registered hook looks like this ==> textShadowBlur: [ "textShadow", 3 ], + which consists of the subproperty's name, the associated root property's name, + and the subproperty's position in the root's value. */ + }, + /* Convert the templates into individual hooks then append them to the registered object above. */ + register: function() { + for (var i = 0; i < CSS.Lists.colors.length; i++) { + var rgbComponents = CSS.Lists.colors[i] === "color" ? "0 0 0 1" : "255 255 255 1"; + CSS.Hooks.templates[CSS.Lists.colors[i]] = ["Red Green Blue Alpha", rgbComponents]; + } + var rootProperty, hookTemplate, hookNames; + if (IE) { + for (rootProperty in CSS.Hooks.templates) { + if (!CSS.Hooks.templates.hasOwnProperty(rootProperty)) { + continue; + } + hookTemplate = CSS.Hooks.templates[rootProperty]; + hookNames = hookTemplate[0].split(" "); + var defaultValues = hookTemplate[1].match(CSS.RegEx.valueSplit); + if (hookNames[0] === "Color") { + hookNames.push(hookNames.shift()); + defaultValues.push(defaultValues.shift()); + CSS.Hooks.templates[rootProperty] = [hookNames.join(" "), defaultValues.join(" ")]; + } + } + } + for (rootProperty in CSS.Hooks.templates) { + if (!CSS.Hooks.templates.hasOwnProperty(rootProperty)) { + continue; + } + hookTemplate = CSS.Hooks.templates[rootProperty]; + hookNames = hookTemplate[0].split(" "); + for (var j in hookNames) { + if (!hookNames.hasOwnProperty(j)) { + continue; + } + var fullHookName = rootProperty + hookNames[j], hookPosition = j; + CSS.Hooks.registered[fullHookName] = [rootProperty, hookPosition]; + } + } + }, + /***************************** + Injection and Extraction + *****************************/ + /* Look up the root property associated with the hook (e.g. return "textShadow" for "textShadowBlur"). */ + /* Since a hook cannot be set directly (the browser won't recognize it), style updating for hooks is routed through the hook's root property. */ + getRoot: function(property) { + var hookData = CSS.Hooks.registered[property]; + if (hookData) { + return hookData[0]; + } else { + return property; + } + }, + getUnit: function(str, start) { + var unit = (str.substr(start || 0, 5).match(/^[a-z%]+/) || [])[0] || ""; + if (unit && _inArray(CSS.Lists.units)) { + return unit; + } + return ""; + }, + fixColors: function(str) { + return str.replace(/(rgba?\(\s*)?(\b[a-z]+\b)/g, function($0, $1, $22) { + if (CSS.Lists.colorNames.hasOwnProperty($22)) { + return ($1 ? $1 : "rgba(") + CSS.Lists.colorNames[$22] + ($1 ? "" : ",1)"); + } + return $1 + $22; + }); + }, + /* Convert any rootPropertyValue, null or otherwise, into a space-delimited list of hook values so that + the targeted hook can be injected or extracted at its standard position. */ + cleanRootPropertyValue: function(rootProperty, rootPropertyValue) { + if (CSS.RegEx.valueUnwrap.test(rootPropertyValue)) { + rootPropertyValue = rootPropertyValue.match(CSS.RegEx.valueUnwrap)[1]; + } + if (CSS.Values.isCSSNullValue(rootPropertyValue)) { + rootPropertyValue = CSS.Hooks.templates[rootProperty][1]; + } + return rootPropertyValue; + }, + /* Extracted the hook's value from its root property's value. This is used to get the starting value of an animating hook. */ + extractValue: function(fullHookName, rootPropertyValue) { + var hookData = CSS.Hooks.registered[fullHookName]; + if (hookData) { + var hookRoot = hookData[0], hookPosition = hookData[1]; + rootPropertyValue = CSS.Hooks.cleanRootPropertyValue(hookRoot, rootPropertyValue); + return rootPropertyValue.toString().match(CSS.RegEx.valueSplit)[hookPosition]; + } else { + return rootPropertyValue; + } + }, + /* Inject the hook's value into its root property's value. This is used to piece back together the root property + once Velocity has updated one of its individually hooked values through tweening. */ + injectValue: function(fullHookName, hookValue, rootPropertyValue) { + var hookData = CSS.Hooks.registered[fullHookName]; + if (hookData) { + var hookRoot = hookData[0], hookPosition = hookData[1], rootPropertyValueParts, rootPropertyValueUpdated; + rootPropertyValue = CSS.Hooks.cleanRootPropertyValue(hookRoot, rootPropertyValue); + rootPropertyValueParts = rootPropertyValue.toString().match(CSS.RegEx.valueSplit); + rootPropertyValueParts[hookPosition] = hookValue; + rootPropertyValueUpdated = rootPropertyValueParts.join(" "); + return rootPropertyValueUpdated; + } else { + return rootPropertyValue; + } + } + }, + /******************* + Normalizations + *******************/ + /* Normalizations standardize CSS property manipulation by pollyfilling browser-specific implementations (e.g. opacity) + and reformatting special properties (e.g. clip, rgba) to look like standard ones. */ + Normalizations: { + /* Normalizations are passed a normalization target (either the property's name, its extracted value, or its injected value), + the targeted element (which may need to be queried), and the targeted property value. */ + registered: { + clip: function(type, element, propertyValue) { + switch (type) { + case "name": + return "clip"; + case "extract": + var extracted; + if (CSS.RegEx.wrappedValueAlreadyExtracted.test(propertyValue)) { + extracted = propertyValue; + } else { + extracted = propertyValue.toString().match(CSS.RegEx.valueUnwrap); + extracted = extracted ? extracted[1].replace(/,(\s+)?/g, " ") : propertyValue; + } + return extracted; + case "inject": + return "rect(" + propertyValue + ")"; + } + }, + blur: function(type, element, propertyValue) { + switch (type) { + case "name": + return Velocity.State.isFirefox ? "filter" : "-webkit-filter"; + case "extract": + var extracted = parseFloat(propertyValue); + if (!(extracted || extracted === 0)) { + var blurComponent = propertyValue.toString().match(/blur\(([0-9]+[A-z]+)\)/i); + if (blurComponent) { + extracted = blurComponent[1]; + } else { + extracted = 0; + } + } + return extracted; + case "inject": + if (!parseFloat(propertyValue)) { + return "none"; + } else { + return "blur(" + propertyValue + ")"; + } + } + }, + /* <=IE8 do not support the standard opacity property. They use filter:alpha(opacity=INT) instead. */ + opacity: function(type, element, propertyValue) { + if (IE <= 8) { + switch (type) { + case "name": + return "filter"; + case "extract": + var extracted = propertyValue.toString().match(/alpha\(opacity=(.*)\)/i); + if (extracted) { + propertyValue = extracted[1] / 100; + } else { + propertyValue = 1; + } + return propertyValue; + case "inject": + element.style.zoom = 1; + if (parseFloat(propertyValue) >= 1) { + return ""; + } else { + return "alpha(opacity=" + parseInt(parseFloat(propertyValue) * 100, 10) + ")"; + } + } + } else { + switch (type) { + case "name": + return "opacity"; + case "extract": + return propertyValue; + case "inject": + return propertyValue; + } + } + } + }, + /***************************** + Batched Registrations + *****************************/ + /* Note: Batched normalizations extend the CSS.Normalizations.registered object. */ + register: function() { + if ((!IE || IE > 9) && !Velocity.State.isGingerbread) { + CSS.Lists.transformsBase = CSS.Lists.transformsBase.concat(CSS.Lists.transforms3D); + } + for (var i = 0; i < CSS.Lists.transformsBase.length; i++) { + (function() { + var transformName = CSS.Lists.transformsBase[i]; + CSS.Normalizations.registered[transformName] = function(type, element, propertyValue) { + switch (type) { + case "name": + return "transform"; + case "extract": + if (Data(element) === undefined$1 || Data(element).transformCache[transformName] === undefined$1) { + return /^scale/i.test(transformName) ? 1 : 0; + } + return Data(element).transformCache[transformName].replace(/[()]/g, ""); + case "inject": + var invalid = false; + switch (transformName.substr(0, transformName.length - 1)) { + case "translate": + invalid = !/(%|px|em|rem|vw|vh|\d)$/i.test(propertyValue); + break; + case "scal": + case "scale": + if (Velocity.State.isAndroid && Data(element).transformCache[transformName] === undefined$1 && propertyValue < 1) { + propertyValue = 1; + } + invalid = !/(\d)$/i.test(propertyValue); + break; + case "skew": + invalid = !/(deg|\d)$/i.test(propertyValue); + break; + case "rotate": + invalid = !/(deg|\d)$/i.test(propertyValue); + break; + } + if (!invalid) { + Data(element).transformCache[transformName] = "(" + propertyValue + ")"; + } + return Data(element).transformCache[transformName]; + } + }; + })(); + } + for (var j = 0; j < CSS.Lists.colors.length; j++) { + (function() { + var colorName = CSS.Lists.colors[j]; + CSS.Normalizations.registered[colorName] = function(type, element, propertyValue) { + switch (type) { + case "name": + return colorName; + case "extract": + var extracted; + if (CSS.RegEx.wrappedValueAlreadyExtracted.test(propertyValue)) { + extracted = propertyValue; + } else { + var converted, colorNames = { + black: "rgb(0, 0, 0)", + blue: "rgb(0, 0, 255)", + gray: "rgb(128, 128, 128)", + green: "rgb(0, 128, 0)", + red: "rgb(255, 0, 0)", + white: "rgb(255, 255, 255)" + }; + if (/^[A-z]+$/i.test(propertyValue)) { + if (colorNames[propertyValue] !== undefined$1) { + converted = colorNames[propertyValue]; + } else { + converted = colorNames.black; + } + } else if (CSS.RegEx.isHex.test(propertyValue)) { + converted = "rgb(" + CSS.Values.hexToRgb(propertyValue).join(" ") + ")"; + } else if (!/^rgba?\(/i.test(propertyValue)) { + converted = colorNames.black; + } + extracted = (converted || propertyValue).toString().match(CSS.RegEx.valueUnwrap)[1].replace(/,(\s+)?/g, " "); + } + if ((!IE || IE > 8) && extracted.split(" ").length === 3) { + extracted += " 1"; + } + return extracted; + case "inject": + if (/^rgb/.test(propertyValue)) { + return propertyValue; + } + if (IE <= 8) { + if (propertyValue.split(" ").length === 4) { + propertyValue = propertyValue.split(/\s+/).slice(0, 3).join(" "); + } + } else if (propertyValue.split(" ").length === 3) { + propertyValue += " 1"; + } + return (IE <= 8 ? "rgb" : "rgba") + "(" + propertyValue.replace(/\s+/g, ",").replace(/\.(\d)+(?=,)/g, "") + ")"; + } + }; + })(); + } + function augmentDimension(name, element, wantInner) { + var isBorderBox = CSS.getPropertyValue(element, "boxSizing").toString().toLowerCase() === "border-box"; + if (isBorderBox === (wantInner || false)) { + var i2, value, augment = 0, sides = name === "width" ? ["Left", "Right"] : ["Top", "Bottom"], fields = ["padding" + sides[0], "padding" + sides[1], "border" + sides[0] + "Width", "border" + sides[1] + "Width"]; + for (i2 = 0; i2 < fields.length; i2++) { + value = parseFloat(CSS.getPropertyValue(element, fields[i2])); + if (!isNaN(value)) { + augment += value; + } + } + return wantInner ? -augment : augment; + } + return 0; + } + function getDimension(name, wantInner) { + return function(type, element, propertyValue) { + switch (type) { + case "name": + return name; + case "extract": + return parseFloat(propertyValue) + augmentDimension(name, element, wantInner); + case "inject": + return parseFloat(propertyValue) - augmentDimension(name, element, wantInner) + "px"; + } + }; + } + CSS.Normalizations.registered.innerWidth = getDimension("width", true); + CSS.Normalizations.registered.innerHeight = getDimension("height", true); + CSS.Normalizations.registered.outerWidth = getDimension("width"); + CSS.Normalizations.registered.outerHeight = getDimension("height"); + } + }, + /************************ + CSS Property Names + ************************/ + Names: { + /* Camelcase a property name into its JavaScript notation (e.g. "background-color" ==> "backgroundColor"). + Camelcasing is used to normalize property names between and across calls. */ + camelCase: function(property) { + return property.replace(/-(\w)/g, function(match, subMatch) { + return subMatch.toUpperCase(); + }); + }, + /* For SVG elements, some properties (namely, dimensional ones) are GET/SET via the element's HTML attributes (instead of via CSS styles). */ + SVGAttribute: function(property) { + var SVGAttributes = "width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2"; + if (IE || Velocity.State.isAndroid && !Velocity.State.isChrome) { + SVGAttributes += "|transform"; + } + return new RegExp("^(" + SVGAttributes + ")$", "i").test(property); + }, + /* Determine whether a property should be set with a vendor prefix. */ + /* If a prefixed version of the property exists, return it. Otherwise, return the original property name. + If the property is not at all supported by the browser, return a false flag. */ + prefixCheck: function(property) { + if (Velocity.State.prefixMatches[property]) { + return [Velocity.State.prefixMatches[property], true]; + } else { + var vendors = ["", "Webkit", "Moz", "ms", "O"]; + for (var i = 0, vendorsLength = vendors.length; i < vendorsLength; i++) { + var propertyPrefixed; + if (i === 0) { + propertyPrefixed = property; + } else { + propertyPrefixed = vendors[i] + property.replace(/^\w/, function(match) { + return match.toUpperCase(); + }); + } + if (Type.isString(Velocity.State.prefixElement.style[propertyPrefixed])) { + Velocity.State.prefixMatches[property] = propertyPrefixed; + return [propertyPrefixed, true]; + } + } + return [property, false]; + } + } + }, + /************************ + CSS Property Values + ************************/ + Values: { + /* Hex to RGB conversion. Copyright Tim Down: http://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb */ + hexToRgb: function(hex) { + var shortformRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i, longformRegex = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i, rgbParts; + hex = hex.replace(shortformRegex, function(m, r, g, b) { + return r + r + g + g + b + b; + }); + rgbParts = longformRegex.exec(hex); + return rgbParts ? [parseInt(rgbParts[1], 16), parseInt(rgbParts[2], 16), parseInt(rgbParts[3], 16)] : [0, 0, 0]; + }, + isCSSNullValue: function(value) { + return !value || /^(none|auto|transparent|(rgba\(0, ?0, ?0, ?0\)))$/i.test(value); + }, + /* Retrieve a property's default unit type. Used for assigning a unit type when one is not supplied by the user. */ + getUnitType: function(property) { + if (/^(rotate|skew)/i.test(property)) { + return "deg"; + } else if (/(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(property)) { + return ""; + } else { + return "px"; + } + }, + /* HTML elements default to an associated display type when they're not set to display:none. */ + /* Note: This function is used for correctly setting the non-"none" display value in certain Velocity redirects, such as fadeIn/Out. */ + getDisplayType: function(element) { + var tagName = element && element.tagName.toString().toLowerCase(); + if (/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(tagName)) { + return "inline"; + } else if (/^(li)$/i.test(tagName)) { + return "list-item"; + } else if (/^(tr)$/i.test(tagName)) { + return "table-row"; + } else if (/^(table)$/i.test(tagName)) { + return "table"; + } else if (/^(tbody)$/i.test(tagName)) { + return "table-row-group"; + } else { + return "block"; + } + }, + /* The class add/remove functions are used to temporarily apply a "velocity-animating" class to elements while they're animating. */ + addClass: function(element, className) { + if (element) { + if (element.classList) { + element.classList.add(className); + } else if (Type.isString(element.className)) { + element.className += (element.className.length ? " " : "") + className; + } else { + var currentClass = element.getAttribute(IE <= 7 ? "className" : "class") || ""; + element.setAttribute("class", currentClass + (currentClass ? " " : "") + className); + } + } + }, + removeClass: function(element, className) { + if (element) { + if (element.classList) { + element.classList.remove(className); + } else if (Type.isString(element.className)) { + element.className = element.className.toString().replace(new RegExp("(^|\\s)" + className.split(" ").join("|") + "(\\s|$)", "gi"), " "); + } else { + var currentClass = element.getAttribute(IE <= 7 ? "className" : "class") || ""; + element.setAttribute("class", currentClass.replace(new RegExp("(^|s)" + className.split(" ").join("|") + "(s|$)", "gi"), " ")); + } + } + } + }, + /**************************** + Style Getting & Setting + ****************************/ + /* The singular getPropertyValue, which routes the logic for all normalizations, hooks, and standard CSS properties. */ + getPropertyValue: function(element, property, rootPropertyValue, forceStyleLookup) { + function computePropertyValue(element2, property2) { + var computedValue = 0; + if (IE <= 8) { + computedValue = $2.css(element2, property2); + } else { + var toggleDisplay = false; + if (/^(width|height)$/.test(property2) && CSS.getPropertyValue(element2, "display") === 0) { + toggleDisplay = true; + CSS.setPropertyValue(element2, "display", CSS.Values.getDisplayType(element2)); + } + var revertDisplay = function() { + if (toggleDisplay) { + CSS.setPropertyValue(element2, "display", "none"); + } + }; + if (!forceStyleLookup) { + if (property2 === "height" && CSS.getPropertyValue(element2, "boxSizing").toString().toLowerCase() !== "border-box") { + var contentBoxHeight = element2.offsetHeight - (parseFloat(CSS.getPropertyValue(element2, "borderTopWidth")) || 0) - (parseFloat(CSS.getPropertyValue(element2, "borderBottomWidth")) || 0) - (parseFloat(CSS.getPropertyValue(element2, "paddingTop")) || 0) - (parseFloat(CSS.getPropertyValue(element2, "paddingBottom")) || 0); + revertDisplay(); + return contentBoxHeight; + } else if (property2 === "width" && CSS.getPropertyValue(element2, "boxSizing").toString().toLowerCase() !== "border-box") { + var contentBoxWidth = element2.offsetWidth - (parseFloat(CSS.getPropertyValue(element2, "borderLeftWidth")) || 0) - (parseFloat(CSS.getPropertyValue(element2, "borderRightWidth")) || 0) - (parseFloat(CSS.getPropertyValue(element2, "paddingLeft")) || 0) - (parseFloat(CSS.getPropertyValue(element2, "paddingRight")) || 0); + revertDisplay(); + return contentBoxWidth; + } + } + var computedStyle; + if (Data(element2) === undefined$1) { + computedStyle = window2.getComputedStyle(element2, null); + } else if (!Data(element2).computedStyle) { + computedStyle = Data(element2).computedStyle = window2.getComputedStyle(element2, null); + } else { + computedStyle = Data(element2).computedStyle; + } + if (property2 === "borderColor") { + property2 = "borderTopColor"; + } + if (IE === 9 && property2 === "filter") { + computedValue = computedStyle.getPropertyValue(property2); + } else { + computedValue = computedStyle[property2]; + } + if (computedValue === "" || computedValue === null) { + computedValue = element2.style[property2]; + } + revertDisplay(); + } + if (computedValue === "auto" && /^(top|right|bottom|left)$/i.test(property2)) { + var position = computePropertyValue(element2, "position"); + if (position === "fixed" || position === "absolute" && /top|left/i.test(property2)) { + computedValue = $2(element2).position()[property2] + "px"; + } + } + return computedValue; + } + var propertyValue; + if (CSS.Hooks.registered[property]) { + var hook = property, hookRoot = CSS.Hooks.getRoot(hook); + if (rootPropertyValue === undefined$1) { + rootPropertyValue = CSS.getPropertyValue(element, CSS.Names.prefixCheck(hookRoot)[0]); + } + if (CSS.Normalizations.registered[hookRoot]) { + rootPropertyValue = CSS.Normalizations.registered[hookRoot]("extract", element, rootPropertyValue); + } + propertyValue = CSS.Hooks.extractValue(hook, rootPropertyValue); + } else if (CSS.Normalizations.registered[property]) { + var normalizedPropertyName, normalizedPropertyValue; + normalizedPropertyName = CSS.Normalizations.registered[property]("name", element); + if (normalizedPropertyName !== "transform") { + normalizedPropertyValue = computePropertyValue(element, CSS.Names.prefixCheck(normalizedPropertyName)[0]); + if (CSS.Values.isCSSNullValue(normalizedPropertyValue) && CSS.Hooks.templates[property]) { + normalizedPropertyValue = CSS.Hooks.templates[property][1]; + } + } + propertyValue = CSS.Normalizations.registered[property]("extract", element, normalizedPropertyValue); + } + if (!/^[\d-]/.test(propertyValue)) { + var data = Data(element); + if (data && data.isSVG && CSS.Names.SVGAttribute(property)) { + if (/^(height|width)$/i.test(property)) { + try { + propertyValue = element.getBBox()[property]; + } catch (error) { + propertyValue = 0; + } + } else { + propertyValue = element.getAttribute(property); + } + } else { + propertyValue = computePropertyValue(element, CSS.Names.prefixCheck(property)[0]); + } + } + if (CSS.Values.isCSSNullValue(propertyValue)) { + propertyValue = 0; + } + if (Velocity.debug >= 2) { + console.log("Get " + property + ": " + propertyValue); + } + return propertyValue; + }, + /* The singular setPropertyValue, which routes the logic for all normalizations, hooks, and standard CSS properties. */ + setPropertyValue: function(element, property, propertyValue, rootPropertyValue, scrollData) { + var propertyName = property; + if (property === "scroll") { + if (scrollData.container) { + scrollData.container["scroll" + scrollData.direction] = propertyValue; + } else { + if (scrollData.direction === "Left") { + window2.scrollTo(propertyValue, scrollData.alternateValue); + } else { + window2.scrollTo(scrollData.alternateValue, propertyValue); + } + } + } else { + if (CSS.Normalizations.registered[property] && CSS.Normalizations.registered[property]("name", element) === "transform") { + CSS.Normalizations.registered[property]("inject", element, propertyValue); + propertyName = "transform"; + propertyValue = Data(element).transformCache[property]; + } else { + if (CSS.Hooks.registered[property]) { + var hookName = property, hookRoot = CSS.Hooks.getRoot(property); + rootPropertyValue = rootPropertyValue || CSS.getPropertyValue(element, hookRoot); + propertyValue = CSS.Hooks.injectValue(hookName, propertyValue, rootPropertyValue); + property = hookRoot; + } + if (CSS.Normalizations.registered[property]) { + propertyValue = CSS.Normalizations.registered[property]("inject", element, propertyValue); + property = CSS.Normalizations.registered[property]("name", element); + } + propertyName = CSS.Names.prefixCheck(property)[0]; + if (IE <= 8) { + try { + element.style[propertyName] = propertyValue; + } catch (error) { + if (Velocity.debug) { + console.log("Browser does not support [" + propertyValue + "] for [" + propertyName + "]"); + } + } + } else { + var data = Data(element); + if (data && data.isSVG && CSS.Names.SVGAttribute(property)) { + element.setAttribute(property, propertyValue); + } else { + element.style[propertyName] = propertyValue; + } + } + if (Velocity.debug >= 2) { + console.log("Set " + property + " (" + propertyName + "): " + propertyValue); + } + } + } + return [propertyName, propertyValue]; + }, + /* To increase performance by batching transform updates into a single SET, transforms are not directly applied to an element until flushTransformCache() is called. */ + /* Note: Velocity applies transform properties in the same order that they are chronogically introduced to the element's CSS styles. */ + flushTransformCache: function(element) { + var transformString = "", data = Data(element); + if ((IE || Velocity.State.isAndroid && !Velocity.State.isChrome) && data && data.isSVG) { + var getTransformFloat = function(transformProperty) { + return parseFloat(CSS.getPropertyValue(element, transformProperty)); + }; + var SVGTransforms = { + translate: [getTransformFloat("translateX"), getTransformFloat("translateY")], + skewX: [getTransformFloat("skewX")], + skewY: [getTransformFloat("skewY")], + /* If the scale property is set (non-1), use that value for the scaleX and scaleY values + (this behavior mimics the result of animating all these properties at once on HTML elements). */ + scale: getTransformFloat("scale") !== 1 ? [getTransformFloat("scale"), getTransformFloat("scale")] : [getTransformFloat("scaleX"), getTransformFloat("scaleY")], + /* Note: SVG's rotate transform takes three values: rotation degrees followed by the X and Y values + defining the rotation's origin point. We ignore the origin values (default them to 0). */ + rotate: [getTransformFloat("rotateZ"), 0, 0] + }; + $2.each(Data(element).transformCache, function(transformName) { + if (/^translate/i.test(transformName)) { + transformName = "translate"; + } else if (/^scale/i.test(transformName)) { + transformName = "scale"; + } else if (/^rotate/i.test(transformName)) { + transformName = "rotate"; + } + if (SVGTransforms[transformName]) { + transformString += transformName + "(" + SVGTransforms[transformName].join(" ") + ") "; + delete SVGTransforms[transformName]; + } + }); + } else { + var transformValue, perspective; + $2.each(Data(element).transformCache, function(transformName) { + transformValue = Data(element).transformCache[transformName]; + if (transformName === "transformPerspective") { + perspective = transformValue; + return true; + } + if (IE === 9 && transformName === "rotateZ") { + transformName = "rotate"; + } + transformString += transformName + transformValue + " "; + }); + if (perspective) { + transformString = "perspective" + perspective + " " + transformString; + } + } + CSS.setPropertyValue(element, "transform", transformString); + } + }; + CSS.Hooks.register(); + CSS.Normalizations.register(); + Velocity.hook = function(elements, arg2, arg3) { + var value; + elements = sanitizeElements(elements); + $2.each(elements, function(i, element) { + if (Data(element) === undefined$1) { + Velocity.init(element); + } + if (arg3 === undefined$1) { + if (value === undefined$1) { + value = CSS.getPropertyValue(element, arg2); + } + } else { + var adjustedSet = CSS.setPropertyValue(element, arg2, arg3); + if (adjustedSet[0] === "transform") { + Velocity.CSS.flushTransformCache(element); + } + value = adjustedSet; + } + }); + return value; + }; + var animate = function() { + var opts; + function getChain() { + if (isUtility) { + return promiseData.promise || null; + } else { + return elementsWrapped; + } + } + var syntacticSugar = arguments[0] && (arguments[0].p || ($2.isPlainObject(arguments[0].properties) && !arguments[0].properties.names || Type.isString(arguments[0].properties))), isUtility, elementsWrapped, argumentIndex; + var elements, propertiesMap, options; + if (Type.isWrapped(this)) { + isUtility = false; + argumentIndex = 0; + elements = this; + elementsWrapped = this; + } else { + isUtility = true; + argumentIndex = 1; + elements = syntacticSugar ? arguments[0].elements || arguments[0].e : arguments[0]; + } + var promiseData = { + promise: null, + resolver: null, + rejecter: null + }; + if (isUtility && Velocity.Promise) { + promiseData.promise = new Velocity.Promise(function(resolve, reject) { + promiseData.resolver = resolve; + promiseData.rejecter = reject; + }); + } + if (syntacticSugar) { + propertiesMap = arguments[0].properties || arguments[0].p; + options = arguments[0].options || arguments[0].o; + } else { + propertiesMap = arguments[argumentIndex]; + options = arguments[argumentIndex + 1]; + } + elements = sanitizeElements(elements); + if (!elements) { + if (promiseData.promise) { + if (!propertiesMap || !options || options.promiseRejectEmpty !== false) { + promiseData.rejecter(); + } else { + promiseData.resolver(); + } + } + return; + } + var elementsLength = elements.length, elementsIndex = 0; + if (!/^(stop|finish|finishAll|pause|resume)$/i.test(propertiesMap) && !$2.isPlainObject(options)) { + var startingArgumentPosition = argumentIndex + 1; + options = {}; + for (var i = startingArgumentPosition; i < arguments.length; i++) { + if (!Type.isArray(arguments[i]) && (/^(fast|normal|slow)$/i.test(arguments[i]) || /^\d/.test(arguments[i]))) { + options.duration = arguments[i]; + } else if (Type.isString(arguments[i]) || Type.isArray(arguments[i])) { + options.easing = arguments[i]; + } else if (Type.isFunction(arguments[i])) { + options.complete = arguments[i]; + } + } + } + var action; + switch (propertiesMap) { + case "scroll": + action = "scroll"; + break; + case "reverse": + action = "reverse"; + break; + case "pause": + var currentTime = (/* @__PURE__ */ new Date()).getTime(); + $2.each(elements, function(i2, element) { + pauseDelayOnElement(element, currentTime); + }); + $2.each(Velocity.State.calls, function(i2, activeCall) { + var found = false; + if (activeCall) { + $2.each(activeCall[1], function(k, activeElement) { + var queueName = options === undefined$1 ? "" : options; + if (queueName !== true && activeCall[2].queue !== queueName && !(options === undefined$1 && activeCall[2].queue === false)) { + return true; + } + $2.each(elements, function(l, element) { + if (element === activeElement) { + activeCall[5] = { + resume: false + }; + found = true; + return false; + } + }); + if (found) { + return false; + } + }); + } + }); + return getChain(); + case "resume": + $2.each(elements, function(i2, element) { + resumeDelayOnElement(element); + }); + $2.each(Velocity.State.calls, function(i2, activeCall) { + var found = false; + if (activeCall) { + $2.each(activeCall[1], function(k, activeElement) { + var queueName = options === undefined$1 ? "" : options; + if (queueName !== true && activeCall[2].queue !== queueName && !(options === undefined$1 && activeCall[2].queue === false)) { + return true; + } + if (!activeCall[5]) { + return true; + } + $2.each(elements, function(l, element) { + if (element === activeElement) { + activeCall[5].resume = true; + found = true; + return false; + } + }); + if (found) { + return false; + } + }); + } + }); + return getChain(); + case "finish": + case "finishAll": + case "stop": + $2.each(elements, function(i2, element) { + if (Data(element) && Data(element).delayTimer) { + clearTimeout(Data(element).delayTimer.setTimeout); + if (Data(element).delayTimer.next) { + Data(element).delayTimer.next(); + } + delete Data(element).delayTimer; + } + if (propertiesMap === "finishAll" && (options === true || Type.isString(options))) { + $2.each($2.queue(element, Type.isString(options) ? options : ""), function(_, item) { + if (Type.isFunction(item)) { + item(); + } + }); + $2.queue(element, Type.isString(options) ? options : "", []); + } + }); + var callsToStop = []; + $2.each(Velocity.State.calls, function(i2, activeCall) { + if (activeCall) { + $2.each(activeCall[1], function(k, activeElement) { + var queueName = options === undefined$1 ? "" : options; + if (queueName !== true && activeCall[2].queue !== queueName && !(options === undefined$1 && activeCall[2].queue === false)) { + return true; + } + $2.each(elements, function(l, element) { + if (element === activeElement) { + if (options === true || Type.isString(options)) { + $2.each($2.queue(element, Type.isString(options) ? options : ""), function(_, item) { + if (Type.isFunction(item)) { + item(null, true); + } + }); + $2.queue(element, Type.isString(options) ? options : "", []); + } + if (propertiesMap === "stop") { + var data = Data(element); + if (data && data.tweensContainer && (queueName === true || queueName === "")) { + $2.each(data.tweensContainer, function(m, activeTween) { + activeTween.endValue = activeTween.currentValue; + }); + } + callsToStop.push(i2); + } else if (propertiesMap === "finish" || propertiesMap === "finishAll") { + activeCall[2].duration = 1; + } + } + }); + }); + } + }); + if (propertiesMap === "stop") { + $2.each(callsToStop, function(i2, j) { + completeCall(j, true); + }); + if (promiseData.promise) { + promiseData.resolver(elements); + } + } + return getChain(); + default: + if ($2.isPlainObject(propertiesMap) && !Type.isEmptyObject(propertiesMap)) { + action = "start"; + } else if (Type.isString(propertiesMap) && Velocity.Redirects[propertiesMap]) { + opts = $2.extend({}, options); + var durationOriginal = opts.duration, delayOriginal = opts.delay || 0; + if (opts.backwards === true) { + elements = $2.extend(true, [], elements).reverse(); + } + $2.each(elements, function(elementIndex, element) { + if (parseFloat(opts.stagger)) { + opts.delay = delayOriginal + parseFloat(opts.stagger) * elementIndex; + } else if (Type.isFunction(opts.stagger)) { + opts.delay = delayOriginal + opts.stagger.call(element, elementIndex, elementsLength); + } + if (opts.drag) { + opts.duration = parseFloat(durationOriginal) || (/^(callout|transition)/.test(propertiesMap) ? 1e3 : DURATION_DEFAULT); + opts.duration = Math.max(opts.duration * (opts.backwards ? 1 - elementIndex / elementsLength : (elementIndex + 1) / elementsLength), opts.duration * 0.75, 200); + } + Velocity.Redirects[propertiesMap].call(element, element, opts || {}, elementIndex, elementsLength, elements, promiseData.promise ? promiseData : undefined$1); + }); + return getChain(); + } else { + var abortError = "Velocity: First argument (" + propertiesMap + ") was not a property map, a known action, or a registered redirect. Aborting."; + if (promiseData.promise) { + promiseData.rejecter(new Error(abortError)); + } else if (window2.console) { + console.log(abortError); + } + return getChain(); + } + } + var callUnitConversionData = { + lastParent: null, + lastPosition: null, + lastFontSize: null, + lastPercentToPxWidth: null, + lastPercentToPxHeight: null, + lastEmToPx: null, + remToPx: null, + vwToPx: null, + vhToPx: null + }; + var call = []; + function processElement(element, elementArrayIndex) { + var opts2 = $2.extend({}, Velocity.defaults, options), tweensContainer = {}, elementUnitConversionData; + if (Data(element) === undefined$1) { + Velocity.init(element); + } + if (parseFloat(opts2.delay) && opts2.queue !== false) { + $2.queue(element, opts2.queue, function(next, clearQueue) { + if (clearQueue === true) { + return true; + } + Velocity.velocityQueueEntryFlag = true; + var callIndex2 = Velocity.State.delayedElements.count++; + Velocity.State.delayedElements[callIndex2] = element; + var delayComplete2 = function(index) { + return function() { + Velocity.State.delayedElements[index] = false; + next(); + }; + }(callIndex2); + Data(element).delayBegin = (/* @__PURE__ */ new Date()).getTime(); + Data(element).delay = parseFloat(opts2.delay); + Data(element).delayTimer = { + setTimeout: setTimeout(next, parseFloat(opts2.delay)), + next: delayComplete2 + }; + }); + } + switch (opts2.duration.toString().toLowerCase()) { + case "fast": + opts2.duration = 200; + break; + case "normal": + opts2.duration = DURATION_DEFAULT; + break; + case "slow": + opts2.duration = 600; + break; + default: + opts2.duration = parseFloat(opts2.duration) || 1; + } + if (Velocity.mock !== false) { + if (Velocity.mock === true) { + opts2.duration = opts2.delay = 1; + } else { + opts2.duration *= parseFloat(Velocity.mock) || 1; + opts2.delay *= parseFloat(Velocity.mock) || 1; + } + } + opts2.easing = getEasing(opts2.easing, opts2.duration); + if (opts2.begin && !Type.isFunction(opts2.begin)) { + opts2.begin = null; + } + if (opts2.progress && !Type.isFunction(opts2.progress)) { + opts2.progress = null; + } + if (opts2.complete && !Type.isFunction(opts2.complete)) { + opts2.complete = null; + } + if (opts2.display !== undefined$1 && opts2.display !== null) { + opts2.display = opts2.display.toString().toLowerCase(); + if (opts2.display === "auto") { + opts2.display = Velocity.CSS.Values.getDisplayType(element); + } + } + if (opts2.visibility !== undefined$1 && opts2.visibility !== null) { + opts2.visibility = opts2.visibility.toString().toLowerCase(); + } + opts2.mobileHA = opts2.mobileHA && Velocity.State.isMobile && !Velocity.State.isGingerbread; + function buildQueue(next) { + var data, lastTweensContainer; + if (opts2.begin && elementsIndex === 0) { + try { + opts2.begin.call(elements, elements); + } catch (error) { + setTimeout(function() { + throw error; + }, 1); + } + } + if (action === "scroll") { + var scrollDirection = /^x$/i.test(opts2.axis) ? "Left" : "Top", scrollOffset = parseFloat(opts2.offset) || 0, scrollPositionCurrent, scrollPositionCurrentAlternate, scrollPositionEnd; + if (opts2.container) { + if (Type.isWrapped(opts2.container) || Type.isNode(opts2.container)) { + opts2.container = opts2.container[0] || opts2.container; + scrollPositionCurrent = opts2.container["scroll" + scrollDirection]; + scrollPositionEnd = scrollPositionCurrent + $2(element).position()[scrollDirection.toLowerCase()] + scrollOffset; + } else { + opts2.container = null; + } + } else { + scrollPositionCurrent = Velocity.State.scrollAnchor[Velocity.State["scrollProperty" + scrollDirection]]; + scrollPositionCurrentAlternate = Velocity.State.scrollAnchor[Velocity.State["scrollProperty" + (scrollDirection === "Left" ? "Top" : "Left")]]; + scrollPositionEnd = $2(element).offset()[scrollDirection.toLowerCase()] + scrollOffset; + } + tweensContainer = { + scroll: { + rootPropertyValue: false, + startValue: scrollPositionCurrent, + currentValue: scrollPositionCurrent, + endValue: scrollPositionEnd, + unitType: "", + easing: opts2.easing, + scrollData: { + container: opts2.container, + direction: scrollDirection, + alternateValue: scrollPositionCurrentAlternate + } + }, + element + }; + if (Velocity.debug) { + console.log("tweensContainer (scroll): ", tweensContainer.scroll, element); + } + } else if (action === "reverse") { + data = Data(element); + if (!data) { + return; + } + if (!data.tweensContainer) { + $2.dequeue(element, opts2.queue); + return; + } else { + if (data.opts.display === "none") { + data.opts.display = "auto"; + } + if (data.opts.visibility === "hidden") { + data.opts.visibility = "visible"; + } + data.opts.loop = false; + data.opts.begin = null; + data.opts.complete = null; + if (!options.easing) { + delete opts2.easing; + } + if (!options.duration) { + delete opts2.duration; + } + opts2 = $2.extend({}, data.opts, opts2); + lastTweensContainer = $2.extend(true, {}, data ? data.tweensContainer : null); + for (var lastTween in lastTweensContainer) { + if (lastTweensContainer.hasOwnProperty(lastTween) && lastTween !== "element") { + var lastStartValue = lastTweensContainer[lastTween].startValue; + lastTweensContainer[lastTween].startValue = lastTweensContainer[lastTween].currentValue = lastTweensContainer[lastTween].endValue; + lastTweensContainer[lastTween].endValue = lastStartValue; + if (!Type.isEmptyObject(options)) { + lastTweensContainer[lastTween].easing = opts2.easing; + } + if (Velocity.debug) { + console.log("reverse tweensContainer (" + lastTween + "): " + JSON.stringify(lastTweensContainer[lastTween]), element); + } + } + } + tweensContainer = lastTweensContainer; + } + } else if (action === "start") { + data = Data(element); + if (data && data.tweensContainer && data.isAnimating === true) { + lastTweensContainer = data.tweensContainer; + } + var parsePropertyValue = function(valueData2, skipResolvingEasing) { + var endValue2, easing2, startValue2; + if (Type.isFunction(valueData2)) { + valueData2 = valueData2.call(element, elementArrayIndex, elementsLength); + } + if (Type.isArray(valueData2)) { + endValue2 = valueData2[0]; + if (!Type.isArray(valueData2[1]) && /^[\d-]/.test(valueData2[1]) || Type.isFunction(valueData2[1]) || CSS.RegEx.isHex.test(valueData2[1])) { + startValue2 = valueData2[1]; + } else if (Type.isString(valueData2[1]) && !CSS.RegEx.isHex.test(valueData2[1]) && Velocity.Easings[valueData2[1]] || Type.isArray(valueData2[1])) { + easing2 = skipResolvingEasing ? valueData2[1] : getEasing(valueData2[1], opts2.duration); + startValue2 = valueData2[2]; + } else { + startValue2 = valueData2[1] || valueData2[2]; + } + } else { + endValue2 = valueData2; + } + if (!skipResolvingEasing) { + easing2 = easing2 || opts2.easing; + } + if (Type.isFunction(endValue2)) { + endValue2 = endValue2.call(element, elementArrayIndex, elementsLength); + } + if (Type.isFunction(startValue2)) { + startValue2 = startValue2.call(element, elementArrayIndex, elementsLength); + } + return [endValue2 || 0, easing2, startValue2]; + }; + var fixPropertyValue = function(property2, valueData2) { + var rootProperty = CSS.Hooks.getRoot(property2), rootPropertyValue = false, endValue2 = valueData2[0], easing2 = valueData2[1], startValue2 = valueData2[2], pattern; + if ((!data || !data.isSVG) && rootProperty !== "tween" && CSS.Names.prefixCheck(rootProperty)[1] === false && CSS.Normalizations.registered[rootProperty] === undefined$1) { + if (Velocity.debug) { + console.log("Skipping [" + rootProperty + "] due to a lack of browser support."); + } + return; + } + if ((opts2.display !== undefined$1 && opts2.display !== null && opts2.display !== "none" || opts2.visibility !== undefined$1 && opts2.visibility !== "hidden") && /opacity|filter/.test(property2) && !startValue2 && endValue2 !== 0) { + startValue2 = 0; + } + if (opts2._cacheValues && lastTweensContainer && lastTweensContainer[property2]) { + if (startValue2 === undefined$1) { + startValue2 = lastTweensContainer[property2].endValue + lastTweensContainer[property2].unitType; + } + rootPropertyValue = data.rootPropertyValueCache[rootProperty]; + } else { + if (CSS.Hooks.registered[property2]) { + if (startValue2 === undefined$1) { + rootPropertyValue = CSS.getPropertyValue(element, rootProperty); + startValue2 = CSS.getPropertyValue(element, property2, rootPropertyValue); + } else { + rootPropertyValue = CSS.Hooks.templates[rootProperty][1]; + } + } else if (startValue2 === undefined$1) { + startValue2 = CSS.getPropertyValue(element, property2); + } + } + var separatedValue, endValueUnitType, startValueUnitType, operator = false; + var separateValue = function(property3, value) { + var unitType, numericValue; + numericValue = (value || "0").toString().toLowerCase().replace(/[%A-z]+$/, function(match) { + unitType = match; + return ""; + }); + if (!unitType) { + unitType = CSS.Values.getUnitType(property3); + } + return [numericValue, unitType]; + }; + if (startValue2 !== endValue2 && Type.isString(startValue2) && Type.isString(endValue2)) { + pattern = ""; + var iStart = 0, iEnd = 0, aStart = [], aEnd = [], inCalc = 0, inRGB = 0, inRGBA = 0; + startValue2 = CSS.Hooks.fixColors(startValue2); + endValue2 = CSS.Hooks.fixColors(endValue2); + while (iStart < startValue2.length && iEnd < endValue2.length) { + var cStart = startValue2[iStart], cEnd = endValue2[iEnd]; + if (/[\d\.-]/.test(cStart) && /[\d\.-]/.test(cEnd)) { + var tStart = cStart, tEnd = cEnd, dotStart = ".", dotEnd = "."; + while (++iStart < startValue2.length) { + cStart = startValue2[iStart]; + if (cStart === dotStart) { + dotStart = ".."; + } else if (!/\d/.test(cStart)) { + break; + } + tStart += cStart; + } + while (++iEnd < endValue2.length) { + cEnd = endValue2[iEnd]; + if (cEnd === dotEnd) { + dotEnd = ".."; + } else if (!/\d/.test(cEnd)) { + break; + } + tEnd += cEnd; + } + var uStart = CSS.Hooks.getUnit(startValue2, iStart), uEnd = CSS.Hooks.getUnit(endValue2, iEnd); + iStart += uStart.length; + iEnd += uEnd.length; + if (uStart === uEnd) { + if (tStart === tEnd) { + pattern += tStart + uStart; + } else { + pattern += "{" + aStart.length + (inRGB ? "!" : "") + "}" + uStart; + aStart.push(parseFloat(tStart)); + aEnd.push(parseFloat(tEnd)); + } + } else { + var nStart = parseFloat(tStart), nEnd = parseFloat(tEnd); + pattern += (inCalc < 5 ? "calc" : "") + "(" + (nStart ? "{" + aStart.length + (inRGB ? "!" : "") + "}" : "0") + uStart + " + " + (nEnd ? "{" + (aStart.length + (nStart ? 1 : 0)) + (inRGB ? "!" : "") + "}" : "0") + uEnd + ")"; + if (nStart) { + aStart.push(nStart); + aEnd.push(0); + } + if (nEnd) { + aStart.push(0); + aEnd.push(nEnd); + } + } + } else if (cStart === cEnd) { + pattern += cStart; + iStart++; + iEnd++; + if (inCalc === 0 && cStart === "c" || inCalc === 1 && cStart === "a" || inCalc === 2 && cStart === "l" || inCalc === 3 && cStart === "c" || inCalc >= 4 && cStart === "(") { + inCalc++; + } else if (inCalc && inCalc < 5 || inCalc >= 4 && cStart === ")" && --inCalc < 5) { + inCalc = 0; + } + if (inRGB === 0 && cStart === "r" || inRGB === 1 && cStart === "g" || inRGB === 2 && cStart === "b" || inRGB === 3 && cStart === "a" || inRGB >= 3 && cStart === "(") { + if (inRGB === 3 && cStart === "a") { + inRGBA = 1; + } + inRGB++; + } else if (inRGBA && cStart === ",") { + if (++inRGBA > 3) { + inRGB = inRGBA = 0; + } + } else if (inRGBA && inRGB < (inRGBA ? 5 : 4) || inRGB >= (inRGBA ? 4 : 3) && cStart === ")" && --inRGB < (inRGBA ? 5 : 4)) { + inRGB = inRGBA = 0; + } + } else { + inCalc = 0; + break; + } + } + if (iStart !== startValue2.length || iEnd !== endValue2.length) { + if (Velocity.debug) { + console.error('Trying to pattern match mis-matched strings ["' + endValue2 + '", "' + startValue2 + '"]'); + } + pattern = undefined$1; + } + if (pattern) { + if (aStart.length) { + if (Velocity.debug) { + console.log('Pattern found "' + pattern + '" -> ', aStart, aEnd, "[" + startValue2 + "," + endValue2 + "]"); + } + startValue2 = aStart; + endValue2 = aEnd; + endValueUnitType = startValueUnitType = ""; + } else { + pattern = undefined$1; + } + } + } + if (!pattern) { + separatedValue = separateValue(property2, startValue2); + startValue2 = separatedValue[0]; + startValueUnitType = separatedValue[1]; + separatedValue = separateValue(property2, endValue2); + endValue2 = separatedValue[0].replace(/^([+-\/*])=/, function(match, subMatch) { + operator = subMatch; + return ""; + }); + endValueUnitType = separatedValue[1]; + startValue2 = parseFloat(startValue2) || 0; + endValue2 = parseFloat(endValue2) || 0; + if (endValueUnitType === "%") { + if (/^(fontSize|lineHeight)$/.test(property2)) { + endValue2 = endValue2 / 100; + endValueUnitType = "em"; + } else if (/^scale/.test(property2)) { + endValue2 = endValue2 / 100; + endValueUnitType = ""; + } else if (/(Red|Green|Blue)$/i.test(property2)) { + endValue2 = endValue2 / 100 * 255; + endValueUnitType = ""; + } + } + } + var calculateUnitRatios = function() { + var sameRatioIndicators = { + myParent: element.parentNode || document2.body, + /* GET */ + position: CSS.getPropertyValue(element, "position"), + /* GET */ + fontSize: CSS.getPropertyValue(element, "fontSize") + /* GET */ + }, samePercentRatio = sameRatioIndicators.position === callUnitConversionData.lastPosition && sameRatioIndicators.myParent === callUnitConversionData.lastParent, sameEmRatio = sameRatioIndicators.fontSize === callUnitConversionData.lastFontSize; + callUnitConversionData.lastParent = sameRatioIndicators.myParent; + callUnitConversionData.lastPosition = sameRatioIndicators.position; + callUnitConversionData.lastFontSize = sameRatioIndicators.fontSize; + var measurement = 100, unitRatios = {}; + if (!sameEmRatio || !samePercentRatio) { + var dummy = data && data.isSVG ? document2.createElementNS("http://www.w3.org/2000/svg", "rect") : document2.createElement("div"); + Velocity.init(dummy); + sameRatioIndicators.myParent.appendChild(dummy); + $2.each(["overflow", "overflowX", "overflowY"], function(i3, property3) { + Velocity.CSS.setPropertyValue(dummy, property3, "hidden"); + }); + Velocity.CSS.setPropertyValue(dummy, "position", sameRatioIndicators.position); + Velocity.CSS.setPropertyValue(dummy, "fontSize", sameRatioIndicators.fontSize); + Velocity.CSS.setPropertyValue(dummy, "boxSizing", "content-box"); + $2.each(["minWidth", "maxWidth", "width", "minHeight", "maxHeight", "height"], function(i3, property3) { + Velocity.CSS.setPropertyValue(dummy, property3, measurement + "%"); + }); + Velocity.CSS.setPropertyValue(dummy, "paddingLeft", measurement + "em"); + unitRatios.percentToPxWidth = callUnitConversionData.lastPercentToPxWidth = (parseFloat(CSS.getPropertyValue(dummy, "width", null, true)) || 1) / measurement; + unitRatios.percentToPxHeight = callUnitConversionData.lastPercentToPxHeight = (parseFloat(CSS.getPropertyValue(dummy, "height", null, true)) || 1) / measurement; + unitRatios.emToPx = callUnitConversionData.lastEmToPx = (parseFloat(CSS.getPropertyValue(dummy, "paddingLeft")) || 1) / measurement; + sameRatioIndicators.myParent.removeChild(dummy); + } else { + unitRatios.emToPx = callUnitConversionData.lastEmToPx; + unitRatios.percentToPxWidth = callUnitConversionData.lastPercentToPxWidth; + unitRatios.percentToPxHeight = callUnitConversionData.lastPercentToPxHeight; + } + if (callUnitConversionData.remToPx === null) { + callUnitConversionData.remToPx = parseFloat(CSS.getPropertyValue(document2.body, "fontSize")) || 16; + } + if (callUnitConversionData.vwToPx === null) { + callUnitConversionData.vwToPx = parseFloat(window2.innerWidth) / 100; + callUnitConversionData.vhToPx = parseFloat(window2.innerHeight) / 100; + } + unitRatios.remToPx = callUnitConversionData.remToPx; + unitRatios.vwToPx = callUnitConversionData.vwToPx; + unitRatios.vhToPx = callUnitConversionData.vhToPx; + if (Velocity.debug >= 1) { + console.log("Unit ratios: " + JSON.stringify(unitRatios), element); + } + return unitRatios; + }; + if (/[\/*]/.test(operator)) { + endValueUnitType = startValueUnitType; + } else if (startValueUnitType !== endValueUnitType && startValue2 !== 0) { + if (endValue2 === 0) { + endValueUnitType = startValueUnitType; + } else { + elementUnitConversionData = elementUnitConversionData || calculateUnitRatios(); + var axis = /margin|padding|left|right|width|text|word|letter/i.test(property2) || /X$/.test(property2) || property2 === "x" ? "x" : "y"; + switch (startValueUnitType) { + case "%": + startValue2 *= axis === "x" ? elementUnitConversionData.percentToPxWidth : elementUnitConversionData.percentToPxHeight; + break; + case "px": + break; + default: + startValue2 *= elementUnitConversionData[startValueUnitType + "ToPx"]; + } + switch (endValueUnitType) { + case "%": + startValue2 *= 1 / (axis === "x" ? elementUnitConversionData.percentToPxWidth : elementUnitConversionData.percentToPxHeight); + break; + case "px": + break; + default: + startValue2 *= 1 / elementUnitConversionData[endValueUnitType + "ToPx"]; + } + } + } + switch (operator) { + case "+": + endValue2 = startValue2 + endValue2; + break; + case "-": + endValue2 = startValue2 - endValue2; + break; + case "*": + endValue2 = startValue2 * endValue2; + break; + case "/": + endValue2 = startValue2 / endValue2; + break; + } + tweensContainer[property2] = { + rootPropertyValue, + startValue: startValue2, + currentValue: startValue2, + endValue: endValue2, + unitType: endValueUnitType, + easing: easing2 + }; + if (pattern) { + tweensContainer[property2].pattern = pattern; + } + if (Velocity.debug) { + console.log("tweensContainer (" + property2 + "): " + JSON.stringify(tweensContainer[property2]), element); + } + }; + for (var property in propertiesMap) { + if (!propertiesMap.hasOwnProperty(property)) { + continue; + } + var propertyName = CSS.Names.camelCase(property), valueData = parsePropertyValue(propertiesMap[property]); + if (_inArray(CSS.Lists.colors)) { + var endValue = valueData[0], easing = valueData[1], startValue = valueData[2]; + if (CSS.RegEx.isHex.test(endValue)) { + var colorComponents = ["Red", "Green", "Blue"], endValueRGB = CSS.Values.hexToRgb(endValue), startValueRGB = startValue ? CSS.Values.hexToRgb(startValue) : undefined$1; + for (var i2 = 0; i2 < colorComponents.length; i2++) { + var dataArray = [endValueRGB[i2]]; + if (easing) { + dataArray.push(easing); + } + if (startValueRGB !== undefined$1) { + dataArray.push(startValueRGB[i2]); + } + fixPropertyValue(propertyName + colorComponents[i2], dataArray); + } + continue; + } + } + fixPropertyValue(propertyName, valueData); + } + tweensContainer.element = element; + } + if (tweensContainer.element) { + CSS.Values.addClass(element, "velocity-animating"); + call.push(tweensContainer); + data = Data(element); + if (data) { + if (opts2.queue === "") { + data.tweensContainer = tweensContainer; + data.opts = opts2; + } + data.isAnimating = true; + } + if (elementsIndex === elementsLength - 1) { + Velocity.State.calls.push([call, elements, opts2, null, promiseData.resolver, null, 0]); + if (Velocity.State.isTicking === false) { + Velocity.State.isTicking = true; + tick(); + } + } else { + elementsIndex++; + } + } + } + if (opts2.queue === false) { + if (opts2.delay) { + var callIndex = Velocity.State.delayedElements.count++; + Velocity.State.delayedElements[callIndex] = element; + var delayComplete = function(index) { + return function() { + Velocity.State.delayedElements[index] = false; + buildQueue(); + }; + }(callIndex); + Data(element).delayBegin = (/* @__PURE__ */ new Date()).getTime(); + Data(element).delay = parseFloat(opts2.delay); + Data(element).delayTimer = { + setTimeout: setTimeout(buildQueue, parseFloat(opts2.delay)), + next: delayComplete + }; + } else { + buildQueue(); + } + } else { + $2.queue(element, opts2.queue, function(next, clearQueue) { + if (clearQueue === true) { + if (promiseData.promise) { + promiseData.resolver(elements); + } + return true; + } + Velocity.velocityQueueEntryFlag = true; + buildQueue(); + }); + } + if ((opts2.queue === "" || opts2.queue === "fx") && $2.queue(element)[0] !== "inprogress") { + $2.dequeue(element); + } + } + $2.each(elements, function(i2, element) { + if (Type.isNode(element)) { + processElement(element, i2); + } + }); + opts = $2.extend({}, Velocity.defaults, options); + opts.loop = parseInt(opts.loop, 10); + var reverseCallsCount = opts.loop * 2 - 1; + if (opts.loop) { + for (var x = 0; x < reverseCallsCount; x++) { + var reverseOptions = { + delay: opts.delay, + progress: opts.progress + }; + if (x === reverseCallsCount - 1) { + reverseOptions.display = opts.display; + reverseOptions.visibility = opts.visibility; + reverseOptions.complete = opts.complete; + } + animate(elements, "reverse", reverseOptions); + } + } + return getChain(); + }; + Velocity = $2.extend(animate, Velocity); + Velocity.animate = animate; + var ticker = window2.requestAnimationFrame || rAFShim; + if (!Velocity.State.isMobile && document2.hidden !== undefined$1) { + var updateTicker = function() { + if (document2.hidden) { + ticker = function(callback) { + return setTimeout(function() { + callback(true); + }, 16); + }; + tick(); + } else { + ticker = window2.requestAnimationFrame || rAFShim; + } + }; + updateTicker(); + document2.addEventListener("visibilitychange", updateTicker); + } + function tick(timestamp) { + if (timestamp) { + var timeCurrent = Velocity.timestamp && timestamp !== true ? timestamp : performance.now(); + var callsLength = Velocity.State.calls.length; + if (callsLength > 1e4) { + Velocity.State.calls = compactSparseArray(Velocity.State.calls); + callsLength = Velocity.State.calls.length; + } + for (var i = 0; i < callsLength; i++) { + if (!Velocity.State.calls[i]) { + continue; + } + var callContainer = Velocity.State.calls[i], call = callContainer[0], opts = callContainer[2], timeStart = callContainer[3], firstTick = !timeStart, tweenDummyValue = null, pauseObject = callContainer[5], millisecondsEllapsed = callContainer[6]; + if (!timeStart) { + timeStart = Velocity.State.calls[i][3] = timeCurrent - 16; + } + if (pauseObject) { + if (pauseObject.resume === true) { + timeStart = callContainer[3] = Math.round(timeCurrent - millisecondsEllapsed - 16); + callContainer[5] = null; + } else { + continue; + } + } + millisecondsEllapsed = callContainer[6] = timeCurrent - timeStart; + var percentComplete = Math.min(millisecondsEllapsed / opts.duration, 1); + for (var j = 0, callLength = call.length; j < callLength; j++) { + var tweensContainer = call[j], element = tweensContainer.element; + if (!Data(element)) { + continue; + } + var transformPropertyExists = false; + if (opts.display !== undefined$1 && opts.display !== null && opts.display !== "none") { + if (opts.display === "flex") { + var flexValues = ["-webkit-box", "-moz-box", "-ms-flexbox", "-webkit-flex"]; + $2.each(flexValues, function(i2, flexValue) { + CSS.setPropertyValue(element, "display", flexValue); + }); + } + CSS.setPropertyValue(element, "display", opts.display); + } + if (opts.visibility !== undefined$1 && opts.visibility !== "hidden") { + CSS.setPropertyValue(element, "visibility", opts.visibility); + } + for (var property in tweensContainer) { + if (tweensContainer.hasOwnProperty(property) && property !== "element") { + var tween = tweensContainer[property], currentValue, easing = Type.isString(tween.easing) ? Velocity.Easings[tween.easing] : tween.easing; + if (Type.isString(tween.pattern)) { + var patternReplace = percentComplete === 1 ? function($0, index, round) { + var result = tween.endValue[index]; + return round ? Math.round(result) : result; + } : function($0, index, round) { + var startValue = tween.startValue[index], tweenDelta2 = tween.endValue[index] - startValue, result = startValue + tweenDelta2 * easing(percentComplete, opts, tweenDelta2); + return round ? Math.round(result) : result; + }; + currentValue = tween.pattern.replace(/{(\d+)(!)?}/g, patternReplace); + } else if (percentComplete === 1) { + currentValue = tween.endValue; + } else { + var tweenDelta = tween.endValue - tween.startValue; + currentValue = tween.startValue + tweenDelta * easing(percentComplete, opts, tweenDelta); + } + if (!firstTick && currentValue === tween.currentValue) { + continue; + } + tween.currentValue = currentValue; + if (property === "tween") { + tweenDummyValue = currentValue; + } else { + var hookRoot; + if (CSS.Hooks.registered[property]) { + hookRoot = CSS.Hooks.getRoot(property); + var rootPropertyValueCache = Data(element).rootPropertyValueCache[hookRoot]; + if (rootPropertyValueCache) { + tween.rootPropertyValue = rootPropertyValueCache; + } + } + var adjustedSetData = CSS.setPropertyValue( + element, + /* SET */ + property, + tween.currentValue + (IE < 9 && parseFloat(currentValue) === 0 ? "" : tween.unitType), + tween.rootPropertyValue, + tween.scrollData + ); + if (CSS.Hooks.registered[property]) { + if (CSS.Normalizations.registered[hookRoot]) { + Data(element).rootPropertyValueCache[hookRoot] = CSS.Normalizations.registered[hookRoot]("extract", null, adjustedSetData[1]); + } else { + Data(element).rootPropertyValueCache[hookRoot] = adjustedSetData[1]; + } + } + if (adjustedSetData[0] === "transform") { + transformPropertyExists = true; + } + } + } + } + if (opts.mobileHA) { + if (Data(element).transformCache.translate3d === undefined$1) { + Data(element).transformCache.translate3d = "(0px, 0px, 0px)"; + transformPropertyExists = true; + } + } + if (transformPropertyExists) { + CSS.flushTransformCache(element); + } + } + if (opts.display !== undefined$1 && opts.display !== "none") { + Velocity.State.calls[i][2].display = false; + } + if (opts.visibility !== undefined$1 && opts.visibility !== "hidden") { + Velocity.State.calls[i][2].visibility = false; + } + if (opts.progress) { + opts.progress.call( + callContainer[1], + callContainer[1], + percentComplete, + Math.max(0, timeStart + opts.duration - timeCurrent), + timeStart, + tweenDummyValue + ); + } + if (percentComplete === 1) { + completeCall(i); + } + } + } + if (Velocity.State.isTicking) { + ticker(tick); + } + } + function completeCall(callIndex, isStopped) { + if (!Velocity.State.calls[callIndex]) { + return false; + } + var call = Velocity.State.calls[callIndex][0], elements = Velocity.State.calls[callIndex][1], opts = Velocity.State.calls[callIndex][2], resolver = Velocity.State.calls[callIndex][4]; + var remainingCallsExist = false; + for (var i = 0, callLength = call.length; i < callLength; i++) { + var element = call[i].element; + if (!isStopped && !opts.loop) { + if (opts.display === "none") { + CSS.setPropertyValue(element, "display", opts.display); + } + if (opts.visibility === "hidden") { + CSS.setPropertyValue(element, "visibility", opts.visibility); + } + } + var data = Data(element); + if (opts.loop !== true && ($2.queue(element)[1] === undefined$1 || !/\.velocityQueueEntryFlag/i.test($2.queue(element)[1]))) { + if (data) { + data.isAnimating = false; + data.rootPropertyValueCache = {}; + var transformHAPropertyExists = false; + $2.each(CSS.Lists.transforms3D, function(i2, transformName) { + var defaultValue = /^scale/.test(transformName) ? 1 : 0, currentValue = data.transformCache[transformName]; + if (data.transformCache[transformName] !== undefined$1 && new RegExp("^\\(" + defaultValue + "[^.]").test(currentValue)) { + transformHAPropertyExists = true; + delete data.transformCache[transformName]; + } + }); + if (opts.mobileHA) { + transformHAPropertyExists = true; + delete data.transformCache.translate3d; + } + if (transformHAPropertyExists) { + CSS.flushTransformCache(element); + } + CSS.Values.removeClass(element, "velocity-animating"); + } + } + if (!isStopped && opts.complete && !opts.loop && i === callLength - 1) { + try { + opts.complete.call(elements, elements); + } catch (error) { + setTimeout(function() { + throw error; + }, 1); + } + } + if (resolver && opts.loop !== true) { + resolver(elements); + } + if (data && opts.loop === true && !isStopped) { + $2.each(data.tweensContainer, function(propertyName, tweenContainer) { + if (/^rotate/.test(propertyName) && (parseFloat(tweenContainer.startValue) - parseFloat(tweenContainer.endValue)) % 360 === 0) { + var oldStartValue = tweenContainer.startValue; + tweenContainer.startValue = tweenContainer.endValue; + tweenContainer.endValue = oldStartValue; + } + if (/^backgroundPosition/.test(propertyName) && parseFloat(tweenContainer.endValue) === 100 && tweenContainer.unitType === "%") { + tweenContainer.endValue = 0; + tweenContainer.startValue = 100; + } + }); + Velocity(element, "reverse", { loop: true, delay: opts.delay }); + } + if (opts.queue !== false) { + $2.dequeue(element, opts.queue); + } + } + Velocity.State.calls[callIndex] = false; + for (var j = 0, callsLength = Velocity.State.calls.length; j < callsLength; j++) { + if (Velocity.State.calls[j] !== false) { + remainingCallsExist = true; + break; + } + } + if (remainingCallsExist === false) { + Velocity.State.isTicking = false; + delete Velocity.State.calls; + Velocity.State.calls = []; + } + } + global2.Velocity = Velocity; + if (global2 !== window2) { + global2.fn.velocity = animate; + global2.fn.velocity.defaults = Velocity.defaults; + } + $2.each(["Down", "Up"], function(i, direction) { + Velocity.Redirects["slide" + direction] = function(element, options, elementsIndex, elementsSize, elements, promiseData) { + var opts = $2.extend({}, options), begin = opts.begin, complete = opts.complete, inlineValues = {}, computedValues = { height: "", marginTop: "", marginBottom: "", paddingTop: "", paddingBottom: "" }; + if (opts.display === undefined$1) { + opts.display = direction === "Down" ? Velocity.CSS.Values.getDisplayType(element) === "inline" ? "inline-block" : "block" : "none"; + } + opts.begin = function() { + if (elementsIndex === 0 && begin) { + begin.call(elements, elements); + } + for (var property in computedValues) { + if (!computedValues.hasOwnProperty(property)) { + continue; + } + inlineValues[property] = element.style[property]; + var propertyValue = CSS.getPropertyValue(element, property); + computedValues[property] = direction === "Down" ? [propertyValue, 0] : [0, propertyValue]; + } + inlineValues.overflow = element.style.overflow; + element.style.overflow = "hidden"; + }; + opts.complete = function() { + for (var property in inlineValues) { + if (inlineValues.hasOwnProperty(property)) { + element.style[property] = inlineValues[property]; + } + } + if (elementsIndex === elementsSize - 1) { + if (complete) { + complete.call(elements, elements); + } + if (promiseData) { + promiseData.resolver(elements); + } + } + }; + Velocity(element, computedValues, opts); + }; + }); + $2.each(["In", "Out"], function(i, direction) { + Velocity.Redirects["fade" + direction] = function(element, options, elementsIndex, elementsSize, elements, promiseData) { + var opts = $2.extend({}, options), complete = opts.complete, propertiesMap = { opacity: direction === "In" ? 1 : 0 }; + if (elementsIndex !== 0) { + opts.begin = null; + } + if (elementsIndex !== elementsSize - 1) { + opts.complete = null; + } else { + opts.complete = function() { + if (complete) { + complete.call(elements, elements); + } + if (promiseData) { + promiseData.resolver(elements); + } + }; + } + if (opts.display === undefined$1) { + opts.display = direction === "In" ? "auto" : "none"; + } + Velocity(this, propertiesMap, opts); + }; + }); + return Velocity; + }(window.jQuery || window.Zepto || window, window, window ? window.document : void 0); + }); + })(velocity); + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + function updateSources(img, sources) { + if (sources === void 0) { + return; + } + const imgSiblingWebp = $$1(img).siblings('source[type="image/webp"]'); + const imgSiblingAvif = $$1(img).siblings('source[type="image/avif"]'); + if (sources.webp !== void 0 && imgSiblingWebp.length) { + imgSiblingWebp.attr("srcset", sources.webp); + } + if (sources.avif !== void 0 && imgSiblingAvif.length) { + imgSiblingAvif.attr("srcset", sources.avif); + } + } + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + class ProductMinitature { + init() { + $$1(".js-product-miniature").each((index, element) => { + if ($$1(element).find(".color").length > 5) { + let count = 0; + $$1(element).find(".color").each((colorIndex, colorElement) => { + if (colorIndex > 4) { + $$1(colorElement).hide(); + count += 1; + } + }); + $$1(element).find(".js-count").append(`+${count}`); + } + }); + } + } + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + $$1(document).ready(() => { + const move = (direction) => { + const THUMB_MARGIN = 20; + const $thumbnails = $$1(".js-qv-product-images"); + const thumbHeight = $$1(".js-qv-product-images li img").height() + THUMB_MARGIN; + const currentPosition = $thumbnails.position().top; + $thumbnails.velocity( + { + translateY: direction === "up" ? currentPosition + thumbHeight : currentPosition - thumbHeight + }, + () => { + if ($thumbnails.position().top >= 0) { + $$1(".arrow-up").css("opacity", ".2"); + } else if ($thumbnails.position().top + $thumbnails.height() <= $$1(".js-qv-mask").height()) { + $$1(".arrow-down").css("opacity", ".2"); + } + } + ); + }; + const productConfig = (qv) => { + const MAX_THUMBS = 4; + const $arrows = $$1(prestashop$1.themeSelectors.product.arrows); + const $thumbnails = qv.find(".js-qv-product-images"); + $$1(prestashop$1.themeSelectors.product.thumb).on("click", (event) => { + if ($$1(prestashop$1.themeSelectors.product.thumb).hasClass("selected")) { + $$1(prestashop$1.themeSelectors.product.thumb).removeClass("selected"); + } + $$1(event.currentTarget).addClass("selected"); + $$1(prestashop$1.themeSelectors.product.cover).attr("src", $$1(event.target).data("image-large-src")); + $$1(prestashop$1.themeSelectors.product.cover).attr("alt", $$1(event.target).attr("alt")); + $$1(prestashop$1.themeSelectors.product.cover).attr("title", $$1(event.target).attr("title")); + updateSources( + $$1(prestashop$1.themeSelectors.product.cover), + $$1(event.target).data("image-large-sources") + ); + }); + if ($thumbnails.find("li").length <= MAX_THUMBS) { + $arrows.hide(); + } else { + $arrows.on("click", (event) => { + if ($$1(event.target).hasClass("arrow-up") && $$1(".js-qv-product-images").position().top < 0) { + move("up"); + $$1(prestashop$1.themeSelectors.arrowDown).css("opacity", "1"); + } else if ($$1(event.target).hasClass("arrow-down") && $thumbnails.position().top + $thumbnails.height() > $$1(".js-qv-mask").height()) { + move("down"); + $$1(prestashop$1.themeSelectors.arrowUp).css("opacity", "1"); + } + }); + } + qv.find(prestashop$1.selectors.quantityWanted).TouchSpin({ + verticalbuttons: true, + verticalupclass: "material-icons touchspin-up", + verticaldownclass: "material-icons touchspin-down", + buttondown_class: "btn btn-touchspin js-touchspin", + buttonup_class: "btn btn-touchspin js-touchspin", + min: 1, + max: 1e6 + }); + $$1(prestashop$1.themeSelectors.touchspin).off("touchstart.touchspin"); + }; + prestashop$1.on("clickQuickView", (elm) => { + const data = { + action: "quickview", + id_product: elm.dataset.idProduct, + id_product_attribute: elm.dataset.idProductAttribute + }; + $$1.post(prestashop$1.urls.pages.product, data, null, "json").then((resp) => { + $$1("body").append(resp.quickview_html); + const productModal = $$1( + `#quickview-modal-${resp.product.id}-${resp.product.id_product_attribute}` + ); + productModal.modal("show"); + productConfig(productModal); + productModal.on("hidden.bs.modal", () => { + productModal.remove(); + }); + }).fail((resp) => { + prestashop$1.emit("handleError", { + eventType: "clickQuickView", + resp + }); + }); + }); + $$1("body").on( + "click", + prestashop$1.themeSelectors.listing.searchFilterToggler, + () => { + $$1(prestashop$1.themeSelectors.listing.searchFiltersWrapper).removeClass( + "hidden-sm-down" + ); + $$1(prestashop$1.themeSelectors.contentWrapper).addClass("hidden-sm-down"); + $$1(prestashop$1.themeSelectors.footer).addClass("hidden-sm-down"); + } + ); + $$1( + `${prestashop$1.themeSelectors.listing.searchFilterControls} ${prestashop$1.themeSelectors.clear}` + ).on("click", () => { + $$1(prestashop$1.themeSelectors.listing.searchFiltersWrapper).addClass( + "hidden-sm-down" + ); + $$1(prestashop$1.themeSelectors.contentWrapper).removeClass("hidden-sm-down"); + $$1(prestashop$1.themeSelectors.footer).removeClass("hidden-sm-down"); + }); + $$1(`${prestashop$1.themeSelectors.listing.searchFilterControls} .ok`).on( + "click", + () => { + $$1(prestashop$1.themeSelectors.listing.searchFiltersWrapper).addClass( + "hidden-sm-down" + ); + $$1(prestashop$1.themeSelectors.contentWrapper).removeClass("hidden-sm-down"); + $$1(prestashop$1.themeSelectors.footer).removeClass("hidden-sm-down"); + } + ); + const parseSearchUrl = function(event) { + if (event.target.dataset.searchUrl !== void 0) { + return event.target.dataset.searchUrl; + } + if ($$1(event.target).parent()[0].dataset.searchUrl === void 0) { + throw new Error("Can not parse search URL"); + } + return $$1(event.target).parent()[0].dataset.searchUrl; + }; + function updateProductListDOM(data) { + $$1(prestashop$1.themeSelectors.listing.searchFilters).replaceWith( + data.rendered_facets + ); + $$1(prestashop$1.themeSelectors.listing.activeSearchFilters).replaceWith( + data.rendered_active_filters + ); + $$1(prestashop$1.themeSelectors.listing.listTop).replaceWith( + data.rendered_products_top + ); + const renderedProducts = $$1(data.rendered_products); + const productSelectors = $$1(prestashop$1.themeSelectors.listing.product); + if (productSelectors.length > 0) { + productSelectors.removeClass().addClass(productSelectors.first().attr("class")); + } else { + productSelectors.removeClass().addClass(renderedProducts.first().attr("class")); + } + $$1(prestashop$1.themeSelectors.listing.list).replaceWith(renderedProducts); + $$1(prestashop$1.themeSelectors.listing.listBottom).replaceWith( + data.rendered_products_bottom + ); + if (data.rendered_products_header) { + $$1(prestashop$1.themeSelectors.listing.listHeader).replaceWith( + data.rendered_products_header + ); + } + const productMinitature = new ProductMinitature(); + productMinitature.init(); + } + $$1("body").on( + "change", + `${prestashop$1.themeSelectors.listing.searchFilters} input[data-search-url]`, + (event) => { + prestashop$1.emit("updateFacets", parseSearchUrl(event)); + } + ); + $$1("body").on( + "click", + prestashop$1.themeSelectors.listing.searchFiltersClearAll, + (event) => { + prestashop$1.emit("updateFacets", parseSearchUrl(event)); + } + ); + $$1("body").on("click", prestashop$1.themeSelectors.listing.searchLink, (event) => { + event.preventDefault(); + prestashop$1.emit( + "updateFacets", + $$1(event.target).closest("a").get(0).href + ); + }); + window.addEventListener("popstate", (e) => { + if (e.state && e.state.current_url) { + window.location.href = e.state.current_url; + } + }); + $$1("body").on( + "change", + `${prestashop$1.themeSelectors.listing.searchFilters} select`, + (event) => { + const form = $$1(event.target).closest("form"); + prestashop$1.emit("updateFacets", `?${form.serialize()}`); + } + ); + prestashop$1.on("updateProductList", (data) => { + updateProductListDOM(data); + window.scrollTo(0, 0); + }); + }); + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + class ProductSelect { + init() { + const MAX_THUMBS = 5; + const $arrows = $$1(".js-modal-arrows"); + const $thumbnails = $$1(".js-modal-product-images"); + $$1("body").on("click", ".js-modal-thumb", (event) => { + if ($$1(".js-modal-thumb").hasClass("selected")) { + $$1(".js-modal-thumb").removeClass("selected"); + } + $$1(event.currentTarget).addClass("selected"); + $$1(prestashop.themeSelectors.product.modalProductCover).attr("src", $$1(event.target).data("image-large-src")); + $$1(prestashop.themeSelectors.product.modalProductCover).attr("title", $$1(event.target).attr("title")); + $$1(prestashop.themeSelectors.product.modalProductCover).attr("alt", $$1(event.target).attr("alt")); + }).on("click", "aside#thumbnails", (event) => { + if (event.target.id === "thumbnails") { + $$1("#product-modal").modal("hide"); + } + }); + if ($$1(".js-modal-product-images li").length <= MAX_THUMBS) { + $arrows.css("opacity", ".2"); + } else { + $arrows.on("click", (event) => { + if ($$1(event.target).hasClass("arrow-up") && $thumbnails.position().top < 0) { + this.move("up"); + $$1(".js-modal-arrow-down").css("opacity", "1"); + } else if ($$1(event.target).hasClass("arrow-down") && $thumbnails.position().top + $thumbnails.height() > $$1(".js-modal-mask").height()) { + this.move("down"); + $$1(".js-modal-arrow-up").css("opacity", "1"); + } + }); + } + } + move(direction) { + const THUMB_MARGIN = 10; + const $thumbnails = $$1(".js-modal-product-images"); + const thumbHeight = $$1(".js-modal-product-images li img").height() + THUMB_MARGIN; + const currentPosition = $thumbnails.position().top; + $thumbnails.velocity( + { + translateY: direction === "up" ? currentPosition + thumbHeight : currentPosition - thumbHeight + }, + () => { + if ($thumbnails.position().top >= 0) { + $$1(".js-modal-arrow-up").css("opacity", ".2"); + } else if ($thumbnails.position().top + $thumbnails.height() <= $$1(".js-modal-mask").height()) { + $$1(".js-modal-arrow-down").css("opacity", ".2"); + } + } + ); + } + } + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + $$1(document).ready(() => { + function coverImage() { + const productCover = $$1(prestashop$1.themeSelectors.product.cover); + const modalProductCover = $$1(prestashop$1.themeSelectors.product.modalProductCover); + let thumbSelected = $$1(prestashop$1.themeSelectors.product.selected); + const swipe = (selectedThumb, thumbParent) => { + const newSelectedThumb = thumbParent.find(prestashop$1.themeSelectors.product.thumb); + selectedThumb.removeClass("selected"); + newSelectedThumb.addClass("selected"); + modalProductCover.prop("src", newSelectedThumb.data("image-large-src")); + productCover.prop("src", newSelectedThumb.data("image-medium-src")); + productCover.attr("title", newSelectedThumb.attr("title")); + modalProductCover.attr("title", newSelectedThumb.attr("title")); + productCover.attr("alt", newSelectedThumb.attr("alt")); + modalProductCover.attr("alt", newSelectedThumb.attr("alt")); + updateSources(productCover, newSelectedThumb.data("image-medium-sources")); + updateSources(modalProductCover, newSelectedThumb.data("image-large-sources")); + }; + $$1(prestashop$1.themeSelectors.product.thumb).on("click", (event) => { + thumbSelected = $$1(prestashop$1.themeSelectors.product.selected); + swipe(thumbSelected, $$1(event.target).closest(prestashop$1.themeSelectors.product.thumbContainer)); + }); + productCover.swipe({ + swipe: (event, direction) => { + thumbSelected = $$1(prestashop$1.themeSelectors.product.selected); + const parentThumb = thumbSelected.closest(prestashop$1.themeSelectors.product.thumbContainer); + if (direction === "right") { + if (parentThumb.prev().length > 0) { + swipe(thumbSelected, parentThumb.prev()); + } else if (parentThumb.next().length > 0) { + swipe(thumbSelected, parentThumb.next()); + } + } else if (direction === "left") { + if (parentThumb.next().length > 0) { + swipe(thumbSelected, parentThumb.next()); + } else if (parentThumb.prev().length > 0) { + swipe(thumbSelected, parentThumb.prev()); + } + } + }, + allowPageScroll: "vertical" + }); + } + function imageScrollBox() { + if ($$1("#main .js-qv-product-images li").length > 2) { + $$1("#main .js-qv-mask").addClass("scroll"); + $$1(".scroll-box-arrows").addClass("scroll"); + $$1("#main .js-qv-mask").scrollbox({ + direction: "h", + distance: 113, + autoPlay: false + }); + $$1(".scroll-box-arrows .left").click(() => { + $$1("#main .js-qv-mask").trigger("backward"); + }); + $$1(".scroll-box-arrows .right").click(() => { + $$1("#main .js-qv-mask").trigger("forward"); + }); + } else { + $$1("#main .js-qv-mask").removeClass("scroll"); + $$1(".scroll-box-arrows").removeClass("scroll"); + } + } + function createInputFile() { + $$1(prestashop$1.themeSelectors.fileInput).on("change", (event) => { + const target = $$1(event.currentTarget)[0]; + const file = target ? target.files[0] : null; + if (target && file) { + $$1(target).prev().text(file.name); + } + }); + } + function createProductSpin() { + const $quantityInput = $$1(prestashop$1.selectors.quantityWanted); + $quantityInput.TouchSpin({ + verticalbuttons: true, + verticalupclass: "material-icons touchspin-up", + verticaldownclass: "material-icons touchspin-down", + buttondown_class: "btn btn-touchspin js-touchspin", + buttonup_class: "btn btn-touchspin js-touchspin", + min: parseInt($quantityInput.attr("min"), 10), + max: 1e6 + }); + $$1(prestashop$1.themeSelectors.touchspin).off("touchstart.touchspin"); + $quantityInput.on("focusout", () => { + if ($quantityInput.val() === "" || $quantityInput.val() < $quantityInput.attr("min")) { + $quantityInput.val($quantityInput.attr("min")); + $quantityInput.trigger("change"); + } + }); + $$1("body").on("change keyup", prestashop$1.selectors.quantityWanted, (e) => { + if ($quantityInput.val() !== "") { + $$1(e.currentTarget).trigger("touchspin.stopspin"); + prestashop$1.emit("updateProduct", { + eventType: "updatedProductQuantity", + event: e + }); + } + }); + } + function addJsProductTabActiveSelector() { + const nav = $$1(prestashop$1.themeSelectors.product.tabs); + nav.on("show.bs.tab", (e) => { + const target = $$1(e.target); + target.addClass(prestashop$1.themeSelectors.product.activeNavClass); + $$1(target.attr("href")).addClass(prestashop$1.themeSelectors.product.activeTabClass); + }); + nav.on("hide.bs.tab", (e) => { + const target = $$1(e.target); + target.removeClass(prestashop$1.themeSelectors.product.activeNavClass); + $$1(target.attr("href")).removeClass(prestashop$1.themeSelectors.product.activeTabClass); + }); + } + createProductSpin(); + createInputFile(); + coverImage(); + imageScrollBox(); + addJsProductTabActiveSelector(); + prestashop$1.on("updatedProduct", (event) => { + createInputFile(); + coverImage(); + if (event && event.product_minimal_quantity) { + const minimalProductQuantity = parseInt(event.product_minimal_quantity, 10); + const quantityInputSelector = prestashop$1.selectors.quantityWanted; + const quantityInput = $$1(quantityInputSelector); + quantityInput.trigger("touchspin.updatesettings", { + min: minimalProductQuantity + }); + } + imageScrollBox(); + $$1($$1(prestashop$1.themeSelectors.product.activeTabs).attr("href")).addClass("active").removeClass("fade"); + $$1(prestashop$1.themeSelectors.product.imagesModal).replaceWith(event.product_images_modal); + const productSelect = new ProductSelect(); + productSelect.init(); + }); + }); + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + function debounce(func, timeout = 300) { + let timer; + return (...args) => { + clearTimeout(timer); + timer = setTimeout(() => { + func.apply(this, args); + }, timeout); + }; + } + prestashop$1.cart = prestashop$1.cart || {}; + prestashop$1.cart.active_inputs = null; + const spinnerSelector = 'input[name="product-quantity-spin"]'; + let hasError = false; + let isUpdateOperation = false; + let errorMsg = ""; + const CheckUpdateQuantityOperations = { + switchErrorStat: () => { + const $checkoutBtn = $$1(prestashop$1.themeSelectors.checkout.btn); + if ($$1(prestashop$1.themeSelectors.notifications.dangerAlert).length || errorMsg !== "" && !hasError) { + $checkoutBtn.addClass("disabled"); + } + if (errorMsg !== "") { + const strError = ` - `;i(b.themeSelectors.notifications.container).html(n),ct="",lt=!1,mt&&l.removeClass("disabled")}else!mt&<&&(mt=!1,lt=!1,i(b.themeSelectors.notifications.container).html(""),l.removeClass("disabled"))},checkUpdateOperation:l=>{const{hasError:n,errors:t}=l;mt=n??!1;const w=t??"";w instanceof Array?ct=w.join(" "):ct=w,lt=!0}};function Dt(){i.each(i(Vt),(l,n)=>{i(n).TouchSpin({verticalbuttons:!0,verticalupclass:"material-icons touchspin-up",verticaldownclass:"material-icons touchspin-down",buttondown_class:"btn btn-touchspin js-touchspin js-increase-product-quantity",buttonup_class:"btn btn-touchspin js-touchspin js-decrease-product-quantity",min:parseInt(i(n).attr("min"),10),max:1e6})}),i(b.themeSelectors.touchspin).off("touchstart.touchspin"),Ot.switchErrorStat()}const Rt=l=>window.shouldPreventModal?(l.preventDefault(),!1):!0;i(document).ready(()=>{const l=b.themeSelectors.cart.productLineQty,n=[];b.on("updateCart",()=>{i(b.themeSelectors.cart.quickview).modal("hide")}),b.on("updatedCart",()=>{window.shouldPreventModal=!1,i(b.themeSelectors.product.customizationModal).on("show.bs.modal",A=>{Rt(A)}),Dt()}),Dt();const t=i("body");function w(A){return A==="on.startupspin"||A==="on.startdownspin"}function s(A){return A==="on.startupspin"}function k(A){const c=A.parents(b.themeSelectors.cart.touchspin).find(l);return c.is(":focus")?null:c}function C(A){const c=A.split("-");let N,G,ie="";for(N=0;N{let A;for(;n.length>0;)A=n.pop(),A.abort()},Q=A=>i(A.parents(b.themeSelectors.cart.touchspin).find("input"));i(b.themeSelectors.product.customizationModal).on("show.bs.modal",A=>{Rt(A)});const _=A=>{p(),window.shouldPreventModal=!0,A.preventDefault();const c=i(A.currentTarget),{dataset:N}=A.currentTarget,G=o(c,A.namespace),ie={ajax:"1",action:"update"};G&&i.ajax({url:G.url,method:"POST",data:ie,dataType:"json",beforeSend(ce){n.push(ce)}}).then(ce=>{const Le=Q(c);Ot.checkUpdateOperation(ce),Le.val(ce.quantity),b.emit("updateCart",{reason:N,resp:ce})}).fail(ce=>{b.emit("handleError",{eventType:"updateProductInCart",resp:ce,cartAction:G.type})})};t.on("click",b.themeSelectors.cart.actions,_);function u(A,c,N){return p(),window.shouldPreventModal=!0,i.ajax({url:A,method:"POST",data:c,dataType:"json",beforeSend(G){n.push(G)}}).then(G=>{Ot.checkUpdateOperation(G),N.val(G.quantity);const ie=N&&N.dataset?N.dataset:G;b.emit("updateCart",{reason:ie,resp:G})}).fail(G=>{b.emit("handleError",{eventType:"updateProductQuantityInCart",resp:G})})}function S(A){return A>0?"up":"down"}function d(A){return{ajax:"1",qty:Math.abs(A),action:"update",op:S(A)}}function V(A){const c=i(A.currentTarget),N=c.data("update-url"),G=c.attr("value"),ie=c.val();if(ie!=parseInt(ie,10)||ie<0||isNaN(ie)){window.shouldPreventModal=!1,c.val(G);return}const ce=ie-G;ce!==0&&(ie==="0"?c.closest(".product-line-actions").find('[data-link-action="delete-from-cart"]').click():(c.attr("value",ie),u(N,d(ce),c)))}t.on("touchspin.on.stopspin",Vt,cn(V)),t.on("focusout keyup",l,A=>A.type==="keyup"?(A.keyCode===13&&(lt=!0,V(A)),!1):(lt||V(A),!1));const O=400;t.on("hidden.bs.collapse",b.themeSelectors.cart.promoCode,()=>{i(b.themeSelectors.cart.displayPromo).show(O)}),t.on("click",b.themeSelectors.cart.promoCodeButton,A=>{A.preventDefault(),i(b.themeSelectors.cart.promoCode).collapse("toggle")}),t.on("click",b.themeSelectors.cart.displayPromo,A=>{i(A.currentTarget).hide(O)}),t.on("click",b.themeSelectors.cart.discountCode,A=>{A.stopPropagation();const c=i(A.currentTarget);return i(b.themeSelectors.cart.discountName).val(c.text()),i(b.themeSelectors.cart.promoCode).collapse("show"),i(b.themeSelectors.cart.displayPromo).hide(O),!1})});var Ft={exports:{}},ut=typeof Reflect=="object"?Reflect:null,Ut=ut&&typeof ut.apply=="function"?ut.apply:function(n,t,w){return Function.prototype.apply.call(n,t,w)},xt;ut&&typeof ut.ownKeys=="function"?xt=ut.ownKeys:Object.getOwnPropertySymbols?xt=function(n){return Object.getOwnPropertyNames(n).concat(Object.getOwnPropertySymbols(n))}:xt=function(n){return Object.getOwnPropertyNames(n)};function un(l){console&&console.warn&&console.warn(l)}var zt=Number.isNaN||function(n){return n!==n};function fe(){fe.init.call(this)}Ft.exports=fe,Ft.exports.once=hn,fe.EventEmitter=fe,fe.prototype._events=void 0,fe.prototype._eventsCount=0,fe.prototype._maxListeners=void 0;var Wt=10;function St(l){if(typeof l!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof l)}Object.defineProperty(fe,"defaultMaxListeners",{enumerable:!0,get:function(){return Wt},set:function(l){if(typeof l!="number"||l<0||zt(l))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+l+".");Wt=l}}),fe.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},fe.prototype.setMaxListeners=function(n){if(typeof n!="number"||n<0||zt(n))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+n+".");return this._maxListeners=n,this};function Bt(l){return l._maxListeners===void 0?fe.defaultMaxListeners:l._maxListeners}fe.prototype.getMaxListeners=function(){return Bt(this)},fe.prototype.emit=function(n){for(var t=[],w=1;w0&&(C=t[0]),C instanceof Error)throw C;var o=new Error("Unhandled error."+(C?" ("+C.message+")":""));throw o.context=C,o}var p=k[n];if(p===void 0)return!1;if(typeof p=="function")Ut(p,this,t);else for(var Q=p.length,_=Jt(p,Q),w=0;w0&&C.length>s&&!C.warned){C.warned=!0;var o=new Error("Possible EventEmitter memory leak detected. "+C.length+" "+String(n)+" listeners added. Use emitter.setMaxListeners() to increase limit");o.name="MaxListenersExceededWarning",o.emitter=l,o.type=n,o.count=C.length,un(o)}return l}fe.prototype.addListener=function(n,t){return Qt(this,n,t,!1)},fe.prototype.on=fe.prototype.addListener,fe.prototype.prependListener=function(n,t){return Qt(this,n,t,!0)};function fn(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function Yt(l,n,t){var w={fired:!1,wrapFn:void 0,target:l,type:n,listener:t},s=fn.bind(w);return s.listener=t,w.wrapFn=s,s}fe.prototype.once=function(n,t){return St(t),this.on(n,Yt(this,n,t)),this},fe.prototype.prependOnceListener=function(n,t){return St(t),this.prependListener(n,Yt(this,n,t)),this},fe.prototype.removeListener=function(n,t){var w,s,k,C,o;if(St(t),s=this._events,s===void 0)return this;if(w=s[n],w===void 0)return this;if(w===t||w.listener===t)--this._eventsCount===0?this._events=Object.create(null):(delete s[n],s.removeListener&&this.emit("removeListener",n,w.listener||t));else if(typeof w!="function"){for(k=-1,C=w.length-1;C>=0;C--)if(w[C]===t||w[C].listener===t){o=w[C].listener,k=C;break}if(k<0)return this;k===0?w.shift():dn(w,k),w.length===1&&(s[n]=w[0]),s.removeListener!==void 0&&this.emit("removeListener",n,o||t)}return this},fe.prototype.off=fe.prototype.removeListener,fe.prototype.removeAllListeners=function(n){var t,w,s;if(w=this._events,w===void 0)return this;if(w.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):w[n]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete w[n]),this;if(arguments.length===0){var k=Object.keys(w),C;for(s=0;s=0;s--)this.removeListener(n,t[s]);return this};function Zt(l,n,t){var w=l._events;if(w===void 0)return[];var s=w[n];return s===void 0?[]:typeof s=="function"?t?[s.listener||s]:[s]:t?pn(s):Jt(s,s.length)}fe.prototype.listeners=function(n){return Zt(this,n,!0)},fe.prototype.rawListeners=function(n){return Zt(this,n,!1)},fe.listenerCount=function(l,n){return typeof l.listenerCount=="function"?l.listenerCount(n):Gt.call(l,n)},fe.prototype.listenerCount=Gt;function Gt(l){var n=this._events;if(n!==void 0){var t=n[l];if(typeof t=="function")return 1;if(t!==void 0)return t.length}return 0}fe.prototype.eventNames=function(){return this._eventsCount>0?xt(this._events):[]};function Jt(l,n){for(var t=new Array(n),w=0;w - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */class $t{constructor(n){this.el=n}init(){this.el.on("show.bs.dropdown",(n,t)=>{t?i(`#${t}`).find(".dropdown-menu").first().stop(!0,!0).slideDown():i(n.target).find(".dropdown-menu").first().stop(!0,!0).slideDown()}),this.el.on("hide.bs.dropdown",(n,t)=>{t?i(`#${t}`).find(".dropdown-menu").first().stop(!0,!0).slideUp():i(n.target).find(".dropdown-menu").first().stop(!0,!0).slideUp()}),this.el.find("select.link").each((n,t)=>{i(t).on("change",function(){window.location=i(this).val()})})}}/** - * Copyright since 2007 PrestaShop SA and Contributors - * PrestaShop is an International Registered Trademark & Property of PrestaShop SA - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License 3.0 (AFL-3.0) - * that is bundled with this package in the file LICENSE.md. - * It is also available through the world-wide-web at this URL: - * https://opensource.org/licenses/AFL-3.0 - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@prestashop.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade PrestaShop to newer - * versions in the future. If you wish to customize PrestaShop for your - * needs please refer to https://devdocs.prestashop.com/ for more information. - * - * @author PrestaShop SA and Contributors - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */class vn{init(){this.parentFocus(),this.togglePasswordVisibility()}parentFocus(){i(".js-child-focus").on("focus",function(){i(this).closest(".js-parent-focus").addClass("focus")}),i(".js-child-focus").on("focusout",function(){i(this).closest(".js-parent-focus").removeClass("focus")})}togglePasswordVisibility(){i('button[data-action="show-password"]').on("click",function(){const n=i(this).closest(".input-group").children("input.js-visible-password");n.attr("type")==="password"?(n.attr("type","text"),i(this).text(i(this).data("textHide"))):(n.attr("type","password"),i(this).text(i(this).data("textShow")))})}}var Mt={};(function(l){(function(){var n={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[+-]/};function t(o){return s(C(o),arguments)}function w(o,p){return t.apply(null,[o].concat(p||[]))}function s(o,p){var Q=1,_=o.length,u,S="",d,V,O,A,c,N,G,ie;for(d=0;d<_;d++)if(typeof o[d]=="string")S+=o[d];else if(typeof o[d]=="object"){if(O=o[d],O.keys)for(u=p[Q],V=0;V=0),O.type){case"b":u=parseInt(u,10).toString(2);break;case"c":u=String.fromCharCode(parseInt(u,10));break;case"d":case"i":u=parseInt(u,10);break;case"j":u=JSON.stringify(u,null,O.width?parseInt(O.width):0);break;case"e":u=O.precision?parseFloat(u).toExponential(O.precision):parseFloat(u).toExponential();break;case"f":u=O.precision?parseFloat(u).toFixed(O.precision):parseFloat(u);break;case"g":u=O.precision?String(Number(u.toPrecision(O.precision))):parseFloat(u);break;case"o":u=(parseInt(u,10)>>>0).toString(8);break;case"s":u=String(u),u=O.precision?u.substring(0,O.precision):u;break;case"t":u=String(!!u),u=O.precision?u.substring(0,O.precision):u;break;case"T":u=Object.prototype.toString.call(u).slice(8,-1).toLowerCase(),u=O.precision?u.substring(0,O.precision):u;break;case"u":u=parseInt(u,10)>>>0;break;case"v":u=u.valueOf(),u=O.precision?u.substring(0,O.precision):u;break;case"x":u=(parseInt(u,10)>>>0).toString(16);break;case"X":u=(parseInt(u,10)>>>0).toString(16).toUpperCase();break}n.json.test(O.type)?S+=u:(n.number.test(O.type)&&(!G||O.sign)?(ie=G?"+":"-",u=u.toString().replace(n.sign,"")):ie="",c=O.pad_char?O.pad_char==="0"?"0":O.pad_char.charAt(1):" ",N=O.width-(ie+u).length,A=O.width&&N>0?c.repeat(N):"",S+=O.align?ie+u+A:c==="0"?ie+A+u:A+ie+u)}return S}var k=Object.create(null);function C(o){if(k[o])return k[o];for(var p=o,Q,_=[],u=0;p;){if((Q=n.text.exec(p))!==null)_.push(Q[0]);else if((Q=n.modulo.exec(p))!==null)_.push("%");else if((Q=n.placeholder.exec(p))!==null){if(Q[2]){u|=1;var S=[],d=Q[2],V=[];if((V=n.key.exec(d))!==null)for(S.push(V[1]);(d=d.substring(V[0].length))!=="";)if((V=n.key_access.exec(d))!==null)S.push(V[1]);else if((V=n.index_access.exec(d))!==null)S.push(V[1]);else throw new SyntaxError("[sprintf] failed to parse named argument key");else throw new SyntaxError("[sprintf] failed to parse named argument key");Q[2]=S}else u|=2;if(u===3)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");_.push({placeholder:Q[0],param_no:Q[1],keys:Q[2],sign:Q[3],pad_char:Q[4],align:Q[5],width:Q[6],precision:Q[7],type:Q[8]})}else throw new SyntaxError("[sprintf] unexpected placeholder");p=p.substring(Q[0].length)}return k[o]=_}l.sprintf=t,l.vsprintf=w,typeof window<"u"&&(window.sprintf=t,window.vsprintf=w)})()})(Mt);/** - * Copyright since 2007 PrestaShop SA and Contributors - * PrestaShop is an International Registered Trademark & Property of PrestaShop SA - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License 3.0 (AFL-3.0) - * that is bundled with this package in the file LICENSE.md. - * It is also available through the world-wide-web at this URL: - * https://opensource.org/licenses/AFL-3.0 - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@prestashop.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade PrestaShop to newer - * versions in the future. If you wish to customize PrestaShop for your - * needs please refer to https://devdocs.prestashop.com/ for more information. - * - * @author PrestaShop SA and Contributors - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */const{passwordPolicy:$e}=prestashop.themeSelectors,bn="The password policy elements are undefined.",wn=l=>{switch(l){case 0:return{color:"bg-danger"};case 1:return{color:"bg-danger"};case 2:return{color:"bg-warning"};case 3:return{color:"bg-success"};case 4:return{color:"bg-success"};default:throw new Error("Invalid password strength indicator.")}},yn=async(l,n,t)=>{const{prestashop:w}=window,s=l.value,k=n.querySelector($e.requirementScoreIcon),C=await w.checkPasswordScore(s),o=wn(C.score),p=s.length,Q=[];$(l).popover("dispose"),n.style.display=s===""?"none":"block",C.feedback.warning!==""&&C.feedback.warning in t&&Q.push(t[C.feedback.warning]),C.feedback.suggestions.forEach(V=>{V in t&&Q.push(t[V])}),$(l).popover({html:!0,placement:"top",content:Q.join("
")}).popover("show");const _=p>=parseInt(l.dataset.minlength,10)&&p<=parseInt(l.dataset.maxlength,10),u=parseInt(l.dataset.minscore,10)<=C.score;n.querySelector($e.requirementLengthIcon).classList.toggle("text-success",_),k.classList.toggle("text-success",u),l.classList.remove("border-success","border-danger"),l.classList.add(u&&_?"border-success":"border-danger"),l.classList.add("form-control","border");const S=C.score*20+20,d=n.querySelector($e.progressBar);d&&(d.style.width=`${S}%`,d.classList.remove("bg-success","bg-danger","bg-warning"),d.classList.add(o.color))},xn=l=>{document.querySelectorAll(l).forEach(t=>{const w=t==null?void 0:t.querySelector($e.inputColumn),s=t==null?void 0:t.querySelector("input"),k=document.createElement("div"),C=document.querySelector($e.template);let o;if(C&&t&&w&&s&&(k.innerHTML=C.innerHTML,w.append(k),o=t.querySelector($e.container),o)){const p=document.querySelector($e.hint);if(p){const Q=JSON.parse(p.innerHTML),_=o.querySelector($e.requirementLength),u=o.querySelector($e.requirementScore),S=_==null?void 0:_.querySelector("span"),d=u==null?void 0:u.querySelector("span");S&&_&&_.dataset.translation&&(S.innerText=Mt.sprintf(_.dataset.translation,s.dataset.minlength,s.dataset.maxlength)),d&&u&&u.dataset.translation&&(d.innerText=Mt.sprintf(u.dataset.translation,Q[s.dataset.minscore])),s.addEventListener("keyup",()=>yn(s,o,Q)),s.addEventListener("blur",()=>{$(s).popover("dispose")})}}return t?{element:t}:{error:new Error(bn)}})};/** - * Copyright since 2007 PrestaShop SA and Contributors - * PrestaShop is an International Registered Trademark & Property of PrestaShop SA - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License 3.0 (AFL-3.0) - * that is bundled with this package in the file LICENSE.md. - * It is also available through the world-wide-web at this URL: - * https://opensource.org/licenses/AFL-3.0 - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@prestashop.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade PrestaShop to newer - * versions in the future. If you wish to customize PrestaShop for your - * needs please refer to https://devdocs.prestashop.com/ for more information. - * - * @author PrestaShop SA and Contributors - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */class Sn extends $t{init(){let n;const t=this;this.el.find("li").on("mouseenter mouseleave",w=>{if(this.el.parent().hasClass("mobile"))return;const s=i(w.currentTarget).attr("class");n!==s&&(n=Array.prototype.slice.call(w.currentTarget.classList).map(C=>typeof C=="string"?`.${C}`:!1).join(""),n&&i(w.target).data("depth")===0&&i(`${n} .js-sub-menu`).css({top:i(`${n}`).height()+i(`${n}`).position().top}))}),i("#menu-icon").on("click",()=>{i("#mobile_top_menu_wrapper").toggle(),t.toggleMobileMenu()}),this.el.on("click",w=>{this.el.parent().hasClass("mobile")||w.stopPropagation()}),b.on("responsive update",()=>{i(".js-sub-menu").removeAttr("style"),t.toggleMobileMenu()}),super.init()}toggleMobileMenu(){i("#header").toggleClass("is-open"),i("#mobile_top_menu_wrapper").is(":visible")?i("#notifications, #wrapper, #footer").hide():i("#notifications, #wrapper, #footer").show()}}/** - * Copyright since 2007 PrestaShop SA and Contributors - * PrestaShop is an International Registered Trademark & Property of PrestaShop SA - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License 3.0 (AFL-3.0) - * that is bundled with this package in the file LICENSE.md. - * It is also available through the world-wide-web at this URL: - * https://opensource.org/licenses/AFL-3.0 - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@prestashop.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade PrestaShop to newer - * versions in the future. If you wish to customize PrestaShop for your - * needs please refer to https://devdocs.prestashop.com/ for more information. - * - * @author PrestaShop SA and Contributors - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */b.blockcart=b.blockcart||{},b.blockcart.showModal=l=>{function n(){return i("#blockcart-modal")}let t=n();t.length&&t.remove(),i("body").append(l),t=n(),t.modal("show").on("hidden.bs.modal",w=>{b.emit("updateProduct",{reason:w.currentTarget.dataset,event:w})})};/** - * Copyright since 2007 PrestaShop SA and Contributors - * PrestaShop is an International Registered Trademark & Property of PrestaShop SA - * - * NOTICE OF LICENSE - * - * This source file is subject to the Academic Free License 3.0 (AFL-3.0) - * that is bundled with this package in the file LICENSE.md. - * It is also available through the world-wide-web at this URL: - * https://opensource.org/licenses/AFL-3.0 - * If you did not receive a copy of the license and are unable to - * obtain it through the world-wide-web, please send an email - * to license@prestashop.com so we can send you a copy immediately. - * - * DISCLAIMER - * - * Do not edit or add to this file if you wish to upgrade PrestaShop to newer - * versions in the future. If you wish to customize PrestaShop for your - * needs please refer to https://devdocs.prestashop.com/ for more information. - * - * @author PrestaShop SA and Contributors - * @copyright Since 2007 PrestaShop SA and Contributors - * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) - */for(const l in Xt.prototype)b[l]=Xt.prototype[l];i(document).ready(()=>{const l=i(".js-dropdown"),n=new vn,t=i('.js-top-menu ul[data-depth="0"]'),w=new $t(l),s=new Sn(t),k=new qt,C=new Ht;w.init(),n.init(),s.init(),k.init(),C.init(),xn(".field-password-policy"),i('.carousel[data-touch="true"]').swipe({swipe(o,p){p==="left"&&i(this).carousel("next"),p==="right"&&i(this).carousel("prev")},allowPageScroll:"vertical"})})})(jQuery,prestashop); + `; + $$1(prestashop$1.themeSelectors.notifications.container).html(strError); + errorMsg = ""; + isUpdateOperation = false; + if (hasError) { + $checkoutBtn.removeClass("disabled"); + } + } else if (!hasError && isUpdateOperation) { + hasError = false; + isUpdateOperation = false; + $$1(prestashop$1.themeSelectors.notifications.container).html(""); + $checkoutBtn.removeClass("disabled"); + } + }, + checkUpdateOperation: (resp) => { + const { hasError: hasErrorOccurred, errors: errorData } = resp; + hasError = hasErrorOccurred ?? false; + const errors = errorData ?? ""; + if (errors instanceof Array) { + errorMsg = errors.join(" "); + } else { + errorMsg = errors; + } + isUpdateOperation = true; + } + }; + function createSpin() { + $$1.each($$1(spinnerSelector), (index, spinner) => { + $$1(spinner).TouchSpin({ + verticalbuttons: true, + verticalupclass: "material-icons touchspin-up", + verticaldownclass: "material-icons touchspin-down", + buttondown_class: "btn btn-touchspin js-touchspin js-increase-product-quantity", + buttonup_class: "btn btn-touchspin js-touchspin js-decrease-product-quantity", + min: parseInt($$1(spinner).attr("min"), 10), + max: 1e6 + }); + }); + $$1(prestashop$1.themeSelectors.touchspin).off("touchstart.touchspin"); + CheckUpdateQuantityOperations.switchErrorStat(); + } + const preventCustomModalOpen = (event) => { + if (window.shouldPreventModal) { + event.preventDefault(); + return false; + } + return true; + }; + $$1(document).ready(() => { + const productLineInCartSelector = prestashop$1.themeSelectors.cart.productLineQty; + const promises = []; + prestashop$1.on("updateCart", () => { + $$1(prestashop$1.themeSelectors.cart.quickview).modal("hide"); + }); + prestashop$1.on("updatedCart", () => { + window.shouldPreventModal = false; + $$1(prestashop$1.themeSelectors.product.customizationModal).on("show.bs.modal", (modalEvent) => { + preventCustomModalOpen(modalEvent); + }); + createSpin(); + }); + createSpin(); + const $body = $$1("body"); + function isTouchSpin(namespace) { + return namespace === "on.startupspin" || namespace === "on.startdownspin"; + } + function shouldIncreaseProductQuantity(namespace) { + return namespace === "on.startupspin"; + } + function findCartLineProductQuantityInput($target) { + const $input = $target.parents(prestashop$1.themeSelectors.cart.touchspin).find(productLineInCartSelector); + if ($input.is(":focus")) { + return null; + } + return $input; + } + function camelize(subject) { + const actionTypeParts = subject.split("-"); + let i; + let part; + let camelizedSubject = ""; + for (i = 0; i < actionTypeParts.length; i += 1) { + part = actionTypeParts[i]; + if (i !== 0) { + part = part.substring(0, 1).toUpperCase() + part.substring(1); + } + camelizedSubject += part; + } + return camelizedSubject; + } + function parseCartAction($target, namespace) { + if (!isTouchSpin(namespace)) { + return { + url: $target.attr("href"), + type: camelize($target.data("link-action")) + }; + } + const $input = findCartLineProductQuantityInput($target); + if (!$input) { + return false; + } + let cartAction = {}; + if (shouldIncreaseProductQuantity(namespace)) { + cartAction = { + url: $input.data("up-url"), + type: "increaseProductQuantity" + }; + } else { + cartAction = { + url: $input.data("down-url"), + type: "decreaseProductQuantity" + }; + } + return cartAction; + } + const abortPreviousRequests = () => { + let promise; + while (promises.length > 0) { + promise = promises.pop(); + promise.abort(); + } + }; + const getTouchSpinInput = ($button) => $$1($button.parents(prestashop$1.themeSelectors.cart.touchspin).find("input")); + $$1(prestashop$1.themeSelectors.product.customizationModal).on("show.bs.modal", (modalEvent) => { + preventCustomModalOpen(modalEvent); + }); + const handleCartAction = (event) => { + abortPreviousRequests(); + window.shouldPreventModal = true; + event.preventDefault(); + const $target = $$1(event.currentTarget); + const { dataset } = event.currentTarget; + const cartAction = parseCartAction($target, event.namespace); + const requestData = { + ajax: "1", + action: "update" + }; + if (!cartAction) { + return; + } + $$1.ajax({ + url: cartAction.url, + method: "POST", + data: requestData, + dataType: "json", + beforeSend(jqXHR) { + promises.push(jqXHR); + } + }).then((resp) => { + const $quantityInput = getTouchSpinInput($target); + CheckUpdateQuantityOperations.checkUpdateOperation(resp); + $quantityInput.val(resp.quantity); + prestashop$1.emit("updateCart", { + reason: dataset, + resp + }); + }).fail((resp) => { + prestashop$1.emit("handleError", { + eventType: "updateProductInCart", + resp, + cartAction: cartAction.type + }); + }); + }; + $body.on("click", prestashop$1.themeSelectors.cart.actions, handleCartAction); + function sendUpdateQuantityInCartRequest(updateQuantityInCartUrl, requestData, $target) { + abortPreviousRequests(); + window.shouldPreventModal = true; + return $$1.ajax({ + url: updateQuantityInCartUrl, + method: "POST", + data: requestData, + dataType: "json", + beforeSend(jqXHR) { + promises.push(jqXHR); + } + }).then((resp) => { + CheckUpdateQuantityOperations.checkUpdateOperation(resp); + $target.val(resp.quantity); + const dataset = $target && $target.dataset ? $target.dataset : resp; + prestashop$1.emit("updateCart", { + reason: dataset, + resp + }); + }).fail((resp) => { + prestashop$1.emit("handleError", { + eventType: "updateProductQuantityInCart", + resp + }); + }); + } + function getQuantityChangeType($quantity) { + return $quantity > 0 ? "up" : "down"; + } + function getRequestData(quantity) { + return { + ajax: "1", + qty: Math.abs(quantity), + action: "update", + op: getQuantityChangeType(quantity) + }; + } + function updateProductQuantityInCart(event) { + const $target = $$1(event.currentTarget); + const updateQuantityInCartUrl = $target.data("update-url"); + const baseValue = $target.attr("value"); + const targetValue = $target.val(); + if (targetValue != parseInt(targetValue, 10) || targetValue < 0 || isNaN(targetValue)) { + window.shouldPreventModal = false; + $target.val(baseValue); + return; + } + const qty = targetValue - baseValue; + if (qty === 0) { + return; + } + if (targetValue === "0") { + $target.closest(".product-line-actions").find('[data-link-action="delete-from-cart"]').click(); + } else { + $target.attr("value", targetValue); + sendUpdateQuantityInCartRequest(updateQuantityInCartUrl, getRequestData(qty), $target); + } + } + $body.on("touchspin.on.stopspin", spinnerSelector, debounce(updateProductQuantityInCart)); + $body.on("focusout keyup", productLineInCartSelector, (event) => { + if (event.type === "keyup") { + if (event.keyCode === 13) { + isUpdateOperation = true; + updateProductQuantityInCart(event); + } + return false; + } + if (!isUpdateOperation) { + updateProductQuantityInCart(event); + } + return false; + }); + const $timeoutEffect = 400; + $body.on("hidden.bs.collapse", prestashop$1.themeSelectors.cart.promoCode, () => { + $$1(prestashop$1.themeSelectors.cart.displayPromo).show($timeoutEffect); + }); + $body.on("click", prestashop$1.themeSelectors.cart.promoCodeButton, (event) => { + event.preventDefault(); + $$1(prestashop$1.themeSelectors.cart.promoCode).collapse("toggle"); + }); + $body.on("click", prestashop$1.themeSelectors.cart.displayPromo, (event) => { + $$1(event.currentTarget).hide($timeoutEffect); + }); + $body.on("click", prestashop$1.themeSelectors.cart.discountCode, (event) => { + event.stopPropagation(); + const $code = $$1(event.currentTarget); + const $discountInput = $$1(prestashop$1.themeSelectors.cart.discountName); + $discountInput.val($code.text()); + $$1(prestashop$1.themeSelectors.cart.promoCode).collapse("show"); + $$1(prestashop$1.themeSelectors.cart.displayPromo).hide($timeoutEffect); + return false; + }); + }); + var events = { exports: {} }; + var R = typeof Reflect === "object" ? Reflect : null; + var ReflectApply = R && typeof R.apply === "function" ? R.apply : function ReflectApply2(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + }; + var ReflectOwnKeys; + if (R && typeof R.ownKeys === "function") { + ReflectOwnKeys = R.ownKeys; + } else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys2(target) { + return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target)); + }; + } else { + ReflectOwnKeys = function ReflectOwnKeys2(target) { + return Object.getOwnPropertyNames(target); + }; + } + function ProcessEmitWarning(warning) { + if (console && console.warn) + console.warn(warning); + } + var NumberIsNaN = Number.isNaN || function NumberIsNaN2(value) { + return value !== value; + }; + function EventEmitter() { + EventEmitter.init.call(this); + } + events.exports = EventEmitter; + events.exports.once = once; + EventEmitter.EventEmitter = EventEmitter; + EventEmitter.prototype._events = void 0; + EventEmitter.prototype._eventsCount = 0; + EventEmitter.prototype._maxListeners = void 0; + var defaultMaxListeners = 10; + function checkListener(listener) { + if (typeof listener !== "function") { + throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); + } + } + Object.defineProperty(EventEmitter, "defaultMaxListeners", { + enumerable: true, + get: function() { + return defaultMaxListeners; + }, + set: function(arg) { + if (typeof arg !== "number" || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + "."); + } + defaultMaxListeners = arg; + } + }); + EventEmitter.init = function() { + if (this._events === void 0 || this._events === Object.getPrototypeOf(this)._events) { + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + } + this._maxListeners = this._maxListeners || void 0; + }; + EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== "number" || n < 0 || NumberIsNaN(n)) { + throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + "."); + } + this._maxListeners = n; + return this; + }; + function _getMaxListeners(that) { + if (that._maxListeners === void 0) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; + } + EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); + }; + EventEmitter.prototype.emit = function emit(type) { + var args = []; + for (var i = 1; i < arguments.length; i++) + args.push(arguments[i]); + var doError = type === "error"; + var events2 = this._events; + if (events2 !== void 0) + doError = doError && events2.error === void 0; + else if (!doError) + return false; + if (doError) { + var er; + if (args.length > 0) + er = args[0]; + if (er instanceof Error) { + throw er; + } + var err = new Error("Unhandled error." + (er ? " (" + er.message + ")" : "")); + err.context = er; + throw err; + } + var handler = events2[type]; + if (handler === void 0) + return false; + if (typeof handler === "function") { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) + ReflectApply(listeners[i], this, args); + } + return true; + }; + function _addListener(target, type, listener, prepend) { + var m; + var events2; + var existing; + checkListener(listener); + events2 = target._events; + if (events2 === void 0) { + events2 = target._events = /* @__PURE__ */ Object.create(null); + target._eventsCount = 0; + } else { + if (events2.newListener !== void 0) { + target.emit( + "newListener", + type, + listener.listener ? listener.listener : listener + ); + events2 = target._events; + } + existing = events2[type]; + } + if (existing === void 0) { + existing = events2[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === "function") { + existing = events2[type] = prepend ? [listener, existing] : [existing, listener]; + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + var w = new Error("Possible EventEmitter memory leak detected. " + existing.length + " " + String(type) + " listeners added. Use emitter.setMaxListeners() to increase limit"); + w.name = "MaxListenersExceededWarning"; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + return target; + } + EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); + }; + EventEmitter.prototype.on = EventEmitter.prototype.addListener; + EventEmitter.prototype.prependListener = function prependListener(type, listener) { + return _addListener(this, type, listener, true); + }; + function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) + return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } + } + function _onceWrap(target, type, listener) { + var state = { fired: false, wrapFn: void 0, target, type, listener }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; + } + EventEmitter.prototype.once = function once2(type, listener) { + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; + }; + EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; + }; + EventEmitter.prototype.removeListener = function removeListener(type, listener) { + var list, events2, position, i, originalListener; + checkListener(listener); + events2 = this._events; + if (events2 === void 0) + return this; + list = events2[type]; + if (list === void 0) + return this; + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) + this._events = /* @__PURE__ */ Object.create(null); + else { + delete events2[type]; + if (events2.removeListener) + this.emit("removeListener", type, list.listener || listener); + } + } else if (typeof list !== "function") { + position = -1; + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + if (position < 0) + return this; + if (position === 0) + list.shift(); + else { + spliceOne(list, position); + } + if (list.length === 1) + events2[type] = list[0]; + if (events2.removeListener !== void 0) + this.emit("removeListener", type, originalListener || listener); + } + return this; + }; + EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { + var listeners, events2, i; + events2 = this._events; + if (events2 === void 0) + return this; + if (events2.removeListener === void 0) { + if (arguments.length === 0) { + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + } else if (events2[type] !== void 0) { + if (--this._eventsCount === 0) + this._events = /* @__PURE__ */ Object.create(null); + else + delete events2[type]; + } + return this; + } + if (arguments.length === 0) { + var keys = Object.keys(events2); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === "removeListener") + continue; + this.removeAllListeners(key); + } + this.removeAllListeners("removeListener"); + this._events = /* @__PURE__ */ Object.create(null); + this._eventsCount = 0; + return this; + } + listeners = events2[type]; + if (typeof listeners === "function") { + this.removeListener(type, listeners); + } else if (listeners !== void 0) { + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + return this; + }; + function _listeners(target, type, unwrap) { + var events2 = target._events; + if (events2 === void 0) + return []; + var evlistener = events2[type]; + if (evlistener === void 0) + return []; + if (typeof evlistener === "function") + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); + } + EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); + }; + EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); + }; + EventEmitter.listenerCount = function(emitter, type) { + if (typeof emitter.listenerCount === "function") { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } + }; + EventEmitter.prototype.listenerCount = listenerCount; + function listenerCount(type) { + var events2 = this._events; + if (events2 !== void 0) { + var evlistener = events2[type]; + if (typeof evlistener === "function") { + return 1; + } else if (evlistener !== void 0) { + return evlistener.length; + } + } + return 0; + } + EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; + }; + function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) + copy[i] = arr[i]; + return copy; + } + function spliceOne(list, index) { + for (; index + 1 < list.length; index++) + list[index] = list[index + 1]; + list.pop(); + } + function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; + } + function once(emitter, name) { + return new Promise(function(resolve, reject) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } + function resolver() { + if (typeof emitter.removeListener === "function") { + emitter.removeListener("error", errorListener); + } + resolve([].slice.call(arguments)); + } + eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); + if (name !== "error") { + addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); + } + }); + } + function addErrorHandlerIfEventEmitter(emitter, handler, flags) { + if (typeof emitter.on === "function") { + eventTargetAgnosticAddListener(emitter, "error", handler, flags); + } + } + function eventTargetAgnosticAddListener(emitter, name, listener, flags) { + if (typeof emitter.on === "function") { + if (flags.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === "function") { + emitter.addEventListener(name, function wrapListener(arg) { + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); + } else { + throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); + } + } + var eventsExports = events.exports; + const EventEmitter$1 = /* @__PURE__ */ getDefaultExportFromCjs(eventsExports); + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + class DropDown { + constructor(el) { + this.el = el; + } + init() { + this.el.on("show.bs.dropdown", (e, el) => { + if (el) { + $$1(`#${el}`).find(".dropdown-menu").first().stop(true, true).slideDown(); + } else { + $$1(e.target).find(".dropdown-menu").first().stop(true, true).slideDown(); + } + }); + this.el.on("hide.bs.dropdown", (e, el) => { + if (el) { + $$1(`#${el}`).find(".dropdown-menu").first().stop(true, true).slideUp(); + } else { + $$1(e.target).find(".dropdown-menu").first().stop(true, true).slideUp(); + } + }); + this.el.find("select.link").each((idx, el) => { + $$1(el).on("change", function() { + window.location = $$1(this).val(); + }); + }); + } + } + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + class Form { + init() { + this.parentFocus(); + this.togglePasswordVisibility(); + } + parentFocus() { + $$1(".js-child-focus").on("focus", function() { + $$1(this).closest(".js-parent-focus").addClass("focus"); + }); + $$1(".js-child-focus").on("focusout", function() { + $$1(this).closest(".js-parent-focus").removeClass("focus"); + }); + } + togglePasswordVisibility() { + $$1('button[data-action="show-password"]').on("click", function() { + const elm = $$1(this).closest(".input-group").children("input.js-visible-password"); + if (elm.attr("type") === "password") { + elm.attr("type", "text"); + $$1(this).text($$1(this).data("textHide")); + } else { + elm.attr("type", "password"); + $$1(this).text($$1(this).data("textShow")); + } + }); + } + } + var sprintf = {}; + (function(exports) { + !function() { + var re = { + not_string: /[^s]/, + not_bool: /[^t]/, + not_type: /[^T]/, + not_primitive: /[^v]/, + number: /[diefg]/, + numeric_arg: /[bcdiefguxX]/, + json: /[j]/, + not_json: /[^j]/, + text: /^[^\x25]+/, + modulo: /^\x25{2}/, + placeholder: /^\x25(?:([1-9]\d*)\$|\(([^)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/, + key: /^([a-z_][a-z_\d]*)/i, + key_access: /^\.([a-z_][a-z_\d]*)/i, + index_access: /^\[(\d+)\]/, + sign: /^[+-]/ + }; + function sprintf2(key) { + return sprintf_format(sprintf_parse(key), arguments); + } + function vsprintf(fmt, argv) { + return sprintf2.apply(null, [fmt].concat(argv || [])); + } + function sprintf_format(parse_tree, argv) { + var cursor = 1, tree_length = parse_tree.length, arg, output = "", i, k, ph, pad, pad_character, pad_length, is_positive, sign; + for (i = 0; i < tree_length; i++) { + if (typeof parse_tree[i] === "string") { + output += parse_tree[i]; + } else if (typeof parse_tree[i] === "object") { + ph = parse_tree[i]; + if (ph.keys) { + arg = argv[cursor]; + for (k = 0; k < ph.keys.length; k++) { + if (arg == void 0) { + throw new Error(sprintf2('[sprintf] Cannot access property "%s" of undefined value "%s"', ph.keys[k], ph.keys[k - 1])); + } + arg = arg[ph.keys[k]]; + } + } else if (ph.param_no) { + arg = argv[ph.param_no]; + } else { + arg = argv[cursor++]; + } + if (re.not_type.test(ph.type) && re.not_primitive.test(ph.type) && arg instanceof Function) { + arg = arg(); + } + if (re.numeric_arg.test(ph.type) && (typeof arg !== "number" && isNaN(arg))) { + throw new TypeError(sprintf2("[sprintf] expecting number but found %T", arg)); + } + if (re.number.test(ph.type)) { + is_positive = arg >= 0; + } + switch (ph.type) { + case "b": + arg = parseInt(arg, 10).toString(2); + break; + case "c": + arg = String.fromCharCode(parseInt(arg, 10)); + break; + case "d": + case "i": + arg = parseInt(arg, 10); + break; + case "j": + arg = JSON.stringify(arg, null, ph.width ? parseInt(ph.width) : 0); + break; + case "e": + arg = ph.precision ? parseFloat(arg).toExponential(ph.precision) : parseFloat(arg).toExponential(); + break; + case "f": + arg = ph.precision ? parseFloat(arg).toFixed(ph.precision) : parseFloat(arg); + break; + case "g": + arg = ph.precision ? String(Number(arg.toPrecision(ph.precision))) : parseFloat(arg); + break; + case "o": + arg = (parseInt(arg, 10) >>> 0).toString(8); + break; + case "s": + arg = String(arg); + arg = ph.precision ? arg.substring(0, ph.precision) : arg; + break; + case "t": + arg = String(!!arg); + arg = ph.precision ? arg.substring(0, ph.precision) : arg; + break; + case "T": + arg = Object.prototype.toString.call(arg).slice(8, -1).toLowerCase(); + arg = ph.precision ? arg.substring(0, ph.precision) : arg; + break; + case "u": + arg = parseInt(arg, 10) >>> 0; + break; + case "v": + arg = arg.valueOf(); + arg = ph.precision ? arg.substring(0, ph.precision) : arg; + break; + case "x": + arg = (parseInt(arg, 10) >>> 0).toString(16); + break; + case "X": + arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase(); + break; + } + if (re.json.test(ph.type)) { + output += arg; + } else { + if (re.number.test(ph.type) && (!is_positive || ph.sign)) { + sign = is_positive ? "+" : "-"; + arg = arg.toString().replace(re.sign, ""); + } else { + sign = ""; + } + pad_character = ph.pad_char ? ph.pad_char === "0" ? "0" : ph.pad_char.charAt(1) : " "; + pad_length = ph.width - (sign + arg).length; + pad = ph.width ? pad_length > 0 ? pad_character.repeat(pad_length) : "" : ""; + output += ph.align ? sign + arg + pad : pad_character === "0" ? sign + pad + arg : pad + sign + arg; + } + } + } + return output; + } + var sprintf_cache = /* @__PURE__ */ Object.create(null); + function sprintf_parse(fmt) { + if (sprintf_cache[fmt]) { + return sprintf_cache[fmt]; + } + var _fmt = fmt, match, parse_tree = [], arg_names = 0; + while (_fmt) { + if ((match = re.text.exec(_fmt)) !== null) { + parse_tree.push(match[0]); + } else if ((match = re.modulo.exec(_fmt)) !== null) { + parse_tree.push("%"); + } else if ((match = re.placeholder.exec(_fmt)) !== null) { + if (match[2]) { + arg_names |= 1; + var field_list = [], replacement_field = match[2], field_match = []; + if ((field_match = re.key.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + while ((replacement_field = replacement_field.substring(field_match[0].length)) !== "") { + if ((field_match = re.key_access.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } else if ((field_match = re.index_access.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } else { + throw new SyntaxError("[sprintf] failed to parse named argument key"); + } + } + } else { + throw new SyntaxError("[sprintf] failed to parse named argument key"); + } + match[2] = field_list; + } else { + arg_names |= 2; + } + if (arg_names === 3) { + throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported"); + } + parse_tree.push( + { + placeholder: match[0], + param_no: match[1], + keys: match[2], + sign: match[3], + pad_char: match[4], + align: match[5], + width: match[6], + precision: match[7], + type: match[8] + } + ); + } else { + throw new SyntaxError("[sprintf] unexpected placeholder"); + } + _fmt = _fmt.substring(match[0].length); + } + return sprintf_cache[fmt] = parse_tree; + } + { + exports["sprintf"] = sprintf2; + exports["vsprintf"] = vsprintf; + } + if (typeof window !== "undefined") { + window["sprintf"] = sprintf2; + window["vsprintf"] = vsprintf; + } + }(); + })(sprintf); + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + const { passwordPolicy: PasswordPolicyMap } = prestashop.themeSelectors; + const PASSWORD_POLICY_ERROR = "The password policy elements are undefined."; + const getPasswordStrengthFeedback = (strength) => { + switch (strength) { + case 0: + return { + color: "bg-danger" + }; + case 1: + return { + color: "bg-danger" + }; + case 2: + return { + color: "bg-warning" + }; + case 3: + return { + color: "bg-success" + }; + case 4: + return { + color: "bg-success" + }; + default: + throw new Error("Invalid password strength indicator."); + } + }; + const watchPassword = async (elementInput, feedbackContainer, hints) => { + const { prestashop: prestashop2 } = window; + const passwordValue = elementInput.value; + const elementIcon = feedbackContainer.querySelector(PasswordPolicyMap.requirementScoreIcon); + const result = await prestashop2.checkPasswordScore(passwordValue); + const feedback = getPasswordStrengthFeedback(result.score); + const passwordLength = passwordValue.length; + const popoverContent = []; + $(elementInput).popover("dispose"); + feedbackContainer.style.display = passwordValue === "" ? "none" : "block"; + if (result.feedback.warning !== "") { + if (result.feedback.warning in hints) { + popoverContent.push(hints[result.feedback.warning]); + } + } + result.feedback.suggestions.forEach((suggestion) => { + if (suggestion in hints) { + popoverContent.push(hints[suggestion]); + } + }); + $(elementInput).popover({ + html: true, + placement: "top", + content: popoverContent.join("
") + }).popover("show"); + const passwordLengthValid = passwordLength >= parseInt(elementInput.dataset.minlength, 10) && passwordLength <= parseInt(elementInput.dataset.maxlength, 10); + const passwordScoreValid = parseInt(elementInput.dataset.minscore, 10) <= result.score; + feedbackContainer.querySelector(PasswordPolicyMap.requirementLengthIcon).classList.toggle( + "text-success", + passwordLengthValid + ); + elementIcon.classList.toggle( + "text-success", + passwordScoreValid + ); + elementInput.classList.remove("border-success", "border-danger"); + elementInput.classList.add(passwordScoreValid && passwordLengthValid ? "border-success" : "border-danger"); + elementInput.classList.add("form-control", "border"); + const percentage = result.score * 20 + 20; + const progressBar = feedbackContainer.querySelector(PasswordPolicyMap.progressBar); + if (progressBar) { + progressBar.style.width = `${percentage}%`; + progressBar.classList.remove("bg-success", "bg-danger", "bg-warning"); + progressBar.classList.add(feedback.color); + } + }; + const usePasswordPolicy = (selector) => { + const elements = document.querySelectorAll(selector); + elements.forEach((element) => { + const inputColumn = element == null ? void 0 : element.querySelector(PasswordPolicyMap.inputColumn); + const elementInput = element == null ? void 0 : element.querySelector("input"); + const templateElement = document.createElement("div"); + const feedbackTemplate = document.querySelector(PasswordPolicyMap.template); + let feedbackContainer; + if (feedbackTemplate && element && inputColumn && elementInput) { + templateElement.innerHTML = feedbackTemplate.innerHTML; + inputColumn.append(templateElement); + feedbackContainer = element.querySelector(PasswordPolicyMap.container); + if (feedbackContainer) { + const hintElement = document.querySelector(PasswordPolicyMap.hint); + if (hintElement) { + const hints = JSON.parse(hintElement.innerHTML); + const passwordRequirementsLength = feedbackContainer.querySelector(PasswordPolicyMap.requirementLength); + const passwordRequirementsScore = feedbackContainer.querySelector(PasswordPolicyMap.requirementScore); + const passwordLengthText = passwordRequirementsLength == null ? void 0 : passwordRequirementsLength.querySelector("span"); + const passwordRequirementsText = passwordRequirementsScore == null ? void 0 : passwordRequirementsScore.querySelector("span"); + if (passwordLengthText && passwordRequirementsLength && passwordRequirementsLength.dataset.translation) { + passwordLengthText.innerText = sprintf.sprintf( + passwordRequirementsLength.dataset.translation, + elementInput.dataset.minlength, + elementInput.dataset.maxlength + ); + } + if (passwordRequirementsText && passwordRequirementsScore && passwordRequirementsScore.dataset.translation) { + passwordRequirementsText.innerText = sprintf.sprintf( + passwordRequirementsScore.dataset.translation, + hints[elementInput.dataset.minscore] + ); + } + elementInput.addEventListener("keyup", () => watchPassword(elementInput, feedbackContainer, hints)); + elementInput.addEventListener("blur", () => { + $(elementInput).popover("dispose"); + }); + } + } + } + if (element) { + return { + element + }; + } + return { + error: new Error(PASSWORD_POLICY_ERROR) + }; + }); + }; + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + class TopMenu extends DropDown { + init() { + let elmtClass; + const self2 = this; + this.el.find("li").on("mouseenter mouseleave", (e) => { + if (this.el.parent().hasClass("mobile")) { + return; + } + const currentTargetClass = $$1(e.currentTarget).attr("class"); + if (elmtClass !== currentTargetClass) { + const classesSelected = Array.prototype.slice.call(e.currentTarget.classList).map((elem) => typeof elem === "string" ? `.${elem}` : false); + elmtClass = classesSelected.join(""); + if (elmtClass && $$1(e.target).data("depth") === 0) { + $$1(`${elmtClass} .js-sub-menu`).css({ + top: $$1(`${elmtClass}`).height() + $$1(`${elmtClass}`).position().top + }); + } + } + }); + $$1("#menu-icon").on("click", () => { + $$1("#mobile_top_menu_wrapper").toggle(); + self2.toggleMobileMenu(); + }); + this.el.on("click", (e) => { + if (this.el.parent().hasClass("mobile")) { + return; + } + e.stopPropagation(); + }); + prestashop$1.on("responsive update", () => { + $$1(".js-sub-menu").removeAttr("style"); + self2.toggleMobileMenu(); + }); + super.init(); + } + toggleMobileMenu() { + $$1("#header").toggleClass("is-open"); + if ($$1("#mobile_top_menu_wrapper").is(":visible")) { + $$1("#notifications, #wrapper, #footer").hide(); + } else { + $$1("#notifications, #wrapper, #footer").show(); + } + } + } + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + prestashop$1.blockcart = prestashop$1.blockcart || {}; + prestashop$1.blockcart.showModal = (html) => { + function getBlockCartModal() { + return $$1("#blockcart-modal"); + } + let $blockCartModal = getBlockCartModal(); + if ($blockCartModal.length) { + $blockCartModal.remove(); + } + $$1("body").append(html); + $blockCartModal = getBlockCartModal(); + $blockCartModal.modal("show").on("hidden.bs.modal", (event) => { + prestashop$1.emit("updateProduct", { + reason: event.currentTarget.dataset, + event + }); + }); + }; + var jquery_offcanvas_min = { exports: {} }; + (function(module) { + !function(t, e) { + module.exports = function(t2, s) { + return void 0 === s && (s = "undefined" != typeof window ? $$1 : $$1(t2)), e(s), s; + }; + }(commonjsGlobal, function(t) { + function e(t2, e2, s2) { + var i2; + return function() { + var n = this, o = arguments, h = function() { + i2 = null, s2 || t2.apply(n, o); + }, a = s2 && !i2; + clearTimeout(i2), i2 = setTimeout(h, e2), a && t2.apply(n, o); + }; + } + function s(e2, s2) { + var n, o, h = t(e2).data(); + this.$el = t(e2); + for (n in h) + h.hasOwnProperty(n) && /^offcanvas[A-Z]+/.test(n) && (o = n[i.length].toLowerCase() + n.substr(i.length + 1), h[o] = h[n]); + this.settings = t.extend(true, {}, t.fn[i].defaults, s2, h), this.name = i, this.$el.data(this.name + ".opts", this.settings), this.init(); + } + var i = "offcanvas"; + t.extend(s.prototype, { setHeights: function() { + var t2 = this.$outerWrapper.height(); + this.$el.data(this.name + ".opts") && (this.$element.css("height", t2), this.settings.overlay && this.$overlay.css("height", t2)); + }, show: function() { + var e2 = {}; + this.visible || (this.$cont.addClass(this.settings.classes.open), this.visible = true, this.$el.trigger("show." + this.name), this.$el.trigger("toggle." + this.name, this.visible), this.setHeights(), e2[this.settings.origin] = this.effects[this.settings.effect].to, this.effects[this.settings.effect].$el.velocity(e2, t.extend({ complete: (function() { + this.$el.trigger("shown." + this.name), this.settings.overlay && this.$overlay.one("click." + this.name, (function() { + this.hide(); + }).bind(this)); + }).bind(this) }, this.animationOptions)), this.settings.overlay && this.$overlay.velocity({ opacity: 1 }, t.extend({ display: "block" }, this.animationOptions))); + }, hide: function() { + this.visible && (this.$cont.removeClass(this.settings.classes.open), this.visible = false, this.$el.trigger("hide." + this.name), this.$el.trigger("toggle." + this.name, this.visible), this.effects[this.settings.effect].$el.velocity("stop").velocity("reverse", t.extend({ complete: (function() { + this.$el.trigger("hidden." + this.name); + }).bind(this) }, this.animationOptions)), this.settings.overlay && this.$overlay.velocity("stop").velocity("reverse", t.extend({ display: "none" }, this.animationOptions))); + }, toggle: function() { + return (this.visible ? this.hide : this.show).call(this); + }, destroy: function() { + this.$el.data(this.name + ".opts") && (this.$innerWrapper.unwrap(), this.$innerWrapper.children().unwrap(), this.$cont.removeClass(this.settings.classes.container).removeClass(this.settings.classes.open), this.settings.overlay && this.$overlay.off("click." + this.name).remove(), this.$el.unwrap().removeData(this.name + ".opts").removeAttr("style"), this.$win.off("resize." + this.name)); + }, init: function() { + var s2 = {}; + this.$win = t(window), this.$body = t("body"), this.visible = false, this.$cont = t(this.settings.container), this.$cont.addClass(this.settings.classes.container).children(":not(script)").wrapAll(t("
").addClass(this.settings.classes.outer)), this.$outerWrapper = t("." + this.settings.classes.outer).wrapInner(t("
").addClass(this.settings.classes.inner)), this.$innerWrapper = t("." + this.settings.classes.inner), this.settings.overlay && (this.$innerWrapper.append(t("
").addClass(this.settings.classes.overlay).css("background-color", this.settings.overlayColor)), this.$overlay = t("." + this.settings.classes.overlay)), this.$el.wrap(t("
").addClass(this.settings.classes.element)), this.$element = this.$el.parent(), s2[this.settings.origin] = "-" + this.settings.coverage, s2.width = this.settings.coverage, this.$element.css(s2), this.effects = { push: { $el: this.$innerWrapper, from: 0, to: this.settings.coverage }, "slide-in-over": { $el: this.$element, from: "-" + this.settings.coverage, to: 0 } }, this.animationOptions = { easing: this.settings.easing, duration: this.settings.duration }, this.$win.on("resize." + this.name, e(this.setHeights, 300).bind(this)), this.setHeights(), this.$el.trigger("init." + this.name); + } }), t.fn[i] = function(e2) { + var n, o = arguments; + return void 0 === e2 || "object" == typeof e2 ? this.each(function() { + t.data(this, "plugin_" + i) || t.data(this, "plugin_" + i, new s(this, e2)); + }) : "string" == typeof e2 && "_" !== e2[0] && "init" !== e2 && (this.each(function() { + var h = t.data(this, "plugin_" + i); + h instanceof s && "function" == typeof h[e2] && (n = h[e2].apply(h, Array.prototype.slice.call(o, 1))), "destroy" === e2 && t.data(this, "plugin_" + i, null); + }), void 0 !== n ? n : this); + }, t.fn[i].defaults = { classes: { container: i, element: i + "-element", inner: i + "-inner", open: i + "-open", outer: i + "-outer", overlay: i + "-overlay" }, container: "body", coverage: "220px", origin: "left", duration: 300, easing: "ease-in-out", effect: "push", overlay: false, overlayColor: "rgba(0, 0, 0, 0.7)" }; + }); + })(jquery_offcanvas_min); + var jquery_offcanvas_minExports = jquery_offcanvas_min.exports; + const jo = /* @__PURE__ */ getDefaultExportFromCjs(jquery_offcanvas_minExports); + /** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + jo(window, $$1); + touchspin(window, $$1); + for (const i in EventEmitter$1.prototype) { + prestashop$1[i] = EventEmitter$1.prototype[i]; + } + $$1(function() { + const dropDownEl = $$1(".js-dropdown"); + const form = new Form(); + const topMenuEl = $$1('.js-top-menu ul[data-depth="0"]'); + const dropDown = new DropDown(dropDownEl); + const topMenu = new TopMenu(topMenuEl); + const productMinitature = new ProductMinitature(); + const productSelect = new ProductSelect(); + dropDown.init(); + form.init(); + topMenu.init(); + productMinitature.init(); + productSelect.init(); + usePasswordPolicy(".field-password-policy"); + $$1('.carousel[data-touch="true"]').swipe({ + swipe(event, direction) { + if (direction === "left") { + $$1(this).carousel("next"); + } + if (direction === "right") { + $$1(this).carousel("prev"); + } + }, + allowPageScroll: "vertical" + }); + $$1("#product-list-top-filters").offcanvas({ + effect: "slide-in-over", + overlay: true, + classes: { + element: "absolute top-0 z-50" + } + }); + $$1("#show-filters").on("click.offcanvas", function() { + $$1("#product-list-top-filters").offcanvas("toggle"); + }); + $$1("#product-list-top-filters").on("shown.offcanvas", function() { + $$1("#product-list-top-filters").show(); + }); + $$1("#product-list-top-filters").on("hide.offcanvas", function() { + $$1("#product-list-top-filters").hide(); + }); + function ThAccordion() { + } + $$1.extend(ThAccordion.prototype, { + init() { + } + }); + $$1.fn["thaccordion"] = function() { + var selectors = { + root: ".th-accordion", + item: ".th-accordion-item", + trigger: ".th-accordion-item-trigger", + content: ".th-accordion-item-content" + }; + let selection = null; + let items = this.find(selectors.item); + function collapseAll() { + items.each(function() { + $$1(this).find(selectors.content).hide(500); + }); + } + function open() { + collapseAll(); + $$1(selection).find(selectors.content).show(500); + } + function isOpen(item) { + return $$1(item).find(selectors.content).is(":visible"); + } + collapseAll(); + items.each(function() { + var self2 = this; + $$1(this).find(selectors.trigger).on("click", function() { + if (selection === self2) { + selection = null; + } else { + selection = self2; + if (!isOpen(selection)) { + open(); + } + } + }); + }); + }; + $$1(".th-accordion").thaccordion(); + }); +})(jQuery, prestashop); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuanMiLCJzb3VyY2VzIjpbIi4uLy4uL19kZXYvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC10b3VjaHNwaW4vZGlzdC9qcXVlcnkuYm9vdHN0cmFwLXRvdWNoc3Bpbi5qcyIsIi4uLy4uL19kZXYvbm9kZV9tb2R1bGVzL2pxdWVyeS10b3VjaHN3aXBlL2pxdWVyeS50b3VjaFN3aXBlLm1pbi5qcyIsIi4uLy4uL19kZXYvanMvc2VsZWN0b3JzLmpzIiwiLi4vLi4vX2Rldi9qcy9yZXNwb25zaXZlLmpzIiwiLi4vLi4vX2Rldi9qcy9jaGVja291dC5qcyIsIi4uLy4uL19kZXYvanMvY3VzdG9tZXIuanMiLCIuLi8uLi9fZGV2L25vZGVfbW9kdWxlcy92ZWxvY2l0eS1hbmltYXRlL3ZlbG9jaXR5LmpzIiwiLi4vLi4vX2Rldi9qcy9jb21wb25lbnRzL3VwZGF0ZS1zb3VyY2VzLmpzIiwiLi4vLi4vX2Rldi9qcy9jb21wb25lbnRzL3Byb2R1Y3QtbWluaWF0dXJlLmpzIiwiLi4vLi4vX2Rldi9qcy9saXN0aW5nLmpzIiwiLi4vLi4vX2Rldi9qcy9jb21wb25lbnRzL3Byb2R1Y3Qtc2VsZWN0LmpzIiwiLi4vLi4vX2Rldi9qcy9wcm9kdWN0LmpzIiwiLi4vLi4vX2Rldi9qcy9jb21wb25lbnRzL2RlYm91bmNlLmpzIiwiLi4vLi4vX2Rldi9qcy9jYXJ0LmpzIiwiLi4vLi4vX2Rldi9ub2RlX21vZHVsZXMvZXZlbnRzL2V2ZW50cy5qcyIsIi4uLy4uL19kZXYvanMvY29tcG9uZW50cy9kcm9wLWRvd24uanMiLCIuLi8uLi9fZGV2L2pzL2NvbXBvbmVudHMvZm9ybS5qcyIsIi4uLy4uL19kZXYvbm9kZV9tb2R1bGVzL3NwcmludGYtanMvc3JjL3NwcmludGYuanMiLCIuLi8uLi9fZGV2L2pzL2NvbXBvbmVudHMvdXNlUGFzc3dvcmRQb2xpY3kuanMiLCIuLi8uLi9fZGV2L2pzL2NvbXBvbmVudHMvdG9wLW1lbnUuanMiLCIuLi8uLi9fZGV2L2pzL2NvbXBvbmVudHMvYmxvY2stY2FydC5qcyIsIi4uLy4uL19kZXYvbm9kZV9tb2R1bGVzL2pxdWVyeS1vZmZjYW52YXMvZGlzdC9qcXVlcnkub2ZmY2FudmFzLm1pbi5qcyIsIi4uLy4uL19kZXYvanMvdGhlbWUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7IFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjsgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgU3ltYm9sICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9LCBfdHlwZW9mKG9iaik7IH1cbi8qXHJcbiAqICBCb290c3RyYXAgVG91Y2hzcGluIC0gdjQuNy4zXHJcbiAqICBBIG1vYmlsZSBhbmQgdG91Y2ggZnJpZW5kbHkgaW5wdXQgc3Bpbm5lciBjb21wb25lbnQgZm9yIEJvb3RzdHJhcCAzICYgNC5cclxuICogIGh0dHBzOi8vd3d3LnZpcnR1b3NvZnQuZXUvY29kZS9ib290c3RyYXAtdG91Y2hzcGluL1xyXG4gKlxyXG4gKiAgTWFkZSBieSBJc3R2w6FuIFVqai1Nw6lzesOhcm9zXHJcbiAqICBVbmRlciBNSVQgTGljZW5zZVxyXG4gKi9cbihmdW5jdGlvbiAoZmFjdG9yeSkge1xuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKCh0eXBlb2YgbW9kdWxlID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YobW9kdWxlKSkgPT09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAocm9vdCwgalF1ZXJ5KSB7XG4gICAgICBpZiAoalF1ZXJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgalF1ZXJ5ID0gcmVxdWlyZSgnanF1ZXJ5Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgalF1ZXJ5ID0gcmVxdWlyZSgnanF1ZXJ5Jykocm9vdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZhY3RvcnkoalF1ZXJ5KTtcbiAgICAgIHJldHVybiBqUXVlcnk7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBmYWN0b3J5KGpRdWVyeSk7XG4gIH1cbn0pKGZ1bmN0aW9uICgkKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgX2N1cnJlbnRTcGlubmVySWQgPSAwO1xuICAkLmZuLlRvdWNoU3BpbiA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgdmFyIGRlZmF1bHRzID0ge1xuICAgICAgbWluOiAwLFxuICAgICAgLy8gSWYgbnVsbCwgdGhlcmUgaXMgbm8gbWluaW11bSBlbmZvcmNlZFxuICAgICAgbWF4OiAxMDAsXG4gICAgICAvLyBJZiBudWxsLCB0aGVyZSBpcyBubyBtYXhpbXVtIGVuZm9yY2VkXG4gICAgICBpbml0dmFsOiAnJyxcbiAgICAgIHJlcGxhY2VtZW50dmFsOiAnJyxcbiAgICAgIGZpcnN0Y2xpY2t2YWx1ZWlmZW1wdHk6IG51bGwsXG4gICAgICBzdGVwOiAxLFxuICAgICAgZGVjaW1hbHM6IDAsXG4gICAgICBzdGVwaW50ZXJ2YWw6IDEwMCxcbiAgICAgIGZvcmNlc3RlcGRpdmlzaWJpbGl0eTogJ3JvdW5kJyxcbiAgICAgIC8vIG5vbmUgfCBmbG9vciB8IHJvdW5kIHwgY2VpbFxuICAgICAgc3RlcGludGVydmFsZGVsYXk6IDUwMCxcbiAgICAgIHZlcnRpY2FsYnV0dG9uczogZmFsc2UsXG4gICAgICB2ZXJ0aWNhbHVwOiAnJnBsdXM7JyxcbiAgICAgIHZlcnRpY2FsZG93bjogJyZtaW51czsnLFxuICAgICAgdmVydGljYWx1cGNsYXNzOiAnJyxcbiAgICAgIHZlcnRpY2FsZG93bmNsYXNzOiAnJyxcbiAgICAgIHByZWZpeDogJycsXG4gICAgICBwb3N0Zml4OiAnJyxcbiAgICAgIHByZWZpeF9leHRyYWNsYXNzOiAnJyxcbiAgICAgIHBvc3RmaXhfZXh0cmFjbGFzczogJycsXG4gICAgICBib29zdGVyOiB0cnVlLFxuICAgICAgYm9vc3RhdDogMTAsXG4gICAgICBtYXhib29zdGVkc3RlcDogZmFsc2UsXG4gICAgICBtb3VzZXdoZWVsOiB0cnVlLFxuICAgICAgYnV0dG9uZG93bl9jbGFzczogJ2J0biBidG4tcHJpbWFyeScsXG4gICAgICBidXR0b251cF9jbGFzczogJ2J0biBidG4tcHJpbWFyeScsXG4gICAgICBidXR0b25kb3duX3R4dDogJyZtaW51czsnLFxuICAgICAgYnV0dG9udXBfdHh0OiAnJnBsdXM7JyxcbiAgICAgIGNhbGxiYWNrX2JlZm9yZV9jYWxjdWxhdGlvbjogZnVuY3Rpb24gY2FsbGJhY2tfYmVmb3JlX2NhbGN1bGF0aW9uKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICBjYWxsYmFja19hZnRlcl9jYWxjdWxhdGlvbjogZnVuY3Rpb24gY2FsbGJhY2tfYWZ0ZXJfY2FsY3VsYXRpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH07XG4gICAgdmFyIGF0dHJpYnV0ZU1hcCA9IHtcbiAgICAgIG1pbjogJ21pbicsXG4gICAgICBtYXg6ICdtYXgnLFxuICAgICAgaW5pdHZhbDogJ2luaXQtdmFsJyxcbiAgICAgIHJlcGxhY2VtZW50dmFsOiAncmVwbGFjZW1lbnQtdmFsJyxcbiAgICAgIGZpcnN0Y2xpY2t2YWx1ZWlmZW1wdHk6ICdmaXJzdC1jbGljay12YWx1ZS1pZi1lbXB0eScsXG4gICAgICBzdGVwOiAnc3RlcCcsXG4gICAgICBkZWNpbWFsczogJ2RlY2ltYWxzJyxcbiAgICAgIHN0ZXBpbnRlcnZhbDogJ3N0ZXAtaW50ZXJ2YWwnLFxuICAgICAgdmVydGljYWxidXR0b25zOiAndmVydGljYWwtYnV0dG9ucycsXG4gICAgICB2ZXJ0aWNhbHVwY2xhc3M6ICd2ZXJ0aWNhbC11cC1jbGFzcycsXG4gICAgICB2ZXJ0aWNhbGRvd25jbGFzczogJ3ZlcnRpY2FsLWRvd24tY2xhc3MnLFxuICAgICAgZm9yY2VzdGVwZGl2aXNpYmlsaXR5OiAnZm9yY2Utc3RlcC1kaXZpc2liaWxpdHknLFxuICAgICAgc3RlcGludGVydmFsZGVsYXk6ICdzdGVwLWludGVydmFsLWRlbGF5JyxcbiAgICAgIHByZWZpeDogJ3ByZWZpeCcsXG4gICAgICBwb3N0Zml4OiAncG9zdGZpeCcsXG4gICAgICBwcmVmaXhfZXh0cmFjbGFzczogJ3ByZWZpeC1leHRyYS1jbGFzcycsXG4gICAgICBwb3N0Zml4X2V4dHJhY2xhc3M6ICdwb3N0Zml4LWV4dHJhLWNsYXNzJyxcbiAgICAgIGJvb3N0ZXI6ICdib29zdGVyJyxcbiAgICAgIGJvb3N0YXQ6ICdib29zdGF0JyxcbiAgICAgIG1heGJvb3N0ZWRzdGVwOiAnbWF4LWJvb3N0ZWQtc3RlcCcsXG4gICAgICBtb3VzZXdoZWVsOiAnbW91c2Utd2hlZWwnLFxuICAgICAgYnV0dG9uZG93bl9jbGFzczogJ2J1dHRvbi1kb3duLWNsYXNzJyxcbiAgICAgIGJ1dHRvbnVwX2NsYXNzOiAnYnV0dG9uLXVwLWNsYXNzJyxcbiAgICAgIGJ1dHRvbmRvd25fdHh0OiAnYnV0dG9uLWRvd24tdHh0JyxcbiAgICAgIGJ1dHRvbnVwX3R4dDogJ2J1dHRvbi11cC10eHQnXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzZXR0aW5ncyxcbiAgICAgICAgb3JpZ2luYWxpbnB1dCA9ICQodGhpcyksXG4gICAgICAgIG9yaWdpbmFsaW5wdXRfZGF0YSA9IG9yaWdpbmFsaW5wdXQuZGF0YSgpLFxuICAgICAgICBfZGV0YWNoZWRfcHJlZml4LFxuICAgICAgICBfZGV0YWNoZWRfcG9zdGZpeCxcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgdmVydGljYWxidXR0b25zX2h0bWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBkb3duU3BpblRpbWVyLFxuICAgICAgICB1cFNwaW5UaW1lcixcbiAgICAgICAgZG93bkRlbGF5VGltZW91dCxcbiAgICAgICAgdXBEZWxheVRpbWVvdXQsXG4gICAgICAgIHNwaW5jb3VudCA9IDAsXG4gICAgICAgIHNwaW5uaW5nID0gZmFsc2U7XG4gICAgICBpbml0KCk7XG4gICAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICBpZiAob3JpZ2luYWxpbnB1dC5kYXRhKCdhbHJlYWR5aW5pdGlhbGl6ZWQnKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvcmlnaW5hbGlucHV0LmRhdGEoJ2FscmVhZHlpbml0aWFsaXplZCcsIHRydWUpO1xuICAgICAgICBfY3VycmVudFNwaW5uZXJJZCArPSAxO1xuICAgICAgICBvcmlnaW5hbGlucHV0LmRhdGEoJ3NwaW5uZXJpZCcsIF9jdXJyZW50U3Bpbm5lcklkKTtcbiAgICAgICAgaWYgKCFvcmlnaW5hbGlucHV0LmlzKCdpbnB1dCcpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ011c3QgYmUgYW4gaW5wdXQuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIF9pbml0U2V0dGluZ3MoKTtcbiAgICAgICAgX3NldEluaXR2YWwoKTtcbiAgICAgICAgX2NoZWNrVmFsdWUoKTtcbiAgICAgICAgX2J1aWxkSHRtbCgpO1xuICAgICAgICBfaW5pdEVsZW1lbnRzKCk7XG4gICAgICAgIF91cGRhdGVCdXR0b25EaXNhYmxlZFN0YXRlKCk7XG4gICAgICAgIF9oaWRlRW1wdHlQcmVmaXhQb3N0Zml4KCk7XG4gICAgICAgIF9zZXR1cE11dGF0aW9uT2JzZXJ2ZXJzKCk7XG4gICAgICAgIF9iaW5kRXZlbnRzKCk7XG4gICAgICAgIF9iaW5kRXZlbnRzSW50ZXJmYWNlKCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfc2V0SW5pdHZhbCgpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzLmluaXR2YWwgIT09ICcnICYmIG9yaWdpbmFsaW5wdXQudmFsKCkgPT09ICcnKSB7XG4gICAgICAgICAgb3JpZ2luYWxpbnB1dC52YWwoc2V0dGluZ3MuaW5pdHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGNoYW5nZVNldHRpbmdzKG5ld3NldHRpbmdzKSB7XG4gICAgICAgIF91cGRhdGVTZXR0aW5ncyhuZXdzZXR0aW5ncyk7XG4gICAgICAgIF9jaGVja1ZhbHVlKCk7XG4gICAgICAgIHZhciB2YWx1ZSA9IGVsZW1lbnRzLmlucHV0LnZhbCgpO1xuICAgICAgICBpZiAodmFsdWUgIT09ICcnKSB7XG4gICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHNldHRpbmdzLmNhbGxiYWNrX2JlZm9yZV9jYWxjdWxhdGlvbihlbGVtZW50cy5pbnB1dC52YWwoKSkpO1xuICAgICAgICAgIGVsZW1lbnRzLmlucHV0LnZhbChzZXR0aW5ncy5jYWxsYmFja19hZnRlcl9jYWxjdWxhdGlvbihwYXJzZUZsb2F0KHZhbHVlKS50b0ZpeGVkKHNldHRpbmdzLmRlY2ltYWxzKSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfaW5pdFNldHRpbmdzKCkge1xuICAgICAgICBzZXR0aW5ncyA9ICQuZXh0ZW5kKHt9LCBkZWZhdWx0cywgb3JpZ2luYWxpbnB1dF9kYXRhLCBfcGFyc2VBdHRyaWJ1dGVzKCksIG9wdGlvbnMpO1xuICAgICAgICBpZiAocGFyc2VGbG9hdChzZXR0aW5ncy5zdGVwKSAhPT0gMSkge1xuICAgICAgICAgIHZhciByZW1haW5kZXI7XG5cbiAgICAgICAgICAvLyBNb2RpZnkgc2V0dGluZ3MubWF4IHRvIGJlIGRpdmlzaWJsZSBieSBzdGVwXG4gICAgICAgICAgcmVtYWluZGVyID0gc2V0dGluZ3MubWF4ICUgc2V0dGluZ3Muc3RlcDtcbiAgICAgICAgICBpZiAocmVtYWluZGVyICE9PSAwKSB7XG4gICAgICAgICAgICBzZXR0aW5ncy5tYXggPSBwYXJzZUZsb2F0KHNldHRpbmdzLm1heCkgLSByZW1haW5kZXI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRG8gdGhlIHNhbWUgd2l0aCBtaW4sIHNob3VsZCB3b3JrIHdpdGggbmVnYXRpdmUgbnVtYmVycyB0b29cbiAgICAgICAgICByZW1haW5kZXIgPSBzZXR0aW5ncy5taW4gJSBzZXR0aW5ncy5zdGVwO1xuICAgICAgICAgIGlmIChyZW1haW5kZXIgIT09IDApIHtcbiAgICAgICAgICAgIHNldHRpbmdzLm1pbiA9IHBhcnNlRmxvYXQoc2V0dGluZ3MubWluKSArIChwYXJzZUZsb2F0KHNldHRpbmdzLnN0ZXApIC0gcmVtYWluZGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9wYXJzZUF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIHZhciBkYXRhID0ge307XG5cbiAgICAgICAgLy8gU2V0dGluZyB1cCBiYXNlZCBvbiBkYXRhIGF0dHJpYnV0ZXNcbiAgICAgICAgJC5lYWNoKGF0dHJpYnV0ZU1hcCwgZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgICB2YXIgYXR0ck5hbWUgPSAnYnRzLScgKyB2YWx1ZSArICcnO1xuICAgICAgICAgIGlmIChvcmlnaW5hbGlucHV0LmlzKCdbZGF0YS0nICsgYXR0ck5hbWUgKyAnXScpKSB7XG4gICAgICAgICAgICBkYXRhW2tleV0gPSBvcmlnaW5hbGlucHV0LmRhdGEoYXR0ck5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2V0dGluZyB1cCBiYXNlZCBvbiBpbnB1dCBhdHRyaWJ1dGVzIGlmIHNwZWNpZmllZCAoaW5wdXQgYXR0cmlidXRlcyBoYXZlIHByZWNlZGVuY2UpXG4gICAgICAgICQuZWFjaChbJ21pbicsICdtYXgnLCAnc3RlcCddLCBmdW5jdGlvbiAoaSwga2V5KSB7XG4gICAgICAgICAgaWYgKG9yaWdpbmFsaW5wdXQuaXMoJ1snICsga2V5ICsgJ10nKSkge1xuICAgICAgICAgICAgaWYgKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignQm90aCB0aGUgXCJkYXRhLWJ0cy0nICsga2V5ICsgJ1wiIGRhdGEgYXR0cmlidXRlIGFuZCB0aGUgXCInICsga2V5ICsgJ1wiIGluZGl2aWR1YWwgYXR0cmlidXRlIHdlcmUgc3BlY2lmaWVkLCB0aGUgaW5kaXZpZHVhbCBhdHRyaWJ1dGUgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb246ICcsIG9yaWdpbmFsaW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGF0YVtrZXldID0gb3JpZ2luYWxpbnB1dC5hdHRyKGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfZGVzdHJveSgpIHtcbiAgICAgICAgdmFyICRwYXJlbnQgPSBvcmlnaW5hbGlucHV0LnBhcmVudCgpO1xuICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICBvcmlnaW5hbGlucHV0Lm9mZignLnRvdWNoc3BpbicpO1xuICAgICAgICBpZiAoJHBhcmVudC5oYXNDbGFzcygnYm9vdHN0cmFwLXRvdWNoc3Bpbi1pbmplY3RlZCcpKSB7XG4gICAgICAgICAgb3JpZ2luYWxpbnB1dC5zaWJsaW5ncygpLnJlbW92ZSgpO1xuICAgICAgICAgIG9yaWdpbmFsaW5wdXQudW53cmFwKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJCgnLmJvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWQnLCAkcGFyZW50KS5yZW1vdmUoKTtcbiAgICAgICAgICAkcGFyZW50LnJlbW92ZUNsYXNzKCdib290c3RyYXAtdG91Y2hzcGluJyk7XG4gICAgICAgIH1cbiAgICAgICAgb3JpZ2luYWxpbnB1dC5kYXRhKCdhbHJlYWR5aW5pdGlhbGl6ZWQnLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfdXBkYXRlU2V0dGluZ3MobmV3c2V0dGluZ3MpIHtcbiAgICAgICAgc2V0dGluZ3MgPSAkLmV4dGVuZCh7fSwgc2V0dGluZ3MsIG5ld3NldHRpbmdzKTtcblxuICAgICAgICAvLyBVcGRhdGUgcG9zdGZpeCBhbmQgcHJlZml4IHRleHRzIGlmIHRob3NlIHNldHRpbmdzIHdlcmUgY2hhbmdlZC5cbiAgICAgICAgaWYgKG5ld3NldHRpbmdzLnBvc3RmaXgpIHtcbiAgICAgICAgICB2YXIgJHBvc3RmaXggPSBvcmlnaW5hbGlucHV0LnBhcmVudCgpLmZpbmQoJy5ib290c3RyYXAtdG91Y2hzcGluLXBvc3RmaXgnKTtcbiAgICAgICAgICBpZiAoJHBvc3RmaXgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBfZGV0YWNoZWRfcG9zdGZpeC5pbnNlcnRBZnRlcihvcmlnaW5hbGlucHV0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3JpZ2luYWxpbnB1dC5wYXJlbnQoKS5maW5kKCcuYm9vdHN0cmFwLXRvdWNoc3Bpbi1wb3N0Zml4IC5pbnB1dC1ncm91cC10ZXh0JykudGV4dChuZXdzZXR0aW5ncy5wb3N0Zml4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV3c2V0dGluZ3MucHJlZml4KSB7XG4gICAgICAgICAgdmFyICRwcmVmaXggPSBvcmlnaW5hbGlucHV0LnBhcmVudCgpLmZpbmQoJy5ib290c3RyYXAtdG91Y2hzcGluLXByZWZpeCcpO1xuICAgICAgICAgIGlmICgkcHJlZml4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgX2RldGFjaGVkX3ByZWZpeC5pbnNlcnRCZWZvcmUob3JpZ2luYWxpbnB1dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9yaWdpbmFsaW5wdXQucGFyZW50KCkuZmluZCgnLmJvb3RzdHJhcC10b3VjaHNwaW4tcHJlZml4IC5pbnB1dC1ncm91cC10ZXh0JykudGV4dChuZXdzZXR0aW5ncy5wcmVmaXgpO1xuICAgICAgICB9XG4gICAgICAgIF9oaWRlRW1wdHlQcmVmaXhQb3N0Zml4KCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfYnVpbGRIdG1sKCkge1xuICAgICAgICB2YXIgaW5pdHZhbCA9IG9yaWdpbmFsaW5wdXQudmFsKCksXG4gICAgICAgICAgcGFyZW50ZWxlbWVudCA9IG9yaWdpbmFsaW5wdXQucGFyZW50KCk7XG4gICAgICAgIGlmIChpbml0dmFsICE9PSAnJykge1xuICAgICAgICAgIC8vIGluaXR2YWwgbWF5IG5vdCBiZSBwYXJzYWJsZSBhcyBhIG51bWJlciAoY2FsbGJhY2tfYWZ0ZXJfY2FsY3VsYXRpb24oKSBtYXkgZGVjb3JhdGUgaXQgc28gaXQgY2FudCBiZSBwYXJzZWQpLiAgVXNlIHRoZSBjYWxsYmFja3MgaWYgcHJvdmlkZWQuXG4gICAgICAgICAgaW5pdHZhbCA9IHNldHRpbmdzLmNhbGxiYWNrX2JlZm9yZV9jYWxjdWxhdGlvbihpbml0dmFsKTtcbiAgICAgICAgICBpbml0dmFsID0gc2V0dGluZ3MuY2FsbGJhY2tfYWZ0ZXJfY2FsY3VsYXRpb24ocGFyc2VGbG9hdChpbml0dmFsKS50b0ZpeGVkKHNldHRpbmdzLmRlY2ltYWxzKSk7XG4gICAgICAgIH1cbiAgICAgICAgb3JpZ2luYWxpbnB1dC5kYXRhKCdpbml0dmFsdWUnLCBpbml0dmFsKS52YWwoaW5pdHZhbCk7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQuYWRkQ2xhc3MoJ2Zvcm0tY29udHJvbCcpO1xuICAgICAgICB2ZXJ0aWNhbGJ1dHRvbnNfaHRtbCA9IFwiXFxuICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJpbnB1dC1ncm91cC1hZGRvbiBib290c3RyYXAtdG91Y2hzcGluLXZlcnRpY2FsLWJ1dHRvbi13cmFwcGVyXFxcIj5cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYnRuLXZlcnRpY2FsXFxcIj5cXG4gICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XFxcIi0xXFxcIiBjbGFzcz1cXFwiXCIuY29uY2F0KHNldHRpbmdzLmJ1dHRvbmRvd25fY2xhc3MsIFwiIGJvb3RzdHJhcC10b3VjaHNwaW4tdXAgXCIpLmNvbmNhdChzZXR0aW5ncy52ZXJ0aWNhbHVwY2xhc3MsIFwiXFxcIiB0eXBlPVxcXCJidXR0b25cXFwiPlwiKS5jb25jYXQoc2V0dGluZ3MudmVydGljYWx1cCwgXCI8L2J1dHRvbj5cXG4gICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XFxcIi0xXFxcIiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzZXR0aW5ncy5idXR0b251cF9jbGFzcywgXCIgYm9vdHN0cmFwLXRvdWNoc3Bpbi1kb3duIFwiKS5jb25jYXQoc2V0dGluZ3MudmVydGljYWxkb3duY2xhc3MsIFwiXFxcIiB0eXBlPVxcXCJidXR0b25cXFwiPlwiKS5jb25jYXQoc2V0dGluZ3MudmVydGljYWxkb3duLCBcIjwvYnV0dG9uPlxcbiAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgPC9zcGFuPlxcbiAgICAgICBcIik7XG4gICAgICAgIGlmIChwYXJlbnRlbGVtZW50Lmhhc0NsYXNzKCdpbnB1dC1ncm91cCcpKSB7XG4gICAgICAgICAgX2FkdmFuY2VJbnB1dEdyb3VwKHBhcmVudGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9idWlsZElucHV0R3JvdXAoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2FkdmFuY2VJbnB1dEdyb3VwKHBhcmVudGVsZW1lbnQpIHtcbiAgICAgICAgcGFyZW50ZWxlbWVudC5hZGRDbGFzcygnYm9vdHN0cmFwLXRvdWNoc3BpbicpO1xuICAgICAgICB2YXIgcHJldiA9IG9yaWdpbmFsaW5wdXQucHJldigpLFxuICAgICAgICAgIG5leHQgPSBvcmlnaW5hbGlucHV0Lm5leHQoKTtcbiAgICAgICAgdmFyIGRvd25odG1sLFxuICAgICAgICAgIHVwaHRtbCxcbiAgICAgICAgICBwcmVmaXhodG1sID0gXCJcXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYWRkb24gaW5wdXQtZ3JvdXAtcHJlcGVuZCBib290c3RyYXAtdG91Y2hzcGluLXByZWZpeCBpbnB1dC1ncm91cC1wcmVwZW5kIGJvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWRcXFwiPlxcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLXRleHRcXFwiPlwiLmNvbmNhdChzZXR0aW5ncy5wcmVmaXgsIFwiPC9zcGFuPlxcbiAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgXCIpLFxuICAgICAgICAgIHBvc3RmaXhodG1sID0gXCJcXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYWRkb24gaW5wdXQtZ3JvdXAtYXBwZW5kIGJvb3RzdHJhcC10b3VjaHNwaW4tcG9zdGZpeCBpbnB1dC1ncm91cC1hcHBlbmQgYm9vdHN0cmFwLXRvdWNoc3Bpbi1pbmplY3RlZFxcXCI+XFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtdGV4dFxcXCI+XCIuY29uY2F0KHNldHRpbmdzLnBvc3RmaXgsIFwiPC9zcGFuPlxcbiAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgXCIpO1xuICAgICAgICBpZiAoc2V0dGluZ3MudmVydGljYWxidXR0b25zKSB7XG4gICAgICAgICAgJCh2ZXJ0aWNhbGJ1dHRvbnNfaHRtbCkuaW5zZXJ0QWZ0ZXIob3JpZ2luYWxpbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHByZXYuaGFzQ2xhc3MoJ2lucHV0LWdyb3VwLWJ0bicpIHx8IHByZXYuaGFzQ2xhc3MoJ2lucHV0LWdyb3VwLXByZXBlbmQnKSkge1xuICAgICAgICAgICAgZG93bmh0bWwgPSBcIlxcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cXFwiLTFcXFwiIGNsYXNzPVxcXCJcIi5jb25jYXQoc2V0dGluZ3MuYnV0dG9uZG93bl9jbGFzcywgXCIgYm9vdHN0cmFwLXRvdWNoc3Bpbi1kb3duIGJvb3RzdHJhcC10b3VjaHNwaW4taW5qZWN0ZWRcXFwiIHR5cGU9XFxcImJ1dHRvblxcXCI+XCIpLmNvbmNhdChzZXR0aW5ncy5idXR0b25kb3duX3R4dCwgXCI8L2J1dHRvbj5cXG4gICAgICAgICAgICBcIik7XG4gICAgICAgICAgICBwcmV2LmFwcGVuZChkb3duaHRtbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvd25odG1sID0gXCJcXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJpbnB1dC1ncm91cC1idG4gaW5wdXQtZ3JvdXAtcHJlcGVuZCBib290c3RyYXAtdG91Y2hzcGluLWluamVjdGVkXFxcIj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cXFwiLTFcXFwiIGNsYXNzPVxcXCJcIi5jb25jYXQoc2V0dGluZ3MuYnV0dG9uZG93bl9jbGFzcywgXCIgYm9vdHN0cmFwLXRvdWNoc3Bpbi1kb3duXFxcIiB0eXBlPVxcXCJidXR0b25cXFwiPlwiKS5jb25jYXQoc2V0dGluZ3MuYnV0dG9uZG93bl90eHQsIFwiPC9idXR0b24+XFxuICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgXCIpO1xuICAgICAgICAgICAgJChkb3duaHRtbCkuaW5zZXJ0QmVmb3JlKG9yaWdpbmFsaW5wdXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobmV4dC5oYXNDbGFzcygnaW5wdXQtZ3JvdXAtYnRuJykgfHwgbmV4dC5oYXNDbGFzcygnaW5wdXQtZ3JvdXAtYXBwZW5kJykpIHtcbiAgICAgICAgICAgIHVwaHRtbCA9IFwiXFxuICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cXFwiLTFcXFwiIGNsYXNzPVxcXCJcIi5jb25jYXQoc2V0dGluZ3MuYnV0dG9udXBfY2xhc3MsIFwiIGJvb3RzdHJhcC10b3VjaHNwaW4tdXAgYm9vdHN0cmFwLXRvdWNoc3Bpbi1pbmplY3RlZFxcXCIgdHlwZT1cXFwiYnV0dG9uXFxcIj5cIikuY29uY2F0KHNldHRpbmdzLmJ1dHRvbnVwX3R4dCwgXCI8L2J1dHRvbj5cXG4gICAgICAgICAgXCIpO1xuICAgICAgICAgICAgbmV4dC5wcmVwZW5kKHVwaHRtbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVwaHRtbCA9IFwiXFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLWJ0biBpbnB1dC1ncm91cC1hcHBlbmQgYm9vdHN0cmFwLXRvdWNoc3Bpbi1pbmplY3RlZFxcXCI+XFxuICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVxcXCItMVxcXCIgY2xhc3M9XFxcIlwiLmNvbmNhdChzZXR0aW5ncy5idXR0b251cF9jbGFzcywgXCIgYm9vdHN0cmFwLXRvdWNoc3Bpbi11cFxcXCIgdHlwZT1cXFwiYnV0dG9uXFxcIj5cIikuY29uY2F0KHNldHRpbmdzLmJ1dHRvbnVwX3R4dCwgXCI8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgIFwiKTtcbiAgICAgICAgICAgICQodXBodG1sKS5pbnNlcnRBZnRlcihvcmlnaW5hbGlucHV0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgJChwcmVmaXhodG1sKS5pbnNlcnRCZWZvcmUob3JpZ2luYWxpbnB1dCk7XG4gICAgICAgICQocG9zdGZpeGh0bWwpLmluc2VydEFmdGVyKG9yaWdpbmFsaW5wdXQpO1xuICAgICAgICBjb250YWluZXIgPSBwYXJlbnRlbGVtZW50O1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2J1aWxkSW5wdXRHcm91cCgpIHtcbiAgICAgICAgdmFyIGh0bWw7XG4gICAgICAgIHZhciBpbnB1dEdyb3VwU2l6ZSA9ICcnO1xuICAgICAgICBpZiAob3JpZ2luYWxpbnB1dC5oYXNDbGFzcygnaW5wdXQtc20nKSB8fCBvcmlnaW5hbGlucHV0Lmhhc0NsYXNzKCdmb3JtLWNvbnRyb2wtc20nKSkge1xuICAgICAgICAgIGlucHV0R3JvdXBTaXplID0gJ2lucHV0LWdyb3VwLXNtJztcbiAgICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbGlucHV0Lmhhc0NsYXNzKCdpbnB1dC1sZycpIHx8IG9yaWdpbmFsaW5wdXQuaGFzQ2xhc3MoJ2Zvcm0tY29udHJvbC1sZycpKSB7XG4gICAgICAgICAgaW5wdXRHcm91cFNpemUgPSAnaW5wdXQtZ3JvdXAtbGcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR0aW5ncy52ZXJ0aWNhbGJ1dHRvbnMpIHtcbiAgICAgICAgICBodG1sID0gXCJcXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJpbnB1dC1ncm91cCBcIi5jb25jYXQoaW5wdXRHcm91cFNpemUsIFwiIGJvb3RzdHJhcC10b3VjaHNwaW4gYm9vdHN0cmFwLXRvdWNoc3Bpbi1pbmplY3RlZFxcXCI+XFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYWRkb24gaW5wdXQtZ3JvdXAtcHJlcGVuZCBib290c3RyYXAtdG91Y2hzcGluLXByZWZpeFxcXCI+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJpbnB1dC1ncm91cC10ZXh0XFxcIj5cIikuY29uY2F0KHNldHRpbmdzLnByZWZpeCwgXCI8L3NwYW4+XFxuICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYWRkb24gYm9vdHN0cmFwLXRvdWNoc3Bpbi1wb3N0Zml4IGlucHV0LWdyb3VwLWFwcGVuZFxcXCI+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJpbnB1dC1ncm91cC10ZXh0XFxcIj5cIikuY29uY2F0KHNldHRpbmdzLnBvc3RmaXgsIFwiPC9zcGFuPlxcbiAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgXCIpLmNvbmNhdCh2ZXJ0aWNhbGJ1dHRvbnNfaHRtbCwgXCJcXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGh0bWwgPSBcIlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImlucHV0LWdyb3VwIGJvb3RzdHJhcC10b3VjaHNwaW4gYm9vdHN0cmFwLXRvdWNoc3Bpbi1pbmplY3RlZFxcXCI+XFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYnRuIGlucHV0LWdyb3VwLXByZXBlbmRcXFwiPlxcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVxcXCItMVxcXCIgY2xhc3M9XFxcIlwiLmNvbmNhdChzZXR0aW5ncy5idXR0b25kb3duX2NsYXNzLCBcIiBib290c3RyYXAtdG91Y2hzcGluLWRvd25cXFwiIHR5cGU9XFxcImJ1dHRvblxcXCI+XCIpLmNvbmNhdChzZXR0aW5ncy5idXR0b25kb3duX3R4dCwgXCI8L2J1dHRvbj5cXG4gICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJpbnB1dC1ncm91cC1hZGRvbiBib290c3RyYXAtdG91Y2hzcGluLXByZWZpeCBpbnB1dC1ncm91cC1wcmVwZW5kXFxcIj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLXRleHRcXFwiPlwiKS5jb25jYXQoc2V0dGluZ3MucHJlZml4LCBcIjwvc3Bhbj5cXG4gICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJpbnB1dC1ncm91cC1hZGRvbiBib290c3RyYXAtdG91Y2hzcGluLXBvc3RmaXggaW5wdXQtZ3JvdXAtYXBwZW5kXFxcIj5cXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImlucHV0LWdyb3VwLXRleHRcXFwiPlwiKS5jb25jYXQoc2V0dGluZ3MucG9zdGZpeCwgXCI8L3NwYW4+XFxuICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiaW5wdXQtZ3JvdXAtYnRuIGlucHV0LWdyb3VwLWFwcGVuZFxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XFxcIi0xXFxcIiBjbGFzcz1cXFwiXCIpLmNvbmNhdChzZXR0aW5ncy5idXR0b251cF9jbGFzcywgXCIgYm9vdHN0cmFwLXRvdWNoc3Bpbi11cFxcXCIgdHlwZT1cXFwiYnV0dG9uXFxcIj5cIikuY29uY2F0KHNldHRpbmdzLmJ1dHRvbnVwX3R4dCwgXCI8L2J1dHRvbj5cXG4gICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICA8L2Rpdj5cIik7XG4gICAgICAgIH1cbiAgICAgICAgY29udGFpbmVyID0gJChodG1sKS5pbnNlcnRCZWZvcmUob3JpZ2luYWxpbnB1dCk7XG4gICAgICAgICQoJy5ib290c3RyYXAtdG91Y2hzcGluLXByZWZpeCcsIGNvbnRhaW5lcikuYWZ0ZXIob3JpZ2luYWxpbnB1dCk7XG4gICAgICAgIGlmIChvcmlnaW5hbGlucHV0Lmhhc0NsYXNzKCdpbnB1dC1zbScpIHx8IG9yaWdpbmFsaW5wdXQuaGFzQ2xhc3MoJ2Zvcm0tY29udHJvbC1zbScpKSB7XG4gICAgICAgICAgY29udGFpbmVyLmFkZENsYXNzKCdpbnB1dC1ncm91cC1zbScpO1xuICAgICAgICB9IGVsc2UgaWYgKG9yaWdpbmFsaW5wdXQuaGFzQ2xhc3MoJ2lucHV0LWxnJykgfHwgb3JpZ2luYWxpbnB1dC5oYXNDbGFzcygnZm9ybS1jb250cm9sLWxnJykpIHtcbiAgICAgICAgICBjb250YWluZXIuYWRkQ2xhc3MoJ2lucHV0LWdyb3VwLWxnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9pbml0RWxlbWVudHMoKSB7XG4gICAgICAgIGVsZW1lbnRzID0ge1xuICAgICAgICAgIGRvd246ICQoJy5ib290c3RyYXAtdG91Y2hzcGluLWRvd24nLCBjb250YWluZXIpLFxuICAgICAgICAgIHVwOiAkKCcuYm9vdHN0cmFwLXRvdWNoc3Bpbi11cCcsIGNvbnRhaW5lciksXG4gICAgICAgICAgaW5wdXQ6ICQoJ2lucHV0JywgY29udGFpbmVyKSxcbiAgICAgICAgICBwcmVmaXg6ICQoJy5ib290c3RyYXAtdG91Y2hzcGluLXByZWZpeCcsIGNvbnRhaW5lcikuYWRkQ2xhc3Moc2V0dGluZ3MucHJlZml4X2V4dHJhY2xhc3MpLFxuICAgICAgICAgIHBvc3RmaXg6ICQoJy5ib290c3RyYXAtdG91Y2hzcGluLXBvc3RmaXgnLCBjb250YWluZXIpLmFkZENsYXNzKHNldHRpbmdzLnBvc3RmaXhfZXh0cmFjbGFzcylcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9oaWRlRW1wdHlQcmVmaXhQb3N0Zml4KCkge1xuICAgICAgICBpZiAoc2V0dGluZ3MucHJlZml4ID09PSAnJykge1xuICAgICAgICAgIF9kZXRhY2hlZF9wcmVmaXggPSBlbGVtZW50cy5wcmVmaXguZGV0YWNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmdzLnBvc3RmaXggPT09ICcnKSB7XG4gICAgICAgICAgX2RldGFjaGVkX3Bvc3RmaXggPSBlbGVtZW50cy5wb3N0Zml4LmRldGFjaCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfYmluZEV2ZW50cygpIHtcbiAgICAgICAgb3JpZ2luYWxpbnB1dC5vbigna2V5ZG93bi50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICB2YXIgY29kZSA9IGV2LmtleUNvZGUgfHwgZXYud2hpY2g7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IDM4KSB7XG4gICAgICAgICAgICBpZiAoc3Bpbm5pbmcgIT09ICd1cCcpIHtcbiAgICAgICAgICAgICAgdXBPbmNlKCk7XG4gICAgICAgICAgICAgIHN0YXJ0VXBTcGluKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA9PT0gNDApIHtcbiAgICAgICAgICAgIGlmIChzcGlubmluZyAhPT0gJ2Rvd24nKSB7XG4gICAgICAgICAgICAgIGRvd25PbmNlKCk7XG4gICAgICAgICAgICAgIHN0YXJ0RG93blNwaW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSA5IHx8IGNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICBfY2hlY2tWYWx1ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQub24oJ2tleXVwLnRvdWNoc3BpbicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIHZhciBjb2RlID0gZXYua2V5Q29kZSB8fCBldi53aGljaDtcbiAgICAgICAgICBpZiAoY29kZSA9PT0gMzgpIHtcbiAgICAgICAgICAgIHN0b3BTcGluKCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb2RlID09PSA0MCkge1xuICAgICAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGNoYW5nZSBpcyBmaXJlZCBiZWZvcmUgYmx1ciwgc28gd2UgbmVlZCB0byB3b3JrIGFyb3VuZCB0aGF0XG4gICAgICAgICQoZG9jdW1lbnQpLm9uKCdtb3VzZWRvd24gdG91Y2hzdGFydCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGlmICgkKGV2ZW50LnRhcmdldCkuaXMob3JpZ2luYWxpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgX2NoZWNrVmFsdWUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQub24oJ2JsdXIudG91Y2hzcGluJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF9jaGVja1ZhbHVlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50cy5kb3duLm9uKCdrZXlkb3duJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgdmFyIGNvZGUgPSBldi5rZXlDb2RlIHx8IGV2LndoaWNoO1xuICAgICAgICAgIGlmIChjb2RlID09PSAzMiB8fCBjb2RlID09PSAxMykge1xuICAgICAgICAgICAgaWYgKHNwaW5uaW5nICE9PSAnZG93bicpIHtcbiAgICAgICAgICAgICAgZG93bk9uY2UoKTtcbiAgICAgICAgICAgICAgc3RhcnREb3duU3BpbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50cy5kb3duLm9uKCdrZXl1cC50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICB2YXIgY29kZSA9IGV2LmtleUNvZGUgfHwgZXYud2hpY2g7XG4gICAgICAgICAgaWYgKGNvZGUgPT09IDMyIHx8IGNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnRzLnVwLm9uKCdrZXlkb3duLnRvdWNoc3BpbicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIHZhciBjb2RlID0gZXYua2V5Q29kZSB8fCBldi53aGljaDtcbiAgICAgICAgICBpZiAoY29kZSA9PT0gMzIgfHwgY29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgIGlmIChzcGlubmluZyAhPT0gJ3VwJykge1xuICAgICAgICAgICAgICB1cE9uY2UoKTtcbiAgICAgICAgICAgICAgc3RhcnRVcFNwaW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudHMudXAub24oJ2tleXVwLnRvdWNoc3BpbicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIHZhciBjb2RlID0gZXYua2V5Q29kZSB8fCBldi53aGljaDtcbiAgICAgICAgICBpZiAoY29kZSA9PT0gMzIgfHwgY29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgIHN0b3BTcGluKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudHMuZG93bi5vbignbW91c2Vkb3duLnRvdWNoc3BpbicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIGVsZW1lbnRzLmRvd24ub2ZmKCd0b3VjaHN0YXJ0LnRvdWNoc3BpbicpOyAvLyBhbmRyb2lkIDQgd29ya2Fyb3VuZFxuXG4gICAgICAgICAgaWYgKG9yaWdpbmFsaW5wdXQuaXMoJzpkaXNhYmxlZCxbcmVhZG9ubHldJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZG93bk9uY2UoKTtcbiAgICAgICAgICBzdGFydERvd25TcGluKCk7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnRzLmRvd24ub24oJ3RvdWNoc3RhcnQudG91Y2hzcGluJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgZWxlbWVudHMuZG93bi5vZmYoJ21vdXNlZG93bi50b3VjaHNwaW4nKTsgLy8gYW5kcm9pZCA0IHdvcmthcm91bmRcblxuICAgICAgICAgIGlmIChvcmlnaW5hbGlucHV0LmlzKCc6ZGlzYWJsZWQsW3JlYWRvbmx5XScpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGRvd25PbmNlKCk7XG4gICAgICAgICAgc3RhcnREb3duU3BpbigpO1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50cy51cC5vbignbW91c2Vkb3duLnRvdWNoc3BpbicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIGVsZW1lbnRzLnVwLm9mZigndG91Y2hzdGFydC50b3VjaHNwaW4nKTsgLy8gYW5kcm9pZCA0IHdvcmthcm91bmRcblxuICAgICAgICAgIGlmIChvcmlnaW5hbGlucHV0LmlzKCc6ZGlzYWJsZWQsW3JlYWRvbmx5XScpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHVwT25jZSgpO1xuICAgICAgICAgIHN0YXJ0VXBTcGluKCk7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGVsZW1lbnRzLnVwLm9uKCd0b3VjaHN0YXJ0LnRvdWNoc3BpbicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgIGVsZW1lbnRzLnVwLm9mZignbW91c2Vkb3duLnRvdWNoc3BpbicpOyAvLyBhbmRyb2lkIDQgd29ya2Fyb3VuZFxuXG4gICAgICAgICAgaWYgKG9yaWdpbmFsaW5wdXQuaXMoJzpkaXNhYmxlZCxbcmVhZG9ubHldJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdXBPbmNlKCk7XG4gICAgICAgICAgc3RhcnRVcFNwaW4oKTtcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudHMudXAub24oJ21vdXNldXAudG91Y2hzcGluIG1vdXNlb3V0LnRvdWNoc3BpbiB0b3VjaGxlYXZlLnRvdWNoc3BpbiB0b3VjaGVuZC50b3VjaHNwaW4gdG91Y2hjYW5jZWwudG91Y2hzcGluJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgaWYgKCFzcGlubmluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudHMuZG93bi5vbignbW91c2V1cC50b3VjaHNwaW4gbW91c2VvdXQudG91Y2hzcGluIHRvdWNobGVhdmUudG91Y2hzcGluIHRvdWNoZW5kLnRvdWNoc3BpbiB0b3VjaGNhbmNlbC50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICBpZiAoIXNwaW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHN0b3BTcGluKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50cy5kb3duLm9uKCdtb3VzZW1vdmUudG91Y2hzcGluIHRvdWNobW92ZS50b3VjaHNwaW4nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgICBpZiAoIXNwaW5uaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBlbGVtZW50cy51cC5vbignbW91c2Vtb3ZlLnRvdWNoc3BpbiB0b3VjaG1vdmUudG91Y2hzcGluJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgaWYgKCFzcGlubmluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgb3JpZ2luYWxpbnB1dC5vbignbW91c2V3aGVlbC50b3VjaHNwaW4gRE9NTW91c2VTY3JvbGwudG91Y2hzcGluJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgaWYgKCFzZXR0aW5ncy5tb3VzZXdoZWVsIHx8ICFvcmlnaW5hbGlucHV0LmlzKCc6Zm9jdXMnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZGVsdGEgPSBldi5vcmlnaW5hbEV2ZW50LndoZWVsRGVsdGEgfHwgLWV2Lm9yaWdpbmFsRXZlbnQuZGVsdGFZIHx8IC1ldi5vcmlnaW5hbEV2ZW50LmRldGFpbDtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGlmIChkZWx0YSA8IDApIHtcbiAgICAgICAgICAgIGRvd25PbmNlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVwT25jZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfYmluZEV2ZW50c0ludGVyZmFjZSgpIHtcbiAgICAgICAgb3JpZ2luYWxpbnB1dC5vbigndG91Y2hzcGluLmRlc3Ryb3knLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX2Rlc3Ryb3koKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQub24oJ3RvdWNoc3Bpbi51cG9uY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgICB1cE9uY2UoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQub24oJ3RvdWNoc3Bpbi5kb3dub25jZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICAgIGRvd25PbmNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbGlucHV0Lm9uKCd0b3VjaHNwaW4uc3RhcnR1cHNwaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc3RhcnRVcFNwaW4oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQub24oJ3RvdWNoc3Bpbi5zdGFydGRvd25zcGluJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHN0YXJ0RG93blNwaW4oKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQub24oJ3RvdWNoc3Bpbi5zdG9wc3BpbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICB9KTtcbiAgICAgICAgb3JpZ2luYWxpbnB1dC5vbigndG91Y2hzcGluLnVwZGF0ZXNldHRpbmdzJywgZnVuY3Rpb24gKGUsIG5ld3NldHRpbmdzKSB7XG4gICAgICAgICAgY2hhbmdlU2V0dGluZ3MobmV3c2V0dGluZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9zZXR1cE11dGF0aW9uT2JzZXJ2ZXJzKCkge1xuICAgICAgICBpZiAodHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gTXV0YXRpb25PYnNlcnZlciBpcyBhdmFpbGFibGVcbiAgICAgICAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0YXRpb25zKSB7XG4gICAgICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAobXV0YXRpb24pIHtcbiAgICAgICAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdhdHRyaWJ1dGVzJyAmJiAobXV0YXRpb24uYXR0cmlidXRlTmFtZSA9PT0gJ2Rpc2FibGVkJyB8fCBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lID09PSAncmVhZG9ubHknKSkge1xuICAgICAgICAgICAgICAgIF91cGRhdGVCdXR0b25EaXNhYmxlZFN0YXRlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUob3JpZ2luYWxpbnB1dFswXSwge1xuICAgICAgICAgICAgYXR0cmlidXRlczogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBfZm9yY2VzdGVwZGl2aXNpYmlsaXR5KHZhbHVlKSB7XG4gICAgICAgIHN3aXRjaCAoc2V0dGluZ3MuZm9yY2VzdGVwZGl2aXNpYmlsaXR5KSB7XG4gICAgICAgICAgY2FzZSAncm91bmQnOlxuICAgICAgICAgICAgcmV0dXJuIChNYXRoLnJvdW5kKHZhbHVlIC8gc2V0dGluZ3Muc3RlcCkgKiBzZXR0aW5ncy5zdGVwKS50b0ZpeGVkKHNldHRpbmdzLmRlY2ltYWxzKTtcbiAgICAgICAgICBjYXNlICdmbG9vcic6XG4gICAgICAgICAgICByZXR1cm4gKE1hdGguZmxvb3IodmFsdWUgLyBzZXR0aW5ncy5zdGVwKSAqIHNldHRpbmdzLnN0ZXApLnRvRml4ZWQoc2V0dGluZ3MuZGVjaW1hbHMpO1xuICAgICAgICAgIGNhc2UgJ2NlaWwnOlxuICAgICAgICAgICAgcmV0dXJuIChNYXRoLmNlaWwodmFsdWUgLyBzZXR0aW5ncy5zdGVwKSAqIHNldHRpbmdzLnN0ZXApLnRvRml4ZWQoc2V0dGluZ3MuZGVjaW1hbHMpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9GaXhlZChzZXR0aW5ncy5kZWNpbWFscyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIF9jaGVja1ZhbHVlKCkge1xuICAgICAgICB2YXIgdmFsLCBwYXJzZWR2YWwsIHJldHVybnZhbDtcbiAgICAgICAgdmFsID0gc2V0dGluZ3MuY2FsbGJhY2tfYmVmb3JlX2NhbGN1bGF0aW9uKG9yaWdpbmFsaW5wdXQudmFsKCkpO1xuICAgICAgICBpZiAodmFsID09PSAnJykge1xuICAgICAgICAgIGlmIChzZXR0aW5ncy5yZXBsYWNlbWVudHZhbCAhPT0gJycpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsaW5wdXQudmFsKHNldHRpbmdzLnJlcGxhY2VtZW50dmFsKTtcbiAgICAgICAgICAgIG9yaWdpbmFsaW5wdXQudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0dGluZ3MuZGVjaW1hbHMgPiAwICYmIHZhbCA9PT0gJy4nKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHBhcnNlZHZhbCA9IHBhcnNlRmxvYXQodmFsKTtcbiAgICAgICAgaWYgKGlzTmFOKHBhcnNlZHZhbCkpIHtcbiAgICAgICAgICBpZiAoc2V0dGluZ3MucmVwbGFjZW1lbnR2YWwgIT09ICcnKSB7XG4gICAgICAgICAgICBwYXJzZWR2YWwgPSBzZXR0aW5ncy5yZXBsYWNlbWVudHZhbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyc2VkdmFsID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJudmFsID0gcGFyc2VkdmFsO1xuICAgICAgICBpZiAocGFyc2VkdmFsLnRvU3RyaW5nKCkgIT09IHZhbCkge1xuICAgICAgICAgIHJldHVybnZhbCA9IHBhcnNlZHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm52YWwgPSBfZm9yY2VzdGVwZGl2aXNpYmlsaXR5KHBhcnNlZHZhbCk7XG4gICAgICAgIGlmIChzZXR0aW5ncy5taW4gIT09IG51bGwgJiYgcGFyc2VkdmFsIDwgc2V0dGluZ3MubWluKSB7XG4gICAgICAgICAgcmV0dXJudmFsID0gc2V0dGluZ3MubWluO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZXR0aW5ncy5tYXggIT09IG51bGwgJiYgcGFyc2VkdmFsID4gc2V0dGluZ3MubWF4KSB7XG4gICAgICAgICAgcmV0dXJudmFsID0gc2V0dGluZ3MubWF4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZUZsb2F0KHBhcnNlZHZhbCkudG9TdHJpbmcoKSAhPT0gcGFyc2VGbG9hdChyZXR1cm52YWwpLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICBvcmlnaW5hbGlucHV0LnZhbChyZXR1cm52YWwpO1xuICAgICAgICB9XG4gICAgICAgIG9yaWdpbmFsaW5wdXQudmFsKHNldHRpbmdzLmNhbGxiYWNrX2FmdGVyX2NhbGN1bGF0aW9uKHBhcnNlRmxvYXQocmV0dXJudmFsKS50b0ZpeGVkKHNldHRpbmdzLmRlY2ltYWxzKSkpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX2dldEJvb3N0ZWRTdGVwKCkge1xuICAgICAgICBpZiAoIXNldHRpbmdzLmJvb3N0ZXIpIHtcbiAgICAgICAgICByZXR1cm4gc2V0dGluZ3Muc3RlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgYm9vc3RlZCA9IE1hdGgucG93KDIsIE1hdGguZmxvb3Ioc3BpbmNvdW50IC8gc2V0dGluZ3MuYm9vc3RhdCkpICogc2V0dGluZ3Muc3RlcDtcbiAgICAgICAgICBpZiAoc2V0dGluZ3MubWF4Ym9vc3RlZHN0ZXApIHtcbiAgICAgICAgICAgIGlmIChib29zdGVkID4gc2V0dGluZ3MubWF4Ym9vc3RlZHN0ZXApIHtcbiAgICAgICAgICAgICAgYm9vc3RlZCA9IHNldHRpbmdzLm1heGJvb3N0ZWRzdGVwO1xuICAgICAgICAgICAgICB2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUgLyBib29zdGVkKSAqIGJvb3N0ZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBNYXRoLm1heChzZXR0aW5ncy5zdGVwLCBib29zdGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gdmFsdWVJZklzTmFOKCkge1xuICAgICAgICBpZiAodHlwZW9mIHNldHRpbmdzLmZpcnN0Y2xpY2t2YWx1ZWlmZW1wdHkgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmV0dXJuIHNldHRpbmdzLmZpcnN0Y2xpY2t2YWx1ZWlmZW1wdHk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIChzZXR0aW5ncy5taW4gKyBzZXR0aW5ncy5tYXgpIC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gX3VwZGF0ZUJ1dHRvbkRpc2FibGVkU3RhdGUoKSB7XG4gICAgICAgIHZhciBpc0Rpc2FibGVkID0gb3JpZ2luYWxpbnB1dC5pcygnOmRpc2FibGVkLFtyZWFkb25seV0nKTtcbiAgICAgICAgZWxlbWVudHMudXAucHJvcCgnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcbiAgICAgICAgZWxlbWVudHMuZG93bi5wcm9wKCdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xuICAgICAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgICAgIHN0b3BTcGluKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHVwT25jZSgpIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsaW5wdXQuaXMoJzpkaXNhYmxlZCxbcmVhZG9ubHldJykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgX2NoZWNrVmFsdWUoKTtcbiAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHNldHRpbmdzLmNhbGxiYWNrX2JlZm9yZV9jYWxjdWxhdGlvbihlbGVtZW50cy5pbnB1dC52YWwoKSkpO1xuICAgICAgICB2YXIgaW5pdHZhbHVlID0gdmFsdWU7XG4gICAgICAgIHZhciBib29zdGVkc3RlcDtcbiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVJZklzTmFOKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYm9vc3RlZHN0ZXAgPSBfZ2V0Qm9vc3RlZFN0ZXAoKTtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgYm9vc3RlZHN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmdzLm1heCAhPT0gbnVsbCAmJiB2YWx1ZSA+PSBzZXR0aW5ncy5tYXgpIHtcbiAgICAgICAgICB2YWx1ZSA9IHNldHRpbmdzLm1heDtcbiAgICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5tYXgnKTtcbiAgICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLmlucHV0LnZhbChzZXR0aW5ncy5jYWxsYmFja19hZnRlcl9jYWxjdWxhdGlvbihwYXJzZUZsb2F0KHZhbHVlKS50b0ZpeGVkKHNldHRpbmdzLmRlY2ltYWxzKSkpO1xuICAgICAgICBpZiAoaW5pdHZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgIG9yaWdpbmFsaW5wdXQudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGRvd25PbmNlKCkge1xuICAgICAgICBpZiAob3JpZ2luYWxpbnB1dC5pcygnOmRpc2FibGVkLFtyZWFkb25seV0nKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBfY2hlY2tWYWx1ZSgpO1xuICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQoc2V0dGluZ3MuY2FsbGJhY2tfYmVmb3JlX2NhbGN1bGF0aW9uKGVsZW1lbnRzLmlucHV0LnZhbCgpKSk7XG4gICAgICAgIHZhciBpbml0dmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdmFyIGJvb3N0ZWRzdGVwO1xuICAgICAgICBpZiAoaXNOYU4odmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZUlmSXNOYU4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBib29zdGVkc3RlcCA9IF9nZXRCb29zdGVkU3RlcCgpO1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUgLSBib29zdGVkc3RlcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2V0dGluZ3MubWluICE9PSBudWxsICYmIHZhbHVlIDw9IHNldHRpbmdzLm1pbikge1xuICAgICAgICAgIHZhbHVlID0gc2V0dGluZ3MubWluO1xuICAgICAgICAgIG9yaWdpbmFsaW5wdXQudHJpZ2dlcigndG91Y2hzcGluLm9uLm1pbicpO1xuICAgICAgICAgIHN0b3BTcGluKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHMuaW5wdXQudmFsKHNldHRpbmdzLmNhbGxiYWNrX2FmdGVyX2NhbGN1bGF0aW9uKHBhcnNlRmxvYXQodmFsdWUpLnRvRml4ZWQoc2V0dGluZ3MuZGVjaW1hbHMpKSk7XG4gICAgICAgIGlmIChpbml0dmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgICAgb3JpZ2luYWxpbnB1dC50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gc3RhcnREb3duU3BpbigpIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsaW5wdXQuaXMoJzpkaXNhYmxlZCxbcmVhZG9ubHldJykpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3RvcFNwaW4oKTtcbiAgICAgICAgc3BpbmNvdW50ID0gMDtcbiAgICAgICAgc3Bpbm5pbmcgPSAnZG93bic7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQudHJpZ2dlcigndG91Y2hzcGluLm9uLnN0YXJ0c3BpbicpO1xuICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5zdGFydGRvd25zcGluJyk7XG4gICAgICAgIGRvd25EZWxheVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBkb3duU3BpblRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc3BpbmNvdW50Kys7XG4gICAgICAgICAgICBkb3duT25jZSgpO1xuICAgICAgICAgIH0sIHNldHRpbmdzLnN0ZXBpbnRlcnZhbCk7XG4gICAgICAgIH0sIHNldHRpbmdzLnN0ZXBpbnRlcnZhbGRlbGF5KTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHN0YXJ0VXBTcGluKCkge1xuICAgICAgICBpZiAob3JpZ2luYWxpbnB1dC5pcygnOmRpc2FibGVkLFtyZWFkb25seV0nKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzdG9wU3BpbigpO1xuICAgICAgICBzcGluY291bnQgPSAwO1xuICAgICAgICBzcGlubmluZyA9ICd1cCc7XG4gICAgICAgIG9yaWdpbmFsaW5wdXQudHJpZ2dlcigndG91Y2hzcGluLm9uLnN0YXJ0c3BpbicpO1xuICAgICAgICBvcmlnaW5hbGlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi5vbi5zdGFydHVwc3BpbicpO1xuICAgICAgICB1cERlbGF5VGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHVwU3BpblRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc3BpbmNvdW50Kys7XG4gICAgICAgICAgICB1cE9uY2UoKTtcbiAgICAgICAgICB9LCBzZXR0aW5ncy5zdGVwaW50ZXJ2YWwpO1xuICAgICAgICB9LCBzZXR0aW5ncy5zdGVwaW50ZXJ2YWxkZWxheSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBzdG9wU3BpbigpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGRvd25EZWxheVRpbWVvdXQpO1xuICAgICAgICBjbGVhclRpbWVvdXQodXBEZWxheVRpbWVvdXQpO1xuICAgICAgICBjbGVhckludGVydmFsKGRvd25TcGluVGltZXIpO1xuICAgICAgICBjbGVhckludGVydmFsKHVwU3BpblRpbWVyKTtcbiAgICAgICAgc3dpdGNoIChzcGlubmluZykge1xuICAgICAgICAgIGNhc2UgJ3VwJzpcbiAgICAgICAgICAgIG9yaWdpbmFsaW5wdXQudHJpZ2dlcigndG91Y2hzcGluLm9uLnN0b3B1cHNwaW4nKTtcbiAgICAgICAgICAgIG9yaWdpbmFsaW5wdXQudHJpZ2dlcigndG91Y2hzcGluLm9uLnN0b3BzcGluJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdkb3duJzpcbiAgICAgICAgICAgIG9yaWdpbmFsaW5wdXQudHJpZ2dlcigndG91Y2hzcGluLm9uLnN0b3Bkb3duc3BpbicpO1xuICAgICAgICAgICAgb3JpZ2luYWxpbnB1dC50cmlnZ2VyKCd0b3VjaHNwaW4ub24uc3RvcHNwaW4nKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNwaW5jb3VudCA9IDA7XG4gICAgICAgIHNwaW5uaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWpxdWVyeS5ib290c3RyYXAtdG91Y2hzcGluLmpzLm1hcFxuIiwiLyohXG4gKiBAZmlsZU92ZXJ2aWV3IFRvdWNoU3dpcGUgLSBqUXVlcnkgUGx1Z2luXG4gKiBAdmVyc2lvbiAxLjYuMThcbiAqXG4gKiBAYXV0aG9yIE1hdHQgQnJ5c29uIGh0dHA6Ly93d3cuZ2l0aHViLmNvbS9tYXR0YnJ5c29uXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXR0YnJ5c29uL1RvdWNoU3dpcGUtSnF1ZXJ5LVBsdWdpblxuICogQHNlZSBodHRwOi8vbGFicy5yYW1waW50ZXJhY3RpdmUuY28udWsvdG91Y2hTd2lwZS9cbiAqIEBzZWUgaHR0cDovL3BsdWdpbnMuanF1ZXJ5LmNvbS9wcm9qZWN0L3RvdWNoU3dpcGVcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNSBNYXR0IEJyeXNvblxuICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIG9yIEdQTCBWZXJzaW9uIDIgbGljZW5zZXMuXG4gKlxuICovXG4hZnVuY3Rpb24oZmFjdG9yeSl7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeT9kZWZpbmUoW1wianF1ZXJ5XCJdLGZhY3RvcnkpOmZhY3RvcnkoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHM/cmVxdWlyZShcImpxdWVyeVwiKTpqUXVlcnkpfShmdW5jdGlvbigkKXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpbml0KG9wdGlvbnMpe3JldHVybiFvcHRpb25zfHx2b2lkIDAhPT1vcHRpb25zLmFsbG93UGFnZVNjcm9sbHx8dm9pZCAwPT09b3B0aW9ucy5zd2lwZSYmdm9pZCAwPT09b3B0aW9ucy5zd2lwZVN0YXR1c3x8KG9wdGlvbnMuYWxsb3dQYWdlU2Nyb2xsPU5PTkUpLHZvaWQgMCE9PW9wdGlvbnMuY2xpY2smJnZvaWQgMD09PW9wdGlvbnMudGFwJiYob3B0aW9ucy50YXA9b3B0aW9ucy5jbGljayksb3B0aW9uc3x8KG9wdGlvbnM9e30pLG9wdGlvbnM9JC5leHRlbmQoe30sJC5mbi5zd2lwZS5kZWZhdWx0cyxvcHRpb25zKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgJHRoaXM9JCh0aGlzKSxwbHVnaW49JHRoaXMuZGF0YShQTFVHSU5fTlMpO3BsdWdpbnx8KHBsdWdpbj1uZXcgVG91Y2hTd2lwZSh0aGlzLG9wdGlvbnMpLCR0aGlzLmRhdGEoUExVR0lOX05TLHBsdWdpbikpfSl9ZnVuY3Rpb24gVG91Y2hTd2lwZShlbGVtZW50LG9wdGlvbnMpe2Z1bmN0aW9uIHRvdWNoU3RhcnQoanFFdmVudCl7aWYoIShnZXRUb3VjaEluUHJvZ3Jlc3MoKXx8JChqcUV2ZW50LnRhcmdldCkuY2xvc2VzdChvcHRpb25zLmV4Y2x1ZGVkRWxlbWVudHMsJGVsZW1lbnQpLmxlbmd0aD4wKSl7dmFyIGV2ZW50PWpxRXZlbnQub3JpZ2luYWxFdmVudD9qcUV2ZW50Lm9yaWdpbmFsRXZlbnQ6anFFdmVudDtpZighZXZlbnQucG9pbnRlclR5cGV8fFwibW91c2VcIiE9ZXZlbnQucG9pbnRlclR5cGV8fDAhPW9wdGlvbnMuZmFsbGJhY2tUb01vdXNlRXZlbnRzKXt2YXIgcmV0LHRvdWNoZXM9ZXZlbnQudG91Y2hlcyxldnQ9dG91Y2hlcz90b3VjaGVzWzBdOmV2ZW50O3JldHVybiBwaGFzZT1QSEFTRV9TVEFSVCx0b3VjaGVzP2ZpbmdlckNvdW50PXRvdWNoZXMubGVuZ3RoOm9wdGlvbnMucHJldmVudERlZmF1bHRFdmVudHMhPT0hMSYmanFFdmVudC5wcmV2ZW50RGVmYXVsdCgpLGRpc3RhbmNlPTAsZGlyZWN0aW9uPW51bGwsY3VycmVudERpcmVjdGlvbj1udWxsLHBpbmNoRGlyZWN0aW9uPW51bGwsZHVyYXRpb249MCxzdGFydFRvdWNoZXNEaXN0YW5jZT0wLGVuZFRvdWNoZXNEaXN0YW5jZT0wLHBpbmNoWm9vbT0xLHBpbmNoRGlzdGFuY2U9MCxtYXhpbXVtc01hcD1jcmVhdGVNYXhpbXVtc0RhdGEoKSxjYW5jZWxNdWx0aUZpbmdlclJlbGVhc2UoKSxjcmVhdGVGaW5nZXJEYXRhKDAsZXZ0KSwhdG91Y2hlc3x8ZmluZ2VyQ291bnQ9PT1vcHRpb25zLmZpbmdlcnN8fG9wdGlvbnMuZmluZ2Vycz09PUFMTF9GSU5HRVJTfHxoYXNQaW5jaGVzKCk/KHN0YXJ0VGltZT1nZXRUaW1lU3RhbXAoKSwyPT1maW5nZXJDb3VudCYmKGNyZWF0ZUZpbmdlckRhdGEoMSx0b3VjaGVzWzFdKSxzdGFydFRvdWNoZXNEaXN0YW5jZT1lbmRUb3VjaGVzRGlzdGFuY2U9Y2FsY3VsYXRlVG91Y2hlc0Rpc3RhbmNlKGZpbmdlckRhdGFbMF0uc3RhcnQsZmluZ2VyRGF0YVsxXS5zdGFydCkpLChvcHRpb25zLnN3aXBlU3RhdHVzfHxvcHRpb25zLnBpbmNoU3RhdHVzKSYmKHJldD10cmlnZ2VySGFuZGxlcihldmVudCxwaGFzZSkpKTpyZXQ9ITEscmV0PT09ITE/KHBoYXNlPVBIQVNFX0NBTkNFTCx0cmlnZ2VySGFuZGxlcihldmVudCxwaGFzZSkscmV0KToob3B0aW9ucy5ob2xkJiYoaG9sZFRpbWVvdXQ9c2V0VGltZW91dCgkLnByb3h5KGZ1bmN0aW9uKCl7JGVsZW1lbnQudHJpZ2dlcihcImhvbGRcIixbZXZlbnQudGFyZ2V0XSksb3B0aW9ucy5ob2xkJiYocmV0PW9wdGlvbnMuaG9sZC5jYWxsKCRlbGVtZW50LGV2ZW50LGV2ZW50LnRhcmdldCkpfSx0aGlzKSxvcHRpb25zLmxvbmdUYXBUaHJlc2hvbGQpKSxzZXRUb3VjaEluUHJvZ3Jlc3MoITApLG51bGwpfX19ZnVuY3Rpb24gdG91Y2hNb3ZlKGpxRXZlbnQpe3ZhciBldmVudD1qcUV2ZW50Lm9yaWdpbmFsRXZlbnQ/anFFdmVudC5vcmlnaW5hbEV2ZW50OmpxRXZlbnQ7aWYocGhhc2UhPT1QSEFTRV9FTkQmJnBoYXNlIT09UEhBU0VfQ0FOQ0VMJiYhaW5NdWx0aUZpbmdlclJlbGVhc2UoKSl7dmFyIHJldCx0b3VjaGVzPWV2ZW50LnRvdWNoZXMsZXZ0PXRvdWNoZXM/dG91Y2hlc1swXTpldmVudCxjdXJyZW50RmluZ2VyPXVwZGF0ZUZpbmdlckRhdGEoZXZ0KTtpZihlbmRUaW1lPWdldFRpbWVTdGFtcCgpLHRvdWNoZXMmJihmaW5nZXJDb3VudD10b3VjaGVzLmxlbmd0aCksb3B0aW9ucy5ob2xkJiZjbGVhclRpbWVvdXQoaG9sZFRpbWVvdXQpLHBoYXNlPVBIQVNFX01PVkUsMj09ZmluZ2VyQ291bnQmJigwPT1zdGFydFRvdWNoZXNEaXN0YW5jZT8oY3JlYXRlRmluZ2VyRGF0YSgxLHRvdWNoZXNbMV0pLHN0YXJ0VG91Y2hlc0Rpc3RhbmNlPWVuZFRvdWNoZXNEaXN0YW5jZT1jYWxjdWxhdGVUb3VjaGVzRGlzdGFuY2UoZmluZ2VyRGF0YVswXS5zdGFydCxmaW5nZXJEYXRhWzFdLnN0YXJ0KSk6KHVwZGF0ZUZpbmdlckRhdGEodG91Y2hlc1sxXSksZW5kVG91Y2hlc0Rpc3RhbmNlPWNhbGN1bGF0ZVRvdWNoZXNEaXN0YW5jZShmaW5nZXJEYXRhWzBdLmVuZCxmaW5nZXJEYXRhWzFdLmVuZCkscGluY2hEaXJlY3Rpb249Y2FsY3VsYXRlUGluY2hEaXJlY3Rpb24oZmluZ2VyRGF0YVswXS5lbmQsZmluZ2VyRGF0YVsxXS5lbmQpKSxwaW5jaFpvb209Y2FsY3VsYXRlUGluY2hab29tKHN0YXJ0VG91Y2hlc0Rpc3RhbmNlLGVuZFRvdWNoZXNEaXN0YW5jZSkscGluY2hEaXN0YW5jZT1NYXRoLmFicyhzdGFydFRvdWNoZXNEaXN0YW5jZS1lbmRUb3VjaGVzRGlzdGFuY2UpKSxmaW5nZXJDb3VudD09PW9wdGlvbnMuZmluZ2Vyc3x8b3B0aW9ucy5maW5nZXJzPT09QUxMX0ZJTkdFUlN8fCF0b3VjaGVzfHxoYXNQaW5jaGVzKCkpe2lmKGRpcmVjdGlvbj1jYWxjdWxhdGVEaXJlY3Rpb24oY3VycmVudEZpbmdlci5zdGFydCxjdXJyZW50RmluZ2VyLmVuZCksY3VycmVudERpcmVjdGlvbj1jYWxjdWxhdGVEaXJlY3Rpb24oY3VycmVudEZpbmdlci5sYXN0LGN1cnJlbnRGaW5nZXIuZW5kKSx2YWxpZGF0ZURlZmF1bHRFdmVudChqcUV2ZW50LGN1cnJlbnREaXJlY3Rpb24pLGRpc3RhbmNlPWNhbGN1bGF0ZURpc3RhbmNlKGN1cnJlbnRGaW5nZXIuc3RhcnQsY3VycmVudEZpbmdlci5lbmQpLGR1cmF0aW9uPWNhbGN1bGF0ZUR1cmF0aW9uKCksc2V0TWF4RGlzdGFuY2UoZGlyZWN0aW9uLGRpc3RhbmNlKSxyZXQ9dHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2UpLCFvcHRpb25zLnRyaWdnZXJPblRvdWNoRW5kfHxvcHRpb25zLnRyaWdnZXJPblRvdWNoTGVhdmUpe3ZhciBpbkJvdW5kcz0hMDtpZihvcHRpb25zLnRyaWdnZXJPblRvdWNoTGVhdmUpe3ZhciBib3VuZHM9Z2V0Ym91bmRzKHRoaXMpO2luQm91bmRzPWlzSW5Cb3VuZHMoY3VycmVudEZpbmdlci5lbmQsYm91bmRzKX0hb3B0aW9ucy50cmlnZ2VyT25Ub3VjaEVuZCYmaW5Cb3VuZHM/cGhhc2U9Z2V0TmV4dFBoYXNlKFBIQVNFX01PVkUpOm9wdGlvbnMudHJpZ2dlck9uVG91Y2hMZWF2ZSYmIWluQm91bmRzJiYocGhhc2U9Z2V0TmV4dFBoYXNlKFBIQVNFX0VORCkpLHBoYXNlIT1QSEFTRV9DQU5DRUwmJnBoYXNlIT1QSEFTRV9FTkR8fHRyaWdnZXJIYW5kbGVyKGV2ZW50LHBoYXNlKX19ZWxzZSBwaGFzZT1QSEFTRV9DQU5DRUwsdHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2UpO3JldD09PSExJiYocGhhc2U9UEhBU0VfQ0FOQ0VMLHRyaWdnZXJIYW5kbGVyKGV2ZW50LHBoYXNlKSl9fWZ1bmN0aW9uIHRvdWNoRW5kKGpxRXZlbnQpe3ZhciBldmVudD1qcUV2ZW50Lm9yaWdpbmFsRXZlbnQ/anFFdmVudC5vcmlnaW5hbEV2ZW50OmpxRXZlbnQsdG91Y2hlcz1ldmVudC50b3VjaGVzO2lmKHRvdWNoZXMpe2lmKHRvdWNoZXMubGVuZ3RoJiYhaW5NdWx0aUZpbmdlclJlbGVhc2UoKSlyZXR1cm4gc3RhcnRNdWx0aUZpbmdlclJlbGVhc2UoZXZlbnQpLCEwO2lmKHRvdWNoZXMubGVuZ3RoJiZpbk11bHRpRmluZ2VyUmVsZWFzZSgpKXJldHVybiEwfXJldHVybiBpbk11bHRpRmluZ2VyUmVsZWFzZSgpJiYoZmluZ2VyQ291bnQ9ZmluZ2VyQ291bnRBdFJlbGVhc2UpLGVuZFRpbWU9Z2V0VGltZVN0YW1wKCksZHVyYXRpb249Y2FsY3VsYXRlRHVyYXRpb24oKSxkaWRTd2lwZUJhY2tUb0NhbmNlbCgpfHwhdmFsaWRhdGVTd2lwZURpc3RhbmNlKCk/KHBoYXNlPVBIQVNFX0NBTkNFTCx0cmlnZ2VySGFuZGxlcihldmVudCxwaGFzZSkpOm9wdGlvbnMudHJpZ2dlck9uVG91Y2hFbmR8fG9wdGlvbnMudHJpZ2dlck9uVG91Y2hFbmQ9PT0hMSYmcGhhc2U9PT1QSEFTRV9NT1ZFPyhvcHRpb25zLnByZXZlbnREZWZhdWx0RXZlbnRzIT09ITEmJmpxRXZlbnQuY2FuY2VsYWJsZSE9PSExJiZqcUV2ZW50LnByZXZlbnREZWZhdWx0KCkscGhhc2U9UEhBU0VfRU5ELHRyaWdnZXJIYW5kbGVyKGV2ZW50LHBoYXNlKSk6IW9wdGlvbnMudHJpZ2dlck9uVG91Y2hFbmQmJmhhc1RhcCgpPyhwaGFzZT1QSEFTRV9FTkQsdHJpZ2dlckhhbmRsZXJGb3JHZXN0dXJlKGV2ZW50LHBoYXNlLFRBUCkpOnBoYXNlPT09UEhBU0VfTU9WRSYmKHBoYXNlPVBIQVNFX0NBTkNFTCx0cmlnZ2VySGFuZGxlcihldmVudCxwaGFzZSkpLHNldFRvdWNoSW5Qcm9ncmVzcyghMSksbnVsbH1mdW5jdGlvbiB0b3VjaENhbmNlbCgpe2ZpbmdlckNvdW50PTAsZW5kVGltZT0wLHN0YXJ0VGltZT0wLHN0YXJ0VG91Y2hlc0Rpc3RhbmNlPTAsZW5kVG91Y2hlc0Rpc3RhbmNlPTAscGluY2hab29tPTEsY2FuY2VsTXVsdGlGaW5nZXJSZWxlYXNlKCksc2V0VG91Y2hJblByb2dyZXNzKCExKX1mdW5jdGlvbiB0b3VjaExlYXZlKGpxRXZlbnQpe3ZhciBldmVudD1qcUV2ZW50Lm9yaWdpbmFsRXZlbnQ/anFFdmVudC5vcmlnaW5hbEV2ZW50OmpxRXZlbnQ7b3B0aW9ucy50cmlnZ2VyT25Ub3VjaExlYXZlJiYocGhhc2U9Z2V0TmV4dFBoYXNlKFBIQVNFX0VORCksdHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2UpKX1mdW5jdGlvbiByZW1vdmVMaXN0ZW5lcnMoKXskZWxlbWVudC5vZmYoU1RBUlRfRVYsdG91Y2hTdGFydCksJGVsZW1lbnQub2ZmKENBTkNFTF9FVix0b3VjaENhbmNlbCksJGVsZW1lbnQub2ZmKE1PVkVfRVYsdG91Y2hNb3ZlKSwkZWxlbWVudC5vZmYoRU5EX0VWLHRvdWNoRW5kKSxMRUFWRV9FViYmJGVsZW1lbnQub2ZmKExFQVZFX0VWLHRvdWNoTGVhdmUpLHNldFRvdWNoSW5Qcm9ncmVzcyghMSl9ZnVuY3Rpb24gZ2V0TmV4dFBoYXNlKGN1cnJlbnRQaGFzZSl7dmFyIG5leHRQaGFzZT1jdXJyZW50UGhhc2UsdmFsaWRUaW1lPXZhbGlkYXRlU3dpcGVUaW1lKCksdmFsaWREaXN0YW5jZT12YWxpZGF0ZVN3aXBlRGlzdGFuY2UoKSxkaWRDYW5jZWw9ZGlkU3dpcGVCYWNrVG9DYW5jZWwoKTtyZXR1cm4hdmFsaWRUaW1lfHxkaWRDYW5jZWw/bmV4dFBoYXNlPVBIQVNFX0NBTkNFTDohdmFsaWREaXN0YW5jZXx8Y3VycmVudFBoYXNlIT1QSEFTRV9NT1ZFfHxvcHRpb25zLnRyaWdnZXJPblRvdWNoRW5kJiYhb3B0aW9ucy50cmlnZ2VyT25Ub3VjaExlYXZlPyF2YWxpZERpc3RhbmNlJiZjdXJyZW50UGhhc2U9PVBIQVNFX0VORCYmb3B0aW9ucy50cmlnZ2VyT25Ub3VjaExlYXZlJiYobmV4dFBoYXNlPVBIQVNFX0NBTkNFTCk6bmV4dFBoYXNlPVBIQVNFX0VORCxuZXh0UGhhc2V9ZnVuY3Rpb24gdHJpZ2dlckhhbmRsZXIoZXZlbnQscGhhc2Upe3ZhciByZXQsdG91Y2hlcz1ldmVudC50b3VjaGVzO3JldHVybihkaWRTd2lwZSgpfHxoYXNTd2lwZXMoKSkmJihyZXQ9dHJpZ2dlckhhbmRsZXJGb3JHZXN0dXJlKGV2ZW50LHBoYXNlLFNXSVBFKSksKGRpZFBpbmNoKCl8fGhhc1BpbmNoZXMoKSkmJnJldCE9PSExJiYocmV0PXRyaWdnZXJIYW5kbGVyRm9yR2VzdHVyZShldmVudCxwaGFzZSxQSU5DSCkpLGRpZERvdWJsZVRhcCgpJiZyZXQhPT0hMT9yZXQ9dHJpZ2dlckhhbmRsZXJGb3JHZXN0dXJlKGV2ZW50LHBoYXNlLERPVUJMRV9UQVApOmRpZExvbmdUYXAoKSYmcmV0IT09ITE/cmV0PXRyaWdnZXJIYW5kbGVyRm9yR2VzdHVyZShldmVudCxwaGFzZSxMT05HX1RBUCk6ZGlkVGFwKCkmJnJldCE9PSExJiYocmV0PXRyaWdnZXJIYW5kbGVyRm9yR2VzdHVyZShldmVudCxwaGFzZSxUQVApKSxwaGFzZT09PVBIQVNFX0NBTkNFTCYmdG91Y2hDYW5jZWwoZXZlbnQpLHBoYXNlPT09UEhBU0VfRU5EJiYodG91Y2hlcz90b3VjaGVzLmxlbmd0aHx8dG91Y2hDYW5jZWwoZXZlbnQpOnRvdWNoQ2FuY2VsKGV2ZW50KSkscmV0fWZ1bmN0aW9uIHRyaWdnZXJIYW5kbGVyRm9yR2VzdHVyZShldmVudCxwaGFzZSxnZXN0dXJlKXt2YXIgcmV0O2lmKGdlc3R1cmU9PVNXSVBFKXtpZigkZWxlbWVudC50cmlnZ2VyKFwic3dpcGVTdGF0dXNcIixbcGhhc2UsZGlyZWN0aW9ufHxudWxsLGRpc3RhbmNlfHwwLGR1cmF0aW9ufHwwLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbl0pLG9wdGlvbnMuc3dpcGVTdGF0dXMmJihyZXQ9b3B0aW9ucy5zd2lwZVN0YXR1cy5jYWxsKCRlbGVtZW50LGV2ZW50LHBoYXNlLGRpcmVjdGlvbnx8bnVsbCxkaXN0YW5jZXx8MCxkdXJhdGlvbnx8MCxmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb24pLHJldD09PSExKSlyZXR1cm4hMTtpZihwaGFzZT09UEhBU0VfRU5EJiZ2YWxpZGF0ZVN3aXBlKCkpe2lmKGNsZWFyVGltZW91dChzaW5nbGVUYXBUaW1lb3V0KSxjbGVhclRpbWVvdXQoaG9sZFRpbWVvdXQpLCRlbGVtZW50LnRyaWdnZXIoXCJzd2lwZVwiLFtkaXJlY3Rpb24sZGlzdGFuY2UsZHVyYXRpb24sZmluZ2VyQ291bnQsZmluZ2VyRGF0YSxjdXJyZW50RGlyZWN0aW9uXSksb3B0aW9ucy5zd2lwZSYmKHJldD1vcHRpb25zLnN3aXBlLmNhbGwoJGVsZW1lbnQsZXZlbnQsZGlyZWN0aW9uLGRpc3RhbmNlLGR1cmF0aW9uLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbikscmV0PT09ITEpKXJldHVybiExO3N3aXRjaChkaXJlY3Rpb24pe2Nhc2UgTEVGVDokZWxlbWVudC50cmlnZ2VyKFwic3dpcGVMZWZ0XCIsW2RpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb25dKSxvcHRpb25zLnN3aXBlTGVmdCYmKHJldD1vcHRpb25zLnN3aXBlTGVmdC5jYWxsKCRlbGVtZW50LGV2ZW50LGRpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb24pKTticmVhaztjYXNlIFJJR0hUOiRlbGVtZW50LnRyaWdnZXIoXCJzd2lwZVJpZ2h0XCIsW2RpcmVjdGlvbixkaXN0YW5jZSxkdXJhdGlvbixmaW5nZXJDb3VudCxmaW5nZXJEYXRhLGN1cnJlbnREaXJlY3Rpb25dKSxvcHRpb25zLnN3aXBlUmlnaHQmJihyZXQ9b3B0aW9ucy5zd2lwZVJpZ2h0LmNhbGwoJGVsZW1lbnQsZXZlbnQsZGlyZWN0aW9uLGRpc3RhbmNlLGR1cmF0aW9uLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbikpO2JyZWFrO2Nhc2UgVVA6JGVsZW1lbnQudHJpZ2dlcihcInN3aXBlVXBcIixbZGlyZWN0aW9uLGRpc3RhbmNlLGR1cmF0aW9uLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbl0pLG9wdGlvbnMuc3dpcGVVcCYmKHJldD1vcHRpb25zLnN3aXBlVXAuY2FsbCgkZWxlbWVudCxldmVudCxkaXJlY3Rpb24sZGlzdGFuY2UsZHVyYXRpb24sZmluZ2VyQ291bnQsZmluZ2VyRGF0YSxjdXJyZW50RGlyZWN0aW9uKSk7YnJlYWs7Y2FzZSBET1dOOiRlbGVtZW50LnRyaWdnZXIoXCJzd2lwZURvd25cIixbZGlyZWN0aW9uLGRpc3RhbmNlLGR1cmF0aW9uLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbl0pLG9wdGlvbnMuc3dpcGVEb3duJiYocmV0PW9wdGlvbnMuc3dpcGVEb3duLmNhbGwoJGVsZW1lbnQsZXZlbnQsZGlyZWN0aW9uLGRpc3RhbmNlLGR1cmF0aW9uLGZpbmdlckNvdW50LGZpbmdlckRhdGEsY3VycmVudERpcmVjdGlvbikpfX19aWYoZ2VzdHVyZT09UElOQ0gpe2lmKCRlbGVtZW50LnRyaWdnZXIoXCJwaW5jaFN0YXR1c1wiLFtwaGFzZSxwaW5jaERpcmVjdGlvbnx8bnVsbCxwaW5jaERpc3RhbmNlfHwwLGR1cmF0aW9ufHwwLGZpbmdlckNvdW50LHBpbmNoWm9vbSxmaW5nZXJEYXRhXSksb3B0aW9ucy5waW5jaFN0YXR1cyYmKHJldD1vcHRpb25zLnBpbmNoU3RhdHVzLmNhbGwoJGVsZW1lbnQsZXZlbnQscGhhc2UscGluY2hEaXJlY3Rpb258fG51bGwscGluY2hEaXN0YW5jZXx8MCxkdXJhdGlvbnx8MCxmaW5nZXJDb3VudCxwaW5jaFpvb20sZmluZ2VyRGF0YSkscmV0PT09ITEpKXJldHVybiExO2lmKHBoYXNlPT1QSEFTRV9FTkQmJnZhbGlkYXRlUGluY2goKSlzd2l0Y2gocGluY2hEaXJlY3Rpb24pe2Nhc2UgSU46JGVsZW1lbnQudHJpZ2dlcihcInBpbmNoSW5cIixbcGluY2hEaXJlY3Rpb258fG51bGwscGluY2hEaXN0YW5jZXx8MCxkdXJhdGlvbnx8MCxmaW5nZXJDb3VudCxwaW5jaFpvb20sZmluZ2VyRGF0YV0pLG9wdGlvbnMucGluY2hJbiYmKHJldD1vcHRpb25zLnBpbmNoSW4uY2FsbCgkZWxlbWVudCxldmVudCxwaW5jaERpcmVjdGlvbnx8bnVsbCxwaW5jaERpc3RhbmNlfHwwLGR1cmF0aW9ufHwwLGZpbmdlckNvdW50LHBpbmNoWm9vbSxmaW5nZXJEYXRhKSk7YnJlYWs7Y2FzZSBPVVQ6JGVsZW1lbnQudHJpZ2dlcihcInBpbmNoT3V0XCIsW3BpbmNoRGlyZWN0aW9ufHxudWxsLHBpbmNoRGlzdGFuY2V8fDAsZHVyYXRpb258fDAsZmluZ2VyQ291bnQscGluY2hab29tLGZpbmdlckRhdGFdKSxvcHRpb25zLnBpbmNoT3V0JiYocmV0PW9wdGlvbnMucGluY2hPdXQuY2FsbCgkZWxlbWVudCxldmVudCxwaW5jaERpcmVjdGlvbnx8bnVsbCxwaW5jaERpc3RhbmNlfHwwLGR1cmF0aW9ufHwwLGZpbmdlckNvdW50LHBpbmNoWm9vbSxmaW5nZXJEYXRhKSl9fXJldHVybiBnZXN0dXJlPT1UQVA/cGhhc2UhPT1QSEFTRV9DQU5DRUwmJnBoYXNlIT09UEhBU0VfRU5EfHwoY2xlYXJUaW1lb3V0KHNpbmdsZVRhcFRpbWVvdXQpLGNsZWFyVGltZW91dChob2xkVGltZW91dCksaGFzRG91YmxlVGFwKCkmJiFpbkRvdWJsZVRhcCgpPyhkb3VibGVUYXBTdGFydFRpbWU9Z2V0VGltZVN0YW1wKCksc2luZ2xlVGFwVGltZW91dD1zZXRUaW1lb3V0KCQucHJveHkoZnVuY3Rpb24oKXtkb3VibGVUYXBTdGFydFRpbWU9bnVsbCwkZWxlbWVudC50cmlnZ2VyKFwidGFwXCIsW2V2ZW50LnRhcmdldF0pLG9wdGlvbnMudGFwJiYocmV0PW9wdGlvbnMudGFwLmNhbGwoJGVsZW1lbnQsZXZlbnQsZXZlbnQudGFyZ2V0KSl9LHRoaXMpLG9wdGlvbnMuZG91YmxlVGFwVGhyZXNob2xkKSk6KGRvdWJsZVRhcFN0YXJ0VGltZT1udWxsLCRlbGVtZW50LnRyaWdnZXIoXCJ0YXBcIixbZXZlbnQudGFyZ2V0XSksb3B0aW9ucy50YXAmJihyZXQ9b3B0aW9ucy50YXAuY2FsbCgkZWxlbWVudCxldmVudCxldmVudC50YXJnZXQpKSkpOmdlc3R1cmU9PURPVUJMRV9UQVA/cGhhc2UhPT1QSEFTRV9DQU5DRUwmJnBoYXNlIT09UEhBU0VfRU5EfHwoY2xlYXJUaW1lb3V0KHNpbmdsZVRhcFRpbWVvdXQpLGNsZWFyVGltZW91dChob2xkVGltZW91dCksZG91YmxlVGFwU3RhcnRUaW1lPW51bGwsJGVsZW1lbnQudHJpZ2dlcihcImRvdWJsZXRhcFwiLFtldmVudC50YXJnZXRdKSxvcHRpb25zLmRvdWJsZVRhcCYmKHJldD1vcHRpb25zLmRvdWJsZVRhcC5jYWxsKCRlbGVtZW50LGV2ZW50LGV2ZW50LnRhcmdldCkpKTpnZXN0dXJlPT1MT05HX1RBUCYmKHBoYXNlIT09UEhBU0VfQ0FOQ0VMJiZwaGFzZSE9PVBIQVNFX0VORHx8KGNsZWFyVGltZW91dChzaW5nbGVUYXBUaW1lb3V0KSxkb3VibGVUYXBTdGFydFRpbWU9bnVsbCwkZWxlbWVudC50cmlnZ2VyKFwibG9uZ3RhcFwiLFtldmVudC50YXJnZXRdKSxvcHRpb25zLmxvbmdUYXAmJihyZXQ9b3B0aW9ucy5sb25nVGFwLmNhbGwoJGVsZW1lbnQsZXZlbnQsZXZlbnQudGFyZ2V0KSkpKSxyZXR9ZnVuY3Rpb24gdmFsaWRhdGVTd2lwZURpc3RhbmNlKCl7dmFyIHZhbGlkPSEwO3JldHVybiBudWxsIT09b3B0aW9ucy50aHJlc2hvbGQmJih2YWxpZD1kaXN0YW5jZT49b3B0aW9ucy50aHJlc2hvbGQpLHZhbGlkfWZ1bmN0aW9uIGRpZFN3aXBlQmFja1RvQ2FuY2VsKCl7dmFyIGNhbmNlbGxlZD0hMTtyZXR1cm4gbnVsbCE9PW9wdGlvbnMuY2FuY2VsVGhyZXNob2xkJiZudWxsIT09ZGlyZWN0aW9uJiYoY2FuY2VsbGVkPWdldE1heERpc3RhbmNlKGRpcmVjdGlvbiktZGlzdGFuY2U+PW9wdGlvbnMuY2FuY2VsVGhyZXNob2xkKSxjYW5jZWxsZWR9ZnVuY3Rpb24gdmFsaWRhdGVQaW5jaERpc3RhbmNlKCl7cmV0dXJuIG51bGwhPT1vcHRpb25zLnBpbmNoVGhyZXNob2xkP3BpbmNoRGlzdGFuY2U+PW9wdGlvbnMucGluY2hUaHJlc2hvbGQ6ITB9ZnVuY3Rpb24gdmFsaWRhdGVTd2lwZVRpbWUoKXt2YXIgcmVzdWx0O3JldHVybiByZXN1bHQ9b3B0aW9ucy5tYXhUaW1lVGhyZXNob2xkPyEoZHVyYXRpb24+PW9wdGlvbnMubWF4VGltZVRocmVzaG9sZCk6ITB9ZnVuY3Rpb24gdmFsaWRhdGVEZWZhdWx0RXZlbnQoanFFdmVudCxkaXJlY3Rpb24pe2lmKG9wdGlvbnMucHJldmVudERlZmF1bHRFdmVudHMhPT0hMSlpZihvcHRpb25zLmFsbG93UGFnZVNjcm9sbD09PU5PTkUpanFFdmVudC5wcmV2ZW50RGVmYXVsdCgpO2Vsc2V7dmFyIGF1dG89b3B0aW9ucy5hbGxvd1BhZ2VTY3JvbGw9PT1BVVRPO3N3aXRjaChkaXJlY3Rpb24pe2Nhc2UgTEVGVDoob3B0aW9ucy5zd2lwZUxlZnQmJmF1dG98fCFhdXRvJiZvcHRpb25zLmFsbG93UGFnZVNjcm9sbCE9SE9SSVpPTlRBTCkmJmpxRXZlbnQucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIFJJR0hUOihvcHRpb25zLnN3aXBlUmlnaHQmJmF1dG98fCFhdXRvJiZvcHRpb25zLmFsbG93UGFnZVNjcm9sbCE9SE9SSVpPTlRBTCkmJmpxRXZlbnQucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIFVQOihvcHRpb25zLnN3aXBlVXAmJmF1dG98fCFhdXRvJiZvcHRpb25zLmFsbG93UGFnZVNjcm9sbCE9VkVSVElDQUwpJiZqcUV2ZW50LnByZXZlbnREZWZhdWx0KCk7YnJlYWs7Y2FzZSBET1dOOihvcHRpb25zLnN3aXBlRG93biYmYXV0b3x8IWF1dG8mJm9wdGlvbnMuYWxsb3dQYWdlU2Nyb2xsIT1WRVJUSUNBTCkmJmpxRXZlbnQucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIE5PTkU6fX19ZnVuY3Rpb24gdmFsaWRhdGVQaW5jaCgpe3ZhciBoYXNDb3JyZWN0RmluZ2VyQ291bnQ9dmFsaWRhdGVGaW5nZXJzKCksaGFzRW5kUG9pbnQ9dmFsaWRhdGVFbmRQb2ludCgpLGhhc0NvcnJlY3REaXN0YW5jZT12YWxpZGF0ZVBpbmNoRGlzdGFuY2UoKTtyZXR1cm4gaGFzQ29ycmVjdEZpbmdlckNvdW50JiZoYXNFbmRQb2ludCYmaGFzQ29ycmVjdERpc3RhbmNlfWZ1bmN0aW9uIGhhc1BpbmNoZXMoKXtyZXR1cm4hIShvcHRpb25zLnBpbmNoU3RhdHVzfHxvcHRpb25zLnBpbmNoSW58fG9wdGlvbnMucGluY2hPdXQpfWZ1bmN0aW9uIGRpZFBpbmNoKCl7cmV0dXJuISghdmFsaWRhdGVQaW5jaCgpfHwhaGFzUGluY2hlcygpKX1mdW5jdGlvbiB2YWxpZGF0ZVN3aXBlKCl7dmFyIGhhc1ZhbGlkVGltZT12YWxpZGF0ZVN3aXBlVGltZSgpLGhhc1ZhbGlkRGlzdGFuY2U9dmFsaWRhdGVTd2lwZURpc3RhbmNlKCksaGFzQ29ycmVjdEZpbmdlckNvdW50PXZhbGlkYXRlRmluZ2VycygpLGhhc0VuZFBvaW50PXZhbGlkYXRlRW5kUG9pbnQoKSxkaWRDYW5jZWw9ZGlkU3dpcGVCYWNrVG9DYW5jZWwoKSx2YWxpZD0hZGlkQ2FuY2VsJiZoYXNFbmRQb2ludCYmaGFzQ29ycmVjdEZpbmdlckNvdW50JiZoYXNWYWxpZERpc3RhbmNlJiZoYXNWYWxpZFRpbWU7cmV0dXJuIHZhbGlkfWZ1bmN0aW9uIGhhc1N3aXBlcygpe3JldHVybiEhKG9wdGlvbnMuc3dpcGV8fG9wdGlvbnMuc3dpcGVTdGF0dXN8fG9wdGlvbnMuc3dpcGVMZWZ0fHxvcHRpb25zLnN3aXBlUmlnaHR8fG9wdGlvbnMuc3dpcGVVcHx8b3B0aW9ucy5zd2lwZURvd24pfWZ1bmN0aW9uIGRpZFN3aXBlKCl7cmV0dXJuISghdmFsaWRhdGVTd2lwZSgpfHwhaGFzU3dpcGVzKCkpfWZ1bmN0aW9uIHZhbGlkYXRlRmluZ2Vycygpe3JldHVybiBmaW5nZXJDb3VudD09PW9wdGlvbnMuZmluZ2Vyc3x8b3B0aW9ucy5maW5nZXJzPT09QUxMX0ZJTkdFUlN8fCFTVVBQT1JUU19UT1VDSH1mdW5jdGlvbiB2YWxpZGF0ZUVuZFBvaW50KCl7cmV0dXJuIDAhPT1maW5nZXJEYXRhWzBdLmVuZC54fWZ1bmN0aW9uIGhhc1RhcCgpe3JldHVybiEhb3B0aW9ucy50YXB9ZnVuY3Rpb24gaGFzRG91YmxlVGFwKCl7cmV0dXJuISFvcHRpb25zLmRvdWJsZVRhcH1mdW5jdGlvbiBoYXNMb25nVGFwKCl7cmV0dXJuISFvcHRpb25zLmxvbmdUYXB9ZnVuY3Rpb24gdmFsaWRhdGVEb3VibGVUYXAoKXtpZihudWxsPT1kb3VibGVUYXBTdGFydFRpbWUpcmV0dXJuITE7dmFyIG5vdz1nZXRUaW1lU3RhbXAoKTtyZXR1cm4gaGFzRG91YmxlVGFwKCkmJm5vdy1kb3VibGVUYXBTdGFydFRpbWU8PW9wdGlvbnMuZG91YmxlVGFwVGhyZXNob2xkfWZ1bmN0aW9uIGluRG91YmxlVGFwKCl7cmV0dXJuIHZhbGlkYXRlRG91YmxlVGFwKCl9ZnVuY3Rpb24gdmFsaWRhdGVUYXAoKXtyZXR1cm4oMT09PWZpbmdlckNvdW50fHwhU1VQUE9SVFNfVE9VQ0gpJiYoaXNOYU4oZGlzdGFuY2UpfHxkaXN0YW5jZTxvcHRpb25zLnRocmVzaG9sZCl9ZnVuY3Rpb24gdmFsaWRhdGVMb25nVGFwKCl7cmV0dXJuIGR1cmF0aW9uPm9wdGlvbnMubG9uZ1RhcFRocmVzaG9sZCYmRE9VQkxFX1RBUF9USFJFU0hPTEQ+ZGlzdGFuY2V9ZnVuY3Rpb24gZGlkVGFwKCl7cmV0dXJuISghdmFsaWRhdGVUYXAoKXx8IWhhc1RhcCgpKX1mdW5jdGlvbiBkaWREb3VibGVUYXAoKXtyZXR1cm4hKCF2YWxpZGF0ZURvdWJsZVRhcCgpfHwhaGFzRG91YmxlVGFwKCkpfWZ1bmN0aW9uIGRpZExvbmdUYXAoKXtyZXR1cm4hKCF2YWxpZGF0ZUxvbmdUYXAoKXx8IWhhc0xvbmdUYXAoKSl9ZnVuY3Rpb24gc3RhcnRNdWx0aUZpbmdlclJlbGVhc2UoZXZlbnQpe3ByZXZpb3VzVG91Y2hFbmRUaW1lPWdldFRpbWVTdGFtcCgpLGZpbmdlckNvdW50QXRSZWxlYXNlPWV2ZW50LnRvdWNoZXMubGVuZ3RoKzF9ZnVuY3Rpb24gY2FuY2VsTXVsdGlGaW5nZXJSZWxlYXNlKCl7cHJldmlvdXNUb3VjaEVuZFRpbWU9MCxmaW5nZXJDb3VudEF0UmVsZWFzZT0wfWZ1bmN0aW9uIGluTXVsdGlGaW5nZXJSZWxlYXNlKCl7dmFyIHdpdGhpblRocmVzaG9sZD0hMTtpZihwcmV2aW91c1RvdWNoRW5kVGltZSl7dmFyIGRpZmY9Z2V0VGltZVN0YW1wKCktcHJldmlvdXNUb3VjaEVuZFRpbWU7ZGlmZjw9b3B0aW9ucy5maW5nZXJSZWxlYXNlVGhyZXNob2xkJiYod2l0aGluVGhyZXNob2xkPSEwKX1yZXR1cm4gd2l0aGluVGhyZXNob2xkfWZ1bmN0aW9uIGdldFRvdWNoSW5Qcm9ncmVzcygpe3JldHVybiEoJGVsZW1lbnQuZGF0YShQTFVHSU5fTlMrXCJfaW50b3VjaFwiKSE9PSEwKX1mdW5jdGlvbiBzZXRUb3VjaEluUHJvZ3Jlc3ModmFsKXskZWxlbWVudCYmKHZhbD09PSEwPygkZWxlbWVudC5vbihNT1ZFX0VWLHRvdWNoTW92ZSksJGVsZW1lbnQub24oRU5EX0VWLHRvdWNoRW5kKSxMRUFWRV9FViYmJGVsZW1lbnQub24oTEVBVkVfRVYsdG91Y2hMZWF2ZSkpOigkZWxlbWVudC5vZmYoTU9WRV9FVix0b3VjaE1vdmUsITEpLCRlbGVtZW50Lm9mZihFTkRfRVYsdG91Y2hFbmQsITEpLExFQVZFX0VWJiYkZWxlbWVudC5vZmYoTEVBVkVfRVYsdG91Y2hMZWF2ZSwhMSkpLCRlbGVtZW50LmRhdGEoUExVR0lOX05TK1wiX2ludG91Y2hcIix2YWw9PT0hMCkpfWZ1bmN0aW9uIGNyZWF0ZUZpbmdlckRhdGEoaWQsZXZ0KXt2YXIgZj17c3RhcnQ6e3g6MCx5OjB9LGxhc3Q6e3g6MCx5OjB9LGVuZDp7eDowLHk6MH19O3JldHVybiBmLnN0YXJ0Lng9Zi5sYXN0Lng9Zi5lbmQueD1ldnQucGFnZVh8fGV2dC5jbGllbnRYLGYuc3RhcnQueT1mLmxhc3QueT1mLmVuZC55PWV2dC5wYWdlWXx8ZXZ0LmNsaWVudFksZmluZ2VyRGF0YVtpZF09ZixmfWZ1bmN0aW9uIHVwZGF0ZUZpbmdlckRhdGEoZXZ0KXt2YXIgaWQ9dm9pZCAwIT09ZXZ0LmlkZW50aWZpZXI/ZXZ0LmlkZW50aWZpZXI6MCxmPWdldEZpbmdlckRhdGEoaWQpO3JldHVybiBudWxsPT09ZiYmKGY9Y3JlYXRlRmluZ2VyRGF0YShpZCxldnQpKSxmLmxhc3QueD1mLmVuZC54LGYubGFzdC55PWYuZW5kLnksZi5lbmQueD1ldnQucGFnZVh8fGV2dC5jbGllbnRYLGYuZW5kLnk9ZXZ0LnBhZ2VZfHxldnQuY2xpZW50WSxmfWZ1bmN0aW9uIGdldEZpbmdlckRhdGEoaWQpe3JldHVybiBmaW5nZXJEYXRhW2lkXXx8bnVsbH1mdW5jdGlvbiBzZXRNYXhEaXN0YW5jZShkaXJlY3Rpb24sZGlzdGFuY2Upe2RpcmVjdGlvbiE9Tk9ORSYmKGRpc3RhbmNlPU1hdGgubWF4KGRpc3RhbmNlLGdldE1heERpc3RhbmNlKGRpcmVjdGlvbikpLG1heGltdW1zTWFwW2RpcmVjdGlvbl0uZGlzdGFuY2U9ZGlzdGFuY2UpfWZ1bmN0aW9uIGdldE1heERpc3RhbmNlKGRpcmVjdGlvbil7cmV0dXJuIG1heGltdW1zTWFwW2RpcmVjdGlvbl0/bWF4aW11bXNNYXBbZGlyZWN0aW9uXS5kaXN0YW5jZTp2b2lkIDB9ZnVuY3Rpb24gY3JlYXRlTWF4aW11bXNEYXRhKCl7dmFyIG1heERhdGE9e307cmV0dXJuIG1heERhdGFbTEVGVF09Y3JlYXRlTWF4aW11bVZPKExFRlQpLG1heERhdGFbUklHSFRdPWNyZWF0ZU1heGltdW1WTyhSSUdIVCksbWF4RGF0YVtVUF09Y3JlYXRlTWF4aW11bVZPKFVQKSxtYXhEYXRhW0RPV05dPWNyZWF0ZU1heGltdW1WTyhET1dOKSxtYXhEYXRhfWZ1bmN0aW9uIGNyZWF0ZU1heGltdW1WTyhkaXIpe3JldHVybntkaXJlY3Rpb246ZGlyLGRpc3RhbmNlOjB9fWZ1bmN0aW9uIGNhbGN1bGF0ZUR1cmF0aW9uKCl7cmV0dXJuIGVuZFRpbWUtc3RhcnRUaW1lfWZ1bmN0aW9uIGNhbGN1bGF0ZVRvdWNoZXNEaXN0YW5jZShzdGFydFBvaW50LGVuZFBvaW50KXt2YXIgZGlmZlg9TWF0aC5hYnMoc3RhcnRQb2ludC54LWVuZFBvaW50LngpLGRpZmZZPU1hdGguYWJzKHN0YXJ0UG9pbnQueS1lbmRQb2ludC55KTtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnNxcnQoZGlmZlgqZGlmZlgrZGlmZlkqZGlmZlkpKX1mdW5jdGlvbiBjYWxjdWxhdGVQaW5jaFpvb20oc3RhcnREaXN0YW5jZSxlbmREaXN0YW5jZSl7dmFyIHBlcmNlbnQ9ZW5kRGlzdGFuY2Uvc3RhcnREaXN0YW5jZSoxO3JldHVybiBwZXJjZW50LnRvRml4ZWQoMil9ZnVuY3Rpb24gY2FsY3VsYXRlUGluY2hEaXJlY3Rpb24oKXtyZXR1cm4gMT5waW5jaFpvb20/T1VUOklOfWZ1bmN0aW9uIGNhbGN1bGF0ZURpc3RhbmNlKHN0YXJ0UG9pbnQsZW5kUG9pbnQpe3JldHVybiBNYXRoLnJvdW5kKE1hdGguc3FydChNYXRoLnBvdyhlbmRQb2ludC54LXN0YXJ0UG9pbnQueCwyKStNYXRoLnBvdyhlbmRQb2ludC55LXN0YXJ0UG9pbnQueSwyKSkpfWZ1bmN0aW9uIGNhbGN1bGF0ZUFuZ2xlKHN0YXJ0UG9pbnQsZW5kUG9pbnQpe3ZhciB4PXN0YXJ0UG9pbnQueC1lbmRQb2ludC54LHk9ZW5kUG9pbnQueS1zdGFydFBvaW50Lnkscj1NYXRoLmF0YW4yKHkseCksYW5nbGU9TWF0aC5yb3VuZCgxODAqci9NYXRoLlBJKTtyZXR1cm4gMD5hbmdsZSYmKGFuZ2xlPTM2MC1NYXRoLmFicyhhbmdsZSkpLGFuZ2xlfWZ1bmN0aW9uIGNhbGN1bGF0ZURpcmVjdGlvbihzdGFydFBvaW50LGVuZFBvaW50KXtpZihjb21wYXJlUG9pbnRzKHN0YXJ0UG9pbnQsZW5kUG9pbnQpKXJldHVybiBOT05FO3ZhciBhbmdsZT1jYWxjdWxhdGVBbmdsZShzdGFydFBvaW50LGVuZFBvaW50KTtyZXR1cm4gNDU+PWFuZ2xlJiZhbmdsZT49MD9MRUZUOjM2MD49YW5nbGUmJmFuZ2xlPj0zMTU/TEVGVDphbmdsZT49MTM1JiYyMjU+PWFuZ2xlP1JJR0hUOmFuZ2xlPjQ1JiYxMzU+YW5nbGU/RE9XTjpVUH1mdW5jdGlvbiBnZXRUaW1lU3RhbXAoKXt2YXIgbm93PW5ldyBEYXRlO3JldHVybiBub3cuZ2V0VGltZSgpfWZ1bmN0aW9uIGdldGJvdW5kcyhlbCl7ZWw9JChlbCk7dmFyIG9mZnNldD1lbC5vZmZzZXQoKSxib3VuZHM9e2xlZnQ6b2Zmc2V0LmxlZnQscmlnaHQ6b2Zmc2V0LmxlZnQrZWwub3V0ZXJXaWR0aCgpLHRvcDpvZmZzZXQudG9wLGJvdHRvbTpvZmZzZXQudG9wK2VsLm91dGVySGVpZ2h0KCl9O3JldHVybiBib3VuZHN9ZnVuY3Rpb24gaXNJbkJvdW5kcyhwb2ludCxib3VuZHMpe3JldHVybiBwb2ludC54PmJvdW5kcy5sZWZ0JiZwb2ludC54PGJvdW5kcy5yaWdodCYmcG9pbnQueT5ib3VuZHMudG9wJiZwb2ludC55PGJvdW5kcy5ib3R0b219ZnVuY3Rpb24gY29tcGFyZVBvaW50cyhwb2ludEEscG9pbnRCKXtyZXR1cm4gcG9pbnRBLng9PXBvaW50Qi54JiZwb2ludEEueT09cG9pbnRCLnl9dmFyIG9wdGlvbnM9JC5leHRlbmQoe30sb3B0aW9ucyksdXNlVG91Y2hFdmVudHM9U1VQUE9SVFNfVE9VQ0h8fFNVUFBPUlRTX1BPSU5URVJ8fCFvcHRpb25zLmZhbGxiYWNrVG9Nb3VzZUV2ZW50cyxTVEFSVF9FVj11c2VUb3VjaEV2ZW50cz9TVVBQT1JUU19QT0lOVEVSP1NVUFBPUlRTX1BPSU5URVJfSUUxMD9cIk1TUG9pbnRlckRvd25cIjpcInBvaW50ZXJkb3duXCI6XCJ0b3VjaHN0YXJ0XCI6XCJtb3VzZWRvd25cIixNT1ZFX0VWPXVzZVRvdWNoRXZlbnRzP1NVUFBPUlRTX1BPSU5URVI/U1VQUE9SVFNfUE9JTlRFUl9JRTEwP1wiTVNQb2ludGVyTW92ZVwiOlwicG9pbnRlcm1vdmVcIjpcInRvdWNobW92ZVwiOlwibW91c2Vtb3ZlXCIsRU5EX0VWPXVzZVRvdWNoRXZlbnRzP1NVUFBPUlRTX1BPSU5URVI/U1VQUE9SVFNfUE9JTlRFUl9JRTEwP1wiTVNQb2ludGVyVXBcIjpcInBvaW50ZXJ1cFwiOlwidG91Y2hlbmRcIjpcIm1vdXNldXBcIixMRUFWRV9FVj11c2VUb3VjaEV2ZW50cz9TVVBQT1JUU19QT0lOVEVSP1wibW91c2VsZWF2ZVwiOm51bGw6XCJtb3VzZWxlYXZlXCIsQ0FOQ0VMX0VWPVNVUFBPUlRTX1BPSU5URVI/U1VQUE9SVFNfUE9JTlRFUl9JRTEwP1wiTVNQb2ludGVyQ2FuY2VsXCI6XCJwb2ludGVyY2FuY2VsXCI6XCJ0b3VjaGNhbmNlbFwiLGRpc3RhbmNlPTAsZGlyZWN0aW9uPW51bGwsY3VycmVudERpcmVjdGlvbj1udWxsLGR1cmF0aW9uPTAsc3RhcnRUb3VjaGVzRGlzdGFuY2U9MCxlbmRUb3VjaGVzRGlzdGFuY2U9MCxwaW5jaFpvb209MSxwaW5jaERpc3RhbmNlPTAscGluY2hEaXJlY3Rpb249MCxtYXhpbXVtc01hcD1udWxsLCRlbGVtZW50PSQoZWxlbWVudCkscGhhc2U9XCJzdGFydFwiLGZpbmdlckNvdW50PTAsZmluZ2VyRGF0YT17fSxzdGFydFRpbWU9MCxlbmRUaW1lPTAscHJldmlvdXNUb3VjaEVuZFRpbWU9MCxmaW5nZXJDb3VudEF0UmVsZWFzZT0wLGRvdWJsZVRhcFN0YXJ0VGltZT0wLHNpbmdsZVRhcFRpbWVvdXQ9bnVsbCxob2xkVGltZW91dD1udWxsO3RyeXskZWxlbWVudC5vbihTVEFSVF9FVix0b3VjaFN0YXJ0KSwkZWxlbWVudC5vbihDQU5DRUxfRVYsdG91Y2hDYW5jZWwpfWNhdGNoKGUpeyQuZXJyb3IoXCJldmVudHMgbm90IHN1cHBvcnRlZCBcIitTVEFSVF9FVitcIixcIitDQU5DRUxfRVYrXCIgb24galF1ZXJ5LnN3aXBlXCIpfXRoaXMuZW5hYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZSgpLCRlbGVtZW50Lm9uKFNUQVJUX0VWLHRvdWNoU3RhcnQpLCRlbGVtZW50Lm9uKENBTkNFTF9FVix0b3VjaENhbmNlbCksJGVsZW1lbnR9LHRoaXMuZGlzYWJsZT1mdW5jdGlvbigpe3JldHVybiByZW1vdmVMaXN0ZW5lcnMoKSwkZWxlbWVudH0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7cmVtb3ZlTGlzdGVuZXJzKCksJGVsZW1lbnQuZGF0YShQTFVHSU5fTlMsbnVsbCksJGVsZW1lbnQ9bnVsbH0sdGhpcy5vcHRpb249ZnVuY3Rpb24ocHJvcGVydHksdmFsdWUpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBwcm9wZXJ0eSlvcHRpb25zPSQuZXh0ZW5kKG9wdGlvbnMscHJvcGVydHkpO2Vsc2UgaWYodm9pZCAwIT09b3B0aW9uc1twcm9wZXJ0eV0pe2lmKHZvaWQgMD09PXZhbHVlKXJldHVybiBvcHRpb25zW3Byb3BlcnR5XTtvcHRpb25zW3Byb3BlcnR5XT12YWx1ZX1lbHNle2lmKCFwcm9wZXJ0eSlyZXR1cm4gb3B0aW9uczskLmVycm9yKFwiT3B0aW9uIFwiK3Byb3BlcnR5K1wiIGRvZXMgbm90IGV4aXN0IG9uIGpRdWVyeS5zd2lwZS5vcHRpb25zXCIpfXJldHVybiBudWxsfX12YXIgVkVSU0lPTj1cIjEuNi4xOFwiLExFRlQ9XCJsZWZ0XCIsUklHSFQ9XCJyaWdodFwiLFVQPVwidXBcIixET1dOPVwiZG93blwiLElOPVwiaW5cIixPVVQ9XCJvdXRcIixOT05FPVwibm9uZVwiLEFVVE89XCJhdXRvXCIsU1dJUEU9XCJzd2lwZVwiLFBJTkNIPVwicGluY2hcIixUQVA9XCJ0YXBcIixET1VCTEVfVEFQPVwiZG91YmxldGFwXCIsTE9OR19UQVA9XCJsb25ndGFwXCIsSE9SSVpPTlRBTD1cImhvcml6b250YWxcIixWRVJUSUNBTD1cInZlcnRpY2FsXCIsQUxMX0ZJTkdFUlM9XCJhbGxcIixET1VCTEVfVEFQX1RIUkVTSE9MRD0xMCxQSEFTRV9TVEFSVD1cInN0YXJ0XCIsUEhBU0VfTU9WRT1cIm1vdmVcIixQSEFTRV9FTkQ9XCJlbmRcIixQSEFTRV9DQU5DRUw9XCJjYW5jZWxcIixTVVBQT1JUU19UT1VDSD1cIm9udG91Y2hzdGFydFwiaW4gd2luZG93LFNVUFBPUlRTX1BPSU5URVJfSUUxMD13aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQmJiF3aW5kb3cuUG9pbnRlckV2ZW50JiYhU1VQUE9SVFNfVE9VQ0gsU1VQUE9SVFNfUE9JTlRFUj0od2luZG93LlBvaW50ZXJFdmVudHx8d2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkKSYmIVNVUFBPUlRTX1RPVUNILFBMVUdJTl9OUz1cIlRvdWNoU3dpcGVcIixkZWZhdWx0cz17ZmluZ2VyczoxLHRocmVzaG9sZDo3NSxjYW5jZWxUaHJlc2hvbGQ6bnVsbCxwaW5jaFRocmVzaG9sZDoyMCxtYXhUaW1lVGhyZXNob2xkOm51bGwsZmluZ2VyUmVsZWFzZVRocmVzaG9sZDoyNTAsbG9uZ1RhcFRocmVzaG9sZDo1MDAsZG91YmxlVGFwVGhyZXNob2xkOjIwMCxzd2lwZTpudWxsLHN3aXBlTGVmdDpudWxsLHN3aXBlUmlnaHQ6bnVsbCxzd2lwZVVwOm51bGwsc3dpcGVEb3duOm51bGwsc3dpcGVTdGF0dXM6bnVsbCxwaW5jaEluOm51bGwscGluY2hPdXQ6bnVsbCxwaW5jaFN0YXR1czpudWxsLGNsaWNrOm51bGwsdGFwOm51bGwsZG91YmxlVGFwOm51bGwsbG9uZ1RhcDpudWxsLGhvbGQ6bnVsbCx0cmlnZ2VyT25Ub3VjaEVuZDohMCx0cmlnZ2VyT25Ub3VjaExlYXZlOiExLGFsbG93UGFnZVNjcm9sbDpcImF1dG9cIixmYWxsYmFja1RvTW91c2VFdmVudHM6ITAsZXhjbHVkZWRFbGVtZW50czpcIi5ub1N3aXBlXCIscHJldmVudERlZmF1bHRFdmVudHM6ITB9OyQuZm4uc3dpcGU9ZnVuY3Rpb24obWV0aG9kKXt2YXIgJHRoaXM9JCh0aGlzKSxwbHVnaW49JHRoaXMuZGF0YShQTFVHSU5fTlMpO2lmKHBsdWdpbiYmXCJzdHJpbmdcIj09dHlwZW9mIG1ldGhvZCl7aWYocGx1Z2luW21ldGhvZF0pcmV0dXJuIHBsdWdpblttZXRob2RdLmFwcGx5KHBsdWdpbixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMSkpOyQuZXJyb3IoXCJNZXRob2QgXCIrbWV0aG9kK1wiIGRvZXMgbm90IGV4aXN0IG9uIGpRdWVyeS5zd2lwZVwiKX1lbHNlIGlmKHBsdWdpbiYmXCJvYmplY3RcIj09dHlwZW9mIG1ldGhvZClwbHVnaW4ub3B0aW9uLmFwcGx5KHBsdWdpbixhcmd1bWVudHMpO2Vsc2UgaWYoIShwbHVnaW58fFwib2JqZWN0XCIhPXR5cGVvZiBtZXRob2QmJm1ldGhvZCkpcmV0dXJuIGluaXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiAkdGhpc30sJC5mbi5zd2lwZS52ZXJzaW9uPVZFUlNJT04sJC5mbi5zd2lwZS5kZWZhdWx0cz1kZWZhdWx0cywkLmZuLnN3aXBlLnBoYXNlcz17UEhBU0VfU1RBUlQ6UEhBU0VfU1RBUlQsUEhBU0VfTU9WRTpQSEFTRV9NT1ZFLFBIQVNFX0VORDpQSEFTRV9FTkQsUEhBU0VfQ0FOQ0VMOlBIQVNFX0NBTkNFTH0sJC5mbi5zd2lwZS5kaXJlY3Rpb25zPXtMRUZUOkxFRlQsUklHSFQ6UklHSFQsVVA6VVAsRE9XTjpET1dOLElOOklOLE9VVDpPVVR9LCQuZm4uc3dpcGUucGFnZVNjcm9sbD17Tk9ORTpOT05FLEhPUklaT05UQUw6SE9SSVpPTlRBTCxWRVJUSUNBTDpWRVJUSUNBTCxBVVRPOkFVVE99LCQuZm4uc3dpcGUuZmluZ2Vycz17T05FOjEsVFdPOjIsVEhSRUU6MyxGT1VSOjQsRklWRTo1LEFMTDpBTExfRklOR0VSU319KTsiLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cbmltcG9ydCBwcmVzdGFzaG9wIGZyb20gJ3ByZXN0YXNob3AnO1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuY29uc3QgcGFzc3dvcmRQb2xpY3kgPSB7XG4gIHRlbXBsYXRlOiAnI3Bhc3N3b3JkLWZlZWRiYWNrJyxcbiAgaGludDogJy5qcy1oaW50LXBhc3N3b3JkJyxcbiAgY29udGFpbmVyOiAnLnBhc3N3b3JkLXN0cmVuZ3RoLWZlZWRiYWNrJyxcbiAgc3RyZW5ndGhUZXh0OiAnLnBhc3N3b3JkLXN0cmVuZ3RoLXRleHQnLFxuICByZXF1aXJlbWVudFNjb3JlOiAnLnBhc3N3b3JkLXJlcXVpcmVtZW50cy1zY29yZScsXG4gIHJlcXVpcmVtZW50TGVuZ3RoOiAnLnBhc3N3b3JkLXJlcXVpcmVtZW50cy1sZW5ndGgnLFxuICByZXF1aXJlbWVudFNjb3JlSWNvbjogJy5wYXNzd29yZC1yZXF1aXJlbWVudHMtc2NvcmUgaScsXG4gIHJlcXVpcmVtZW50TGVuZ3RoSWNvbjogJy5wYXNzd29yZC1yZXF1aXJlbWVudHMtbGVuZ3RoIGknLFxuICBwcm9ncmVzc0JhcjogJy5wcm9ncmVzcy1iYXInLFxuICBpbnB1dENvbHVtbjogJy5qcy1pbnB1dC1jb2x1bW4nLFxufTtcblxucHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycyA9IHtcbiAgcHJvZHVjdDoge1xuICAgIHRhYnM6ICcudGFicyAubmF2LWxpbmsnLFxuICAgIGFjdGl2ZU5hdkNsYXNzOiAnanMtcHJvZHVjdC1uYXYtYWN0aXZlJyxcbiAgICBhY3RpdmVUYWJDbGFzczogJ2pzLXByb2R1Y3QtdGFiLWFjdGl2ZScsXG4gICAgYWN0aXZlVGFiczogJy50YWJzIC5uYXYtbGluay5hY3RpdmUsIC5qcy1wcm9kdWN0LW5hdi1hY3RpdmUnLFxuICAgIGltYWdlc01vZGFsOiAnLmpzLXByb2R1Y3QtaW1hZ2VzLW1vZGFsJyxcbiAgICB0aHVtYjogJy5qcy10aHVtYicsXG4gICAgdGh1bWJDb250YWluZXI6ICcudGh1bWItY29udGFpbmVyLCAuanMtdGh1bWItY29udGFpbmVyJyxcbiAgICBhcnJvd3M6ICcuanMtYXJyb3dzJyxcbiAgICBzZWxlY3RlZDogJy5zZWxlY3RlZCwgLmpzLXRodW1iLXNlbGVjdGVkJyxcbiAgICBtb2RhbFByb2R1Y3RDb3ZlcjogJy5qcy1tb2RhbC1wcm9kdWN0LWNvdmVyJyxcbiAgICBjb3ZlcjogJy5qcy1xdi1wcm9kdWN0LWNvdmVyJyxcbiAgICBjdXN0b21pemF0aW9uTW9kYWw6ICcuanMtY3VzdG9taXphdGlvbi1tb2RhbCcsXG4gIH0sXG4gIGxpc3Rpbmc6IHtcbiAgICBzZWFyY2hGaWx0ZXJUb2dnbGVyOiAnI3NlYXJjaF9maWx0ZXJfdG9nZ2xlciwgLmpzLXNlYXJjaC10b2dnbGVyJyxcbiAgICBzZWFyY2hGaWx0ZXJzV3JhcHBlcjogJyNzZWFyY2hfZmlsdGVyc193cmFwcGVyJyxcbiAgICBzZWFyY2hGaWx0ZXJDb250cm9sczogJyNzZWFyY2hfZmlsdGVyX2NvbnRyb2xzJyxcbiAgICBzZWFyY2hGaWx0ZXJzOiAnI3NlYXJjaF9maWx0ZXJzJyxcbiAgICBhY3RpdmVTZWFyY2hGaWx0ZXJzOiAnI2pzLWFjdGl2ZS1zZWFyY2gtZmlsdGVycycsXG4gICAgbGlzdFRvcDogJyNqcy1wcm9kdWN0LWxpc3QtdG9wJyxcbiAgICBwcm9kdWN0OiAnLmpzLXByb2R1Y3QnLFxuICAgIGxpc3Q6ICcjanMtcHJvZHVjdC1saXN0JyxcbiAgICBsaXN0Qm90dG9tOiAnI2pzLXByb2R1Y3QtbGlzdC1ib3R0b20nLFxuICAgIGxpc3RIZWFkZXI6ICcjanMtcHJvZHVjdC1saXN0LWhlYWRlcicsXG4gICAgc2VhcmNoRmlsdGVyc0NsZWFyQWxsOiAnLmpzLXNlYXJjaC1maWx0ZXJzLWNsZWFyLWFsbCcsXG4gICAgc2VhcmNoTGluazogJy5qcy1zZWFyY2gtbGluaycsXG4gIH0sXG4gIG9yZGVyOiB7XG4gICAgcmV0dXJuRm9ybTogJyNvcmRlci1yZXR1cm4tZm9ybSwgLmpzLW9yZGVyLXJldHVybi1mb3JtJyxcbiAgfSxcbiAgYXJyb3dEb3duOiAnLmFycm93LWRvd24sIC5qcy1hcnJvdy1kb3duJyxcbiAgYXJyb3dVcDogJy5hcnJvdy11cCwgLmpzLWFycm93LXVwJyxcbiAgY2xlYXI6ICcuY2xlYXInLFxuICBmaWxlSW5wdXQ6ICcuanMtZmlsZS1pbnB1dCcsXG4gIGNvbnRlbnRXcmFwcGVyOiAnI2NvbnRlbnQtd3JhcHBlciwgLmpzLWNvbnRlbnQtd3JhcHBlcicsXG4gIGZvb3RlcjogJyNmb290ZXIsIC5qcy1mb290ZXInLFxuICBtb2RhbENvbnRlbnQ6ICcuanMtbW9kYWwtY29udGVudCcsXG4gIG1vZGFsOiAnI21vZGFsLCAuanMtY2hlY2tvdXQtbW9kYWwnLFxuICB0b3VjaHNwaW46ICcuanMtdG91Y2hzcGluJyxcbiAgY2hlY2tvdXQ6IHtcbiAgICB0ZXJtc0xpbms6ICcuanMtdGVybXMgYScsXG4gICAgZ2lmdENoZWNrYm94OiAnLmpzLWdpZnQtY2hlY2tib3gnLFxuICAgIGltYWdlc0xpbms6ICcuY2FyZC1ibG9jayAuY2FydC1zdW1tYXJ5LXByb2R1Y3RzIHAgYSwgLmpzLXNob3ctZGV0YWlscycsXG4gICAgY2FycmllckV4dHJhQ29udGVudDogJy5jYXJyaWVyLWV4dHJhLWNvbnRlbnQsIC5qcy1jYXJyaWVyLWV4dHJhLWNvbnRlbnQnLFxuICAgIGJ0bjogJy5jaGVja291dCBhJyxcbiAgfSxcbiAgY2FydDoge1xuICAgIHByb2R1Y3RMaW5lUXR5OiAnLmpzLWNhcnQtbGluZS1wcm9kdWN0LXF1YW50aXR5JyxcbiAgICBxdWlja3ZpZXc6ICcucXVpY2t2aWV3JyxcbiAgICB0b3VjaHNwaW46ICcuYm9vdHN0cmFwLXRvdWNoc3BpbicsXG4gICAgcHJvbW9Db2RlOiAnI3Byb21vLWNvZGUnLFxuICAgIGRpc3BsYXlQcm9tbzogJy5kaXNwbGF5LXByb21vJyxcbiAgICBwcm9tb0NvZGVCdXR0b246ICcucHJvbW8tY29kZS1idXR0b24nLFxuICAgIGRpc2NvdW50Q29kZTogJy5qcy1kaXNjb3VudCAuY29kZScsXG4gICAgZGlzY291bnROYW1lOiAnW25hbWU9ZGlzY291bnRfbmFtZV0nLFxuICAgIGFjdGlvbnM6ICdbZGF0YS1saW5rLWFjdGlvbj1cImRlbGV0ZS1mcm9tLWNhcnRcIl0sIFtkYXRhLWxpbmstYWN0aW9uPVwicmVtb3ZlLXZvdWNoZXJcIl0nLFxuICB9LFxuICBub3RpZmljYXRpb25zOiB7XG4gICAgZGFuZ2VyQWxlcnQ6ICcjbm90aWZpY2F0aW9ucyBhcnRpY2xlLmFsZXJ0LWRhbmdlcicsXG4gICAgY29udGFpbmVyOiAnI25vdGlmaWNhdGlvbnMgLm5vdGlmaWNhdGlvbnMtY29udGFpbmVyJyxcbiAgfSxcbiAgcGFzc3dvcmRQb2xpY3ksXG59O1xuXG4kKGRvY3VtZW50KS5yZWFkeSgoKSA9PiB7XG4gIHByZXN0YXNob3AuZW1pdCgndGhlbWVTZWxlY3RvcnNJbml0Jyk7XG59KTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjAgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBwcmVzdGFzaG9wIGZyb20gJ3ByZXN0YXNob3AnO1xuXG5wcmVzdGFzaG9wLnJlc3BvbnNpdmUgPSBwcmVzdGFzaG9wLnJlc3BvbnNpdmUgfHwge307XG5cbnByZXN0YXNob3AucmVzcG9uc2l2ZS5jdXJyZW50X3dpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG5wcmVzdGFzaG9wLnJlc3BvbnNpdmUubWluX3dpZHRoID0gNzY4O1xucHJlc3Rhc2hvcC5yZXNwb25zaXZlLm1vYmlsZSA9IHByZXN0YXNob3AucmVzcG9uc2l2ZS5jdXJyZW50X3dpZHRoIDwgcHJlc3Rhc2hvcC5yZXNwb25zaXZlLm1pbl93aWR0aDtcblxuZnVuY3Rpb24gc3dhcENoaWxkcmVuKG9iajEsIG9iajIpIHtcbiAgY29uc3QgdGVtcCA9IG9iajIuY2hpbGRyZW4oKS5kZXRhY2goKTtcbiAgb2JqMi5lbXB0eSgpLmFwcGVuZChvYmoxLmNoaWxkcmVuKCkuZGV0YWNoKCkpO1xuICBvYmoxLmFwcGVuZCh0ZW1wKTtcbn1cblxuZnVuY3Rpb24gdG9nZ2xlTW9iaWxlU3R5bGVzKCkge1xuICBpZiAocHJlc3Rhc2hvcC5yZXNwb25zaXZlLm1vYmlsZSkge1xuICAgICQoXCIqW2lkXj0nX2Rlc2t0b3BfJ11cIikuZWFjaCgoaWR4LCBlbCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gJChgIyR7ZWwuaWQucmVwbGFjZSgnX2Rlc2t0b3BfJywgJ19tb2JpbGVfJyl9YCk7XG5cbiAgICAgIGlmICh0YXJnZXQubGVuZ3RoKSB7XG4gICAgICAgIHN3YXBDaGlsZHJlbigkKGVsKSwgdGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICAkKFwiKltpZF49J19tb2JpbGVfJ11cIikuZWFjaCgoaWR4LCBlbCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gJChgIyR7ZWwuaWQucmVwbGFjZSgnX21vYmlsZV8nLCAnX2Rlc2t0b3BfJyl9YCk7XG5cbiAgICAgIGlmICh0YXJnZXQubGVuZ3RoKSB7XG4gICAgICAgIHN3YXBDaGlsZHJlbigkKGVsKSwgdGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwcmVzdGFzaG9wLmVtaXQoJ3Jlc3BvbnNpdmUgdXBkYXRlJywge1xuICAgIG1vYmlsZTogcHJlc3Rhc2hvcC5yZXNwb25zaXZlLm1vYmlsZSxcbiAgfSk7XG59XG5cbiQod2luZG93KS5vbigncmVzaXplJywgKCkgPT4ge1xuICBjb25zdCBjdyA9IHByZXN0YXNob3AucmVzcG9uc2l2ZS5jdXJyZW50X3dpZHRoO1xuICBjb25zdCBtdyA9IHByZXN0YXNob3AucmVzcG9uc2l2ZS5taW5fd2lkdGg7XG4gIGNvbnN0IHcgPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgY29uc3QgdG9nZ2xlID0gKGN3ID49IG13ICYmIHcgPCBtdykgfHwgKGN3IDwgbXcgJiYgdyA+PSBtdyk7XG5cbiAgcHJlc3Rhc2hvcC5yZXNwb25zaXZlLmN1cnJlbnRfd2lkdGggPSB3O1xuICBwcmVzdGFzaG9wLnJlc3BvbnNpdmUubW9iaWxlID0gcHJlc3Rhc2hvcC5yZXNwb25zaXZlLmN1cnJlbnRfd2lkdGggPCBwcmVzdGFzaG9wLnJlc3BvbnNpdmUubWluX3dpZHRoO1xuICBpZiAodG9nZ2xlKSB7XG4gICAgdG9nZ2xlTW9iaWxlU3R5bGVzKCk7XG4gIH1cbn0pO1xuXG4kKGRvY3VtZW50KS5yZWFkeSgoKSA9PiB7XG4gIGlmIChwcmVzdGFzaG9wLnJlc3BvbnNpdmUubW9iaWxlKSB7XG4gICAgdG9nZ2xlTW9iaWxlU3R5bGVzKCk7XG4gIH1cbn0pO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHByZXN0YXNob3AgZnJvbSAncHJlc3Rhc2hvcCc7XG5cbmZ1bmN0aW9uIHNldFVwQ2hlY2tvdXQoKSB7XG4gICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jaGVja291dC50ZXJtc0xpbmspLm9uKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgbGV0IHVybCA9ICQoZXZlbnQudGFyZ2V0KS5hdHRyKCdocmVmJyk7XG5cbiAgICBpZiAodXJsKSB7XG4gICAgICAvLyBUT0RPOiBIYW5kbGUgcmVxdWVzdCBpZiBubyBwcmV0dHkgVVJMXG4gICAgICB1cmwgKz0gJz9jb250ZW50X29ubHk9MSc7XG4gICAgICAkLmdldCh1cmwsIChjb250ZW50KSA9PiB7XG4gICAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5tb2RhbClcbiAgICAgICAgICAuZmluZChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLm1vZGFsQ29udGVudClcbiAgICAgICAgICAuaHRtbCgkKGNvbnRlbnQpLmZpbmQoJy5wYWdlLWNtcycpLmNvbnRlbnRzKCkpO1xuICAgICAgfSkuZmFpbCgocmVzcCkgPT4ge1xuICAgICAgICBwcmVzdGFzaG9wLmVtaXQoJ2hhbmRsZUVycm9yJywge2V2ZW50VHlwZTogJ2NsaWNrVGVybXMnLCByZXNwfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubW9kYWwpLm1vZGFsKCdzaG93Jyk7XG4gIH0pO1xuXG4gICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jaGVja291dC5naWZ0Q2hlY2tib3gpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAkKCcjZ2lmdCcpLnNsaWRlVG9nZ2xlKCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b2dnbGVJbWFnZSgpIHtcbiAgLy8gQXJyb3cgc2hvdy9oaWRlIGRldGFpbHMgQ2hlY2tvdXQgcGFnZVxuICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2hlY2tvdXQuaW1hZ2VzTGluaykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IGljb24gPSAkKHRoaXMpLmZpbmQoJ2kubWF0ZXJpYWwtaWNvbnMnKTtcblxuICAgIGlmIChpY29uLnRleHQoKSA9PT0gJ2V4cGFuZF9tb3JlJykge1xuICAgICAgaWNvbi50ZXh0KCdleHBhbmRfbGVzcycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpY29uLnRleHQoJ2V4cGFuZF9tb3JlJyk7XG4gICAgfVxuICB9KTtcbn1cblxuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICBpZiAoJCgnYm9keSNjaGVja291dCcpLmxlbmd0aCA9PT0gMSkge1xuICAgIHNldFVwQ2hlY2tvdXQoKTtcbiAgICB0b2dnbGVJbWFnZSgpO1xuICB9XG5cbiAgcHJlc3Rhc2hvcC5vbigndXBkYXRlZERlbGl2ZXJ5Rm9ybScsIChwYXJhbXMpID0+IHtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5kZWxpdmVyeU9wdGlvbiA9PT0gJ3VuZGVmaW5lZCcgfHwgcGFyYW1zLmRlbGl2ZXJ5T3B0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBIaWRlIGFsbCBjYXJyaWVyIGV4dHJhIGNvbnRlbnQgLi4uXG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNoZWNrb3V0LmNhcnJpZXJFeHRyYUNvbnRlbnQpLmhpZGUoKTtcbiAgICAvLyBhbmQgc2hvdyB0aGUgb25lIHJlbGF0ZWQgdG8gdGhlIHNlbGVjdGVkIGNhcnJpZXJcbiAgICBwYXJhbXMuZGVsaXZlcnlPcHRpb24ubmV4dChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNoZWNrb3V0LmNhcnJpZXJFeHRyYUNvbnRlbnQpLnNsaWRlRG93bigpO1xuICB9KTtcbn0pO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHByZXN0YXNob3AgZnJvbSAncHJlc3Rhc2hvcCc7XG5cbmZ1bmN0aW9uIGluaXRSbWFJdGVtU2VsZWN0b3IoKSB7XG4gICQoYCR7cHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5vcmRlci5yZXR1cm5Gb3JtfSB0YWJsZSB0aGVhZCBpbnB1dFt0eXBlPWNoZWNrYm94XWApLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBjaGVja2VkID0gJCh0aGlzKS5wcm9wKCdjaGVja2VkJyk7XG4gICAgJChgJHtwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLm9yZGVyLnJldHVybkZvcm19IHRhYmxlIHRib2R5IGlucHV0W3R5cGU9Y2hlY2tib3hdYCkuZWFjaCgoXywgY2hlY2tib3gpID0+IHtcbiAgICAgICQoY2hlY2tib3gpLnByb3AoJ2NoZWNrZWQnLCBjaGVja2VkKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldHVwQ3VzdG9tZXJTY3JpcHRzKCkge1xuICBpZiAoJCgnYm9keSNvcmRlci1kZXRhaWwnKSkge1xuICAgIGluaXRSbWFJdGVtU2VsZWN0b3IoKTtcbiAgfVxufVxuXG4kKGRvY3VtZW50KS5yZWFkeShzZXR1cEN1c3RvbWVyU2NyaXB0cyk7XG4iLCIvKiEgVmVsb2NpdHlKUy5vcmcgKDEuNS4yKS4gKEMpIDIwMTQgSnVsaWFuIFNoYXBpcm8uIE1JVCBAbGljZW5zZTogZW4ud2lraXBlZGlhLm9yZy93aWtpL01JVF9MaWNlbnNlICovXHJcblxyXG4vKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gVmVsb2NpdHkgalF1ZXJ5IFNoaW1cclxuICoqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG4vKiEgVmVsb2NpdHlKUy5vcmcgalF1ZXJ5IFNoaW0gKDEuMC4xKS4gKEMpIDIwMTQgVGhlIGpRdWVyeSBGb3VuZGF0aW9uLiBNSVQgQGxpY2Vuc2U6IGVuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZS4gKi9cclxuXHJcbi8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgalF1ZXJ5IGZ1bmN0aW9ucyB0aGF0IFZlbG9jaXR5IHJlbGllcyBvbiwgdGhlcmVieSByZW1vdmluZyBWZWxvY2l0eSdzIGRlcGVuZGVuY3kgb24gYSBmdWxsIGNvcHkgb2YgalF1ZXJ5LCBhbmQgYWxsb3dpbmcgaXQgdG8gd29yayBpbiBhbnkgZW52aXJvbm1lbnQuICovXHJcbi8qIFRoZXNlIHNoaW1tZWQgZnVuY3Rpb25zIGFyZSBvbmx5IHVzZWQgaWYgalF1ZXJ5IGlzbid0IHByZXNlbnQuIElmIGJvdGggdGhpcyBzaGltIGFuZCBqUXVlcnkgYXJlIGxvYWRlZCwgVmVsb2NpdHkgZGVmYXVsdHMgdG8galF1ZXJ5IHByb3Blci4gKi9cclxuLyogQnJvd3NlciBzdXBwb3J0OiBVc2luZyB0aGlzIHNoaW0gaW5zdGVhZCBvZiBqUXVlcnkgcHJvcGVyIHJlbW92ZXMgc3VwcG9ydCBmb3IgSUU4LiAqL1xyXG5cclxuKGZ1bmN0aW9uKHdpbmRvdykge1xyXG5cdFwidXNlIHN0cmljdFwiO1xyXG5cdC8qKioqKioqKioqKioqKipcclxuXHQgU2V0dXBcclxuXHQgKioqKioqKioqKioqKioqL1xyXG5cclxuXHQvKiBJZiBqUXVlcnkgaXMgYWxyZWFkeSBsb2FkZWQsIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gbG9hZGluZyB0aGlzIHNoaW0uICovXHJcblx0aWYgKHdpbmRvdy5qUXVlcnkpIHtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdC8qIGpRdWVyeSBiYXNlLiAqL1xyXG5cdHZhciAkID0gZnVuY3Rpb24oc2VsZWN0b3IsIGNvbnRleHQpIHtcclxuXHRcdHJldHVybiBuZXcgJC5mbi5pbml0KHNlbGVjdG9yLCBjb250ZXh0KTtcclxuXHR9O1xyXG5cclxuXHQvKioqKioqKioqKioqKioqKioqKipcclxuXHQgUHJpdmF0ZSBNZXRob2RzXHJcblx0ICoqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHQvKiBqUXVlcnkgKi9cclxuXHQkLmlzV2luZG93ID0gZnVuY3Rpb24ob2JqKSB7XHJcblx0XHQvKiBqc2hpbnQgZXFlcWVxOiBmYWxzZSAqL1xyXG5cdFx0cmV0dXJuIG9iaiAmJiBvYmogPT09IG9iai53aW5kb3c7XHJcblx0fTtcclxuXHJcblx0LyogalF1ZXJ5ICovXHJcblx0JC50eXBlID0gZnVuY3Rpb24ob2JqKSB7XHJcblx0XHRpZiAoIW9iaikge1xyXG5cdFx0XHRyZXR1cm4gb2JqICsgXCJcIjtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgP1xyXG5cdFx0XHRcdGNsYXNzMnR5cGVbdG9TdHJpbmcuY2FsbChvYmopXSB8fCBcIm9iamVjdFwiIDpcclxuXHRcdFx0XHR0eXBlb2Ygb2JqO1xyXG5cdH07XHJcblxyXG5cdC8qIGpRdWVyeSAqL1xyXG5cdCQuaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24ob2JqKSB7XHJcblx0XHRyZXR1cm4gJC50eXBlKG9iaikgPT09IFwiYXJyYXlcIjtcclxuXHR9O1xyXG5cclxuXHQvKiBqUXVlcnkgKi9cclxuXHRmdW5jdGlvbiBpc0FycmF5bGlrZShvYmopIHtcclxuXHRcdHZhciBsZW5ndGggPSBvYmoubGVuZ3RoLFxyXG5cdFx0XHRcdHR5cGUgPSAkLnR5cGUob2JqKTtcclxuXHJcblx0XHRpZiAodHlwZSA9PT0gXCJmdW5jdGlvblwiIHx8ICQuaXNXaW5kb3cob2JqKSkge1xyXG5cdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKG9iai5ub2RlVHlwZSA9PT0gMSAmJiBsZW5ndGgpIHtcclxuXHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHR5cGUgPT09IFwiYXJyYXlcIiB8fCBsZW5ndGggPT09IDAgfHwgdHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiBsZW5ndGggPiAwICYmIChsZW5ndGggLSAxKSBpbiBvYmo7XHJcblx0fVxyXG5cclxuXHQvKioqKioqKioqKioqKioqXHJcblx0ICQgTWV0aG9kc1xyXG5cdCAqKioqKioqKioqKioqKiovXHJcblxyXG5cdC8qIGpRdWVyeTogU3VwcG9ydCByZW1vdmVkIGZvciBJRTw5LiAqL1xyXG5cdCQuaXNQbGFpbk9iamVjdCA9IGZ1bmN0aW9uKG9iaikge1xyXG5cdFx0dmFyIGtleTtcclxuXHJcblx0XHRpZiAoIW9iaiB8fCAkLnR5cGUob2JqKSAhPT0gXCJvYmplY3RcIiB8fCBvYmoubm9kZVR5cGUgfHwgJC5pc1dpbmRvdyhvYmopKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHR0cnkge1xyXG5cdFx0XHRpZiAob2JqLmNvbnN0cnVjdG9yICYmXHJcblx0XHRcdFx0XHQhaGFzT3duLmNhbGwob2JqLCBcImNvbnN0cnVjdG9yXCIpICYmXHJcblx0XHRcdFx0XHQhaGFzT3duLmNhbGwob2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwgXCJpc1Byb3RvdHlwZU9mXCIpKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9IGNhdGNoIChlKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRmb3IgKGtleSBpbiBvYmopIHtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgfHwgaGFzT3duLmNhbGwob2JqLCBrZXkpO1xyXG5cdH07XHJcblxyXG5cdC8qIGpRdWVyeSAqL1xyXG5cdCQuZWFjaCA9IGZ1bmN0aW9uKG9iaiwgY2FsbGJhY2ssIGFyZ3MpIHtcclxuXHRcdHZhciB2YWx1ZSxcclxuXHRcdFx0XHRpID0gMCxcclxuXHRcdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoLFxyXG5cdFx0XHRcdGlzQXJyYXkgPSBpc0FycmF5bGlrZShvYmopO1xyXG5cclxuXHRcdGlmIChhcmdzKSB7XHJcblx0XHRcdGlmIChpc0FycmF5KSB7XHJcblx0XHRcdFx0Zm9yICg7IGkgPCBsZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5hcHBseShvYmpbaV0sIGFyZ3MpO1xyXG5cclxuXHRcdFx0XHRcdGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZvciAoaSBpbiBvYmopIHtcclxuXHRcdFx0XHRcdGlmICghb2JqLmhhc093blByb3BlcnR5KGkpKSB7XHJcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5hcHBseShvYmpbaV0sIGFyZ3MpO1xyXG5cclxuXHRcdFx0XHRcdGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0aWYgKGlzQXJyYXkpIHtcclxuXHRcdFx0XHRmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrLmNhbGwob2JqW2ldLCBpLCBvYmpbaV0pO1xyXG5cclxuXHRcdFx0XHRcdGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGZvciAoaSBpbiBvYmopIHtcclxuXHRcdFx0XHRcdGlmICghb2JqLmhhc093blByb3BlcnR5KGkpKSB7XHJcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjay5jYWxsKG9ialtpXSwgaSwgb2JqW2ldKTtcclxuXHJcblx0XHRcdFx0XHRpZiAodmFsdWUgPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBvYmo7XHJcblx0fTtcclxuXHJcblx0LyogQ3VzdG9tICovXHJcblx0JC5kYXRhID0gZnVuY3Rpb24obm9kZSwga2V5LCB2YWx1ZSkge1xyXG5cdFx0LyogJC5nZXREYXRhKCkgKi9cclxuXHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHZhciBnZXRJZCA9IG5vZGVbJC5leHBhbmRvXSxcclxuXHRcdFx0XHRcdHN0b3JlID0gZ2V0SWQgJiYgY2FjaGVbZ2V0SWRdO1xyXG5cclxuXHRcdFx0aWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0cmV0dXJuIHN0b3JlO1xyXG5cdFx0XHR9IGVsc2UgaWYgKHN0b3JlKSB7XHJcblx0XHRcdFx0aWYgKGtleSBpbiBzdG9yZSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIHN0b3JlW2tleV07XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRcdC8qICQuc2V0RGF0YSgpICovXHJcblx0XHR9IGVsc2UgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdHZhciBzZXRJZCA9IG5vZGVbJC5leHBhbmRvXSB8fCAobm9kZVskLmV4cGFuZG9dID0gKyskLnV1aWQpO1xyXG5cclxuXHRcdFx0Y2FjaGVbc2V0SWRdID0gY2FjaGVbc2V0SWRdIHx8IHt9O1xyXG5cdFx0XHRjYWNoZVtzZXRJZF1ba2V5XSA9IHZhbHVlO1xyXG5cclxuXHRcdFx0cmV0dXJuIHZhbHVlO1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qIEN1c3RvbSAqL1xyXG5cdCQucmVtb3ZlRGF0YSA9IGZ1bmN0aW9uKG5vZGUsIGtleXMpIHtcclxuXHRcdHZhciBpZCA9IG5vZGVbJC5leHBhbmRvXSxcclxuXHRcdFx0XHRzdG9yZSA9IGlkICYmIGNhY2hlW2lkXTtcclxuXHJcblx0XHRpZiAoc3RvcmUpIHtcclxuXHRcdFx0Ly8gQ2xlYW51cCB0aGUgZW50aXJlIHN0b3JlIGlmIG5vIGtleXMgYXJlIHByb3ZpZGVkLlxyXG5cdFx0XHRpZiAoIWtleXMpIHtcclxuXHRcdFx0XHRkZWxldGUgY2FjaGVbaWRdO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdCQuZWFjaChrZXlzLCBmdW5jdGlvbihfLCBrZXkpIHtcclxuXHRcdFx0XHRcdGRlbGV0ZSBzdG9yZVtrZXldO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fTtcclxuXHJcblx0LyogalF1ZXJ5ICovXHJcblx0JC5leHRlbmQgPSBmdW5jdGlvbigpIHtcclxuXHRcdHZhciBzcmMsIGNvcHlJc0FycmF5LCBjb3B5LCBuYW1lLCBvcHRpb25zLCBjbG9uZSxcclxuXHRcdFx0XHR0YXJnZXQgPSBhcmd1bWVudHNbMF0gfHwge30sXHJcblx0XHRcdFx0aSA9IDEsXHJcblx0XHRcdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcclxuXHRcdFx0XHRkZWVwID0gZmFsc2U7XHJcblxyXG5cdFx0aWYgKHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiKSB7XHJcblx0XHRcdGRlZXAgPSB0YXJnZXQ7XHJcblxyXG5cdFx0XHR0YXJnZXQgPSBhcmd1bWVudHNbaV0gfHwge307XHJcblx0XHRcdGkrKztcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAkLnR5cGUodGFyZ2V0KSAhPT0gXCJmdW5jdGlvblwiKSB7XHJcblx0XHRcdHRhcmdldCA9IHt9O1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChpID09PSBsZW5ndGgpIHtcclxuXHRcdFx0dGFyZ2V0ID0gdGhpcztcclxuXHRcdFx0aS0tO1xyXG5cdFx0fVxyXG5cclxuXHRcdGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0aWYgKChvcHRpb25zID0gYXJndW1lbnRzW2ldKSkge1xyXG5cdFx0XHRcdGZvciAobmFtZSBpbiBvcHRpb25zKSB7XHJcblx0XHRcdFx0XHRpZiAoIW9wdGlvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcclxuXHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRzcmMgPSB0YXJnZXRbbmFtZV07XHJcblx0XHRcdFx0XHRjb3B5ID0gb3B0aW9uc1tuYW1lXTtcclxuXHJcblx0XHRcdFx0XHRpZiAodGFyZ2V0ID09PSBjb3B5KSB7XHJcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmIChkZWVwICYmIGNvcHkgJiYgKCQuaXNQbGFpbk9iamVjdChjb3B5KSB8fCAoY29weUlzQXJyYXkgPSAkLmlzQXJyYXkoY29weSkpKSkge1xyXG5cdFx0XHRcdFx0XHRpZiAoY29weUlzQXJyYXkpIHtcclxuXHRcdFx0XHRcdFx0XHRjb3B5SXNBcnJheSA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmICQuaXNBcnJheShzcmMpID8gc3JjIDogW107XHJcblxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmICQuaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHRhcmdldFtuYW1lXSA9ICQuZXh0ZW5kKGRlZXAsIGNsb25lLCBjb3B5KTtcclxuXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGNvcHkgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHR0YXJnZXRbbmFtZV0gPSBjb3B5O1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0YXJnZXQ7XHJcblx0fTtcclxuXHJcblx0LyogalF1ZXJ5IDEuNC4zICovXHJcblx0JC5xdWV1ZSA9IGZ1bmN0aW9uKGVsZW0sIHR5cGUsIGRhdGEpIHtcclxuXHRcdGZ1bmN0aW9uICRtYWtlQXJyYXkoYXJyLCByZXN1bHRzKSB7XHJcblx0XHRcdHZhciByZXQgPSByZXN1bHRzIHx8IFtdO1xyXG5cclxuXHRcdFx0aWYgKGFycikge1xyXG5cdFx0XHRcdGlmIChpc0FycmF5bGlrZShPYmplY3QoYXJyKSkpIHtcclxuXHRcdFx0XHRcdC8qICQubWVyZ2UgKi9cclxuXHRcdFx0XHRcdChmdW5jdGlvbihmaXJzdCwgc2Vjb25kKSB7XHJcblx0XHRcdFx0XHRcdHZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCxcclxuXHRcdFx0XHRcdFx0XHRcdGogPSAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0aSA9IGZpcnN0Lmxlbmd0aDtcclxuXHJcblx0XHRcdFx0XHRcdHdoaWxlIChqIDwgbGVuKSB7XHJcblx0XHRcdFx0XHRcdFx0Zmlyc3RbaSsrXSA9IHNlY29uZFtqKytdO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAobGVuICE9PSBsZW4pIHtcclxuXHRcdFx0XHRcdFx0XHR3aGlsZSAoc2Vjb25kW2pdICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGZpcnN0W2krK10gPSBzZWNvbmRbaisrXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGZpcnN0Lmxlbmd0aCA9IGk7XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmlyc3Q7XHJcblx0XHRcdFx0XHR9KShyZXQsIHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgPyBbYXJyXSA6IGFycik7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFtdLnB1c2guY2FsbChyZXQsIGFycik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gcmV0O1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghZWxlbSkge1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9XHJcblxyXG5cdFx0dHlwZSA9ICh0eXBlIHx8IFwiZnhcIikgKyBcInF1ZXVlXCI7XHJcblxyXG5cdFx0dmFyIHEgPSAkLmRhdGEoZWxlbSwgdHlwZSk7XHJcblxyXG5cdFx0aWYgKCFkYXRhKSB7XHJcblx0XHRcdHJldHVybiBxIHx8IFtdO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICghcSB8fCAkLmlzQXJyYXkoZGF0YSkpIHtcclxuXHRcdFx0cSA9ICQuZGF0YShlbGVtLCB0eXBlLCAkbWFrZUFycmF5KGRhdGEpKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHEucHVzaChkYXRhKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcTtcclxuXHR9O1xyXG5cclxuXHQvKiBqUXVlcnkgMS40LjMgKi9cclxuXHQkLmRlcXVldWUgPSBmdW5jdGlvbihlbGVtcywgdHlwZSkge1xyXG5cdFx0LyogQ3VzdG9tOiBFbWJlZCBlbGVtZW50IGl0ZXJhdGlvbi4gKi9cclxuXHRcdCQuZWFjaChlbGVtcy5ub2RlVHlwZSA/IFtlbGVtc10gOiBlbGVtcywgZnVuY3Rpb24oaSwgZWxlbSkge1xyXG5cdFx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XHJcblxyXG5cdFx0XHR2YXIgcXVldWUgPSAkLnF1ZXVlKGVsZW0sIHR5cGUpLFxyXG5cdFx0XHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpO1xyXG5cclxuXHRcdFx0aWYgKGZuID09PSBcImlucHJvZ3Jlc3NcIikge1xyXG5cdFx0XHRcdGZuID0gcXVldWUuc2hpZnQoKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKGZuKSB7XHJcblx0XHRcdFx0aWYgKHR5cGUgPT09IFwiZnhcIikge1xyXG5cdFx0XHRcdFx0cXVldWUudW5zaGlmdChcImlucHJvZ3Jlc3NcIik7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRmbi5jYWxsKGVsZW0sIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0JC5kZXF1ZXVlKGVsZW0sIHR5cGUpO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9O1xyXG5cclxuXHQvKioqKioqKioqKioqKioqKioqXHJcblx0ICQuZm4gTWV0aG9kc1xyXG5cdCAqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdC8qIGpRdWVyeSAqL1xyXG5cdCQuZm4gPSAkLnByb3RvdHlwZSA9IHtcclxuXHRcdGluaXQ6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XHJcblx0XHRcdC8qIEp1c3QgcmV0dXJuIHRoZSBlbGVtZW50IHdyYXBwZWQgaW5zaWRlIGFuIGFycmF5OyBkb24ndCBwcm9jZWVkIHdpdGggdGhlIGFjdHVhbCBqUXVlcnkgbm9kZSB3cmFwcGluZyBwcm9jZXNzLiAqL1xyXG5cdFx0XHRpZiAoc2VsZWN0b3Iubm9kZVR5cGUpIHtcclxuXHRcdFx0XHR0aGlzWzBdID0gc2VsZWN0b3I7XHJcblxyXG5cdFx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vdCBhIERPTSBub2RlLlwiKTtcclxuXHRcdFx0fVxyXG5cdFx0fSxcclxuXHRcdG9mZnNldDogZnVuY3Rpb24oKSB7XHJcblx0XHRcdC8qIGpRdWVyeSBhbHRlcmVkIGNvZGU6IERyb3BwZWQgZGlzY29ubmVjdGVkIERPTSBub2RlIGNoZWNraW5nLiAqL1xyXG5cdFx0XHR2YXIgYm94ID0gdGhpc1swXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPyB0aGlzWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDoge3RvcDogMCwgbGVmdDogMH07XHJcblxyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdHRvcDogYm94LnRvcCArICh3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuc2Nyb2xsVG9wIHx8IDApIC0gKGRvY3VtZW50LmNsaWVudFRvcCB8fCAwKSxcclxuXHRcdFx0XHRsZWZ0OiBib3gubGVmdCArICh3aW5kb3cucGFnZVhPZmZzZXQgfHwgZG9jdW1lbnQuc2Nyb2xsTGVmdCB8fCAwKSAtIChkb2N1bWVudC5jbGllbnRMZWZ0IHx8IDApXHJcblx0XHRcdH07XHJcblx0XHR9LFxyXG5cdFx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xyXG5cdFx0XHQvKiBqUXVlcnkgKi9cclxuXHRcdFx0ZnVuY3Rpb24gb2Zmc2V0UGFyZW50Rm4oZWxlbSkge1xyXG5cdFx0XHRcdHZhciBvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudDtcclxuXHJcblx0XHRcdFx0d2hpbGUgKG9mZnNldFBhcmVudCAmJiAob2Zmc2V0UGFyZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwiaHRtbFwiICYmIG9mZnNldFBhcmVudC5zdHlsZSAmJiBvZmZzZXRQYXJlbnQuc3R5bGUucG9zaXRpb24udG9Mb3dlckNhc2UoKSA9PT0gXCJzdGF0aWNcIikpIHtcclxuXHRcdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50O1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBaZXB0byAqL1xyXG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbMF0sXHJcblx0XHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnRGbihlbGVtKSxcclxuXHRcdFx0XHRcdG9mZnNldCA9IHRoaXMub2Zmc2V0KCksXHJcblx0XHRcdFx0XHRwYXJlbnRPZmZzZXQgPSAvXig/OmJvZHl8aHRtbCkkL2kudGVzdChvZmZzZXRQYXJlbnQubm9kZU5hbWUpID8ge3RvcDogMCwgbGVmdDogMH0gOiAkKG9mZnNldFBhcmVudCkub2Zmc2V0KCk7XHJcblxyXG5cdFx0XHRvZmZzZXQudG9wIC09IHBhcnNlRmxvYXQoZWxlbS5zdHlsZS5tYXJnaW5Ub3ApIHx8IDA7XHJcblx0XHRcdG9mZnNldC5sZWZ0IC09IHBhcnNlRmxvYXQoZWxlbS5zdHlsZS5tYXJnaW5MZWZ0KSB8fCAwO1xyXG5cclxuXHRcdFx0aWYgKG9mZnNldFBhcmVudC5zdHlsZSkge1xyXG5cdFx0XHRcdHBhcmVudE9mZnNldC50b3AgKz0gcGFyc2VGbG9hdChvZmZzZXRQYXJlbnQuc3R5bGUuYm9yZGVyVG9wV2lkdGgpIHx8IDA7XHJcblx0XHRcdFx0cGFyZW50T2Zmc2V0LmxlZnQgKz0gcGFyc2VGbG9hdChvZmZzZXRQYXJlbnQuc3R5bGUuYm9yZGVyTGVmdFdpZHRoKSB8fCAwO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4ge1xyXG5cdFx0XHRcdHRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AsXHJcblx0XHRcdFx0bGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdFxyXG5cdFx0XHR9O1xyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKioqKioqKioqKioqKioqKioqKioqXHJcblx0IFByaXZhdGUgVmFyaWFibGVzXHJcblx0ICoqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdC8qIEZvciAkLmRhdGEoKSAqL1xyXG5cdHZhciBjYWNoZSA9IHt9O1xyXG5cdCQuZXhwYW5kbyA9IFwidmVsb2NpdHlcIiArIChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7XHJcblx0JC51dWlkID0gMDtcclxuXHJcblx0LyogRm9yICQucXVldWUoKSAqL1xyXG5cdHZhciBjbGFzczJ0eXBlID0ge30sXHJcblx0XHRcdGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJvcGVydHksXHJcblx0XHRcdHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0cmluZztcclxuXHJcblx0dmFyIHR5cGVzID0gXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yXCIuc3BsaXQoXCIgXCIpO1xyXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdGNsYXNzMnR5cGVbXCJbb2JqZWN0IFwiICsgdHlwZXNbaV0gKyBcIl1cIl0gPSB0eXBlc1tpXS50b0xvd2VyQ2FzZSgpO1xyXG5cdH1cclxuXHJcblx0LyogTWFrZXMgJChub2RlKSBwb3NzaWJsZSwgd2l0aG91dCBoYXZpbmcgdG8gY2FsbCBpbml0LiAqL1xyXG5cdCQuZm4uaW5pdC5wcm90b3R5cGUgPSAkLmZuO1xyXG5cclxuXHQvKiBHbG9iYWxpemUgVmVsb2NpdHkgb250byB0aGUgd2luZG93LCBhbmQgYXNzaWduIGl0cyBVdGlsaXRpZXMgcHJvcGVydHkuICovXHJcblx0d2luZG93LlZlbG9jaXR5ID0ge1V0aWxpdGllczogJH07XHJcbn0pKHdpbmRvdyk7XHJcblxyXG4vKioqKioqKioqKioqKioqKioqXHJcbiBWZWxvY2l0eS5qc1xyXG4gKioqKioqKioqKioqKioqKioqL1xyXG5cclxuKGZ1bmN0aW9uKGZhY3RvcnkpIHtcclxuXHRcInVzZSBzdHJpY3RcIjtcclxuXHQvKiBDb21tb25KUyBtb2R1bGUuICovXHJcblx0aWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSBcIm9iamVjdFwiKSB7XHJcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcclxuXHRcdC8qIEFNRCBtb2R1bGUuICovXHJcblx0fSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xyXG5cdFx0ZGVmaW5lKGZhY3RvcnkpO1xyXG5cdFx0LyogQnJvd3NlciBnbG9iYWxzLiAqL1xyXG5cdH0gZWxzZSB7XHJcblx0XHRmYWN0b3J5KCk7XHJcblx0fVxyXG59KGZ1bmN0aW9uKCkge1xyXG5cdFwidXNlIHN0cmljdFwiO1xyXG5cdHJldHVybiBmdW5jdGlvbihnbG9iYWwsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xyXG5cclxuXHRcdC8qKioqKioqKioqKioqKipcclxuXHRcdCBTdW1tYXJ5XHJcblx0XHQgKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdC8qXHJcblx0XHQgLSBDU1M6IENTUyBzdGFjayB0aGF0IHdvcmtzIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgcmVzdCBvZiBWZWxvY2l0eS5cclxuXHRcdCAtIGFuaW1hdGUoKTogQ29yZSBhbmltYXRpb24gbWV0aG9kIHRoYXQgaXRlcmF0ZXMgb3ZlciB0aGUgdGFyZ2V0ZWQgZWxlbWVudHMgYW5kIHF1ZXVlcyB0aGUgaW5jb21pbmcgY2FsbCBvbnRvIGVhY2ggZWxlbWVudCBpbmRpdmlkdWFsbHkuXHJcblx0XHQgLSBQcmUtUXVldWVpbmc6IFByZXBhcmUgdGhlIGVsZW1lbnQgZm9yIGFuaW1hdGlvbiBieSBpbnN0YW50aWF0aW5nIGl0cyBkYXRhIGNhY2hlIGFuZCBwcm9jZXNzaW5nIHRoZSBjYWxsJ3Mgb3B0aW9ucy5cclxuXHRcdCAtIFF1ZXVlaW5nOiBUaGUgbG9naWMgdGhhdCBydW5zIG9uY2UgdGhlIGNhbGwgaGFzIHJlYWNoZWQgaXRzIHBvaW50IG9mIGV4ZWN1dGlvbiBpbiB0aGUgZWxlbWVudCdzICQucXVldWUoKSBzdGFjay5cclxuXHRcdCBNb3N0IGxvZ2ljIGlzIHBsYWNlZCBoZXJlIHRvIGF2b2lkIHJpc2tpbmcgaXQgYmVjb21pbmcgc3RhbGUgKGlmIHRoZSBlbGVtZW50J3MgcHJvcGVydGllcyBoYXZlIGNoYW5nZWQpLlxyXG5cdFx0IC0gUHVzaGluZzogQ29uc29saWRhdGlvbiBvZiB0aGUgdHdlZW4gZGF0YSBmb2xsb3dlZCBieSBpdHMgcHVzaCBvbnRvIHRoZSBnbG9iYWwgaW4tcHJvZ3Jlc3MgY2FsbHMgY29udGFpbmVyLlxyXG5cdFx0IC0gdGljaygpOiBUaGUgc2luZ2xlIHJlcXVlc3RBbmltYXRpb25GcmFtZSBsb29wIHJlc3BvbnNpYmxlIGZvciB0d2VlbmluZyBhbGwgaW4tcHJvZ3Jlc3MgY2FsbHMuXHJcblx0XHQgLSBjb21wbGV0ZUNhbGwoKTogSGFuZGxlcyB0aGUgY2xlYW51cCBwcm9jZXNzIGZvciBlYWNoIFZlbG9jaXR5IGNhbGwuXHJcblx0XHQgKi9cclxuXHJcblx0XHQvKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHQgSGVscGVyIEZ1bmN0aW9uc1xyXG5cdFx0ICoqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHQvKiBJRSBkZXRlY3Rpb24uIEdpc3Q6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2p1bGlhbnNoYXBpcm8vOTA5ODYwOSAqL1xyXG5cdFx0dmFyIElFID0gKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRpZiAoZG9jdW1lbnQuZG9jdW1lbnRNb2RlKSB7XHJcblx0XHRcdFx0cmV0dXJuIGRvY3VtZW50LmRvY3VtZW50TW9kZTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRmb3IgKHZhciBpID0gNzsgaSA+IDQ7IGktLSkge1xyXG5cdFx0XHRcdFx0dmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG5cdFx0XHRcdFx0ZGl2LmlubmVySFRNTCA9IFwiPCEtLVtpZiBJRSBcIiArIGkgKyBcIl0+PHNwYW4+PC9zcGFuPjwhW2VuZGlmXS0tPlwiO1xyXG5cclxuXHRcdFx0XHRcdGlmIChkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzcGFuXCIpLmxlbmd0aCkge1xyXG5cdFx0XHRcdFx0XHRkaXYgPSBudWxsO1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIGk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdFx0fSkoKTtcclxuXHJcblx0XHQvKiByQUYgc2hpbS4gR2lzdDogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vanVsaWFuc2hhcGlyby85NDk3NTEzICovXHJcblx0XHR2YXIgckFGU2hpbSA9IChmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIHRpbWVMYXN0ID0gMDtcclxuXHJcblx0XHRcdHJldHVybiB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8IHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgZnVuY3Rpb24oY2FsbGJhY2spIHtcclxuXHRcdFx0XHR2YXIgdGltZUN1cnJlbnQgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpLFxyXG5cdFx0XHRcdFx0XHR0aW1lRGVsdGE7XHJcblxyXG5cdFx0XHRcdC8qIER5bmFtaWNhbGx5IHNldCBkZWxheSBvbiBhIHBlci10aWNrIGJhc2lzIHRvIG1hdGNoIDYwZnBzLiAqL1xyXG5cdFx0XHRcdC8qIFRlY2huaXF1ZSBieSBFcmlrIE1vbGxlci4gTUlUIGxpY2Vuc2U6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3BhdWxpcmlzaC8xNTc5NjcxICovXHJcblx0XHRcdFx0dGltZURlbHRhID0gTWF0aC5tYXgoMCwgMTYgLSAodGltZUN1cnJlbnQgLSB0aW1lTGFzdCkpO1xyXG5cdFx0XHRcdHRpbWVMYXN0ID0gdGltZUN1cnJlbnQgKyB0aW1lRGVsdGE7XHJcblxyXG5cdFx0XHRcdHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0Y2FsbGJhY2sodGltZUN1cnJlbnQgKyB0aW1lRGVsdGEpO1xyXG5cdFx0XHRcdH0sIHRpbWVEZWx0YSk7XHJcblx0XHRcdH07XHJcblx0XHR9KSgpO1xyXG5cclxuXHRcdHZhciBwZXJmb3JtYW5jZSA9IChmdW5jdGlvbigpIHtcclxuXHRcdFx0dmFyIHBlcmYgPSB3aW5kb3cucGVyZm9ybWFuY2UgfHwge307XHJcblxyXG5cdFx0XHRpZiAodHlwZW9mIHBlcmYubm93ICE9PSBcImZ1bmN0aW9uXCIpIHtcclxuXHRcdFx0XHR2YXIgbm93T2Zmc2V0ID0gcGVyZi50aW1pbmcgJiYgcGVyZi50aW1pbmcubmF2aWdhdGlvblN0YXJ0ID8gcGVyZi50aW1pbmcubmF2aWdhdGlvblN0YXJ0IDogKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcclxuXHJcblx0XHRcdFx0cGVyZi5ub3cgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdHJldHVybiAobmV3IERhdGUoKSkuZ2V0VGltZSgpIC0gbm93T2Zmc2V0O1xyXG5cdFx0XHRcdH07XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIHBlcmY7XHJcblx0XHR9KSgpO1xyXG5cclxuXHRcdC8qIEFycmF5IGNvbXBhY3RpbmcuIENvcHlyaWdodCBMby1EYXNoLiBNSVQgTGljZW5zZTogaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9tYXN0ZXIvTElDRU5TRS50eHQgKi9cclxuXHRcdGZ1bmN0aW9uIGNvbXBhY3RTcGFyc2VBcnJheShhcnJheSkge1xyXG5cdFx0XHR2YXIgaW5kZXggPSAtMSxcclxuXHRcdFx0XHRcdGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCxcclxuXHRcdFx0XHRcdHJlc3VsdCA9IFtdO1xyXG5cclxuXHRcdFx0d2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcclxuXHRcdFx0XHR2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07XHJcblxyXG5cdFx0XHRcdGlmICh2YWx1ZSkge1xyXG5cdFx0XHRcdFx0cmVzdWx0LnB1c2godmFsdWUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcclxuXHRcdH1cclxuXHJcblx0XHQvKipcclxuXHRcdCAqIFNoaW0gZm9yIFwiZml4aW5nXCIgSUUncyBsYWNrIG9mIHN1cHBvcnQgKElFIDwgOSkgZm9yIGFwcGx5aW5nIHNsaWNlXHJcblx0XHQgKiBvbiBob3N0IG9iamVjdHMgbGlrZSBOYW1lZE5vZGVNYXAsIE5vZGVMaXN0LCBhbmQgSFRNTENvbGxlY3Rpb25cclxuXHRcdCAqICh0ZWNobmljYWxseSwgc2luY2UgaG9zdCBvYmplY3RzIGhhdmUgYmVlbiBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQsXHJcblx0XHQgKiBhdCBsZWFzdCBiZWZvcmUgRVMyMDE1LCBJRSBoYXNuJ3QgbmVlZGVkIHRvIHdvcmsgdGhpcyB3YXkpLlxyXG5cdFx0ICogQWxzbyB3b3JrcyBvbiBzdHJpbmdzLCBmaXhlcyBJRSA8IDkgdG8gYWxsb3cgYW4gZXhwbGljaXQgdW5kZWZpbmVkXHJcblx0XHQgKiBmb3IgdGhlIDJuZCBhcmd1bWVudCAoYXMgaW4gRmlyZWZveCksIGFuZCBwcmV2ZW50cyBlcnJvcnMgd2hlblxyXG5cdFx0ICogY2FsbGVkIG9uIG90aGVyIERPTSBvYmplY3RzLlxyXG5cdFx0ICovXHJcblx0XHR2YXIgX3NsaWNlID0gKGZ1bmN0aW9uKCkge1xyXG5cdFx0XHR2YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XHJcblxyXG5cdFx0XHR0cnkge1xyXG5cdFx0XHRcdC8vIENhbid0IGJlIHVzZWQgd2l0aCBET00gZWxlbWVudHMgaW4gSUUgPCA5XHJcblx0XHRcdFx0c2xpY2UuY2FsbChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xyXG5cdFx0XHRcdHJldHVybiBzbGljZTtcclxuXHRcdFx0fSBjYXRjaCAoZSkgeyAvLyBGYWlscyBpbiBJRSA8IDlcclxuXHJcblx0XHRcdFx0Ly8gVGhpcyB3aWxsIHdvcmsgZm9yIGdlbnVpbmUgYXJyYXlzLCBhcnJheS1saWtlIG9iamVjdHMsIFxyXG5cdFx0XHRcdC8vIE5hbWVkTm9kZU1hcCAoYXR0cmlidXRlcywgZW50aXRpZXMsIG5vdGF0aW9ucyksXHJcblx0XHRcdFx0Ly8gTm9kZUxpc3QgKGUuZy4sIGdldEVsZW1lbnRzQnlUYWdOYW1lKSwgSFRNTENvbGxlY3Rpb24gKGUuZy4sIGNoaWxkTm9kZXMpLFxyXG5cdFx0XHRcdC8vIGFuZCB3aWxsIG5vdCBmYWlsIG9uIG90aGVyIERPTSBvYmplY3RzIChhcyBkbyBET00gZWxlbWVudHMgaW4gSUUgPCA5KVxyXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbihiZWdpbiwgZW5kKSB7XHJcblx0XHRcdFx0XHR2YXIgbGVuID0gdGhpcy5sZW5ndGg7XHJcblxyXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBiZWdpbiAhPT0gXCJudW1iZXJcIikge1xyXG5cdFx0XHRcdFx0XHRiZWdpbiA9IDA7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvLyBJRSA8IDkgZ2V0cyB1bmhhcHB5IHdpdGggYW4gdW5kZWZpbmVkIGVuZCBhcmd1bWVudFxyXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBlbmQgIT09IFwibnVtYmVyXCIpIHtcclxuXHRcdFx0XHRcdFx0ZW5kID0gbGVuO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Ly8gRm9yIG5hdGl2ZSBBcnJheSBvYmplY3RzLCB3ZSB1c2UgdGhlIG5hdGl2ZSBzbGljZSBmdW5jdGlvblxyXG5cdFx0XHRcdFx0aWYgKHRoaXMuc2xpY2UpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHNsaWNlLmNhbGwodGhpcywgYmVnaW4sIGVuZCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvLyBGb3IgYXJyYXkgbGlrZSBvYmplY3Qgd2UgaGFuZGxlIGl0IG91cnNlbHZlcy5cclxuXHRcdFx0XHRcdHZhciBpLFxyXG5cdFx0XHRcdFx0XHRcdGNsb25lZCA9IFtdLFxyXG5cdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBuZWdhdGl2ZSB2YWx1ZSBmb3IgXCJiZWdpblwiXHJcblx0XHRcdFx0XHRcdFx0c3RhcnQgPSAoYmVnaW4gPj0gMCkgPyBiZWdpbiA6IE1hdGgubWF4KDAsIGxlbiArIGJlZ2luKSxcclxuXHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgbmVnYXRpdmUgdmFsdWUgZm9yIFwiZW5kXCJcclxuXHRcdFx0XHRcdFx0XHR1cFRvID0gZW5kIDwgMCA/IGxlbiArIGVuZCA6IE1hdGgubWluKGVuZCwgbGVuKSxcclxuXHRcdFx0XHRcdFx0XHQvLyBBY3R1YWwgZXhwZWN0ZWQgc2l6ZSBvZiB0aGUgc2xpY2VcclxuXHRcdFx0XHRcdFx0XHRzaXplID0gdXBUbyAtIHN0YXJ0O1xyXG5cclxuXHRcdFx0XHRcdGlmIChzaXplID4gMCkge1xyXG5cdFx0XHRcdFx0XHRjbG9uZWQgPSBuZXcgQXJyYXkoc2l6ZSk7XHJcblx0XHRcdFx0XHRcdGlmICh0aGlzLmNoYXJBdCkge1xyXG5cdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNsb25lZFtpXSA9IHRoaXMuY2hhckF0KHN0YXJ0ICsgaSk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNsb25lZFtpXSA9IHRoaXNbc3RhcnQgKyBpXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJldHVybiBjbG9uZWQ7XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0fVxyXG5cdFx0fSkoKTtcclxuXHJcblx0XHQvKiAuaW5kZXhPZiBkb2Vzbid0IGV4aXN0IGluIElFPDkgKi9cclxuXHRcdHZhciBfaW5BcnJheSA9IChmdW5jdGlvbigpIHtcclxuXHRcdFx0aWYgKEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcykge1xyXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbihhcnIsIHZhbCkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGFyci5pbmNsdWRlcyh2YWwpO1xyXG5cdFx0XHRcdH07XHJcblx0XHRcdH1cclxuXHRcdFx0aWYgKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGFyciwgdmFsKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gYXJyLmluZGV4T2YodmFsKSA+PSAwO1xyXG5cdFx0XHRcdH07XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKGFyciwgdmFsKSB7XHJcblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdGlmIChhcnJbaV0gPT09IHZhbCkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0ZnVuY3Rpb24gc2FuaXRpemVFbGVtZW50cyhlbGVtZW50cykge1xyXG5cdFx0XHQvKiBVbndyYXAgalF1ZXJ5L1plcHRvIG9iamVjdHMuICovXHJcblx0XHRcdGlmIChUeXBlLmlzV3JhcHBlZChlbGVtZW50cykpIHtcclxuXHRcdFx0XHRlbGVtZW50cyA9IF9zbGljZS5jYWxsKGVsZW1lbnRzKTtcclxuXHRcdFx0XHQvKiBXcmFwIGEgc2luZ2xlIGVsZW1lbnQgaW4gYW4gYXJyYXkgc28gdGhhdCAkLmVhY2goKSBjYW4gaXRlcmF0ZSB3aXRoIHRoZSBlbGVtZW50IGluc3RlYWQgb2YgaXRzIG5vZGUncyBjaGlsZHJlbi4gKi9cclxuXHRcdFx0fSBlbHNlIGlmIChUeXBlLmlzTm9kZShlbGVtZW50cykpIHtcclxuXHRcdFx0XHRlbGVtZW50cyA9IFtlbGVtZW50c107XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBlbGVtZW50cztcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgVHlwZSA9IHtcclxuXHRcdFx0aXNOdW1iZXI6IGZ1bmN0aW9uKHZhcmlhYmxlKSB7XHJcblx0XHRcdFx0cmV0dXJuICh0eXBlb2YgdmFyaWFibGUgPT09IFwibnVtYmVyXCIpO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRpc1N0cmluZzogZnVuY3Rpb24odmFyaWFibGUpIHtcclxuXHRcdFx0XHRyZXR1cm4gKHR5cGVvZiB2YXJpYWJsZSA9PT0gXCJzdHJpbmdcIik7XHJcblx0XHRcdH0sXHJcblx0XHRcdGlzQXJyYXk6IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24odmFyaWFibGUpIHtcclxuXHRcdFx0XHRyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhcmlhYmxlKSA9PT0gXCJbb2JqZWN0IEFycmF5XVwiO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHRpc0Z1bmN0aW9uOiBmdW5jdGlvbih2YXJpYWJsZSkge1xyXG5cdFx0XHRcdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFyaWFibGUpID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCI7XHJcblx0XHRcdH0sXHJcblx0XHRcdGlzTm9kZTogZnVuY3Rpb24odmFyaWFibGUpIHtcclxuXHRcdFx0XHRyZXR1cm4gdmFyaWFibGUgJiYgdmFyaWFibGUubm9kZVR5cGU7XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qIERldGVybWluZSBpZiB2YXJpYWJsZSBpcyBhbiBhcnJheS1saWtlIHdyYXBwZWQgalF1ZXJ5LCBaZXB0byBvciBzaW1pbGFyIGVsZW1lbnQsIG9yIGV2ZW4gYSBOb2RlTGlzdCBldGMuICovXHJcblx0XHRcdC8qIE5PVEU6IEhUTUxGb3JtRWxlbWVudHMgYWxzbyBoYXZlIGEgbGVuZ3RoLiAqL1xyXG5cdFx0XHRpc1dyYXBwZWQ6IGZ1bmN0aW9uKHZhcmlhYmxlKSB7XHJcblx0XHRcdFx0cmV0dXJuIHZhcmlhYmxlXHJcblx0XHRcdFx0XHRcdCYmIHZhcmlhYmxlICE9PSB3aW5kb3dcclxuXHRcdFx0XHRcdFx0JiYgVHlwZS5pc051bWJlcih2YXJpYWJsZS5sZW5ndGgpXHJcblx0XHRcdFx0XHRcdCYmICFUeXBlLmlzU3RyaW5nKHZhcmlhYmxlKVxyXG5cdFx0XHRcdFx0XHQmJiAhVHlwZS5pc0Z1bmN0aW9uKHZhcmlhYmxlKVxyXG5cdFx0XHRcdFx0XHQmJiAhVHlwZS5pc05vZGUodmFyaWFibGUpXHJcblx0XHRcdFx0XHRcdCYmICh2YXJpYWJsZS5sZW5ndGggPT09IDAgfHwgVHlwZS5pc05vZGUodmFyaWFibGVbMF0pKTtcclxuXHRcdFx0fSxcclxuXHRcdFx0aXNTVkc6IGZ1bmN0aW9uKHZhcmlhYmxlKSB7XHJcblx0XHRcdFx0cmV0dXJuIHdpbmRvdy5TVkdFbGVtZW50ICYmICh2YXJpYWJsZSBpbnN0YW5jZW9mIHdpbmRvdy5TVkdFbGVtZW50KTtcclxuXHRcdFx0fSxcclxuXHRcdFx0aXNFbXB0eU9iamVjdDogZnVuY3Rpb24odmFyaWFibGUpIHtcclxuXHRcdFx0XHRmb3IgKHZhciBuYW1lIGluIHZhcmlhYmxlKSB7XHJcblx0XHRcdFx0XHRpZiAodmFyaWFibGUuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdH1cclxuXHRcdH07XHJcblxyXG5cdFx0LyoqKioqKioqKioqKioqKioqXHJcblx0XHQgRGVwZW5kZW5jaWVzXHJcblx0XHQgKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0dmFyICQsXHJcblx0XHRcdFx0aXNKUXVlcnkgPSBmYWxzZTtcclxuXHJcblx0XHRpZiAoZ2xvYmFsLmZuICYmIGdsb2JhbC5mbi5qcXVlcnkpIHtcclxuXHRcdFx0JCA9IGdsb2JhbDtcclxuXHRcdFx0aXNKUXVlcnkgPSB0cnVlO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0JCA9IHdpbmRvdy5WZWxvY2l0eS5VdGlsaXRpZXM7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKElFIDw9IDggJiYgIWlzSlF1ZXJ5KSB7XHJcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlZlbG9jaXR5OiBJRTggYW5kIGJlbG93IHJlcXVpcmUgalF1ZXJ5IHRvIGJlIGxvYWRlZCBiZWZvcmUgVmVsb2NpdHkuXCIpO1xyXG5cdFx0fSBlbHNlIGlmIChJRSA8PSA3KSB7XHJcblx0XHRcdC8qIFJldmVydCB0byBqUXVlcnkncyAkLmFuaW1hdGUoKSwgYW5kIGxvc2UgVmVsb2NpdHkncyBleHRyYSBmZWF0dXJlcy4gKi9cclxuXHRcdFx0alF1ZXJ5LmZuLnZlbG9jaXR5ID0galF1ZXJ5LmZuLmFuaW1hdGU7XHJcblxyXG5cdFx0XHQvKiBOb3cgdGhhdCAkLmZuLnZlbG9jaXR5IGlzIGFsaWFzZWQsIGFib3J0IHRoaXMgVmVsb2NpdHkgZGVjbGFyYXRpb24uICovXHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvKioqKioqKioqKioqKioqKipcclxuXHRcdCBDb25zdGFudHNcclxuXHRcdCAqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHR2YXIgRFVSQVRJT05fREVGQVVMVCA9IDQwMCxcclxuXHRcdFx0XHRFQVNJTkdfREVGQVVMVCA9IFwic3dpbmdcIjtcclxuXHJcblx0XHQvKioqKioqKioqKioqKlxyXG5cdFx0IFN0YXRlXHJcblx0XHQgKioqKioqKioqKioqKi9cclxuXHJcblx0XHR2YXIgVmVsb2NpdHkgPSB7XHJcblx0XHRcdC8qIENvbnRhaW5lciBmb3IgcGFnZS13aWRlIFZlbG9jaXR5IHN0YXRlIGRhdGEuICovXHJcblx0XHRcdFN0YXRlOiB7XHJcblx0XHRcdFx0LyogRGV0ZWN0IG1vYmlsZSBkZXZpY2VzIHRvIGRldGVybWluZSBpZiBtb2JpbGVIQSBzaG91bGQgYmUgdHVybmVkIG9uLiAqL1xyXG5cdFx0XHRcdGlzTW9iaWxlOiAvQW5kcm9pZHx3ZWJPU3xpUGhvbmV8aVBhZHxpUG9kfEJsYWNrQmVycnl8SUVNb2JpbGV8T3BlcmEgTWluaS9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpLFxyXG5cdFx0XHRcdC8qIFRoZSBtb2JpbGVIQSBvcHRpb24ncyBiZWhhdmlvciBjaGFuZ2VzIG9uIG9sZGVyIEFuZHJvaWQgZGV2aWNlcyAoR2luZ2VyYnJlYWQsIHZlcnNpb25zIDIuMy4zLTIuMy43KS4gKi9cclxuXHRcdFx0XHRpc0FuZHJvaWQ6IC9BbmRyb2lkL2kudGVzdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCksXHJcblx0XHRcdFx0aXNHaW5nZXJicmVhZDogL0FuZHJvaWQgMlxcLjNcXC5bMy03XS9pLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpLFxyXG5cdFx0XHRcdGlzQ2hyb21lOiB3aW5kb3cuY2hyb21lLFxyXG5cdFx0XHRcdGlzRmlyZWZveDogL0ZpcmVmb3gvaS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSxcclxuXHRcdFx0XHQvKiBDcmVhdGUgYSBjYWNoZWQgZWxlbWVudCBmb3IgcmUtdXNlIHdoZW4gY2hlY2tpbmcgZm9yIENTUyBwcm9wZXJ0eSBwcmVmaXhlcy4gKi9cclxuXHRcdFx0XHRwcmVmaXhFbGVtZW50OiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLFxyXG5cdFx0XHRcdC8qIENhY2hlIGV2ZXJ5IHByZWZpeCBtYXRjaCB0byBhdm9pZCByZXBlYXRpbmcgbG9va3Vwcy4gKi9cclxuXHRcdFx0XHRwcmVmaXhNYXRjaGVzOiB7fSxcclxuXHRcdFx0XHQvKiBDYWNoZSB0aGUgYW5jaG9yIHVzZWQgZm9yIGFuaW1hdGluZyB3aW5kb3cgc2Nyb2xsaW5nLiAqL1xyXG5cdFx0XHRcdHNjcm9sbEFuY2hvcjogbnVsbCxcclxuXHRcdFx0XHQvKiBDYWNoZSB0aGUgYnJvd3Nlci1zcGVjaWZpYyBwcm9wZXJ0eSBuYW1lcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNjcm9sbCBhbmNob3IuICovXHJcblx0XHRcdFx0c2Nyb2xsUHJvcGVydHlMZWZ0OiBudWxsLFxyXG5cdFx0XHRcdHNjcm9sbFByb3BlcnR5VG9wOiBudWxsLFxyXG5cdFx0XHRcdC8qIEtlZXAgdHJhY2sgb2Ygd2hldGhlciBvdXIgUkFGIHRpY2sgaXMgcnVubmluZy4gKi9cclxuXHRcdFx0XHRpc1RpY2tpbmc6IGZhbHNlLFxyXG5cdFx0XHRcdC8qIENvbnRhaW5lciBmb3IgZXZlcnkgaW4tcHJvZ3Jlc3MgY2FsbCB0byBWZWxvY2l0eS4gKi9cclxuXHRcdFx0XHRjYWxsczogW10sXHJcblx0XHRcdFx0ZGVsYXllZEVsZW1lbnRzOiB7XHJcblx0XHRcdFx0XHRjb3VudDogMFxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0LyogVmVsb2NpdHkncyBjdXN0b20gQ1NTIHN0YWNrLiBNYWRlIGdsb2JhbCBmb3IgdW5pdCB0ZXN0aW5nLiAqL1xyXG5cdFx0XHRDU1M6IHsvKiBEZWZpbmVkIGJlbG93LiAqL30sXHJcblx0XHRcdC8qIEEgc2hpbSBvZiB0aGUgalF1ZXJ5IHV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgYnkgVmVsb2NpdHkgLS0gcHJvdmlkZWQgYnkgVmVsb2NpdHkncyBvcHRpb25hbCBqUXVlcnkgc2hpbS4gKi9cclxuXHRcdFx0VXRpbGl0aWVzOiAkLFxyXG5cdFx0XHQvKiBDb250YWluZXIgZm9yIHRoZSB1c2VyJ3MgY3VzdG9tIGFuaW1hdGlvbiByZWRpcmVjdHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBieSBuYW1lIGluIHBsYWNlIG9mIHRoZSBwcm9wZXJ0aWVzIG1hcCBhcmd1bWVudC4gKi9cclxuXHRcdFx0UmVkaXJlY3RzOiB7LyogTWFudWFsbHkgcmVnaXN0ZXJlZCBieSB0aGUgdXNlci4gKi99LFxyXG5cdFx0XHRFYXNpbmdzOiB7LyogRGVmaW5lZCBiZWxvdy4gKi99LFxyXG5cdFx0XHQvKiBBdHRlbXB0IHRvIHVzZSBFUzYgUHJvbWlzZXMgYnkgZGVmYXVsdC4gVXNlcnMgY2FuIG92ZXJyaWRlIHRoaXMgd2l0aCBhIHRoaXJkLXBhcnR5IHByb21pc2VzIGxpYnJhcnkuICovXHJcblx0XHRcdFByb21pc2U6IHdpbmRvdy5Qcm9taXNlLFxyXG5cdFx0XHQvKiBWZWxvY2l0eSBvcHRpb24gZGVmYXVsdHMsIHdoaWNoIGNhbiBiZSBvdmVycmlkZW4gYnkgdGhlIHVzZXIuICovXHJcblx0XHRcdGRlZmF1bHRzOiB7XHJcblx0XHRcdFx0cXVldWU6IFwiXCIsXHJcblx0XHRcdFx0ZHVyYXRpb246IERVUkFUSU9OX0RFRkFVTFQsXHJcblx0XHRcdFx0ZWFzaW5nOiBFQVNJTkdfREVGQVVMVCxcclxuXHRcdFx0XHRiZWdpbjogdW5kZWZpbmVkLFxyXG5cdFx0XHRcdGNvbXBsZXRlOiB1bmRlZmluZWQsXHJcblx0XHRcdFx0cHJvZ3Jlc3M6IHVuZGVmaW5lZCxcclxuXHRcdFx0XHRkaXNwbGF5OiB1bmRlZmluZWQsXHJcblx0XHRcdFx0dmlzaWJpbGl0eTogdW5kZWZpbmVkLFxyXG5cdFx0XHRcdGxvb3A6IGZhbHNlLFxyXG5cdFx0XHRcdGRlbGF5OiBmYWxzZSxcclxuXHRcdFx0XHRtb2JpbGVIQTogdHJ1ZSxcclxuXHRcdFx0XHQvKiBBZHZhbmNlZDogU2V0IHRvIGZhbHNlIHRvIHByZXZlbnQgcHJvcGVydHkgdmFsdWVzIGZyb20gYmVpbmcgY2FjaGVkIGJldHdlZW4gY29uc2VjdXRpdmUgVmVsb2NpdHktaW5pdGlhdGVkIGNoYWluIGNhbGxzLiAqL1xyXG5cdFx0XHRcdF9jYWNoZVZhbHVlczogdHJ1ZSxcclxuXHRcdFx0XHQvKiBBZHZhbmNlZDogU2V0IHRvIGZhbHNlIGlmIHRoZSBwcm9taXNlIHNob3VsZCBhbHdheXMgcmVzb2x2ZSBvbiBlbXB0eSBlbGVtZW50IGxpc3RzLiAqL1xyXG5cdFx0XHRcdHByb21pc2VSZWplY3RFbXB0eTogdHJ1ZVxyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKiBBIGRlc2lnbiBnb2FsIG9mIFZlbG9jaXR5IGlzIHRvIGNhY2hlIGRhdGEgd2hlcmV2ZXIgcG9zc2libGUgaW4gb3JkZXIgdG8gYXZvaWQgRE9NIHJlcXVlcnlpbmcuIEFjY29yZGluZ2x5LCBlYWNoIGVsZW1lbnQgaGFzIGEgZGF0YSBjYWNoZS4gKi9cclxuXHRcdFx0aW5pdDogZnVuY3Rpb24oZWxlbWVudCkge1xyXG5cdFx0XHRcdCQuZGF0YShlbGVtZW50LCBcInZlbG9jaXR5XCIsIHtcclxuXHRcdFx0XHRcdC8qIFN0b3JlIHdoZXRoZXIgdGhpcyBpcyBhbiBTVkcgZWxlbWVudCwgc2luY2UgaXRzIHByb3BlcnRpZXMgYXJlIHJldHJpZXZlZCBhbmQgdXBkYXRlZCBkaWZmZXJlbnRseSB0aGFuIHN0YW5kYXJkIEhUTUwgZWxlbWVudHMuICovXHJcblx0XHRcdFx0XHRpc1NWRzogVHlwZS5pc1NWRyhlbGVtZW50KSxcclxuXHRcdFx0XHRcdC8qIEtlZXAgdHJhY2sgb2Ygd2hldGhlciB0aGUgZWxlbWVudCBpcyBjdXJyZW50bHkgYmVpbmcgYW5pbWF0ZWQgYnkgVmVsb2NpdHkuXHJcblx0XHRcdFx0XHQgVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHByb3BlcnR5IHZhbHVlcyBhcmUgbm90IHRyYW5zZmVycmVkIGJldHdlZW4gbm9uLWNvbnNlY3V0aXZlIChzdGFsZSkgY2FsbHMuICovXHJcblx0XHRcdFx0XHRpc0FuaW1hdGluZzogZmFsc2UsXHJcblx0XHRcdFx0XHQvKiBBIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCdzIGxpdmUgY29tcHV0ZWRTdHlsZSBvYmplY3QuIExlYXJuIG1vcmUgaGVyZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQVBJL3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlICovXHJcblx0XHRcdFx0XHRjb21wdXRlZFN0eWxlOiBudWxsLFxyXG5cdFx0XHRcdFx0LyogVHdlZW4gZGF0YSBpcyBjYWNoZWQgZm9yIGVhY2ggYW5pbWF0aW9uIG9uIHRoZSBlbGVtZW50IHNvIHRoYXQgZGF0YSBjYW4gYmUgcGFzc2VkIGFjcm9zcyBjYWxscyAtLVxyXG5cdFx0XHRcdFx0IGluIHBhcnRpY3VsYXIsIGVuZCB2YWx1ZXMgYXJlIHVzZWQgYXMgc3Vic2VxdWVudCBzdGFydCB2YWx1ZXMgaW4gY29uc2VjdXRpdmUgVmVsb2NpdHkgY2FsbHMuICovXHJcblx0XHRcdFx0XHR0d2VlbnNDb250YWluZXI6IG51bGwsXHJcblx0XHRcdFx0XHQvKiBUaGUgZnVsbCByb290IHByb3BlcnR5IHZhbHVlcyBvZiBlYWNoIENTUyBob29rIGJlaW5nIGFuaW1hdGVkIG9uIHRoaXMgZWxlbWVudCBhcmUgY2FjaGVkIHNvIHRoYXQ6XHJcblx0XHRcdFx0XHQgMSkgQ29uY3VycmVudGx5LWFuaW1hdGluZyBob29rcyBzaGFyaW5nIHRoZSBzYW1lIHJvb3QgY2FuIGhhdmUgdGhlaXIgcm9vdCB2YWx1ZXMnIG1lcmdlZCBpbnRvIG9uZSB3aGlsZSB0d2VlbmluZy5cclxuXHRcdFx0XHRcdCAyKSBQb3N0LWhvb2staW5qZWN0aW9uIHJvb3QgdmFsdWVzIGNhbiBiZSB0cmFuc2ZlcnJlZCBvdmVyIHRvIGNvbnNlY3V0aXZlbHkgY2hhaW5lZCBWZWxvY2l0eSBjYWxscyBhcyBzdGFydGluZyByb290IHZhbHVlcy4gKi9cclxuXHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlQ2FjaGU6IHt9LFxyXG5cdFx0XHRcdFx0LyogQSBjYWNoZSBmb3IgdHJhbnNmb3JtIHVwZGF0ZXMsIHdoaWNoIG11c3QgYmUgbWFudWFsbHkgZmx1c2hlZCB2aWEgQ1NTLmZsdXNoVHJhbnNmb3JtQ2FjaGUoKS4gKi9cclxuXHRcdFx0XHRcdHRyYW5zZm9ybUNhY2hlOiB7fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKiBBIHBhcmFsbGVsIHRvIGpRdWVyeSdzICQuY3NzKCksIHVzZWQgZm9yIGdldHRpbmcvc2V0dGluZyBWZWxvY2l0eSdzIGhvb2tlZCBDU1MgcHJvcGVydGllcy4gKi9cclxuXHRcdFx0aG9vazogbnVsbCwgLyogRGVmaW5lZCBiZWxvdy4gKi9cclxuXHRcdFx0LyogVmVsb2NpdHktd2lkZSBhbmltYXRpb24gdGltZSByZW1hcHBpbmcgZm9yIHRlc3RpbmcgcHVycG9zZXMuICovXHJcblx0XHRcdG1vY2s6IGZhbHNlLFxyXG5cdFx0XHR2ZXJzaW9uOiB7bWFqb3I6IDEsIG1pbm9yOiA1LCBwYXRjaDogMn0sXHJcblx0XHRcdC8qIFNldCB0byAxIG9yIDIgKG1vc3QgdmVyYm9zZSkgdG8gb3V0cHV0IGRlYnVnIGluZm8gdG8gY29uc29sZS4gKi9cclxuXHRcdFx0ZGVidWc6IGZhbHNlLFxyXG5cdFx0XHQvKiBVc2UgckFGIGhpZ2ggcmVzb2x1dGlvbiB0aW1lc3RhbXAgd2hlbiBhdmFpbGFibGUgKi9cclxuXHRcdFx0dGltZXN0YW1wOiB0cnVlLFxyXG5cdFx0XHQvKiBQYXVzZSBhbGwgYW5pbWF0aW9ucyAqL1xyXG5cdFx0XHRwYXVzZUFsbDogZnVuY3Rpb24ocXVldWVOYW1lKSB7XHJcblx0XHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcclxuXHJcblx0XHRcdFx0JC5lYWNoKFZlbG9jaXR5LlN0YXRlLmNhbGxzLCBmdW5jdGlvbihpLCBhY3RpdmVDYWxsKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKGFjdGl2ZUNhbGwpIHtcclxuXHJcblx0XHRcdFx0XHRcdC8qIElmIHdlIGhhdmUgYSBxdWV1ZU5hbWUgYW5kIHRoaXMgY2FsbCBpcyBub3Qgb24gdGhhdCBxdWV1ZSwgc2tpcCAqL1xyXG5cdFx0XHRcdFx0XHRpZiAocXVldWVOYW1lICE9PSB1bmRlZmluZWQgJiYgKChhY3RpdmVDYWxsWzJdLnF1ZXVlICE9PSBxdWV1ZU5hbWUpIHx8IChhY3RpdmVDYWxsWzJdLnF1ZXVlID09PSBmYWxzZSkpKSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIFNldCBjYWxsIHRvIHBhdXNlZCAqL1xyXG5cdFx0XHRcdFx0XHRhY3RpdmVDYWxsWzVdID0ge1xyXG5cdFx0XHRcdFx0XHRcdHJlc3VtZTogZmFsc2VcclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0LyogUGF1c2UgdGltZXJzIG9uIGFueSBjdXJyZW50bHkgZGVsYXllZCBjYWxscyAqL1xyXG5cdFx0XHRcdCQuZWFjaChWZWxvY2l0eS5TdGF0ZS5kZWxheWVkRWxlbWVudHMsIGZ1bmN0aW9uKGssIGVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdGlmICghZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRwYXVzZURlbGF5T25FbGVtZW50KGVsZW1lbnQsIGN1cnJlbnRUaW1lKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSxcclxuXHRcdFx0LyogUmVzdW1lIGFsbCBhbmltYXRpb25zICovXHJcblx0XHRcdHJlc3VtZUFsbDogZnVuY3Rpb24ocXVldWVOYW1lKSB7XHJcblx0XHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcclxuXHJcblx0XHRcdFx0JC5lYWNoKFZlbG9jaXR5LlN0YXRlLmNhbGxzLCBmdW5jdGlvbihpLCBhY3RpdmVDYWxsKSB7XHJcblxyXG5cdFx0XHRcdFx0aWYgKGFjdGl2ZUNhbGwpIHtcclxuXHJcblx0XHRcdFx0XHRcdC8qIElmIHdlIGhhdmUgYSBxdWV1ZU5hbWUgYW5kIHRoaXMgY2FsbCBpcyBub3Qgb24gdGhhdCBxdWV1ZSwgc2tpcCAqL1xyXG5cdFx0XHRcdFx0XHRpZiAocXVldWVOYW1lICE9PSB1bmRlZmluZWQgJiYgKChhY3RpdmVDYWxsWzJdLnF1ZXVlICE9PSBxdWV1ZU5hbWUpIHx8IChhY3RpdmVDYWxsWzJdLnF1ZXVlID09PSBmYWxzZSkpKSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIFNldCBjYWxsIHRvIHJlc3VtZWQgaWYgaXQgd2FzIHBhdXNlZCAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoYWN0aXZlQ2FsbFs1XSkge1xyXG5cdFx0XHRcdFx0XHRcdGFjdGl2ZUNhbGxbNV0ucmVzdW1lID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdC8qIFJlc3VtZSB0aW1lcnMgb24gYW55IGN1cnJlbnRseSBkZWxheWVkIGNhbGxzICovXHJcblx0XHRcdFx0JC5lYWNoKFZlbG9jaXR5LlN0YXRlLmRlbGF5ZWRFbGVtZW50cywgZnVuY3Rpb24oaywgZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0aWYgKCFlbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdHJlc3VtZURlbGF5T25FbGVtZW50KGVsZW1lbnQsIGN1cnJlbnRUaW1lKTtcclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHJcblx0XHQvKiBSZXRyaWV2ZSB0aGUgYXBwcm9wcmlhdGUgc2Nyb2xsIGFuY2hvciBhbmQgcHJvcGVydHkgbmFtZSBmb3IgdGhlIGJyb3dzZXI6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cuc2Nyb2xsWSAqL1xyXG5cdFx0aWYgKHdpbmRvdy5wYWdlWU9mZnNldCAhPT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFZlbG9jaXR5LlN0YXRlLnNjcm9sbEFuY2hvciA9IHdpbmRvdztcclxuXHRcdFx0VmVsb2NpdHkuU3RhdGUuc2Nyb2xsUHJvcGVydHlMZWZ0ID0gXCJwYWdlWE9mZnNldFwiO1xyXG5cdFx0XHRWZWxvY2l0eS5TdGF0ZS5zY3JvbGxQcm9wZXJ0eVRvcCA9IFwicGFnZVlPZmZzZXRcIjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdFZlbG9jaXR5LlN0YXRlLnNjcm9sbEFuY2hvciA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUgfHwgZG9jdW1lbnQuYm9keTtcclxuXHRcdFx0VmVsb2NpdHkuU3RhdGUuc2Nyb2xsUHJvcGVydHlMZWZ0ID0gXCJzY3JvbGxMZWZ0XCI7XHJcblx0XHRcdFZlbG9jaXR5LlN0YXRlLnNjcm9sbFByb3BlcnR5VG9wID0gXCJzY3JvbGxUb3BcIjtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBTaG9ydGhhbmQgYWxpYXMgZm9yIGpRdWVyeSdzICQuZGF0YSgpIHV0aWxpdHkuICovXHJcblx0XHRmdW5jdGlvbiBEYXRhKGVsZW1lbnQpIHtcclxuXHRcdFx0LyogSGFyZGNvZGUgYSByZWZlcmVuY2UgdG8gdGhlIHBsdWdpbiBuYW1lLiAqL1xyXG5cdFx0XHR2YXIgcmVzcG9uc2UgPSAkLmRhdGEoZWxlbWVudCwgXCJ2ZWxvY2l0eVwiKTtcclxuXHJcblx0XHRcdC8qIGpRdWVyeSA8PTEuNC4yIHJldHVybnMgbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZCB3aGVuIG5vIG1hdGNoIGlzIGZvdW5kLiBXZSBub3JtYWxpemUgdGhpcyBiZWhhdmlvci4gKi9cclxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlID09PSBudWxsID8gdW5kZWZpbmVkIDogcmVzcG9uc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqKioqKioqKioqKioqXHJcblx0XHQgRGVsYXkgVGltZXJcclxuXHRcdCAqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRmdW5jdGlvbiBwYXVzZURlbGF5T25FbGVtZW50KGVsZW1lbnQsIGN1cnJlbnRUaW1lKSB7XHJcblx0XHRcdC8qIENoZWNrIGZvciBhbnkgZGVsYXkgdGltZXJzLCBhbmQgcGF1c2UgdGhlIHNldCB0aW1lb3V0cyAod2hpbGUgcHJlc2VydmluZyB0aW1lIGRhdGEpXHJcblx0XHRcdCB0byBiZSByZXN1bWVkIHdoZW4gdGhlIFwicmVzdW1lXCIgY29tbWFuZCBpcyBpc3N1ZWQgKi9cclxuXHRcdFx0dmFyIGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cdFx0XHRpZiAoZGF0YSAmJiBkYXRhLmRlbGF5VGltZXIgJiYgIWRhdGEuZGVsYXlQYXVzZWQpIHtcclxuXHRcdFx0XHRkYXRhLmRlbGF5UmVtYWluaW5nID0gZGF0YS5kZWxheSAtIGN1cnJlbnRUaW1lICsgZGF0YS5kZWxheUJlZ2luO1xyXG5cdFx0XHRcdGRhdGEuZGVsYXlQYXVzZWQgPSB0cnVlO1xyXG5cdFx0XHRcdGNsZWFyVGltZW91dChkYXRhLmRlbGF5VGltZXIuc2V0VGltZW91dCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHRmdW5jdGlvbiByZXN1bWVEZWxheU9uRWxlbWVudChlbGVtZW50LCBjdXJyZW50VGltZSkge1xyXG5cdFx0XHQvKiBDaGVjayBmb3IgYW55IHBhdXNlZCB0aW1lcnMgYW5kIHJlc3VtZSAqL1xyXG5cdFx0XHR2YXIgZGF0YSA9IERhdGEoZWxlbWVudCk7XHJcblx0XHRcdGlmIChkYXRhICYmIGRhdGEuZGVsYXlUaW1lciAmJiBkYXRhLmRlbGF5UGF1c2VkKSB7XHJcblx0XHRcdFx0LyogSWYgdGhlIGVsZW1lbnQgd2FzIG1pZC1kZWxheSwgcmUgaW5pdGlhdGUgdGhlIHRpbWVvdXQgd2l0aCB0aGUgcmVtYWluaW5nIGRlbGF5ICovXHJcblx0XHRcdFx0ZGF0YS5kZWxheVBhdXNlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdGRhdGEuZGVsYXlUaW1lci5zZXRUaW1lb3V0ID0gc2V0VGltZW91dChkYXRhLmRlbGF5VGltZXIubmV4dCwgZGF0YS5kZWxheVJlbWFpbmluZyk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblxyXG5cclxuXHRcdC8qKioqKioqKioqKioqKlxyXG5cdFx0IEVhc2luZ1xyXG5cdFx0ICoqKioqKioqKioqKioqL1xyXG5cclxuXHRcdC8qIFN0ZXAgZWFzaW5nIGdlbmVyYXRvci4gKi9cclxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlU3RlcChzdGVwcykge1xyXG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24ocCkge1xyXG5cdFx0XHRcdHJldHVybiBNYXRoLnJvdW5kKHAgKiBzdGVwcykgKiAoMSAvIHN0ZXBzKTtcclxuXHRcdFx0fTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBCZXppZXIgY3VydmUgZnVuY3Rpb24gZ2VuZXJhdG9yLiBDb3B5cmlnaHQgR2FldGFuIFJlbmF1ZGVhdS4gTUlUIExpY2Vuc2U6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUlUX0xpY2Vuc2UgKi9cclxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlQmV6aWVyKG1YMSwgbVkxLCBtWDIsIG1ZMikge1xyXG5cdFx0XHR2YXIgTkVXVE9OX0lURVJBVElPTlMgPSA0LFxyXG5cdFx0XHRcdFx0TkVXVE9OX01JTl9TTE9QRSA9IDAuMDAxLFxyXG5cdFx0XHRcdFx0U1VCRElWSVNJT05fUFJFQ0lTSU9OID0gMC4wMDAwMDAxLFxyXG5cdFx0XHRcdFx0U1VCRElWSVNJT05fTUFYX0lURVJBVElPTlMgPSAxMCxcclxuXHRcdFx0XHRcdGtTcGxpbmVUYWJsZVNpemUgPSAxMSxcclxuXHRcdFx0XHRcdGtTYW1wbGVTdGVwU2l6ZSA9IDEuMCAvIChrU3BsaW5lVGFibGVTaXplIC0gMS4wKSxcclxuXHRcdFx0XHRcdGZsb2F0MzJBcnJheVN1cHBvcnRlZCA9IFwiRmxvYXQzMkFycmF5XCIgaW4gd2luZG93O1xyXG5cclxuXHRcdFx0LyogTXVzdCBjb250YWluIGZvdXIgYXJndW1lbnRzLiAqL1xyXG5cdFx0XHRpZiAoYXJndW1lbnRzLmxlbmd0aCAhPT0gNCkge1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyogQXJndW1lbnRzIG11c3QgYmUgbnVtYmVycy4gKi9cclxuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCA0OyArK2kpIHtcclxuXHRcdFx0XHRpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSAhPT0gXCJudW1iZXJcIiB8fCBpc05hTihhcmd1bWVudHNbaV0pIHx8ICFpc0Zpbml0ZShhcmd1bWVudHNbaV0pKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBYIHZhbHVlcyBtdXN0IGJlIGluIHRoZSBbMCwgMV0gcmFuZ2UuICovXHJcblx0XHRcdG1YMSA9IE1hdGgubWluKG1YMSwgMSk7XHJcblx0XHRcdG1YMiA9IE1hdGgubWluKG1YMiwgMSk7XHJcblx0XHRcdG1YMSA9IE1hdGgubWF4KG1YMSwgMCk7XHJcblx0XHRcdG1YMiA9IE1hdGgubWF4KG1YMiwgMCk7XHJcblxyXG5cdFx0XHR2YXIgbVNhbXBsZVZhbHVlcyA9IGZsb2F0MzJBcnJheVN1cHBvcnRlZCA/IG5ldyBGbG9hdDMyQXJyYXkoa1NwbGluZVRhYmxlU2l6ZSkgOiBuZXcgQXJyYXkoa1NwbGluZVRhYmxlU2l6ZSk7XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBBKGFBMSwgYUEyKSB7XHJcblx0XHRcdFx0cmV0dXJuIDEuMCAtIDMuMCAqIGFBMiArIDMuMCAqIGFBMTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmdW5jdGlvbiBCKGFBMSwgYUEyKSB7XHJcblx0XHRcdFx0cmV0dXJuIDMuMCAqIGFBMiAtIDYuMCAqIGFBMTtcclxuXHRcdFx0fVxyXG5cdFx0XHRmdW5jdGlvbiBDKGFBMSkge1xyXG5cdFx0XHRcdHJldHVybiAzLjAgKiBhQTE7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZ1bmN0aW9uIGNhbGNCZXppZXIoYVQsIGFBMSwgYUEyKSB7XHJcblx0XHRcdFx0cmV0dXJuICgoQShhQTEsIGFBMikgKiBhVCArIEIoYUExLCBhQTIpKSAqIGFUICsgQyhhQTEpKSAqIGFUO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmdW5jdGlvbiBnZXRTbG9wZShhVCwgYUExLCBhQTIpIHtcclxuXHRcdFx0XHRyZXR1cm4gMy4wICogQShhQTEsIGFBMikgKiBhVCAqIGFUICsgMi4wICogQihhQTEsIGFBMikgKiBhVCArIEMoYUExKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gbmV3dG9uUmFwaHNvbkl0ZXJhdGUoYVgsIGFHdWVzc1QpIHtcclxuXHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IE5FV1RPTl9JVEVSQVRJT05TOyArK2kpIHtcclxuXHRcdFx0XHRcdHZhciBjdXJyZW50U2xvcGUgPSBnZXRTbG9wZShhR3Vlc3NULCBtWDEsIG1YMik7XHJcblxyXG5cdFx0XHRcdFx0aWYgKGN1cnJlbnRTbG9wZSA9PT0gMC4wKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBhR3Vlc3NUO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHZhciBjdXJyZW50WCA9IGNhbGNCZXppZXIoYUd1ZXNzVCwgbVgxLCBtWDIpIC0gYVg7XHJcblx0XHRcdFx0XHRhR3Vlc3NUIC09IGN1cnJlbnRYIC8gY3VycmVudFNsb3BlO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIGFHdWVzc1Q7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZ1bmN0aW9uIGNhbGNTYW1wbGVWYWx1ZXMoKSB7XHJcblx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBrU3BsaW5lVGFibGVTaXplOyArK2kpIHtcclxuXHRcdFx0XHRcdG1TYW1wbGVWYWx1ZXNbaV0gPSBjYWxjQmV6aWVyKGkgKiBrU2FtcGxlU3RlcFNpemUsIG1YMSwgbVgyKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZ1bmN0aW9uIGJpbmFyeVN1YmRpdmlkZShhWCwgYUEsIGFCKSB7XHJcblx0XHRcdFx0dmFyIGN1cnJlbnRYLCBjdXJyZW50VCwgaSA9IDA7XHJcblxyXG5cdFx0XHRcdGRvIHtcclxuXHRcdFx0XHRcdGN1cnJlbnRUID0gYUEgKyAoYUIgLSBhQSkgLyAyLjA7XHJcblx0XHRcdFx0XHRjdXJyZW50WCA9IGNhbGNCZXppZXIoY3VycmVudFQsIG1YMSwgbVgyKSAtIGFYO1xyXG5cdFx0XHRcdFx0aWYgKGN1cnJlbnRYID4gMC4wKSB7XHJcblx0XHRcdFx0XHRcdGFCID0gY3VycmVudFQ7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRhQSA9IGN1cnJlbnRUO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gd2hpbGUgKE1hdGguYWJzKGN1cnJlbnRYKSA+IFNVQkRJVklTSU9OX1BSRUNJU0lPTiAmJiArK2kgPCBTVUJESVZJU0lPTl9NQVhfSVRFUkFUSU9OUyk7XHJcblxyXG5cdFx0XHRcdHJldHVybiBjdXJyZW50VDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gZ2V0VEZvclgoYVgpIHtcclxuXHRcdFx0XHR2YXIgaW50ZXJ2YWxTdGFydCA9IDAuMCxcclxuXHRcdFx0XHRcdFx0Y3VycmVudFNhbXBsZSA9IDEsXHJcblx0XHRcdFx0XHRcdGxhc3RTYW1wbGUgPSBrU3BsaW5lVGFibGVTaXplIC0gMTtcclxuXHJcblx0XHRcdFx0Zm9yICg7IGN1cnJlbnRTYW1wbGUgIT09IGxhc3RTYW1wbGUgJiYgbVNhbXBsZVZhbHVlc1tjdXJyZW50U2FtcGxlXSA8PSBhWDsgKytjdXJyZW50U2FtcGxlKSB7XHJcblx0XHRcdFx0XHRpbnRlcnZhbFN0YXJ0ICs9IGtTYW1wbGVTdGVwU2l6ZTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC0tY3VycmVudFNhbXBsZTtcclxuXHJcblx0XHRcdFx0dmFyIGRpc3QgPSAoYVggLSBtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGVdKSAvIChtU2FtcGxlVmFsdWVzW2N1cnJlbnRTYW1wbGUgKyAxXSAtIG1TYW1wbGVWYWx1ZXNbY3VycmVudFNhbXBsZV0pLFxyXG5cdFx0XHRcdFx0XHRndWVzc0ZvclQgPSBpbnRlcnZhbFN0YXJ0ICsgZGlzdCAqIGtTYW1wbGVTdGVwU2l6ZSxcclxuXHRcdFx0XHRcdFx0aW5pdGlhbFNsb3BlID0gZ2V0U2xvcGUoZ3Vlc3NGb3JULCBtWDEsIG1YMik7XHJcblxyXG5cdFx0XHRcdGlmIChpbml0aWFsU2xvcGUgPj0gTkVXVE9OX01JTl9TTE9QRSkge1xyXG5cdFx0XHRcdFx0cmV0dXJuIG5ld3RvblJhcGhzb25JdGVyYXRlKGFYLCBndWVzc0ZvclQpO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoaW5pdGlhbFNsb3BlID09PSAwLjApIHtcclxuXHRcdFx0XHRcdHJldHVybiBndWVzc0ZvclQ7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJldHVybiBiaW5hcnlTdWJkaXZpZGUoYVgsIGludGVydmFsU3RhcnQsIGludGVydmFsU3RhcnQgKyBrU2FtcGxlU3RlcFNpemUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIF9wcmVjb21wdXRlZCA9IGZhbHNlO1xyXG5cclxuXHRcdFx0ZnVuY3Rpb24gcHJlY29tcHV0ZSgpIHtcclxuXHRcdFx0XHRfcHJlY29tcHV0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdGlmIChtWDEgIT09IG1ZMSB8fCBtWDIgIT09IG1ZMikge1xyXG5cdFx0XHRcdFx0Y2FsY1NhbXBsZVZhbHVlcygpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFyIGYgPSBmdW5jdGlvbihhWCkge1xyXG5cdFx0XHRcdGlmICghX3ByZWNvbXB1dGVkKSB7XHJcblx0XHRcdFx0XHRwcmVjb21wdXRlKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChtWDEgPT09IG1ZMSAmJiBtWDIgPT09IG1ZMikge1xyXG5cdFx0XHRcdFx0cmV0dXJuIGFYO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoYVggPT09IDApIHtcclxuXHRcdFx0XHRcdHJldHVybiAwO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoYVggPT09IDEpIHtcclxuXHRcdFx0XHRcdHJldHVybiAxO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0cmV0dXJuIGNhbGNCZXppZXIoZ2V0VEZvclgoYVgpLCBtWTEsIG1ZMik7XHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHRmLmdldENvbnRyb2xQb2ludHMgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRyZXR1cm4gW3t4OiBtWDEsIHk6IG1ZMX0sIHt4OiBtWDIsIHk6IG1ZMn1dO1xyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0dmFyIHN0ciA9IFwiZ2VuZXJhdGVCZXppZXIoXCIgKyBbbVgxLCBtWTEsIG1YMiwgbVkyXSArIFwiKVwiO1xyXG5cdFx0XHRmLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0cmV0dXJuIHN0cjtcclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdHJldHVybiBmO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFJ1bmdlLUt1dHRhIHNwcmluZyBwaHlzaWNzIGZ1bmN0aW9uIGdlbmVyYXRvci4gQWRhcHRlZCBmcm9tIEZyYW1lci5qcywgY29weXJpZ2h0IEtvZW4gQm9rLiBNSVQgTGljZW5zZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZSAqL1xyXG5cdFx0LyogR2l2ZW4gYSB0ZW5zaW9uLCBmcmljdGlvbiwgYW5kIGR1cmF0aW9uLCBhIHNpbXVsYXRpb24gYXQgNjBGUFMgd2lsbCBmaXJzdCBydW4gd2l0aG91dCBhIGRlZmluZWQgZHVyYXRpb24gaW4gb3JkZXIgdG8gY2FsY3VsYXRlIHRoZSBmdWxsIHBhdGguIEEgc2Vjb25kIHBhc3NcclxuXHRcdCB0aGVuIGFkanVzdHMgdGhlIHRpbWUgZGVsdGEgLS0gdXNpbmcgdGhlIHJlbGF0aW9uIGJldHdlZW4gYWN0dWFsIHRpbWUgYW5kIGR1cmF0aW9uIC0tIHRvIGNhbGN1bGF0ZSB0aGUgcGF0aCBmb3IgdGhlIGR1cmF0aW9uLWNvbnN0cmFpbmVkIGFuaW1hdGlvbi4gKi9cclxuXHRcdHZhciBnZW5lcmF0ZVNwcmluZ1JLNCA9IChmdW5jdGlvbigpIHtcclxuXHRcdFx0ZnVuY3Rpb24gc3ByaW5nQWNjZWxlcmF0aW9uRm9yU3RhdGUoc3RhdGUpIHtcclxuXHRcdFx0XHRyZXR1cm4gKC1zdGF0ZS50ZW5zaW9uICogc3RhdGUueCkgLSAoc3RhdGUuZnJpY3Rpb24gKiBzdGF0ZS52KTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0ZnVuY3Rpb24gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKGluaXRpYWxTdGF0ZSwgZHQsIGRlcml2YXRpdmUpIHtcclxuXHRcdFx0XHR2YXIgc3RhdGUgPSB7XHJcblx0XHRcdFx0XHR4OiBpbml0aWFsU3RhdGUueCArIGRlcml2YXRpdmUuZHggKiBkdCxcclxuXHRcdFx0XHRcdHY6IGluaXRpYWxTdGF0ZS52ICsgZGVyaXZhdGl2ZS5kdiAqIGR0LFxyXG5cdFx0XHRcdFx0dGVuc2lvbjogaW5pdGlhbFN0YXRlLnRlbnNpb24sXHJcblx0XHRcdFx0XHRmcmljdGlvbjogaW5pdGlhbFN0YXRlLmZyaWN0aW9uXHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0cmV0dXJuIHtkeDogc3RhdGUudiwgZHY6IHNwcmluZ0FjY2VsZXJhdGlvbkZvclN0YXRlKHN0YXRlKX07XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGZ1bmN0aW9uIHNwcmluZ0ludGVncmF0ZVN0YXRlKHN0YXRlLCBkdCkge1xyXG5cdFx0XHRcdHZhciBhID0ge1xyXG5cdFx0XHRcdFx0ZHg6IHN0YXRlLnYsXHJcblx0XHRcdFx0XHRkdjogc3ByaW5nQWNjZWxlcmF0aW9uRm9yU3RhdGUoc3RhdGUpXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0YiA9IHNwcmluZ0V2YWx1YXRlU3RhdGVXaXRoRGVyaXZhdGl2ZShzdGF0ZSwgZHQgKiAwLjUsIGEpLFxyXG5cdFx0XHRcdFx0XHRjID0gc3ByaW5nRXZhbHVhdGVTdGF0ZVdpdGhEZXJpdmF0aXZlKHN0YXRlLCBkdCAqIDAuNSwgYiksXHJcblx0XHRcdFx0XHRcdGQgPSBzcHJpbmdFdmFsdWF0ZVN0YXRlV2l0aERlcml2YXRpdmUoc3RhdGUsIGR0LCBjKSxcclxuXHRcdFx0XHRcdFx0ZHhkdCA9IDEuMCAvIDYuMCAqIChhLmR4ICsgMi4wICogKGIuZHggKyBjLmR4KSArIGQuZHgpLFxyXG5cdFx0XHRcdFx0XHRkdmR0ID0gMS4wIC8gNi4wICogKGEuZHYgKyAyLjAgKiAoYi5kdiArIGMuZHYpICsgZC5kdik7XHJcblxyXG5cdFx0XHRcdHN0YXRlLnggPSBzdGF0ZS54ICsgZHhkdCAqIGR0O1xyXG5cdFx0XHRcdHN0YXRlLnYgPSBzdGF0ZS52ICsgZHZkdCAqIGR0O1xyXG5cclxuXHRcdFx0XHRyZXR1cm4gc3RhdGU7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJldHVybiBmdW5jdGlvbiBzcHJpbmdSSzRGYWN0b3J5KHRlbnNpb24sIGZyaWN0aW9uLCBkdXJhdGlvbikge1xyXG5cclxuXHRcdFx0XHR2YXIgaW5pdFN0YXRlID0ge1xyXG5cdFx0XHRcdFx0eDogLTEsXHJcblx0XHRcdFx0XHR2OiAwLFxyXG5cdFx0XHRcdFx0dGVuc2lvbjogbnVsbCxcclxuXHRcdFx0XHRcdGZyaWN0aW9uOiBudWxsXHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdFx0cGF0aCA9IFswXSxcclxuXHRcdFx0XHRcdFx0dGltZV9sYXBzZWQgPSAwLFxyXG5cdFx0XHRcdFx0XHR0b2xlcmFuY2UgPSAxIC8gMTAwMDAsXHJcblx0XHRcdFx0XHRcdERUID0gMTYgLyAxMDAwLFxyXG5cdFx0XHRcdFx0XHRoYXZlX2R1cmF0aW9uLCBkdCwgbGFzdF9zdGF0ZTtcclxuXHJcblx0XHRcdFx0dGVuc2lvbiA9IHBhcnNlRmxvYXQodGVuc2lvbikgfHwgNTAwO1xyXG5cdFx0XHRcdGZyaWN0aW9uID0gcGFyc2VGbG9hdChmcmljdGlvbikgfHwgMjA7XHJcblx0XHRcdFx0ZHVyYXRpb24gPSBkdXJhdGlvbiB8fCBudWxsO1xyXG5cclxuXHRcdFx0XHRpbml0U3RhdGUudGVuc2lvbiA9IHRlbnNpb247XHJcblx0XHRcdFx0aW5pdFN0YXRlLmZyaWN0aW9uID0gZnJpY3Rpb247XHJcblxyXG5cdFx0XHRcdGhhdmVfZHVyYXRpb24gPSBkdXJhdGlvbiAhPT0gbnVsbDtcclxuXHJcblx0XHRcdFx0LyogQ2FsY3VsYXRlIHRoZSBhY3R1YWwgdGltZSBpdCB0YWtlcyBmb3IgdGhpcyBhbmltYXRpb24gdG8gY29tcGxldGUgd2l0aCB0aGUgcHJvdmlkZWQgY29uZGl0aW9ucy4gKi9cclxuXHRcdFx0XHRpZiAoaGF2ZV9kdXJhdGlvbikge1xyXG5cdFx0XHRcdFx0LyogUnVuIHRoZSBzaW11bGF0aW9uIHdpdGhvdXQgYSBkdXJhdGlvbi4gKi9cclxuXHRcdFx0XHRcdHRpbWVfbGFwc2VkID0gc3ByaW5nUks0RmFjdG9yeSh0ZW5zaW9uLCBmcmljdGlvbik7XHJcblx0XHRcdFx0XHQvKiBDb21wdXRlIHRoZSBhZGp1c3RlZCB0aW1lIGRlbHRhLiAqL1xyXG5cdFx0XHRcdFx0ZHQgPSB0aW1lX2xhcHNlZCAvIGR1cmF0aW9uICogRFQ7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGR0ID0gRFQ7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR3aGlsZSAodHJ1ZSkge1xyXG5cdFx0XHRcdFx0LyogTmV4dC9zdGVwIGZ1bmN0aW9uIC4qL1xyXG5cdFx0XHRcdFx0bGFzdF9zdGF0ZSA9IHNwcmluZ0ludGVncmF0ZVN0YXRlKGxhc3Rfc3RhdGUgfHwgaW5pdFN0YXRlLCBkdCk7XHJcblx0XHRcdFx0XHQvKiBTdG9yZSB0aGUgcG9zaXRpb24uICovXHJcblx0XHRcdFx0XHRwYXRoLnB1c2goMSArIGxhc3Rfc3RhdGUueCk7XHJcblx0XHRcdFx0XHR0aW1lX2xhcHNlZCArPSAxNjtcclxuXHRcdFx0XHRcdC8qIElmIHRoZSBjaGFuZ2UgdGhyZXNob2xkIGlzIHJlYWNoZWQsIGJyZWFrLiAqL1xyXG5cdFx0XHRcdFx0aWYgKCEoTWF0aC5hYnMobGFzdF9zdGF0ZS54KSA+IHRvbGVyYW5jZSAmJiBNYXRoLmFicyhsYXN0X3N0YXRlLnYpID4gdG9sZXJhbmNlKSkge1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qIElmIGR1cmF0aW9uIGlzIG5vdCBkZWZpbmVkLCByZXR1cm4gdGhlIGFjdHVhbCB0aW1lIHJlcXVpcmVkIGZvciBjb21wbGV0aW5nIHRoaXMgYW5pbWF0aW9uLiBPdGhlcndpc2UsIHJldHVybiBhIGNsb3N1cmUgdGhhdCBob2xkcyB0aGVcclxuXHRcdFx0XHQgY29tcHV0ZWQgcGF0aCBhbmQgcmV0dXJucyBhIHNuYXBzaG90IG9mIHRoZSBwb3NpdGlvbiBhY2NvcmRpbmcgdG8gYSBnaXZlbiBwZXJjZW50Q29tcGxldGUuICovXHJcblx0XHRcdFx0cmV0dXJuICFoYXZlX2R1cmF0aW9uID8gdGltZV9sYXBzZWQgOiBmdW5jdGlvbihwZXJjZW50Q29tcGxldGUpIHtcclxuXHRcdFx0XHRcdHJldHVybiBwYXRoWyAocGVyY2VudENvbXBsZXRlICogKHBhdGgubGVuZ3RoIC0gMSkpIHwgMCBdO1xyXG5cdFx0XHRcdH07XHJcblx0XHRcdH07XHJcblx0XHR9KCkpO1xyXG5cclxuXHRcdC8qIGpRdWVyeSBlYXNpbmdzLiAqL1xyXG5cdFx0VmVsb2NpdHkuRWFzaW5ncyA9IHtcclxuXHRcdFx0bGluZWFyOiBmdW5jdGlvbihwKSB7XHJcblx0XHRcdFx0cmV0dXJuIHA7XHJcblx0XHRcdH0sXHJcblx0XHRcdHN3aW5nOiBmdW5jdGlvbihwKSB7XHJcblx0XHRcdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKHAgKiBNYXRoLlBJKSAvIDI7XHJcblx0XHRcdH0sXHJcblx0XHRcdC8qIEJvbnVzIFwic3ByaW5nXCIgZWFzaW5nLCB3aGljaCBpcyBhIGxlc3MgZXhhZ2dlcmF0ZWQgdmVyc2lvbiBvZiBlYXNlSW5PdXRFbGFzdGljLiAqL1xyXG5cdFx0XHRzcHJpbmc6IGZ1bmN0aW9uKHApIHtcclxuXHRcdFx0XHRyZXR1cm4gMSAtIChNYXRoLmNvcyhwICogNC41ICogTWF0aC5QSSkgKiBNYXRoLmV4cCgtcCAqIDYpKTtcclxuXHRcdFx0fVxyXG5cdFx0fTtcclxuXHJcblx0XHQvKiBDU1MzIGFuZCBSb2JlcnQgUGVubmVyIGVhc2luZ3MuICovXHJcblx0XHQkLmVhY2goXHJcblx0XHRcdFx0W1xyXG5cdFx0XHRcdFx0W1wiZWFzZVwiLCBbMC4yNSwgMC4xLCAwLjI1LCAxLjBdXSxcclxuXHRcdFx0XHRcdFtcImVhc2UtaW5cIiwgWzAuNDIsIDAuMCwgMS4wMCwgMS4wXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlLW91dFwiLCBbMC4wMCwgMC4wLCAwLjU4LCAxLjBdXSxcclxuXHRcdFx0XHRcdFtcImVhc2UtaW4tb3V0XCIsIFswLjQyLCAwLjAsIDAuNTgsIDEuMF1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZUluU2luZVwiLCBbMC40NywgMCwgMC43NDUsIDAuNzE1XV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlT3V0U2luZVwiLCBbMC4zOSwgMC41NzUsIDAuNTY1LCAxXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5PdXRTaW5lXCIsIFswLjQ0NSwgMC4wNSwgMC41NSwgMC45NV1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZUluUXVhZFwiLCBbMC41NSwgMC4wODUsIDAuNjgsIDAuNTNdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VPdXRRdWFkXCIsIFswLjI1LCAwLjQ2LCAwLjQ1LCAwLjk0XV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5PdXRRdWFkXCIsIFswLjQ1NSwgMC4wMywgMC41MTUsIDAuOTU1XV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5DdWJpY1wiLCBbMC41NSwgMC4wNTUsIDAuNjc1LCAwLjE5XV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlT3V0Q3ViaWNcIiwgWzAuMjE1LCAwLjYxLCAwLjM1NSwgMV1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZUluT3V0Q3ViaWNcIiwgWzAuNjQ1LCAwLjA0NSwgMC4zNTUsIDFdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VJblF1YXJ0XCIsIFswLjg5NSwgMC4wMywgMC42ODUsIDAuMjJdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VPdXRRdWFydFwiLCBbMC4xNjUsIDAuODQsIDAuNDQsIDFdXSxcclxuXHRcdFx0XHRcdFtcImVhc2VJbk91dFF1YXJ0XCIsIFswLjc3LCAwLCAwLjE3NSwgMV1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZUluUXVpbnRcIiwgWzAuNzU1LCAwLjA1LCAwLjg1NSwgMC4wNl1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZU91dFF1aW50XCIsIFswLjIzLCAxLCAwLjMyLCAxXV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlSW5PdXRRdWludFwiLCBbMC44NiwgMCwgMC4wNywgMV1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZUluRXhwb1wiLCBbMC45NSwgMC4wNSwgMC43OTUsIDAuMDM1XV0sXHJcblx0XHRcdFx0XHRbXCJlYXNlT3V0RXhwb1wiLCBbMC4xOSwgMSwgMC4yMiwgMV1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZUluT3V0RXhwb1wiLCBbMSwgMCwgMCwgMV1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZUluQ2lyY1wiLCBbMC42LCAwLjA0LCAwLjk4LCAwLjMzNV1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZU91dENpcmNcIiwgWzAuMDc1LCAwLjgyLCAwLjE2NSwgMV1dLFxyXG5cdFx0XHRcdFx0W1wiZWFzZUluT3V0Q2lyY1wiLCBbMC43ODUsIDAuMTM1LCAwLjE1LCAwLjg2XV1cclxuXHRcdFx0XHRdLCBmdW5jdGlvbihpLCBlYXNpbmdBcnJheSkge1xyXG5cdFx0XHRWZWxvY2l0eS5FYXNpbmdzW2Vhc2luZ0FycmF5WzBdXSA9IGdlbmVyYXRlQmV6aWVyLmFwcGx5KG51bGwsIGVhc2luZ0FycmF5WzFdKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8qIERldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZWFzaW5nIHR5cGUgZ2l2ZW4gYW4gZWFzaW5nIGlucHV0LiAqL1xyXG5cdFx0ZnVuY3Rpb24gZ2V0RWFzaW5nKHZhbHVlLCBkdXJhdGlvbikge1xyXG5cdFx0XHR2YXIgZWFzaW5nID0gdmFsdWU7XHJcblxyXG5cdFx0XHQvKiBUaGUgZWFzaW5nIG9wdGlvbiBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nIHRoYXQgcmVmZXJlbmNlcyBhIHByZS1yZWdpc3RlcmVkIGVhc2luZyxcclxuXHRcdFx0IG9yIGl0IGNhbiBiZSBhIHR3by0vZm91ci1pdGVtIGFycmF5IG9mIGludGVnZXJzIHRvIGJlIGNvbnZlcnRlZCBpbnRvIGEgYmV6aWVyL3NwcmluZyBmdW5jdGlvbi4gKi9cclxuXHRcdFx0aWYgKFR5cGUuaXNTdHJpbmcodmFsdWUpKSB7XHJcblx0XHRcdFx0LyogRW5zdXJlIHRoYXQgdGhlIGVhc2luZyBoYXMgYmVlbiBhc3NpZ25lZCB0byBqUXVlcnkncyBWZWxvY2l0eS5FYXNpbmdzIG9iamVjdC4gKi9cclxuXHRcdFx0XHRpZiAoIVZlbG9jaXR5LkVhc2luZ3NbdmFsdWVdKSB7XHJcblx0XHRcdFx0XHRlYXNpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0gZWxzZSBpZiAoVHlwZS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDEpIHtcclxuXHRcdFx0XHRlYXNpbmcgPSBnZW5lcmF0ZVN0ZXAuYXBwbHkobnVsbCwgdmFsdWUpO1xyXG5cdFx0XHR9IGVsc2UgaWYgKFR5cGUuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoID09PSAyKSB7XHJcblx0XHRcdFx0Lyogc3ByaW5nUks0IG11c3QgYmUgcGFzc2VkIHRoZSBhbmltYXRpb24ncyBkdXJhdGlvbi4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBJZiB0aGUgc3ByaW5nUks0IGFycmF5IGNvbnRhaW5zIG5vbi1udW1iZXJzLCBnZW5lcmF0ZVNwcmluZ1JLNCgpIHJldHVybnMgYW4gZWFzaW5nXHJcblx0XHRcdFx0IGZ1bmN0aW9uIGdlbmVyYXRlZCB3aXRoIGRlZmF1bHQgdGVuc2lvbiBhbmQgZnJpY3Rpb24gdmFsdWVzLiAqL1xyXG5cdFx0XHRcdGVhc2luZyA9IGdlbmVyYXRlU3ByaW5nUks0LmFwcGx5KG51bGwsIHZhbHVlLmNvbmNhdChbZHVyYXRpb25dKSk7XHJcblx0XHRcdH0gZWxzZSBpZiAoVHlwZS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDQpIHtcclxuXHRcdFx0XHQvKiBOb3RlOiBJZiB0aGUgYmV6aWVyIGFycmF5IGNvbnRhaW5zIG5vbi1udW1iZXJzLCBnZW5lcmF0ZUJlemllcigpIHJldHVybnMgZmFsc2UuICovXHJcblx0XHRcdFx0ZWFzaW5nID0gZ2VuZXJhdGVCZXppZXIuYXBwbHkobnVsbCwgdmFsdWUpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGVhc2luZyA9IGZhbHNlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBSZXZlcnQgdG8gdGhlIFZlbG9jaXR5LXdpZGUgZGVmYXVsdCBlYXNpbmcgdHlwZSwgb3IgZmFsbCBiYWNrIHRvIFwic3dpbmdcIiAod2hpY2ggaXMgYWxzbyBqUXVlcnkncyBkZWZhdWx0KVxyXG5cdFx0XHQgaWYgdGhlIFZlbG9jaXR5LXdpZGUgZGVmYXVsdCBoYXMgYmVlbiBpbmNvcnJlY3RseSBtb2RpZmllZC4gKi9cclxuXHRcdFx0aWYgKGVhc2luZyA9PT0gZmFsc2UpIHtcclxuXHRcdFx0XHRpZiAoVmVsb2NpdHkuRWFzaW5nc1tWZWxvY2l0eS5kZWZhdWx0cy5lYXNpbmddKSB7XHJcblx0XHRcdFx0XHRlYXNpbmcgPSBWZWxvY2l0eS5kZWZhdWx0cy5lYXNpbmc7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdGVhc2luZyA9IEVBU0lOR19ERUZBVUxUO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0cmV0dXJuIGVhc2luZztcclxuXHRcdH1cclxuXHJcblx0XHQvKioqKioqKioqKioqKioqKipcclxuXHRcdCBDU1MgU3RhY2tcclxuXHRcdCAqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHQvKiBUaGUgQ1NTIG9iamVjdCBpcyBhIGhpZ2hseSBjb25kZW5zZWQgYW5kIHBlcmZvcm1hbnQgQ1NTIHN0YWNrIHRoYXQgZnVsbHkgcmVwbGFjZXMgalF1ZXJ5J3MuXHJcblx0XHQgSXQgaGFuZGxlcyB0aGUgdmFsaWRhdGlvbiwgZ2V0dGluZywgYW5kIHNldHRpbmcgb2YgYm90aCBzdGFuZGFyZCBDU1MgcHJvcGVydGllcyBhbmQgQ1NTIHByb3BlcnR5IGhvb2tzLiAqL1xyXG5cdFx0LyogTm90ZTogQSBcIkNTU1wiIHNob3J0aGFuZCBpcyBhbGlhc2VkIHNvIHRoYXQgb3VyIGNvZGUgaXMgZWFzaWVyIHRvIHJlYWQuICovXHJcblx0XHR2YXIgQ1NTID0gVmVsb2NpdHkuQ1NTID0ge1xyXG5cdFx0XHQvKioqKioqKioqKioqKlxyXG5cdFx0XHQgUmVnRXhcclxuXHRcdFx0ICoqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRSZWdFeDoge1xyXG5cdFx0XHRcdGlzSGV4OiAvXiMoW0EtZlxcZF17M30pezEsMn0kL2ksXHJcblx0XHRcdFx0LyogVW53cmFwIGEgcHJvcGVydHkgdmFsdWUncyBzdXJyb3VuZGluZyB0ZXh0LCBlLmcuIFwicmdiYSg0LCAzLCAyLCAxKVwiID09PiBcIjQsIDMsIDIsIDFcIiBhbmQgXCJyZWN0KDRweCAzcHggMnB4IDFweClcIiA9PT4gXCI0cHggM3B4IDJweCAxcHhcIi4gKi9cclxuXHRcdFx0XHR2YWx1ZVVud3JhcDogL15bQS16XStcXCgoLiopXFwpJC9pLFxyXG5cdFx0XHRcdHdyYXBwZWRWYWx1ZUFscmVhZHlFeHRyYWN0ZWQ6IC9bMC05Ll0rIFswLTkuXSsgWzAtOS5dKyggWzAtOS5dKyk/LyxcclxuXHRcdFx0XHQvKiBTcGxpdCBhIG11bHRpLXZhbHVlIHByb3BlcnR5IGludG8gYW4gYXJyYXkgb2Ygc3VidmFsdWVzLCBlLmcuIFwicmdiYSg0LCAzLCAyLCAxKSA0cHggM3B4IDJweCAxcHhcIiA9PT4gWyBcInJnYmEoNCwgMywgMiwgMSlcIiwgXCI0cHhcIiwgXCIzcHhcIiwgXCIycHhcIiwgXCIxcHhcIiBdLiAqL1xyXG5cdFx0XHRcdHZhbHVlU3BsaXQ6IC8oW0Etel0rXFwoLitcXCkpfCgoW0EtejAtOSMtLl0rPykoPz1cXHN8JCkpL2lnXHJcblx0XHRcdH0sXHJcblx0XHRcdC8qKioqKioqKioqKipcclxuXHRcdFx0IExpc3RzXHJcblx0XHRcdCAqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRMaXN0czoge1xyXG5cdFx0XHRcdGNvbG9yczogW1wiZmlsbFwiLCBcInN0cm9rZVwiLCBcInN0b3BDb2xvclwiLCBcImNvbG9yXCIsIFwiYmFja2dyb3VuZENvbG9yXCIsIFwiYm9yZGVyQ29sb3JcIiwgXCJib3JkZXJUb3BDb2xvclwiLCBcImJvcmRlclJpZ2h0Q29sb3JcIiwgXCJib3JkZXJCb3R0b21Db2xvclwiLCBcImJvcmRlckxlZnRDb2xvclwiLCBcIm91dGxpbmVDb2xvclwiXSxcclxuXHRcdFx0XHR0cmFuc2Zvcm1zQmFzZTogW1widHJhbnNsYXRlWFwiLCBcInRyYW5zbGF0ZVlcIiwgXCJzY2FsZVwiLCBcInNjYWxlWFwiLCBcInNjYWxlWVwiLCBcInNrZXdYXCIsIFwic2tld1lcIiwgXCJyb3RhdGVaXCJdLFxyXG5cdFx0XHRcdHRyYW5zZm9ybXMzRDogW1widHJhbnNmb3JtUGVyc3BlY3RpdmVcIiwgXCJ0cmFuc2xhdGVaXCIsIFwic2NhbGVaXCIsIFwicm90YXRlWFwiLCBcInJvdGF0ZVlcIl0sXHJcblx0XHRcdFx0dW5pdHM6IFtcclxuXHRcdFx0XHRcdFwiJVwiLCAvLyByZWxhdGl2ZVxyXG5cdFx0XHRcdFx0XCJlbVwiLCBcImV4XCIsIFwiY2hcIiwgXCJyZW1cIiwgLy8gZm9udCByZWxhdGl2ZVxyXG5cdFx0XHRcdFx0XCJ2d1wiLCBcInZoXCIsIFwidm1pblwiLCBcInZtYXhcIiwgLy8gdmlld3BvcnQgcmVsYXRpdmVcclxuXHRcdFx0XHRcdFwiY21cIiwgXCJtbVwiLCBcIlFcIiwgXCJpblwiLCBcInBjXCIsIFwicHRcIiwgXCJweFwiLCAvLyBhYnNvbHV0ZSBsZW5ndGhzXHJcblx0XHRcdFx0XHRcImRlZ1wiLCBcImdyYWRcIiwgXCJyYWRcIiwgXCJ0dXJuXCIsIC8vIGFuZ2xlc1xyXG5cdFx0XHRcdFx0XCJzXCIsIFwibXNcIiAvLyB0aW1lXHJcblx0XHRcdFx0XSxcclxuXHRcdFx0XHRjb2xvck5hbWVzOiB7XHJcblx0XHRcdFx0XHRcImFsaWNlYmx1ZVwiOiBcIjI0MCwyNDgsMjU1XCIsXHJcblx0XHRcdFx0XHRcImFudGlxdWV3aGl0ZVwiOiBcIjI1MCwyMzUsMjE1XCIsXHJcblx0XHRcdFx0XHRcImFxdWFtYXJpbmVcIjogXCIxMjcsMjU1LDIxMlwiLFxyXG5cdFx0XHRcdFx0XCJhcXVhXCI6IFwiMCwyNTUsMjU1XCIsXHJcblx0XHRcdFx0XHRcImF6dXJlXCI6IFwiMjQwLDI1NSwyNTVcIixcclxuXHRcdFx0XHRcdFwiYmVpZ2VcIjogXCIyNDUsMjQ1LDIyMFwiLFxyXG5cdFx0XHRcdFx0XCJiaXNxdWVcIjogXCIyNTUsMjI4LDE5NlwiLFxyXG5cdFx0XHRcdFx0XCJibGFja1wiOiBcIjAsMCwwXCIsXHJcblx0XHRcdFx0XHRcImJsYW5jaGVkYWxtb25kXCI6IFwiMjU1LDIzNSwyMDVcIixcclxuXHRcdFx0XHRcdFwiYmx1ZXZpb2xldFwiOiBcIjEzOCw0MywyMjZcIixcclxuXHRcdFx0XHRcdFwiYmx1ZVwiOiBcIjAsMCwyNTVcIixcclxuXHRcdFx0XHRcdFwiYnJvd25cIjogXCIxNjUsNDIsNDJcIixcclxuXHRcdFx0XHRcdFwiYnVybHl3b29kXCI6IFwiMjIyLDE4NCwxMzVcIixcclxuXHRcdFx0XHRcdFwiY2FkZXRibHVlXCI6IFwiOTUsMTU4LDE2MFwiLFxyXG5cdFx0XHRcdFx0XCJjaGFydHJldXNlXCI6IFwiMTI3LDI1NSwwXCIsXHJcblx0XHRcdFx0XHRcImNob2NvbGF0ZVwiOiBcIjIxMCwxMDUsMzBcIixcclxuXHRcdFx0XHRcdFwiY29yYWxcIjogXCIyNTUsMTI3LDgwXCIsXHJcblx0XHRcdFx0XHRcImNvcm5mbG93ZXJibHVlXCI6IFwiMTAwLDE0OSwyMzdcIixcclxuXHRcdFx0XHRcdFwiY29ybnNpbGtcIjogXCIyNTUsMjQ4LDIyMFwiLFxyXG5cdFx0XHRcdFx0XCJjcmltc29uXCI6IFwiMjIwLDIwLDYwXCIsXHJcblx0XHRcdFx0XHRcImN5YW5cIjogXCIwLDI1NSwyNTVcIixcclxuXHRcdFx0XHRcdFwiZGFya2JsdWVcIjogXCIwLDAsMTM5XCIsXHJcblx0XHRcdFx0XHRcImRhcmtjeWFuXCI6IFwiMCwxMzksMTM5XCIsXHJcblx0XHRcdFx0XHRcImRhcmtnb2xkZW5yb2RcIjogXCIxODQsMTM0LDExXCIsXHJcblx0XHRcdFx0XHRcImRhcmtncmF5XCI6IFwiMTY5LDE2OSwxNjlcIixcclxuXHRcdFx0XHRcdFwiZGFya2dyZXlcIjogXCIxNjksMTY5LDE2OVwiLFxyXG5cdFx0XHRcdFx0XCJkYXJrZ3JlZW5cIjogXCIwLDEwMCwwXCIsXHJcblx0XHRcdFx0XHRcImRhcmtraGFraVwiOiBcIjE4OSwxODMsMTA3XCIsXHJcblx0XHRcdFx0XHRcImRhcmttYWdlbnRhXCI6IFwiMTM5LDAsMTM5XCIsXHJcblx0XHRcdFx0XHRcImRhcmtvbGl2ZWdyZWVuXCI6IFwiODUsMTA3LDQ3XCIsXHJcblx0XHRcdFx0XHRcImRhcmtvcmFuZ2VcIjogXCIyNTUsMTQwLDBcIixcclxuXHRcdFx0XHRcdFwiZGFya29yY2hpZFwiOiBcIjE1Myw1MCwyMDRcIixcclxuXHRcdFx0XHRcdFwiZGFya3JlZFwiOiBcIjEzOSwwLDBcIixcclxuXHRcdFx0XHRcdFwiZGFya3NhbG1vblwiOiBcIjIzMywxNTAsMTIyXCIsXHJcblx0XHRcdFx0XHRcImRhcmtzZWFncmVlblwiOiBcIjE0MywxODgsMTQzXCIsXHJcblx0XHRcdFx0XHRcImRhcmtzbGF0ZWJsdWVcIjogXCI3Miw2MSwxMzlcIixcclxuXHRcdFx0XHRcdFwiZGFya3NsYXRlZ3JheVwiOiBcIjQ3LDc5LDc5XCIsXHJcblx0XHRcdFx0XHRcImRhcmt0dXJxdW9pc2VcIjogXCIwLDIwNiwyMDlcIixcclxuXHRcdFx0XHRcdFwiZGFya3Zpb2xldFwiOiBcIjE0OCwwLDIxMVwiLFxyXG5cdFx0XHRcdFx0XCJkZWVwcGlua1wiOiBcIjI1NSwyMCwxNDdcIixcclxuXHRcdFx0XHRcdFwiZGVlcHNreWJsdWVcIjogXCIwLDE5MSwyNTVcIixcclxuXHRcdFx0XHRcdFwiZGltZ3JheVwiOiBcIjEwNSwxMDUsMTA1XCIsXHJcblx0XHRcdFx0XHRcImRpbWdyZXlcIjogXCIxMDUsMTA1LDEwNVwiLFxyXG5cdFx0XHRcdFx0XCJkb2RnZXJibHVlXCI6IFwiMzAsMTQ0LDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJmaXJlYnJpY2tcIjogXCIxNzgsMzQsMzRcIixcclxuXHRcdFx0XHRcdFwiZmxvcmFsd2hpdGVcIjogXCIyNTUsMjUwLDI0MFwiLFxyXG5cdFx0XHRcdFx0XCJmb3Jlc3RncmVlblwiOiBcIjM0LDEzOSwzNFwiLFxyXG5cdFx0XHRcdFx0XCJmdWNoc2lhXCI6IFwiMjU1LDAsMjU1XCIsXHJcblx0XHRcdFx0XHRcImdhaW5zYm9yb1wiOiBcIjIyMCwyMjAsMjIwXCIsXHJcblx0XHRcdFx0XHRcImdob3N0d2hpdGVcIjogXCIyNDgsMjQ4LDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJnb2xkXCI6IFwiMjU1LDIxNSwwXCIsXHJcblx0XHRcdFx0XHRcImdvbGRlbnJvZFwiOiBcIjIxOCwxNjUsMzJcIixcclxuXHRcdFx0XHRcdFwiZ3JheVwiOiBcIjEyOCwxMjgsMTI4XCIsXHJcblx0XHRcdFx0XHRcImdyZXlcIjogXCIxMjgsMTI4LDEyOFwiLFxyXG5cdFx0XHRcdFx0XCJncmVlbnllbGxvd1wiOiBcIjE3MywyNTUsNDdcIixcclxuXHRcdFx0XHRcdFwiZ3JlZW5cIjogXCIwLDEyOCwwXCIsXHJcblx0XHRcdFx0XHRcImhvbmV5ZGV3XCI6IFwiMjQwLDI1NSwyNDBcIixcclxuXHRcdFx0XHRcdFwiaG90cGlua1wiOiBcIjI1NSwxMDUsMTgwXCIsXHJcblx0XHRcdFx0XHRcImluZGlhbnJlZFwiOiBcIjIwNSw5Miw5MlwiLFxyXG5cdFx0XHRcdFx0XCJpbmRpZ29cIjogXCI3NSwwLDEzMFwiLFxyXG5cdFx0XHRcdFx0XCJpdm9yeVwiOiBcIjI1NSwyNTUsMjQwXCIsXHJcblx0XHRcdFx0XHRcImtoYWtpXCI6IFwiMjQwLDIzMCwxNDBcIixcclxuXHRcdFx0XHRcdFwibGF2ZW5kZXJibHVzaFwiOiBcIjI1NSwyNDAsMjQ1XCIsXHJcblx0XHRcdFx0XHRcImxhdmVuZGVyXCI6IFwiMjMwLDIzMCwyNTBcIixcclxuXHRcdFx0XHRcdFwibGF3bmdyZWVuXCI6IFwiMTI0LDI1MiwwXCIsXHJcblx0XHRcdFx0XHRcImxlbW9uY2hpZmZvblwiOiBcIjI1NSwyNTAsMjA1XCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0Ymx1ZVwiOiBcIjE3MywyMTYsMjMwXCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0Y29yYWxcIjogXCIyNDAsMTI4LDEyOFwiLFxyXG5cdFx0XHRcdFx0XCJsaWdodGN5YW5cIjogXCIyMjQsMjU1LDI1NVwiLFxyXG5cdFx0XHRcdFx0XCJsaWdodGdvbGRlbnJvZHllbGxvd1wiOiBcIjI1MCwyNTAsMjEwXCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0Z3JheVwiOiBcIjIxMSwyMTEsMjExXCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0Z3JleVwiOiBcIjIxMSwyMTEsMjExXCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0Z3JlZW5cIjogXCIxNDQsMjM4LDE0NFwiLFxyXG5cdFx0XHRcdFx0XCJsaWdodHBpbmtcIjogXCIyNTUsMTgyLDE5M1wiLFxyXG5cdFx0XHRcdFx0XCJsaWdodHNhbG1vblwiOiBcIjI1NSwxNjAsMTIyXCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0c2VhZ3JlZW5cIjogXCIzMiwxNzgsMTcwXCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0c2t5Ymx1ZVwiOiBcIjEzNSwyMDYsMjUwXCIsXHJcblx0XHRcdFx0XHRcImxpZ2h0c2xhdGVncmF5XCI6IFwiMTE5LDEzNiwxNTNcIixcclxuXHRcdFx0XHRcdFwibGlnaHRzdGVlbGJsdWVcIjogXCIxNzYsMTk2LDIyMlwiLFxyXG5cdFx0XHRcdFx0XCJsaWdodHllbGxvd1wiOiBcIjI1NSwyNTUsMjI0XCIsXHJcblx0XHRcdFx0XHRcImxpbWVncmVlblwiOiBcIjUwLDIwNSw1MFwiLFxyXG5cdFx0XHRcdFx0XCJsaW1lXCI6IFwiMCwyNTUsMFwiLFxyXG5cdFx0XHRcdFx0XCJsaW5lblwiOiBcIjI1MCwyNDAsMjMwXCIsXHJcblx0XHRcdFx0XHRcIm1hZ2VudGFcIjogXCIyNTUsMCwyNTVcIixcclxuXHRcdFx0XHRcdFwibWFyb29uXCI6IFwiMTI4LDAsMFwiLFxyXG5cdFx0XHRcdFx0XCJtZWRpdW1hcXVhbWFyaW5lXCI6IFwiMTAyLDIwNSwxNzBcIixcclxuXHRcdFx0XHRcdFwibWVkaXVtYmx1ZVwiOiBcIjAsMCwyMDVcIixcclxuXHRcdFx0XHRcdFwibWVkaXVtb3JjaGlkXCI6IFwiMTg2LDg1LDIxMVwiLFxyXG5cdFx0XHRcdFx0XCJtZWRpdW1wdXJwbGVcIjogXCIxNDcsMTEyLDIxOVwiLFxyXG5cdFx0XHRcdFx0XCJtZWRpdW1zZWFncmVlblwiOiBcIjYwLDE3OSwxMTNcIixcclxuXHRcdFx0XHRcdFwibWVkaXVtc2xhdGVibHVlXCI6IFwiMTIzLDEwNCwyMzhcIixcclxuXHRcdFx0XHRcdFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogXCIwLDI1MCwxNTRcIixcclxuXHRcdFx0XHRcdFwibWVkaXVtdHVycXVvaXNlXCI6IFwiNzIsMjA5LDIwNFwiLFxyXG5cdFx0XHRcdFx0XCJtZWRpdW12aW9sZXRyZWRcIjogXCIxOTksMjEsMTMzXCIsXHJcblx0XHRcdFx0XHRcIm1pZG5pZ2h0Ymx1ZVwiOiBcIjI1LDI1LDExMlwiLFxyXG5cdFx0XHRcdFx0XCJtaW50Y3JlYW1cIjogXCIyNDUsMjU1LDI1MFwiLFxyXG5cdFx0XHRcdFx0XCJtaXN0eXJvc2VcIjogXCIyNTUsMjI4LDIyNVwiLFxyXG5cdFx0XHRcdFx0XCJtb2NjYXNpblwiOiBcIjI1NSwyMjgsMTgxXCIsXHJcblx0XHRcdFx0XHRcIm5hdmFqb3doaXRlXCI6IFwiMjU1LDIyMiwxNzNcIixcclxuXHRcdFx0XHRcdFwibmF2eVwiOiBcIjAsMCwxMjhcIixcclxuXHRcdFx0XHRcdFwib2xkbGFjZVwiOiBcIjI1MywyNDUsMjMwXCIsXHJcblx0XHRcdFx0XHRcIm9saXZlZHJhYlwiOiBcIjEwNywxNDIsMzVcIixcclxuXHRcdFx0XHRcdFwib2xpdmVcIjogXCIxMjgsMTI4LDBcIixcclxuXHRcdFx0XHRcdFwib3JhbmdlcmVkXCI6IFwiMjU1LDY5LDBcIixcclxuXHRcdFx0XHRcdFwib3JhbmdlXCI6IFwiMjU1LDE2NSwwXCIsXHJcblx0XHRcdFx0XHRcIm9yY2hpZFwiOiBcIjIxOCwxMTIsMjE0XCIsXHJcblx0XHRcdFx0XHRcInBhbGVnb2xkZW5yb2RcIjogXCIyMzgsMjMyLDE3MFwiLFxyXG5cdFx0XHRcdFx0XCJwYWxlZ3JlZW5cIjogXCIxNTIsMjUxLDE1MlwiLFxyXG5cdFx0XHRcdFx0XCJwYWxldHVycXVvaXNlXCI6IFwiMTc1LDIzOCwyMzhcIixcclxuXHRcdFx0XHRcdFwicGFsZXZpb2xldHJlZFwiOiBcIjIxOSwxMTIsMTQ3XCIsXHJcblx0XHRcdFx0XHRcInBhcGF5YXdoaXBcIjogXCIyNTUsMjM5LDIxM1wiLFxyXG5cdFx0XHRcdFx0XCJwZWFjaHB1ZmZcIjogXCIyNTUsMjE4LDE4NVwiLFxyXG5cdFx0XHRcdFx0XCJwZXJ1XCI6IFwiMjA1LDEzMyw2M1wiLFxyXG5cdFx0XHRcdFx0XCJwaW5rXCI6IFwiMjU1LDE5MiwyMDNcIixcclxuXHRcdFx0XHRcdFwicGx1bVwiOiBcIjIyMSwxNjAsMjIxXCIsXHJcblx0XHRcdFx0XHRcInBvd2RlcmJsdWVcIjogXCIxNzYsMjI0LDIzMFwiLFxyXG5cdFx0XHRcdFx0XCJwdXJwbGVcIjogXCIxMjgsMCwxMjhcIixcclxuXHRcdFx0XHRcdFwicmVkXCI6IFwiMjU1LDAsMFwiLFxyXG5cdFx0XHRcdFx0XCJyb3N5YnJvd25cIjogXCIxODgsMTQzLDE0M1wiLFxyXG5cdFx0XHRcdFx0XCJyb3lhbGJsdWVcIjogXCI2NSwxMDUsMjI1XCIsXHJcblx0XHRcdFx0XHRcInNhZGRsZWJyb3duXCI6IFwiMTM5LDY5LDE5XCIsXHJcblx0XHRcdFx0XHRcInNhbG1vblwiOiBcIjI1MCwxMjgsMTE0XCIsXHJcblx0XHRcdFx0XHRcInNhbmR5YnJvd25cIjogXCIyNDQsMTY0LDk2XCIsXHJcblx0XHRcdFx0XHRcInNlYWdyZWVuXCI6IFwiNDYsMTM5LDg3XCIsXHJcblx0XHRcdFx0XHRcInNlYXNoZWxsXCI6IFwiMjU1LDI0NSwyMzhcIixcclxuXHRcdFx0XHRcdFwic2llbm5hXCI6IFwiMTYwLDgyLDQ1XCIsXHJcblx0XHRcdFx0XHRcInNpbHZlclwiOiBcIjE5MiwxOTIsMTkyXCIsXHJcblx0XHRcdFx0XHRcInNreWJsdWVcIjogXCIxMzUsMjA2LDIzNVwiLFxyXG5cdFx0XHRcdFx0XCJzbGF0ZWJsdWVcIjogXCIxMDYsOTAsMjA1XCIsXHJcblx0XHRcdFx0XHRcInNsYXRlZ3JheVwiOiBcIjExMiwxMjgsMTQ0XCIsXHJcblx0XHRcdFx0XHRcInNub3dcIjogXCIyNTUsMjUwLDI1MFwiLFxyXG5cdFx0XHRcdFx0XCJzcHJpbmdncmVlblwiOiBcIjAsMjU1LDEyN1wiLFxyXG5cdFx0XHRcdFx0XCJzdGVlbGJsdWVcIjogXCI3MCwxMzAsMTgwXCIsXHJcblx0XHRcdFx0XHRcInRhblwiOiBcIjIxMCwxODAsMTQwXCIsXHJcblx0XHRcdFx0XHRcInRlYWxcIjogXCIwLDEyOCwxMjhcIixcclxuXHRcdFx0XHRcdFwidGhpc3RsZVwiOiBcIjIxNiwxOTEsMjE2XCIsXHJcblx0XHRcdFx0XHRcInRvbWF0b1wiOiBcIjI1NSw5OSw3MVwiLFxyXG5cdFx0XHRcdFx0XCJ0dXJxdW9pc2VcIjogXCI2NCwyMjQsMjA4XCIsXHJcblx0XHRcdFx0XHRcInZpb2xldFwiOiBcIjIzOCwxMzAsMjM4XCIsXHJcblx0XHRcdFx0XHRcIndoZWF0XCI6IFwiMjQ1LDIyMiwxNzlcIixcclxuXHRcdFx0XHRcdFwid2hpdGVzbW9rZVwiOiBcIjI0NSwyNDUsMjQ1XCIsXHJcblx0XHRcdFx0XHRcIndoaXRlXCI6IFwiMjU1LDI1NSwyNTVcIixcclxuXHRcdFx0XHRcdFwieWVsbG93Z3JlZW5cIjogXCIxNTQsMjA1LDUwXCIsXHJcblx0XHRcdFx0XHRcInllbGxvd1wiOiBcIjI1NSwyNTUsMFwiXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKioqKioqKioqKioqXHJcblx0XHRcdCBIb29rc1xyXG5cdFx0XHQgKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogSG9va3MgYWxsb3cgYSBzdWJwcm9wZXJ0eSAoZS5nLiBcImJveFNoYWRvd0JsdXJcIikgb2YgYSBjb21wb3VuZC12YWx1ZSBDU1MgcHJvcGVydHlcclxuXHRcdFx0IChlLmcuIFwiYm94U2hhZG93OiBYIFkgQmx1ciBTcHJlYWQgQ29sb3JcIikgdG8gYmUgYW5pbWF0ZWQgYXMgaWYgaXQgd2VyZSBhIGRpc2NyZXRlIHByb3BlcnR5LiAqL1xyXG5cdFx0XHQvKiBOb3RlOiBCZXlvbmQgZW5hYmxpbmcgZmluZS1ncmFpbmVkIHByb3BlcnR5IGFuaW1hdGlvbiwgaG9va2luZyBpcyBuZWNlc3Nhcnkgc2luY2UgVmVsb2NpdHkgb25seVxyXG5cdFx0XHQgdHdlZW5zIHByb3BlcnRpZXMgd2l0aCBzaW5nbGUgbnVtZXJpYyB2YWx1ZXM7IHVubGlrZSBDU1MgdHJhbnNpdGlvbnMsIFZlbG9jaXR5IGRvZXMgbm90IGludGVycG9sYXRlIGNvbXBvdW5kLXZhbHVlcy4gKi9cclxuXHRcdFx0SG9va3M6IHtcclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgUmVnaXN0cmF0aW9uXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHQvKiBUZW1wbGF0ZXMgYXJlIGEgY29uY2lzZSB3YXkgb2YgaW5kaWNhdGluZyB3aGljaCBzdWJwcm9wZXJ0aWVzIG11c3QgYmUgaW5kaXZpZHVhbGx5IHJlZ2lzdGVyZWQgZm9yIGVhY2ggY29tcG91bmQtdmFsdWUgQ1NTIHByb3BlcnR5LiAqL1xyXG5cdFx0XHRcdC8qIEVhY2ggdGVtcGxhdGUgY29uc2lzdHMgb2YgdGhlIGNvbXBvdW5kLXZhbHVlJ3MgYmFzZSBuYW1lLCBpdHMgY29uc3RpdHVlbnQgc3VicHJvcGVydHkgbmFtZXMsIGFuZCB0aG9zZSBzdWJwcm9wZXJ0aWVzJyBkZWZhdWx0IHZhbHVlcy4gKi9cclxuXHRcdFx0XHR0ZW1wbGF0ZXM6IHtcclxuXHRcdFx0XHRcdFwidGV4dFNoYWRvd1wiOiBbXCJDb2xvciBYIFkgQmx1clwiLCBcImJsYWNrIDBweCAwcHggMHB4XCJdLFxyXG5cdFx0XHRcdFx0XCJib3hTaGFkb3dcIjogW1wiQ29sb3IgWCBZIEJsdXIgU3ByZWFkXCIsIFwiYmxhY2sgMHB4IDBweCAwcHggMHB4XCJdLFxyXG5cdFx0XHRcdFx0XCJjbGlwXCI6IFtcIlRvcCBSaWdodCBCb3R0b20gTGVmdFwiLCBcIjBweCAwcHggMHB4IDBweFwiXSxcclxuXHRcdFx0XHRcdFwiYmFja2dyb3VuZFBvc2l0aW9uXCI6IFtcIlggWVwiLCBcIjAlIDAlXCJdLFxyXG5cdFx0XHRcdFx0XCJ0cmFuc2Zvcm1PcmlnaW5cIjogW1wiWCBZIFpcIiwgXCI1MCUgNTAlIDBweFwiXSxcclxuXHRcdFx0XHRcdFwicGVyc3BlY3RpdmVPcmlnaW5cIjogW1wiWCBZXCIsIFwiNTAlIDUwJVwiXVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0LyogQSBcInJlZ2lzdGVyZWRcIiBob29rIGlzIG9uZSB0aGF0IGhhcyBiZWVuIGNvbnZlcnRlZCBmcm9tIGl0cyB0ZW1wbGF0ZSBmb3JtIGludG8gYSBsaXZlLFxyXG5cdFx0XHRcdCB0d2VlbmFibGUgcHJvcGVydHkuIEl0IGNvbnRhaW5zIGRhdGEgdG8gYXNzb2NpYXRlIGl0IHdpdGggaXRzIHJvb3QgcHJvcGVydHkuICovXHJcblx0XHRcdFx0cmVnaXN0ZXJlZDoge1xyXG5cdFx0XHRcdFx0LyogTm90ZTogQSByZWdpc3RlcmVkIGhvb2sgbG9va3MgbGlrZSB0aGlzID09PiB0ZXh0U2hhZG93Qmx1cjogWyBcInRleHRTaGFkb3dcIiwgMyBdLFxyXG5cdFx0XHRcdFx0IHdoaWNoIGNvbnNpc3RzIG9mIHRoZSBzdWJwcm9wZXJ0eSdzIG5hbWUsIHRoZSBhc3NvY2lhdGVkIHJvb3QgcHJvcGVydHkncyBuYW1lLFxyXG5cdFx0XHRcdFx0IGFuZCB0aGUgc3VicHJvcGVydHkncyBwb3NpdGlvbiBpbiB0aGUgcm9vdCdzIHZhbHVlLiAqL1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0LyogQ29udmVydCB0aGUgdGVtcGxhdGVzIGludG8gaW5kaXZpZHVhbCBob29rcyB0aGVuIGFwcGVuZCB0aGVtIHRvIHRoZSByZWdpc3RlcmVkIG9iamVjdCBhYm92ZS4gKi9cclxuXHRcdFx0XHRyZWdpc3RlcjogZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHQvKiBDb2xvciBob29rcyByZWdpc3RyYXRpb246IENvbG9ycyBhcmUgZGVmYXVsdGVkIHRvIHdoaXRlIC0tIGFzIG9wcG9zZWQgdG8gYmxhY2sgLS0gc2luY2UgY29sb3JzIHRoYXQgYXJlXHJcblx0XHRcdFx0XHQgY3VycmVudGx5IHNldCB0byBcInRyYW5zcGFyZW50XCIgZGVmYXVsdCB0byB0aGVpciByZXNwZWN0aXZlIHRlbXBsYXRlIGJlbG93IHdoZW4gY29sb3ItYW5pbWF0ZWQsXHJcblx0XHRcdFx0XHQgYW5kIHdoaXRlIGlzIHR5cGljYWxseSBhIGNsb3NlciBtYXRjaCB0byB0cmFuc3BhcmVudCB0aGFuIGJsYWNrIGlzLiBBbiBleGNlcHRpb24gaXMgbWFkZSBmb3IgdGV4dCAoXCJjb2xvclwiKSxcclxuXHRcdFx0XHRcdCB3aGljaCBpcyBhbG1vc3QgYWx3YXlzIHNldCBjbG9zZXIgdG8gYmxhY2sgdGhhbiB3aGl0ZS4gKi9cclxuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgQ1NTLkxpc3RzLmNvbG9ycy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0XHR2YXIgcmdiQ29tcG9uZW50cyA9IChDU1MuTGlzdHMuY29sb3JzW2ldID09PSBcImNvbG9yXCIpID8gXCIwIDAgMCAxXCIgOiBcIjI1NSAyNTUgMjU1IDFcIjtcclxuXHRcdFx0XHRcdFx0Q1NTLkhvb2tzLnRlbXBsYXRlc1tDU1MuTGlzdHMuY29sb3JzW2ldXSA9IFtcIlJlZCBHcmVlbiBCbHVlIEFscGhhXCIsIHJnYkNvbXBvbmVudHNdO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHZhciByb290UHJvcGVydHksXHJcblx0XHRcdFx0XHRcdFx0aG9va1RlbXBsYXRlLFxyXG5cdFx0XHRcdFx0XHRcdGhvb2tOYW1lcztcclxuXHJcblx0XHRcdFx0XHQvKiBJbiBJRSwgY29sb3IgdmFsdWVzIGluc2lkZSBjb21wb3VuZC12YWx1ZSBwcm9wZXJ0aWVzIGFyZSBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgdGhlIHZhbHVlIGluc3RlYWQgb2YgYXQgdGhlIGJlZ2lubmluZy5cclxuXHRcdFx0XHRcdCBUaHVzLCB3ZSByZS1hcnJhbmdlIHRoZSB0ZW1wbGF0ZXMgYWNjb3JkaW5nbHkuICovXHJcblx0XHRcdFx0XHRpZiAoSUUpIHtcclxuXHRcdFx0XHRcdFx0Zm9yIChyb290UHJvcGVydHkgaW4gQ1NTLkhvb2tzLnRlbXBsYXRlcykge1xyXG5cdFx0XHRcdFx0XHRcdGlmICghQ1NTLkhvb2tzLnRlbXBsYXRlcy5oYXNPd25Qcm9wZXJ0eShyb290UHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0aG9va1RlbXBsYXRlID0gQ1NTLkhvb2tzLnRlbXBsYXRlc1tyb290UHJvcGVydHldO1xyXG5cdFx0XHRcdFx0XHRcdGhvb2tOYW1lcyA9IGhvb2tUZW1wbGF0ZVswXS5zcGxpdChcIiBcIik7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHZhciBkZWZhdWx0VmFsdWVzID0gaG9va1RlbXBsYXRlWzFdLm1hdGNoKENTUy5SZWdFeC52YWx1ZVNwbGl0KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKGhvb2tOYW1lc1swXSA9PT0gXCJDb2xvclwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBSZXBvc2l0aW9uIGJvdGggdGhlIGhvb2sncyBuYW1lIGFuZCBpdHMgZGVmYXVsdCB2YWx1ZSB0byB0aGUgZW5kIG9mIHRoZWlyIHJlc3BlY3RpdmUgc3RyaW5ncy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGhvb2tOYW1lcy5wdXNoKGhvb2tOYW1lcy5zaGlmdCgpKTtcclxuXHRcdFx0XHRcdFx0XHRcdGRlZmF1bHRWYWx1ZXMucHVzaChkZWZhdWx0VmFsdWVzLnNoaWZ0KCkpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIFJlcGxhY2UgdGhlIGV4aXN0aW5nIHRlbXBsYXRlIGZvciB0aGUgaG9vaydzIHJvb3QgcHJvcGVydHkuICovXHJcblx0XHRcdFx0XHRcdFx0XHRDU1MuSG9va3MudGVtcGxhdGVzW3Jvb3RQcm9wZXJ0eV0gPSBbaG9va05hbWVzLmpvaW4oXCIgXCIpLCBkZWZhdWx0VmFsdWVzLmpvaW4oXCIgXCIpXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBIb29rIHJlZ2lzdHJhdGlvbi4gKi9cclxuXHRcdFx0XHRcdGZvciAocm9vdFByb3BlcnR5IGluIENTUy5Ib29rcy50ZW1wbGF0ZXMpIHtcclxuXHRcdFx0XHRcdFx0aWYgKCFDU1MuSG9va3MudGVtcGxhdGVzLmhhc093blByb3BlcnR5KHJvb3RQcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRob29rVGVtcGxhdGUgPSBDU1MuSG9va3MudGVtcGxhdGVzW3Jvb3RQcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdGhvb2tOYW1lcyA9IGhvb2tUZW1wbGF0ZVswXS5zcGxpdChcIiBcIik7XHJcblxyXG5cdFx0XHRcdFx0XHRmb3IgKHZhciBqIGluIGhvb2tOYW1lcykge1xyXG5cdFx0XHRcdFx0XHRcdGlmICghaG9va05hbWVzLmhhc093blByb3BlcnR5KGopKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0dmFyIGZ1bGxIb29rTmFtZSA9IHJvb3RQcm9wZXJ0eSArIGhvb2tOYW1lc1tqXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0aG9va1Bvc2l0aW9uID0gajtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyogRm9yIGVhY2ggaG9vaywgcmVnaXN0ZXIgaXRzIGZ1bGwgbmFtZSAoZS5nLiB0ZXh0U2hhZG93Qmx1cikgd2l0aCBpdHMgcm9vdCBwcm9wZXJ0eSAoZS5nLiB0ZXh0U2hhZG93KVxyXG5cdFx0XHRcdFx0XHRcdCBhbmQgdGhlIGhvb2sncyBwb3NpdGlvbiBpbiBpdHMgdGVtcGxhdGUncyBkZWZhdWx0IHZhbHVlIHN0cmluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHRDU1MuSG9va3MucmVnaXN0ZXJlZFtmdWxsSG9va05hbWVdID0gW3Jvb3RQcm9wZXJ0eSwgaG9va1Bvc2l0aW9uXTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IEluamVjdGlvbiBhbmQgRXh0cmFjdGlvblxyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0LyogTG9vayB1cCB0aGUgcm9vdCBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvb2sgKGUuZy4gcmV0dXJuIFwidGV4dFNoYWRvd1wiIGZvciBcInRleHRTaGFkb3dCbHVyXCIpLiAqL1xyXG5cdFx0XHRcdC8qIFNpbmNlIGEgaG9vayBjYW5ub3QgYmUgc2V0IGRpcmVjdGx5ICh0aGUgYnJvd3NlciB3b24ndCByZWNvZ25pemUgaXQpLCBzdHlsZSB1cGRhdGluZyBmb3IgaG9va3MgaXMgcm91dGVkIHRocm91Z2ggdGhlIGhvb2sncyByb290IHByb3BlcnR5LiAqL1xyXG5cdFx0XHRcdGdldFJvb3Q6IGZ1bmN0aW9uKHByb3BlcnR5KSB7XHJcblx0XHRcdFx0XHR2YXIgaG9va0RhdGEgPSBDU1MuSG9va3MucmVnaXN0ZXJlZFtwcm9wZXJ0eV07XHJcblxyXG5cdFx0XHRcdFx0aWYgKGhvb2tEYXRhKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBob29rRGF0YVswXTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdC8qIElmIHRoZXJlIHdhcyBubyBob29rIG1hdGNoLCByZXR1cm4gdGhlIHByb3BlcnR5IG5hbWUgdW50b3VjaGVkLiAqL1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHRnZXRVbml0OiBmdW5jdGlvbihzdHIsIHN0YXJ0KSB7XHJcblx0XHRcdFx0XHR2YXIgdW5pdCA9IChzdHIuc3Vic3RyKHN0YXJ0IHx8IDAsIDUpLm1hdGNoKC9eW2EteiVdKy8pIHx8IFtdKVswXSB8fCBcIlwiO1xyXG5cclxuXHRcdFx0XHRcdGlmICh1bml0ICYmIF9pbkFycmF5KENTUy5MaXN0cy51bml0cywgdW5pdCkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIHVuaXQ7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRyZXR1cm4gXCJcIjtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGZpeENvbG9yczogZnVuY3Rpb24oc3RyKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gc3RyLnJlcGxhY2UoLyhyZ2JhP1xcKFxccyopPyhcXGJbYS16XStcXGIpL2csIGZ1bmN0aW9uKCQwLCAkMSwgJDIpIHtcclxuXHRcdFx0XHRcdFx0aWYgKENTUy5MaXN0cy5jb2xvck5hbWVzLmhhc093blByb3BlcnR5KCQyKSkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiAoJDEgPyAkMSA6IFwicmdiYShcIikgKyBDU1MuTGlzdHMuY29sb3JOYW1lc1skMl0gKyAoJDEgPyBcIlwiIDogXCIsMSlcIik7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0cmV0dXJuICQxICsgJDI7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qIENvbnZlcnQgYW55IHJvb3RQcm9wZXJ0eVZhbHVlLCBudWxsIG9yIG90aGVyd2lzZSwgaW50byBhIHNwYWNlLWRlbGltaXRlZCBsaXN0IG9mIGhvb2sgdmFsdWVzIHNvIHRoYXRcclxuXHRcdFx0XHQgdGhlIHRhcmdldGVkIGhvb2sgY2FuIGJlIGluamVjdGVkIG9yIGV4dHJhY3RlZCBhdCBpdHMgc3RhbmRhcmQgcG9zaXRpb24uICovXHJcblx0XHRcdFx0Y2xlYW5Sb290UHJvcGVydHlWYWx1ZTogZnVuY3Rpb24ocm9vdFByb3BlcnR5LCByb290UHJvcGVydHlWYWx1ZSkge1xyXG5cdFx0XHRcdFx0LyogSWYgdGhlIHJvb3RQcm9wZXJ0eVZhbHVlIGlzIHdyYXBwZWQgd2l0aCBcInJnYigpXCIsIFwiY2xpcCgpXCIsIGV0Yy4sIHJlbW92ZSB0aGUgd3JhcHBpbmcgdG8gbm9ybWFsaXplIHRoZSB2YWx1ZSBiZWZvcmUgbWFuaXB1bGF0aW9uLiAqL1xyXG5cdFx0XHRcdFx0aWYgKENTUy5SZWdFeC52YWx1ZVVud3JhcC50ZXN0KHJvb3RQcm9wZXJ0eVZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZSA9IHJvb3RQcm9wZXJ0eVZhbHVlLm1hdGNoKENTUy5SZWdFeC52YWx1ZVVud3JhcClbMV07XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogSWYgcm9vdFByb3BlcnR5VmFsdWUgaXMgYSBDU1MgbnVsbC12YWx1ZSAoZnJvbSB3aGljaCB0aGVyZSdzIGluaGVyZW50bHkgbm8gaG9vayB2YWx1ZSB0byBleHRyYWN0KSxcclxuXHRcdFx0XHRcdCBkZWZhdWx0IHRvIHRoZSByb290J3MgZGVmYXVsdCB2YWx1ZSBhcyBkZWZpbmVkIGluIENTUy5Ib29rcy50ZW1wbGF0ZXMuICovXHJcblx0XHRcdFx0XHQvKiBOb3RlOiBDU1MgbnVsbC12YWx1ZXMgaW5jbHVkZSBcIm5vbmVcIiwgXCJhdXRvXCIsIGFuZCBcInRyYW5zcGFyZW50XCIuIFRoZXkgbXVzdCBiZSBjb252ZXJ0ZWQgaW50byB0aGVpclxyXG5cdFx0XHRcdFx0IHplcm8tdmFsdWVzIChlLmcuIHRleHRTaGFkb3c6IFwibm9uZVwiID09PiB0ZXh0U2hhZG93OiBcIjBweCAwcHggMHB4IGJsYWNrXCIpIGZvciBob29rIG1hbmlwdWxhdGlvbiB0byBwcm9jZWVkLiAqL1xyXG5cdFx0XHRcdFx0aWYgKENTUy5WYWx1ZXMuaXNDU1NOdWxsVmFsdWUocm9vdFByb3BlcnR5VmFsdWUpKSB7XHJcblx0XHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlID0gQ1NTLkhvb2tzLnRlbXBsYXRlc1tyb290UHJvcGVydHldWzFdO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHJldHVybiByb290UHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qIEV4dHJhY3RlZCB0aGUgaG9vaydzIHZhbHVlIGZyb20gaXRzIHJvb3QgcHJvcGVydHkncyB2YWx1ZS4gVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgc3RhcnRpbmcgdmFsdWUgb2YgYW4gYW5pbWF0aW5nIGhvb2suICovXHJcblx0XHRcdFx0ZXh0cmFjdFZhbHVlOiBmdW5jdGlvbihmdWxsSG9va05hbWUsIHJvb3RQcm9wZXJ0eVZhbHVlKSB7XHJcblx0XHRcdFx0XHR2YXIgaG9va0RhdGEgPSBDU1MuSG9va3MucmVnaXN0ZXJlZFtmdWxsSG9va05hbWVdO1xyXG5cclxuXHRcdFx0XHRcdGlmIChob29rRGF0YSkge1xyXG5cdFx0XHRcdFx0XHR2YXIgaG9va1Jvb3QgPSBob29rRGF0YVswXSxcclxuXHRcdFx0XHRcdFx0XHRcdGhvb2tQb3NpdGlvbiA9IGhvb2tEYXRhWzFdO1xyXG5cclxuXHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSBDU1MuSG9va3MuY2xlYW5Sb290UHJvcGVydHlWYWx1ZShob29rUm9vdCwgcm9vdFByb3BlcnR5VmFsdWUpO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogU3BsaXQgcm9vdFByb3BlcnR5VmFsdWUgaW50byBpdHMgY29uc3RpdHVlbnQgaG9vayB2YWx1ZXMgdGhlbiBncmFiIHRoZSBkZXNpcmVkIGhvb2sgYXQgaXRzIHN0YW5kYXJkIHBvc2l0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcm9vdFByb3BlcnR5VmFsdWUudG9TdHJpbmcoKS5tYXRjaChDU1MuUmVnRXgudmFsdWVTcGxpdClbaG9va1Bvc2l0aW9uXTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdC8qIElmIHRoZSBwcm92aWRlZCBmdWxsSG9va05hbWUgaXNuJ3QgYSByZWdpc3RlcmVkIGhvb2ssIHJldHVybiB0aGUgcm9vdFByb3BlcnR5VmFsdWUgdGhhdCB3YXMgcGFzc2VkIGluLiAqL1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcm9vdFByb3BlcnR5VmFsdWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKiBJbmplY3QgdGhlIGhvb2sncyB2YWx1ZSBpbnRvIGl0cyByb290IHByb3BlcnR5J3MgdmFsdWUuIFRoaXMgaXMgdXNlZCB0byBwaWVjZSBiYWNrIHRvZ2V0aGVyIHRoZSByb290IHByb3BlcnR5XHJcblx0XHRcdFx0IG9uY2UgVmVsb2NpdHkgaGFzIHVwZGF0ZWQgb25lIG9mIGl0cyBpbmRpdmlkdWFsbHkgaG9va2VkIHZhbHVlcyB0aHJvdWdoIHR3ZWVuaW5nLiAqL1xyXG5cdFx0XHRcdGluamVjdFZhbHVlOiBmdW5jdGlvbihmdWxsSG9va05hbWUsIGhvb2tWYWx1ZSwgcm9vdFByb3BlcnR5VmFsdWUpIHtcclxuXHRcdFx0XHRcdHZhciBob29rRGF0YSA9IENTUy5Ib29rcy5yZWdpc3RlcmVkW2Z1bGxIb29rTmFtZV07XHJcblxyXG5cdFx0XHRcdFx0aWYgKGhvb2tEYXRhKSB7XHJcblx0XHRcdFx0XHRcdHZhciBob29rUm9vdCA9IGhvb2tEYXRhWzBdLFxyXG5cdFx0XHRcdFx0XHRcdFx0aG9va1Bvc2l0aW9uID0gaG9va0RhdGFbMV0sXHJcblx0XHRcdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZVBhcnRzLFxyXG5cdFx0XHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWVVcGRhdGVkO1xyXG5cclxuXHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSBDU1MuSG9va3MuY2xlYW5Sb290UHJvcGVydHlWYWx1ZShob29rUm9vdCwgcm9vdFByb3BlcnR5VmFsdWUpO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogU3BsaXQgcm9vdFByb3BlcnR5VmFsdWUgaW50byBpdHMgaW5kaXZpZHVhbCBob29rIHZhbHVlcywgcmVwbGFjZSB0aGUgdGFyZ2V0ZWQgdmFsdWUgd2l0aCBob29rVmFsdWUsXHJcblx0XHRcdFx0XHRcdCB0aGVuIHJlY29uc3RydWN0IHRoZSByb290UHJvcGVydHlWYWx1ZSBzdHJpbmcuICovXHJcblx0XHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlUGFydHMgPSByb290UHJvcGVydHlWYWx1ZS50b1N0cmluZygpLm1hdGNoKENTUy5SZWdFeC52YWx1ZVNwbGl0KTtcclxuXHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWVQYXJ0c1tob29rUG9zaXRpb25dID0gaG9va1ZhbHVlO1xyXG5cdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZVVwZGF0ZWQgPSByb290UHJvcGVydHlWYWx1ZVBhcnRzLmpvaW4oXCIgXCIpO1xyXG5cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHJvb3RQcm9wZXJ0eVZhbHVlVXBkYXRlZDtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdC8qIElmIHRoZSBwcm92aWRlZCBmdWxsSG9va05hbWUgaXNuJ3QgYSByZWdpc3RlcmVkIGhvb2ssIHJldHVybiB0aGUgcm9vdFByb3BlcnR5VmFsdWUgdGhhdCB3YXMgcGFzc2VkIGluLiAqL1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gcm9vdFByb3BlcnR5VmFsdWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHQgTm9ybWFsaXphdGlvbnNcclxuXHRcdFx0ICoqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHQvKiBOb3JtYWxpemF0aW9ucyBzdGFuZGFyZGl6ZSBDU1MgcHJvcGVydHkgbWFuaXB1bGF0aW9uIGJ5IHBvbGx5ZmlsbGluZyBicm93c2VyLXNwZWNpZmljIGltcGxlbWVudGF0aW9ucyAoZS5nLiBvcGFjaXR5KVxyXG5cdFx0XHQgYW5kIHJlZm9ybWF0dGluZyBzcGVjaWFsIHByb3BlcnRpZXMgKGUuZy4gY2xpcCwgcmdiYSkgdG8gbG9vayBsaWtlIHN0YW5kYXJkIG9uZXMuICovXHJcblx0XHRcdE5vcm1hbGl6YXRpb25zOiB7XHJcblx0XHRcdFx0LyogTm9ybWFsaXphdGlvbnMgYXJlIHBhc3NlZCBhIG5vcm1hbGl6YXRpb24gdGFyZ2V0IChlaXRoZXIgdGhlIHByb3BlcnR5J3MgbmFtZSwgaXRzIGV4dHJhY3RlZCB2YWx1ZSwgb3IgaXRzIGluamVjdGVkIHZhbHVlKSxcclxuXHRcdFx0XHQgdGhlIHRhcmdldGVkIGVsZW1lbnQgKHdoaWNoIG1heSBuZWVkIHRvIGJlIHF1ZXJpZWQpLCBhbmQgdGhlIHRhcmdldGVkIHByb3BlcnR5IHZhbHVlLiAqL1xyXG5cdFx0XHRcdHJlZ2lzdGVyZWQ6IHtcclxuXHRcdFx0XHRcdGNsaXA6IGZ1bmN0aW9uKHR5cGUsIGVsZW1lbnQsIHByb3BlcnR5VmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRcdFx0XHRcdFx0Y2FzZSBcIm5hbWVcIjpcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBcImNsaXBcIjtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIENsaXAgbmVlZHMgdG8gYmUgdW53cmFwcGVkIGFuZCBzdHJpcHBlZCBvZiBpdHMgY29tbWFzIGR1cmluZyBleHRyYWN0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJleHRyYWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgZXh0cmFjdGVkO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIElmIFZlbG9jaXR5IGFsc28gZXh0cmFjdGVkIHRoaXMgdmFsdWUsIHNraXAgZXh0cmFjdGlvbi4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChDU1MuUmVnRXgud3JhcHBlZFZhbHVlQWxyZWFkeUV4dHJhY3RlZC50ZXN0KHByb3BlcnR5VmFsdWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGV4dHJhY3RlZCA9IHByb3BlcnR5VmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBSZW1vdmUgdGhlIFwicmVjdCgpXCIgd3JhcHBlci4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0ZXh0cmFjdGVkID0gcHJvcGVydHlWYWx1ZS50b1N0cmluZygpLm1hdGNoKENTUy5SZWdFeC52YWx1ZVVud3JhcCk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBTdHJpcCBvZmYgY29tbWFzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRleHRyYWN0ZWQgPSBleHRyYWN0ZWQgPyBleHRyYWN0ZWRbMV0ucmVwbGFjZSgvLChcXHMrKT8vZywgXCIgXCIpIDogcHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZXh0cmFjdGVkO1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogQ2xpcCBuZWVkcyB0byBiZSByZS13cmFwcGVkIGR1cmluZyBpbmplY3Rpb24uICovXHJcblx0XHRcdFx0XHRcdFx0Y2FzZSBcImluamVjdFwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwicmVjdChcIiArIHByb3BlcnR5VmFsdWUgKyBcIilcIjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdGJsdXI6IGZ1bmN0aW9uKHR5cGUsIGVsZW1lbnQsIHByb3BlcnR5VmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRcdFx0XHRcdFx0Y2FzZSBcIm5hbWVcIjpcclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBWZWxvY2l0eS5TdGF0ZS5pc0ZpcmVmb3ggPyBcImZpbHRlclwiIDogXCItd2Via2l0LWZpbHRlclwiO1xyXG5cdFx0XHRcdFx0XHRcdGNhc2UgXCJleHRyYWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgZXh0cmFjdGVkID0gcGFyc2VGbG9hdChwcm9wZXJ0eVZhbHVlKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBJZiBleHRyYWN0ZWQgaXMgTmFOLCBtZWFuaW5nIHRoZSB2YWx1ZSBpc24ndCBhbHJlYWR5IGV4dHJhY3RlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmICghKGV4dHJhY3RlZCB8fCBleHRyYWN0ZWQgPT09IDApKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBibHVyQ29tcG9uZW50ID0gcHJvcGVydHlWYWx1ZS50b1N0cmluZygpLm1hdGNoKC9ibHVyXFwoKFswLTldK1tBLXpdKylcXCkvaSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiB0aGUgZmlsdGVyIHN0cmluZyBoYWQgYSBibHVyIGNvbXBvbmVudCwgcmV0dXJuIGp1c3QgdGhlIGJsdXIgdmFsdWUgYW5kIHVuaXQgdHlwZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGJsdXJDb21wb25lbnQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRleHRyYWN0ZWQgPSBibHVyQ29tcG9uZW50WzFdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBjb21wb25lbnQgZG9lc24ndCBleGlzdCwgZGVmYXVsdCBibHVyIHRvIDAuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZXh0cmFjdGVkID0gMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBleHRyYWN0ZWQ7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBCbHVyIG5lZWRzIHRvIGJlIHJlLXdyYXBwZWQgZHVyaW5nIGluamVjdGlvbi4gKi9cclxuXHRcdFx0XHRcdFx0XHRjYXNlIFwiaW5qZWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBGb3IgdGhlIGJsdXIgZWZmZWN0IHRvIGJlIGZ1bGx5IGRlLWFwcGxpZWQsIGl0IG5lZWRzIHRvIGJlIHNldCB0byBcIm5vbmVcIiBpbnN0ZWFkIG9mIDAuICovXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIXBhcnNlRmxvYXQocHJvcGVydHlWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwibm9uZVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiYmx1cihcIiArIHByb3BlcnR5VmFsdWUgKyBcIilcIjtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSxcclxuXHRcdFx0XHRcdC8qIDw9SUU4IGRvIG5vdCBzdXBwb3J0IHRoZSBzdGFuZGFyZCBvcGFjaXR5IHByb3BlcnR5LiBUaGV5IHVzZSBmaWx0ZXI6YWxwaGEob3BhY2l0eT1JTlQpIGluc3RlYWQuICovXHJcblx0XHRcdFx0XHRvcGFjaXR5OiBmdW5jdGlvbih0eXBlLCBlbGVtZW50LCBwcm9wZXJ0eVZhbHVlKSB7XHJcblx0XHRcdFx0XHRcdGlmIChJRSA8PSA4KSB7XHJcblx0XHRcdFx0XHRcdFx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwibmFtZVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJmaWx0ZXJcIjtcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJleHRyYWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIDw9SUU4IHJldHVybiBhIFwiZmlsdGVyXCIgdmFsdWUgb2YgXCJhbHBoYShvcGFjaXR5PVxcZHsxLDN9KVwiLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgRXh0cmFjdCB0aGUgdmFsdWUgYW5kIGNvbnZlcnQgaXQgdG8gYSBkZWNpbWFsIHZhbHVlIHRvIG1hdGNoIHRoZSBzdGFuZGFyZCBDU1Mgb3BhY2l0eSBwcm9wZXJ0eSdzIGZvcm1hdHRpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBleHRyYWN0ZWQgPSBwcm9wZXJ0eVZhbHVlLnRvU3RyaW5nKCkubWF0Y2goL2FscGhhXFwob3BhY2l0eT0oLiopXFwpL2kpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGV4dHJhY3RlZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIENvbnZlcnQgdG8gZGVjaW1hbCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gZXh0cmFjdGVkWzFdIC8gMTAwO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFdoZW4gZXh0cmFjdGluZyBvcGFjaXR5LCBkZWZhdWx0IHRvIDEgc2luY2UgYSBudWxsIHZhbHVlIG1lYW5zIG9wYWNpdHkgaGFzbid0IGJlZW4gc2V0LiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSAxO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJpbmplY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogT3BhY2lmaWVkIGVsZW1lbnRzIGFyZSByZXF1aXJlZCB0byBoYXZlIHRoZWlyIHpvb20gcHJvcGVydHkgc2V0IHRvIGEgbm9uLXplcm8gdmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGVsZW1lbnQuc3R5bGUuem9vbSA9IDE7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBTZXR0aW5nIHRoZSBmaWx0ZXIgcHJvcGVydHkgb24gZWxlbWVudHMgd2l0aCBjZXJ0YWluIGZvbnQgcHJvcGVydHkgY29tYmluYXRpb25zIGNhbiByZXN1bHQgaW4gYVxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgaGlnaGx5IHVuYXBwZWFsaW5nIHVsdHJhLWJvbGRpbmcgZWZmZWN0LiBUaGVyZSdzIG5vIHdheSB0byByZW1lZHkgdGhpcyB0aHJvdWdob3V0IGEgdHdlZW4sIGJ1dCBkcm9wcGluZyB0aGVcclxuXHRcdFx0XHRcdFx0XHRcdFx0IHZhbHVlIGFsdG9nZXRoZXIgKHdoZW4gb3BhY2l0eSBoaXRzIDEpIGF0IGxlYXN0cyBlbnN1cmVzIHRoYXQgdGhlIGdsaXRjaCBpcyBnb25lIHBvc3QtdHdlZW5pbmcuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChwYXJzZUZsb2F0KHByb3BlcnR5VmFsdWUpID49IDEpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gXCJcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBBcyBwZXIgdGhlIGZpbHRlciBwcm9wZXJ0eSdzIHNwZWMsIGNvbnZlcnQgdGhlIGRlY2ltYWwgdmFsdWUgdG8gYSB3aG9sZSBudW1iZXIgYW5kIHdyYXAgdGhlIHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBcImFscGhhKG9wYWNpdHk9XCIgKyBwYXJzZUludChwYXJzZUZsb2F0KHByb3BlcnR5VmFsdWUpICogMTAwLCAxMCkgKyBcIilcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHQvKiBXaXRoIGFsbCBvdGhlciBicm93c2Vycywgbm9ybWFsaXphdGlvbiBpcyBub3QgcmVxdWlyZWQ7IHJldHVybiB0aGUgc2FtZSB2YWx1ZXMgdGhhdCB3ZXJlIHBhc3NlZCBpbi4gKi9cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHR5cGUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJuYW1lXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBcIm9wYWNpdHlcIjtcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJleHRyYWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eVZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImluamVjdFwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBCYXRjaGVkIFJlZ2lzdHJhdGlvbnNcclxuXHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIE5vdGU6IEJhdGNoZWQgbm9ybWFsaXphdGlvbnMgZXh0ZW5kIHRoZSBDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZCBvYmplY3QuICovXHJcblx0XHRcdFx0cmVnaXN0ZXI6IGZ1bmN0aW9uKCkge1xyXG5cclxuXHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0IFRyYW5zZm9ybXNcclxuXHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHQvKiBUcmFuc2Zvcm1zIGFyZSB0aGUgc3VicHJvcGVydGllcyBjb250YWluZWQgYnkgdGhlIENTUyBcInRyYW5zZm9ybVwiIHByb3BlcnR5LiBUcmFuc2Zvcm1zIG11c3QgdW5kZXJnbyBub3JtYWxpemF0aW9uXHJcblx0XHRcdFx0XHQgc28gdGhhdCB0aGV5IGNhbiBiZSByZWZlcmVuY2VkIGluIGEgcHJvcGVydGllcyBtYXAgYnkgdGhlaXIgaW5kaXZpZHVhbCBuYW1lcy4gKi9cclxuXHRcdFx0XHRcdC8qIE5vdGU6IFdoZW4gdHJhbnNmb3JtcyBhcmUgXCJzZXRcIiwgdGhleSBhcmUgYWN0dWFsbHkgYXNzaWduZWQgdG8gYSBwZXItZWxlbWVudCB0cmFuc2Zvcm1DYWNoZS4gV2hlbiBhbGwgdHJhbnNmb3JtXHJcblx0XHRcdFx0XHQgc2V0dGluZyBpcyBjb21wbGV0ZSBjb21wbGV0ZSwgQ1NTLmZsdXNoVHJhbnNmb3JtQ2FjaGUoKSBtdXN0IGJlIG1hbnVhbGx5IGNhbGxlZCB0byBmbHVzaCB0aGUgdmFsdWVzIHRvIHRoZSBET00uXHJcblx0XHRcdFx0XHQgVHJhbnNmb3JtIHNldHRpbmcgaXMgYmF0Y2hlZCBpbiB0aGlzIHdheSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlOiB0aGUgdHJhbnNmb3JtIHN0eWxlIG9ubHkgbmVlZHMgdG8gYmUgdXBkYXRlZFxyXG5cdFx0XHRcdFx0IG9uY2Ugd2hlbiBtdWx0aXBsZSB0cmFuc2Zvcm0gc3VicHJvcGVydGllcyBhcmUgYmVpbmcgYW5pbWF0ZWQgc2ltdWx0YW5lb3VzbHkuICovXHJcblx0XHRcdFx0XHQvKiBOb3RlOiBJRTkgYW5kIEFuZHJvaWQgR2luZ2VyYnJlYWQgaGF2ZSBzdXBwb3J0IGZvciAyRCAtLSBidXQgbm90IDNEIC0tIHRyYW5zZm9ybXMuIFNpbmNlIGFuaW1hdGluZyB1bnN1cHBvcnRlZFxyXG5cdFx0XHRcdFx0IHRyYW5zZm9ybSBwcm9wZXJ0aWVzIHJlc3VsdHMgaW4gdGhlIGJyb3dzZXIgaWdub3JpbmcgdGhlICplbnRpcmUqIHRyYW5zZm9ybSBzdHJpbmcsIHdlIHByZXZlbnQgdGhlc2UgM0QgdmFsdWVzXHJcblx0XHRcdFx0XHQgZnJvbSBiZWluZyBub3JtYWxpemVkIGZvciB0aGVzZSBicm93c2VycyBzbyB0aGF0IHR3ZWVuaW5nIHNraXBzIHRoZXNlIHByb3BlcnRpZXMgYWx0b2dldGhlclxyXG5cdFx0XHRcdFx0IChzaW5jZSBpdCB3aWxsIGlnbm9yZSB0aGVtIGFzIGJlaW5nIHVuc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyLikgKi9cclxuXHRcdFx0XHRcdGlmICgoIUlFIHx8IElFID4gOSkgJiYgIVZlbG9jaXR5LlN0YXRlLmlzR2luZ2VyYnJlYWQpIHtcclxuXHRcdFx0XHRcdFx0LyogTm90ZTogU2luY2UgdGhlIHN0YW5kYWxvbmUgQ1NTIFwicGVyc3BlY3RpdmVcIiBwcm9wZXJ0eSBhbmQgdGhlIENTUyB0cmFuc2Zvcm0gXCJwZXJzcGVjdGl2ZVwiIHN1YnByb3BlcnR5XHJcblx0XHRcdFx0XHRcdCBzaGFyZSB0aGUgc2FtZSBuYW1lLCB0aGUgbGF0dGVyIGlzIGdpdmVuIGEgdW5pcXVlIHRva2VuIHdpdGhpbiBWZWxvY2l0eTogXCJ0cmFuc2Zvcm1QZXJzcGVjdGl2ZVwiLiAqL1xyXG5cdFx0XHRcdFx0XHRDU1MuTGlzdHMudHJhbnNmb3Jtc0Jhc2UgPSBDU1MuTGlzdHMudHJhbnNmb3Jtc0Jhc2UuY29uY2F0KENTUy5MaXN0cy50cmFuc2Zvcm1zM0QpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgQ1NTLkxpc3RzLnRyYW5zZm9ybXNCYXNlLmxlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0XHRcdC8qIFdyYXAgdGhlIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBub3JtYWxpemF0aW9uIGZ1bmN0aW9uIGluIGEgbmV3IHNjb3BlIHNvIHRoYXQgdHJhbnNmb3JtTmFtZSdzIHZhbHVlIGlzXHJcblx0XHRcdFx0XHRcdCBwYWlyZWQgd2l0aCBpdHMgcmVzcGVjdGl2ZSBmdW5jdGlvbi4gKE90aGVyd2lzZSwgYWxsIGZ1bmN0aW9ucyB3b3VsZCB0YWtlIHRoZSBmaW5hbCBmb3IgbG9vcCdzIHRyYW5zZm9ybU5hbWUuKSAqL1xyXG5cdFx0XHRcdFx0XHQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIHRyYW5zZm9ybU5hbWUgPSBDU1MuTGlzdHMudHJhbnNmb3Jtc0Jhc2VbaV07XHJcblxyXG5cdFx0XHRcdFx0XHRcdENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkW3RyYW5zZm9ybU5hbWVdID0gZnVuY3Rpb24odHlwZSwgZWxlbWVudCwgcHJvcGVydHlWYWx1ZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIFRoZSBub3JtYWxpemVkIHByb3BlcnR5IG5hbWUgaXMgdGhlIHBhcmVudCBcInRyYW5zZm9ybVwiIHByb3BlcnR5IC0tIHRoZSBwcm9wZXJ0eSB0aGF0IGlzIGFjdHVhbGx5IHNldCBpbiBDU1MuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJuYW1lXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwidHJhbnNmb3JtXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogVHJhbnNmb3JtIHZhbHVlcyBhcmUgY2FjaGVkIG9udG8gYSBwZXItZWxlbWVudCB0cmFuc2Zvcm1DYWNoZSBvYmplY3QuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJleHRyYWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogSWYgdGhpcyB0cmFuc2Zvcm0gaGFzIHlldCB0byBiZSBhc3NpZ25lZCBhIHZhbHVlLCByZXR1cm4gaXRzIG51bGwgdmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKERhdGEoZWxlbWVudCkgPT09IHVuZGVmaW5lZCB8fCBEYXRhKGVsZW1lbnQpLnRyYW5zZm9ybUNhY2hlW3RyYW5zZm9ybU5hbWVdID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFNjYWxlIENTUy5MaXN0cy50cmFuc2Zvcm1zQmFzZSBkZWZhdWx0IHRvIDEgd2hlcmVhcyBhbGwgb3RoZXIgdHJhbnNmb3JtIHByb3BlcnRpZXMgZGVmYXVsdCB0byAwLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIC9ec2NhbGUvaS50ZXN0KHRyYW5zZm9ybU5hbWUpID8gMSA6IDA7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBXaGVuIHRyYW5zZm9ybSB2YWx1ZXMgYXJlIHNldCwgdGhleSBhcmUgd3JhcHBlZCBpbiBwYXJlbnRoZXNlcyBhcyBwZXIgdGhlIENTUyBzcGVjLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0IFRodXMsIHdoZW4gZXh0cmFjdGluZyB0aGVpciB2YWx1ZXMgKGZvciB0d2VlbiBjYWxjdWxhdGlvbnMpLCB3ZSBzdHJpcCBvZmYgdGhlIHBhcmVudGhlc2VzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gRGF0YShlbGVtZW50KS50cmFuc2Zvcm1DYWNoZVt0cmFuc2Zvcm1OYW1lXS5yZXBsYWNlKC9bKCldL2csIFwiXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiaW5qZWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGludmFsaWQgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogSWYgYW4gaW5kaXZpZHVhbCB0cmFuc2Zvcm0gcHJvcGVydHkgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQgdW5pdCB0eXBlLCB0aGUgYnJvd3NlciBpZ25vcmVzIHRoZSAqZW50aXJlKiB0cmFuc2Zvcm0gcHJvcGVydHkuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IFRodXMsIHByb3RlY3QgdXNlcnMgZnJvbSB0aGVtc2VsdmVzIGJ5IHNraXBwaW5nIHNldHRpbmcgZm9yIHRyYW5zZm9ybSB2YWx1ZXMgc3VwcGxpZWQgd2l0aCBpbnZhbGlkIHVuaXQgdHlwZXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogU3dpdGNoIG9uIHRoZSBiYXNlIHRyYW5zZm9ybSB0eXBlOyBpZ25vcmUgdGhlIGF4aXMgYnkgcmVtb3ZpbmcgdGhlIGxhc3QgbGV0dGVyIGZyb20gdGhlIHRyYW5zZm9ybSdzIG5hbWUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3dpdGNoICh0cmFuc2Zvcm1OYW1lLnN1YnN0cigwLCB0cmFuc2Zvcm1OYW1lLmxlbmd0aCAtIDEpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBXaGl0ZWxpc3QgdW5pdCB0eXBlcyBmb3IgZWFjaCB0cmFuc2Zvcm0uICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwidHJhbnNsYXRlXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGludmFsaWQgPSAhLyglfHB4fGVtfHJlbXx2d3x2aHxcXGQpJC9pLnRlc3QocHJvcGVydHlWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBTaW5jZSBhbiBheGlzLWZyZWUgXCJzY2FsZVwiIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBhcyB3ZWxsLCBhIGxpdHRsZSBoYWNrIGlzIHVzZWQgaGVyZSB0byBkZXRlY3QgaXQgYnkgY2hvcHBpbmcgb2ZmIGl0cyBsYXN0IGxldHRlci4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJzY2FsXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwic2NhbGVcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogQ2hyb21lIG9uIEFuZHJvaWQgaGFzIGEgYnVnIGluIHdoaWNoIHNjYWxlZCBlbGVtZW50cyBibHVyIGlmIHRoZWlyIGluaXRpYWwgc2NhbGVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IHZhbHVlIGlzIGJlbG93IDEgKHdoaWNoIGNhbiBoYXBwZW4gd2l0aCBmb3JjZWZlZWRpbmcpLiBUaHVzLCB3ZSBkZXRlY3QgYSB5ZXQtdW5zZXQgc2NhbGUgcHJvcGVydHlcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0IGFuZCBlbnN1cmUgdGhhdCBpdHMgZmlyc3QgdmFsdWUgaXMgYWx3YXlzIDEuIE1vcmUgaW5mbzogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDQxNzg5MC9jc3MzLWFuaW1hdGlvbnMtd2l0aC10cmFuc2Zvcm0tY2F1c2VzLWJsdXJyZWQtZWxlbWVudHMtb24td2Via2l0LzEwNDE3OTYyIzEwNDE3OTYyICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChWZWxvY2l0eS5TdGF0ZS5pc0FuZHJvaWQgJiYgRGF0YShlbGVtZW50KS50cmFuc2Zvcm1DYWNoZVt0cmFuc2Zvcm1OYW1lXSA9PT0gdW5kZWZpbmVkICYmIHByb3BlcnR5VmFsdWUgPCAxKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IDE7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGludmFsaWQgPSAhLyhcXGQpJC9pLnRlc3QocHJvcGVydHlWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInNrZXdcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW52YWxpZCA9ICEvKGRlZ3xcXGQpJC9pLnRlc3QocHJvcGVydHlWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInJvdGF0ZVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpbnZhbGlkID0gIS8oZGVnfFxcZCkkL2kudGVzdChwcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIWludmFsaWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIEFzIHBlciB0aGUgQ1NTIHNwZWMsIHdyYXAgdGhlIHZhbHVlIGluIHBhcmVudGhlc2VzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0RGF0YShlbGVtZW50KS50cmFuc2Zvcm1DYWNoZVt0cmFuc2Zvcm1OYW1lXSA9IFwiKFwiICsgcHJvcGVydHlWYWx1ZSArIFwiKVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogQWx0aG91Z2ggdGhlIHZhbHVlIGlzIHNldCBvbiB0aGUgdHJhbnNmb3JtQ2FjaGUgb2JqZWN0LCByZXR1cm4gdGhlIG5ld2x5LXVwZGF0ZWQgdmFsdWUgZm9yIHRoZSBjYWxsaW5nIGNvZGUgdG8gcHJvY2VzcyBhcyBub3JtYWwuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIERhdGEoZWxlbWVudCkudHJhbnNmb3JtQ2FjaGVbdHJhbnNmb3JtTmFtZV07XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fSkoKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0IENvbG9yc1xyXG5cdFx0XHRcdFx0ICoqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0LyogU2luY2UgVmVsb2NpdHkgb25seSBhbmltYXRlcyBhIHNpbmdsZSBudW1lcmljIHZhbHVlIHBlciBwcm9wZXJ0eSwgY29sb3IgYW5pbWF0aW9uIGlzIGFjaGlldmVkIGJ5IGhvb2tpbmcgdGhlIGluZGl2aWR1YWwgUkdCQSBjb21wb25lbnRzIG9mIENTUyBjb2xvciBwcm9wZXJ0aWVzLlxyXG5cdFx0XHRcdFx0IEFjY29yZGluZ2x5LCBjb2xvciB2YWx1ZXMgbXVzdCBiZSBub3JtYWxpemVkIChlLmcuIFwiI2ZmMDAwMFwiLCBcInJlZFwiLCBhbmQgXCJyZ2IoMjU1LCAwLCAwKVwiID09PiBcIjI1NSAwIDAgMVwiKSBzbyB0aGF0IHRoZWlyIGNvbXBvbmVudHMgY2FuIGJlIGluamVjdGVkL2V4dHJhY3RlZCBieSBDU1MuSG9va3MgbG9naWMuICovXHJcblx0XHRcdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IENTUy5MaXN0cy5jb2xvcnMubGVuZ3RoOyBqKyspIHtcclxuXHRcdFx0XHRcdFx0LyogV3JhcCB0aGUgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIG5vcm1hbGl6YXRpb24gZnVuY3Rpb24gaW4gYSBuZXcgc2NvcGUgc28gdGhhdCBjb2xvck5hbWUncyB2YWx1ZSBpcyBwYWlyZWQgd2l0aCBpdHMgcmVzcGVjdGl2ZSBmdW5jdGlvbi5cclxuXHRcdFx0XHRcdFx0IChPdGhlcndpc2UsIGFsbCBmdW5jdGlvbnMgd291bGQgdGFrZSB0aGUgZmluYWwgZm9yIGxvb3AncyBjb2xvck5hbWUuKSAqL1xyXG5cdFx0XHRcdFx0XHQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIGNvbG9yTmFtZSA9IENTUy5MaXN0cy5jb2xvcnNbal07XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIE5vdGU6IEluIElFPD04LCB3aGljaCBzdXBwb3J0IHJnYiBidXQgbm90IHJnYmEsIGNvbG9yIHByb3BlcnRpZXMgYXJlIHJldmVydGVkIHRvIHJnYiBieSBzdHJpcHBpbmcgb2ZmIHRoZSBhbHBoYSBjb21wb25lbnQuICovXHJcblx0XHRcdFx0XHRcdFx0Q1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbY29sb3JOYW1lXSA9IGZ1bmN0aW9uKHR5cGUsIGVsZW1lbnQsIHByb3BlcnR5VmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHN3aXRjaCAodHlwZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwibmFtZVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBjb2xvck5hbWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogQ29udmVydCBhbGwgY29sb3IgdmFsdWVzIGludG8gdGhlIHJnYiBmb3JtYXQuIChPbGQgSUUgY2FuIHJldHVybiBoZXggdmFsdWVzIGFuZCBjb2xvciBuYW1lcyBpbnN0ZWFkIG9mIHJnYi9yZ2JhLikgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImV4dHJhY3RcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgZXh0cmFjdGVkO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiB0aGUgY29sb3IgaXMgYWxyZWFkeSBpbiBpdHMgaG9va2FibGUgZm9ybSAoZS5nLiBcIjI1NSAyNTUgMjU1IDFcIikgZHVlIHRvIGhhdmluZyBiZWVuIHByZXZpb3VzbHkgZXh0cmFjdGVkLCBza2lwIGV4dHJhY3Rpb24uICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKENTUy5SZWdFeC53cmFwcGVkVmFsdWVBbHJlYWR5RXh0cmFjdGVkLnRlc3QocHJvcGVydHlWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGV4dHJhY3RlZCA9IHByb3BlcnR5VmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBjb252ZXJ0ZWQsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29sb3JOYW1lcyA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJsYWNrOiBcInJnYigwLCAwLCAwKVwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ymx1ZTogXCJyZ2IoMCwgMCwgMjU1KVwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Z3JheTogXCJyZ2IoMTI4LCAxMjgsIDEyOClcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGdyZWVuOiBcInJnYigwLCAxMjgsIDApXCIsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZWQ6IFwicmdiKDI1NSwgMCwgMClcIixcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHdoaXRlOiBcInJnYigyNTUsIDI1NSwgMjU1KVwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBDb252ZXJ0IGNvbG9yIG5hbWVzIHRvIHJnYi4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICgvXltBLXpdKyQvaS50ZXN0KHByb3BlcnR5VmFsdWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChjb2xvck5hbWVzW3Byb3BlcnR5VmFsdWVdICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZWQgPSBjb2xvck5hbWVzW3Byb3BlcnR5VmFsdWVdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIElmIGFuIHVubWF0Y2hlZCBjb2xvciBuYW1lIGlzIHByb3ZpZGVkLCBkZWZhdWx0IHRvIGJsYWNrLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnZlcnRlZCA9IGNvbG9yTmFtZXMuYmxhY2s7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogQ29udmVydCBoZXggdmFsdWVzIHRvIHJnYi4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoQ1NTLlJlZ0V4LmlzSGV4LnRlc3QocHJvcGVydHlWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udmVydGVkID0gXCJyZ2IoXCIgKyBDU1MuVmFsdWVzLmhleFRvUmdiKHByb3BlcnR5VmFsdWUpLmpvaW4oXCIgXCIpICsgXCIpXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBwcm92aWRlZCBjb2xvciBkb2Vzbid0IG1hdGNoIGFueSBvZiB0aGUgYWNjZXB0ZWQgY29sb3IgZm9ybWF0cywgZGVmYXVsdCB0byBibGFjay4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoISgvXnJnYmE/XFwoL2kudGVzdChwcm9wZXJ0eVZhbHVlKSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29udmVydGVkID0gY29sb3JOYW1lcy5ibGFjaztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBSZW1vdmUgdGhlIHN1cnJvdW5kaW5nIFwicmdiL3JnYmEoKVwiIHN0cmluZyB0aGVuIHJlcGxhY2UgY29tbWFzIHdpdGggc3BhY2VzIGFuZCBzdHJpcFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0IHJlcGVhdGVkIHNwYWNlcyAoaW4gY2FzZSB0aGUgdmFsdWUgaW5jbHVkZWQgc3BhY2VzIHRvIGJlZ2luIHdpdGgpLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZXh0cmFjdGVkID0gKGNvbnZlcnRlZCB8fCBwcm9wZXJ0eVZhbHVlKS50b1N0cmluZygpLm1hdGNoKENTUy5SZWdFeC52YWx1ZVVud3JhcClbMV0ucmVwbGFjZSgvLChcXHMrKT8vZywgXCIgXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogU28gbG9uZyBhcyB0aGlzIGlzbid0IDw9SUU4LCBhZGQgYSBmb3VydGggKGFscGhhKSBjb21wb25lbnQgaWYgaXQncyBtaXNzaW5nIGFuZCBkZWZhdWx0IGl0IHRvIDEgKHZpc2libGUpLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICgoIUlFIHx8IElFID4gOCkgJiYgZXh0cmFjdGVkLnNwbGl0KFwiIFwiKS5sZW5ndGggPT09IDMpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGV4dHJhY3RlZCArPSBcIiAxXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZXh0cmFjdGVkO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiaW5qZWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogSWYgd2UgaGF2ZSBhIHBhdHRlcm4gdGhlbiBpdCBtaWdodCBhbHJlYWR5IGhhdmUgdGhlIHJpZ2h0IHZhbHVlcyAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICgvXnJnYi8udGVzdChwcm9wZXJ0eVZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHByb3BlcnR5VmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiB0aGlzIGlzIElFPD04IGFuZCBhbiBhbHBoYSBjb21wb25lbnQgZXhpc3RzLCBzdHJpcCBpdCBvZmYuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKElFIDw9IDgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eVZhbHVlLnNwbGl0KFwiIFwiKS5sZW5ndGggPT09IDQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWUuc3BsaXQoL1xccysvKS5zbGljZSgwLCAzKS5qb2luKFwiIFwiKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIE90aGVyd2lzZSwgYWRkIGEgZm91cnRoIChhbHBoYSkgY29tcG9uZW50IGlmIGl0J3MgbWlzc2luZyBhbmQgZGVmYXVsdCBpdCB0byAxICh2aXNpYmxlKS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5VmFsdWUuc3BsaXQoXCIgXCIpLmxlbmd0aCA9PT0gMykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSArPSBcIiAxXCI7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBSZS1pbnNlcnQgdGhlIGJyb3dzZXItYXBwcm9wcmlhdGUgd3JhcHBlcihcInJnYi9yZ2JhKClcIiksIGluc2VydCBjb21tYXMsIGFuZCBzdHJpcCBvZmYgZGVjaW1hbCB1bml0c1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCBvbiBhbGwgdmFsdWVzIGJ1dCB0aGUgZm91cnRoIChSLCBHLCBhbmQgQiBvbmx5IGFjY2VwdCB3aG9sZSBudW1iZXJzKS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKElFIDw9IDggPyBcInJnYlwiIDogXCJyZ2JhXCIpICsgXCIoXCIgKyBwcm9wZXJ0eVZhbHVlLnJlcGxhY2UoL1xccysvZywgXCIsXCIpLnJlcGxhY2UoL1xcLihcXGQpKyg/PSwpL2csIFwiXCIpICsgXCIpXCI7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fSkoKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdCBEaW1lbnNpb25zXHJcblx0XHRcdFx0XHQgKioqKioqKioqKioqKiovXHJcblx0XHRcdFx0XHRmdW5jdGlvbiBhdWdtZW50RGltZW5zaW9uKG5hbWUsIGVsZW1lbnQsIHdhbnRJbm5lcikge1xyXG5cdFx0XHRcdFx0XHR2YXIgaXNCb3JkZXJCb3ggPSBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcImJveFNpemluZ1wiKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT09IFwiYm9yZGVyLWJveFwiO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKGlzQm9yZGVyQm94ID09PSAod2FudElubmVyIHx8IGZhbHNlKSkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIGluIGJveC1zaXppbmcgbW9kZSwgdGhlIENTUyB3aWR0aCAvIGhlaWdodCBhY2Nlc3NvcnMgYWxyZWFkeSBnaXZlIHRoZSBvdXRlcldpZHRoIC8gb3V0ZXJIZWlnaHQuICovXHJcblx0XHRcdFx0XHRcdFx0dmFyIGksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRhdWdtZW50ID0gMCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0c2lkZXMgPSBuYW1lID09PSBcIndpZHRoXCIgPyBbXCJMZWZ0XCIsIFwiUmlnaHRcIl0gOiBbXCJUb3BcIiwgXCJCb3R0b21cIl0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdGZpZWxkcyA9IFtcInBhZGRpbmdcIiArIHNpZGVzWzBdLCBcInBhZGRpbmdcIiArIHNpZGVzWzFdLCBcImJvcmRlclwiICsgc2lkZXNbMF0gKyBcIldpZHRoXCIsIFwiYm9yZGVyXCIgKyBzaWRlc1sxXSArIFwiV2lkdGhcIl07XHJcblxyXG5cdFx0XHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhbHVlID0gcGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBmaWVsZHNbaV0pKTtcclxuXHRcdFx0XHRcdFx0XHRcdGlmICghaXNOYU4odmFsdWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGF1Z21lbnQgKz0gdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB3YW50SW5uZXIgPyAtYXVnbWVudCA6IGF1Z21lbnQ7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0cmV0dXJuIDA7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRmdW5jdGlvbiBnZXREaW1lbnNpb24obmFtZSwgd2FudElubmVyKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbih0eXBlLCBlbGVtZW50LCBwcm9wZXJ0eVZhbHVlKSB7XHJcblx0XHRcdFx0XHRcdFx0c3dpdGNoICh0eXBlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwibmFtZVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gbmFtZTtcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJleHRyYWN0XCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBwYXJzZUZsb2F0KHByb3BlcnR5VmFsdWUpICsgYXVnbWVudERpbWVuc2lvbihuYW1lLCBlbGVtZW50LCB3YW50SW5uZXIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImluamVjdFwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gKHBhcnNlRmxvYXQocHJvcGVydHlWYWx1ZSkgLSBhdWdtZW50RGltZW5zaW9uKG5hbWUsIGVsZW1lbnQsIHdhbnRJbm5lcikpICsgXCJweFwiO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkLmlubmVyV2lkdGggPSBnZXREaW1lbnNpb24oXCJ3aWR0aFwiLCB0cnVlKTtcclxuXHRcdFx0XHRcdENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkLmlubmVySGVpZ2h0ID0gZ2V0RGltZW5zaW9uKFwiaGVpZ2h0XCIsIHRydWUpO1xyXG5cdFx0XHRcdFx0Q1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWQub3V0ZXJXaWR0aCA9IGdldERpbWVuc2lvbihcIndpZHRoXCIpO1xyXG5cdFx0XHRcdFx0Q1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWQub3V0ZXJIZWlnaHQgPSBnZXREaW1lbnNpb24oXCJoZWlnaHRcIik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBDU1MgUHJvcGVydHkgTmFtZXNcclxuXHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdE5hbWVzOiB7XHJcblx0XHRcdFx0LyogQ2FtZWxjYXNlIGEgcHJvcGVydHkgbmFtZSBpbnRvIGl0cyBKYXZhU2NyaXB0IG5vdGF0aW9uIChlLmcuIFwiYmFja2dyb3VuZC1jb2xvclwiID09PiBcImJhY2tncm91bmRDb2xvclwiKS5cclxuXHRcdFx0XHQgQ2FtZWxjYXNpbmcgaXMgdXNlZCB0byBub3JtYWxpemUgcHJvcGVydHkgbmFtZXMgYmV0d2VlbiBhbmQgYWNyb3NzIGNhbGxzLiAqL1xyXG5cdFx0XHRcdGNhbWVsQ2FzZTogZnVuY3Rpb24ocHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdHJldHVybiBwcm9wZXJ0eS5yZXBsYWNlKC8tKFxcdykvZywgZnVuY3Rpb24obWF0Y2gsIHN1Yk1hdGNoKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBzdWJNYXRjaC50b1VwcGVyQ2FzZSgpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKiBGb3IgU1ZHIGVsZW1lbnRzLCBzb21lIHByb3BlcnRpZXMgKG5hbWVseSwgZGltZW5zaW9uYWwgb25lcykgYXJlIEdFVC9TRVQgdmlhIHRoZSBlbGVtZW50J3MgSFRNTCBhdHRyaWJ1dGVzIChpbnN0ZWFkIG9mIHZpYSBDU1Mgc3R5bGVzKS4gKi9cclxuXHRcdFx0XHRTVkdBdHRyaWJ1dGU6IGZ1bmN0aW9uKHByb3BlcnR5KSB7XHJcblx0XHRcdFx0XHR2YXIgU1ZHQXR0cmlidXRlcyA9IFwid2lkdGh8aGVpZ2h0fHh8eXxjeHxjeXxyfHJ4fHJ5fHgxfHgyfHkxfHkyXCI7XHJcblxyXG5cdFx0XHRcdFx0LyogQ2VydGFpbiBicm93c2VycyByZXF1aXJlIGFuIFNWRyB0cmFuc2Zvcm0gdG8gYmUgYXBwbGllZCBhcyBhbiBhdHRyaWJ1dGUuIChPdGhlcndpc2UsIGFwcGxpY2F0aW9uIHZpYSBDU1MgaXMgcHJlZmVyYWJsZSBkdWUgdG8gM0Qgc3VwcG9ydC4pICovXHJcblx0XHRcdFx0XHRpZiAoSUUgfHwgKFZlbG9jaXR5LlN0YXRlLmlzQW5kcm9pZCAmJiAhVmVsb2NpdHkuU3RhdGUuaXNDaHJvbWUpKSB7XHJcblx0XHRcdFx0XHRcdFNWR0F0dHJpYnV0ZXMgKz0gXCJ8dHJhbnNmb3JtXCI7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBSZWdFeHAoXCJeKFwiICsgU1ZHQXR0cmlidXRlcyArIFwiKSRcIiwgXCJpXCIpLnRlc3QocHJvcGVydHkpO1xyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0LyogRGV0ZXJtaW5lIHdoZXRoZXIgYSBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0IHdpdGggYSB2ZW5kb3IgcHJlZml4LiAqL1xyXG5cdFx0XHRcdC8qIElmIGEgcHJlZml4ZWQgdmVyc2lvbiBvZiB0aGUgcHJvcGVydHkgZXhpc3RzLCByZXR1cm4gaXQuIE90aGVyd2lzZSwgcmV0dXJuIHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSBuYW1lLlxyXG5cdFx0XHRcdCBJZiB0aGUgcHJvcGVydHkgaXMgbm90IGF0IGFsbCBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIsIHJldHVybiBhIGZhbHNlIGZsYWcuICovXHJcblx0XHRcdFx0cHJlZml4Q2hlY2s6IGZ1bmN0aW9uKHByb3BlcnR5KSB7XHJcblx0XHRcdFx0XHQvKiBJZiB0aGlzIHByb3BlcnR5IGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCwgcmV0dXJuIHRoZSBjYWNoZWQgdmFsdWUuICovXHJcblx0XHRcdFx0XHRpZiAoVmVsb2NpdHkuU3RhdGUucHJlZml4TWF0Y2hlc1twcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIFtWZWxvY2l0eS5TdGF0ZS5wcmVmaXhNYXRjaGVzW3Byb3BlcnR5XSwgdHJ1ZV07XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHR2YXIgdmVuZG9ycyA9IFtcIlwiLCBcIldlYmtpdFwiLCBcIk1velwiLCBcIm1zXCIsIFwiT1wiXTtcclxuXHJcblx0XHRcdFx0XHRcdGZvciAodmFyIGkgPSAwLCB2ZW5kb3JzTGVuZ3RoID0gdmVuZG9ycy5sZW5ndGg7IGkgPCB2ZW5kb3JzTGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgcHJvcGVydHlQcmVmaXhlZDtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKGkgPT09IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdHByb3BlcnR5UHJlZml4ZWQgPSBwcm9wZXJ0eTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBwcm9wZXJ0eSB0byBjb25mb3JtIHRvIEphdmFTY3JpcHQgdmVuZG9yIHByZWZpeCBub3RhdGlvbiAoZS5nLiB3ZWJraXRGaWx0ZXIpLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlQcmVmaXhlZCA9IHZlbmRvcnNbaV0gKyBwcm9wZXJ0eS5yZXBsYWNlKC9eXFx3LywgZnVuY3Rpb24obWF0Y2gpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG1hdGNoLnRvVXBwZXJDYXNlKCk7XHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIENoZWNrIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoaXMgcHJvcGVydHkgYXMgcHJlZml4ZWQuICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKFR5cGUuaXNTdHJpbmcoVmVsb2NpdHkuU3RhdGUucHJlZml4RWxlbWVudC5zdHlsZVtwcm9wZXJ0eVByZWZpeGVkXSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIENhY2hlIHRoZSBtYXRjaC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LlN0YXRlLnByZWZpeE1hdGNoZXNbcHJvcGVydHldID0gcHJvcGVydHlQcmVmaXhlZDtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gW3Byb3BlcnR5UHJlZml4ZWQsIHRydWVdO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoaXMgcHJvcGVydHkgaW4gYW55IGZvcm0sIGluY2x1ZGUgYSBmYWxzZSBmbGFnIHNvIHRoYXQgdGhlIGNhbGxlciBjYW4gZGVjaWRlIGhvdyB0byBwcm9jZWVkLiAqL1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gW3Byb3BlcnR5LCBmYWxzZV07XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBDU1MgUHJvcGVydHkgVmFsdWVzXHJcblx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRWYWx1ZXM6IHtcclxuXHRcdFx0XHQvKiBIZXggdG8gUkdCIGNvbnZlcnNpb24uIENvcHlyaWdodCBUaW0gRG93bjogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NjIzODM4L3JnYi10by1oZXgtYW5kLWhleC10by1yZ2IgKi9cclxuXHRcdFx0XHRoZXhUb1JnYjogZnVuY3Rpb24oaGV4KSB7XHJcblx0XHRcdFx0XHR2YXIgc2hvcnRmb3JtUmVnZXggPSAvXiM/KFthLWZcXGRdKShbYS1mXFxkXSkoW2EtZlxcZF0pJC9pLFxyXG5cdFx0XHRcdFx0XHRcdGxvbmdmb3JtUmVnZXggPSAvXiM/KFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pJC9pLFxyXG5cdFx0XHRcdFx0XHRcdHJnYlBhcnRzO1xyXG5cclxuXHRcdFx0XHRcdGhleCA9IGhleC5yZXBsYWNlKHNob3J0Zm9ybVJlZ2V4LCBmdW5jdGlvbihtLCByLCBnLCBiKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiByICsgciArIGcgKyBnICsgYiArIGI7XHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHRyZ2JQYXJ0cyA9IGxvbmdmb3JtUmVnZXguZXhlYyhoZXgpO1xyXG5cclxuXHRcdFx0XHRcdHJldHVybiByZ2JQYXJ0cyA/IFtwYXJzZUludChyZ2JQYXJ0c1sxXSwgMTYpLCBwYXJzZUludChyZ2JQYXJ0c1syXSwgMTYpLCBwYXJzZUludChyZ2JQYXJ0c1szXSwgMTYpXSA6IFswLCAwLCAwXTtcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGlzQ1NTTnVsbFZhbHVlOiBmdW5jdGlvbih2YWx1ZSkge1xyXG5cdFx0XHRcdFx0LyogVGhlIGJyb3dzZXIgZGVmYXVsdHMgQ1NTIHZhbHVlcyB0aGF0IGhhdmUgbm90IGJlZW4gc2V0IHRvIGVpdGhlciAwIG9yIG9uZSBvZiBzZXZlcmFsIHBvc3NpYmxlIG51bGwtdmFsdWUgc3RyaW5ncy5cclxuXHRcdFx0XHRcdCBUaHVzLCB3ZSBjaGVjayBmb3IgYm90aCBmYWxzaW5lc3MgYW5kIHRoZXNlIHNwZWNpYWwgc3RyaW5ncy4gKi9cclxuXHRcdFx0XHRcdC8qIE51bGwtdmFsdWUgY2hlY2tpbmcgaXMgcGVyZm9ybWVkIHRvIGRlZmF1bHQgdGhlIHNwZWNpYWwgc3RyaW5ncyB0byAwIChmb3IgdGhlIHNha2Ugb2YgdHdlZW5pbmcpIG9yIHRoZWlyIGhvb2tcclxuXHRcdFx0XHRcdCB0ZW1wbGF0ZXMgYXMgZGVmaW5lZCBhcyBDU1MuSG9va3MgKGZvciB0aGUgc2FrZSBvZiBob29rIGluamVjdGlvbi9leHRyYWN0aW9uKS4gKi9cclxuXHRcdFx0XHRcdC8qIE5vdGU6IENocm9tZSByZXR1cm5zIFwicmdiYSgwLCAwLCAwLCAwKVwiIGZvciBhbiB1bmRlZmluZWQgY29sb3Igd2hlcmVhcyBJRSByZXR1cm5zIFwidHJhbnNwYXJlbnRcIi4gKi9cclxuXHRcdFx0XHRcdHJldHVybiAoIXZhbHVlIHx8IC9eKG5vbmV8YXV0b3x0cmFuc3BhcmVudHwocmdiYVxcKDAsID8wLCA/MCwgPzBcXCkpKSQvaS50ZXN0KHZhbHVlKSk7XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKiBSZXRyaWV2ZSBhIHByb3BlcnR5J3MgZGVmYXVsdCB1bml0IHR5cGUuIFVzZWQgZm9yIGFzc2lnbmluZyBhIHVuaXQgdHlwZSB3aGVuIG9uZSBpcyBub3Qgc3VwcGxpZWQgYnkgdGhlIHVzZXIuICovXHJcblx0XHRcdFx0Z2V0VW5pdFR5cGU6IGZ1bmN0aW9uKHByb3BlcnR5KSB7XHJcblx0XHRcdFx0XHRpZiAoL14ocm90YXRlfHNrZXcpL2kudGVzdChwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiZGVnXCI7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKC8oXihzY2FsZXxzY2FsZVh8c2NhbGVZfHNjYWxlWnxhbHBoYXxmbGV4R3Jvd3xmbGV4SGVpZ2h0fHpJbmRleHxmb250V2VpZ2h0KSQpfCgob3BhY2l0eXxyZWR8Z3JlZW58Ymx1ZXxhbHBoYSkkKS9pLnRlc3QocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdC8qIFRoZSBhYm92ZSBwcm9wZXJ0aWVzIGFyZSB1bml0bGVzcy4gKi9cclxuXHRcdFx0XHRcdFx0cmV0dXJuIFwiXCI7XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHQvKiBEZWZhdWx0IHRvIHB4IGZvciBhbGwgb3RoZXIgcHJvcGVydGllcy4gKi9cclxuXHRcdFx0XHRcdFx0cmV0dXJuIFwicHhcIjtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdC8qIEhUTUwgZWxlbWVudHMgZGVmYXVsdCB0byBhbiBhc3NvY2lhdGVkIGRpc3BsYXkgdHlwZSB3aGVuIHRoZXkncmUgbm90IHNldCB0byBkaXNwbGF5Om5vbmUuICovXHJcblx0XHRcdFx0LyogTm90ZTogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBjb3JyZWN0bHkgc2V0dGluZyB0aGUgbm9uLVwibm9uZVwiIGRpc3BsYXkgdmFsdWUgaW4gY2VydGFpbiBWZWxvY2l0eSByZWRpcmVjdHMsIHN1Y2ggYXMgZmFkZUluL091dC4gKi9cclxuXHRcdFx0XHRnZXREaXNwbGF5VHlwZTogZnVuY3Rpb24oZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0dmFyIHRhZ05hbWUgPSBlbGVtZW50ICYmIGVsZW1lbnQudGFnTmFtZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKC9eKGJ8YmlnfGl8c21hbGx8dHR8YWJicnxhY3JvbnltfGNpdGV8Y29kZXxkZm58ZW18a2JkfHN0cm9uZ3xzYW1wfHZhcnxhfGJkb3xicnxpbWd8bWFwfG9iamVjdHxxfHNjcmlwdHxzcGFufHN1YnxzdXB8YnV0dG9ufGlucHV0fGxhYmVsfHNlbGVjdHx0ZXh0YXJlYSkkL2kudGVzdCh0YWdOYW1lKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJpbmxpbmVcIjtcclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoL14obGkpJC9pLnRlc3QodGFnTmFtZSkpIHtcclxuXHRcdFx0XHRcdFx0cmV0dXJuIFwibGlzdC1pdGVtXCI7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKC9eKHRyKSQvaS50ZXN0KHRhZ05hbWUpKSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBcInRhYmxlLXJvd1wiO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICgvXih0YWJsZSkkL2kudGVzdCh0YWdOYW1lKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJ0YWJsZVwiO1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmICgvXih0Ym9keSkkL2kudGVzdCh0YWdOYW1lKSkge1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJ0YWJsZS1yb3ctZ3JvdXBcIjtcclxuXHRcdFx0XHRcdFx0LyogRGVmYXVsdCB0byBcImJsb2NrXCIgd2hlbiBubyBtYXRjaCBpcyBmb3VuZC4gKi9cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBcImJsb2NrXCI7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKiBUaGUgY2xhc3MgYWRkL3JlbW92ZSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gdGVtcG9yYXJpbHkgYXBwbHkgYSBcInZlbG9jaXR5LWFuaW1hdGluZ1wiIGNsYXNzIHRvIGVsZW1lbnRzIHdoaWxlIHRoZXkncmUgYW5pbWF0aW5nLiAqL1xyXG5cdFx0XHRcdGFkZENsYXNzOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHtcclxuXHRcdFx0XHRcdGlmIChlbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdGlmIChlbGVtZW50LmNsYXNzTGlzdCkge1xyXG5cdFx0XHRcdFx0XHRcdGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFR5cGUuaXNTdHJpbmcoZWxlbWVudC5jbGFzc05hbWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gRWxlbWVudC5jbGFzc05hbWUgaXMgYXJvdW5kIDE1JSBmYXN0ZXIgdGhlbiBzZXQvZ2V0QXR0cmlidXRlXHJcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5jbGFzc05hbWUgKz0gKGVsZW1lbnQuY2xhc3NOYW1lLmxlbmd0aCA/IFwiIFwiIDogXCJcIikgKyBjbGFzc05hbWU7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gV29yayBhcm91bmQgZm9yIElFIHN0cmljdCBtb2RlIGFuaW1hdGluZyBTVkcgLSBhbmQgYW55dGhpbmcgZWxzZSB0aGF0IGRvZXNuJ3QgYmVoYXZlIGNvcnJlY3RseSAtIHRoZSBzYW1lIHdheSBqUXVlcnkgZG9lcyBpdFxyXG5cdFx0XHRcdFx0XHRcdHZhciBjdXJyZW50Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShJRSA8PSA3ID8gXCJjbGFzc05hbWVcIiA6IFwiY2xhc3NcIikgfHwgXCJcIjtcclxuXHJcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBjdXJyZW50Q2xhc3MgKyAoY3VycmVudENsYXNzID8gXCIgXCIgOiBcIlwiKSArIGNsYXNzTmFtZSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHJlbW92ZUNsYXNzOiBmdW5jdGlvbihlbGVtZW50LCBjbGFzc05hbWUpIHtcclxuXHRcdFx0XHRcdGlmIChlbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdGlmIChlbGVtZW50LmNsYXNzTGlzdCkge1xyXG5cdFx0XHRcdFx0XHRcdGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKFR5cGUuaXNTdHJpbmcoZWxlbWVudC5jbGFzc05hbWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gRWxlbWVudC5jbGFzc05hbWUgaXMgYXJvdW5kIDE1JSBmYXN0ZXIgdGhlbiBzZXQvZ2V0QXR0cmlidXRlXHJcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogTmVlZCBzb21lIGpzcGVyZiB0ZXN0cyBvbiBwZXJmb3JtYW5jZSAtIGNhbiB3ZSBnZXQgcmlkIG9mIHRoZSByZWdleCBhbmQgbWF5YmUgdXNlIHNwbGl0IC8gYXJyYXkgbWFuaXB1bGF0aW9uP1xyXG5cdFx0XHRcdFx0XHRcdGVsZW1lbnQuY2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWUudG9TdHJpbmcoKS5yZXBsYWNlKG5ldyBSZWdFeHAoXCIoXnxcXFxccylcIiArIGNsYXNzTmFtZS5zcGxpdChcIiBcIikuam9pbihcInxcIikgKyBcIihcXFxcc3wkKVwiLCBcImdpXCIpLCBcIiBcIik7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Ly8gV29yayBhcm91bmQgZm9yIElFIHN0cmljdCBtb2RlIGFuaW1hdGluZyBTVkcgLSBhbmQgYW55dGhpbmcgZWxzZSB0aGF0IGRvZXNuJ3QgYmVoYXZlIGNvcnJlY3RseSAtIHRoZSBzYW1lIHdheSBqUXVlcnkgZG9lcyBpdFxyXG5cdFx0XHRcdFx0XHRcdHZhciBjdXJyZW50Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShJRSA8PSA3ID8gXCJjbGFzc05hbWVcIiA6IFwiY2xhc3NcIikgfHwgXCJcIjtcclxuXHJcblx0XHRcdFx0XHRcdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBjdXJyZW50Q2xhc3MucmVwbGFjZShuZXcgUmVnRXhwKFwiKF58XFxzKVwiICsgY2xhc3NOYW1lLnNwbGl0KFwiIFwiKS5qb2luKFwifFwiKSArIFwiKFxcc3wkKVwiLCBcImdpXCIpLCBcIiBcIikpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHQgU3R5bGUgR2V0dGluZyAmIFNldHRpbmdcclxuXHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHQvKiBUaGUgc2luZ3VsYXIgZ2V0UHJvcGVydHlWYWx1ZSwgd2hpY2ggcm91dGVzIHRoZSBsb2dpYyBmb3IgYWxsIG5vcm1hbGl6YXRpb25zLCBob29rcywgYW5kIHN0YW5kYXJkIENTUyBwcm9wZXJ0aWVzLiAqL1xyXG5cdFx0XHRnZXRQcm9wZXJ0eVZhbHVlOiBmdW5jdGlvbihlbGVtZW50LCBwcm9wZXJ0eSwgcm9vdFByb3BlcnR5VmFsdWUsIGZvcmNlU3R5bGVMb29rdXApIHtcclxuXHRcdFx0XHQvKiBHZXQgYW4gZWxlbWVudCdzIGNvbXB1dGVkIHByb3BlcnR5IHZhbHVlLiAqL1xyXG5cdFx0XHRcdC8qIE5vdGU6IFJldHJpZXZpbmcgdGhlIHZhbHVlIG9mIGEgQ1NTIHByb3BlcnR5IGNhbm5vdCBzaW1wbHkgYmUgcGVyZm9ybWVkIGJ5IGNoZWNraW5nIGFuIGVsZW1lbnQnc1xyXG5cdFx0XHRcdCBzdHlsZSBhdHRyaWJ1dGUgKHdoaWNoIG9ubHkgcmVmbGVjdHMgdXNlci1kZWZpbmVkIHZhbHVlcykuIEluc3RlYWQsIHRoZSBicm93c2VyIG11c3QgYmUgcXVlcmllZCBmb3IgYSBwcm9wZXJ0eSdzXHJcblx0XHRcdFx0ICpjb21wdXRlZCogdmFsdWUuIFlvdSBjYW4gcmVhZCBtb3JlIGFib3V0IGdldENvbXB1dGVkU3R5bGUgaGVyZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvQVBJL3dpbmRvdy5nZXRDb21wdXRlZFN0eWxlICovXHJcblx0XHRcdFx0ZnVuY3Rpb24gY29tcHV0ZVByb3BlcnR5VmFsdWUoZWxlbWVudCwgcHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdC8qIFdoZW4gYm94LXNpemluZyBpc24ndCBzZXQgdG8gYm9yZGVyLWJveCwgaGVpZ2h0IGFuZCB3aWR0aCBzdHlsZSB2YWx1ZXMgYXJlIGluY29ycmVjdGx5IGNvbXB1dGVkIHdoZW4gYW5cclxuXHRcdFx0XHRcdCBlbGVtZW50J3Mgc2Nyb2xsYmFycyBhcmUgdmlzaWJsZSAod2hpY2ggZXhwYW5kcyB0aGUgZWxlbWVudCdzIGRpbWVuc2lvbnMpLiBUaHVzLCB3ZSBkZWZlciB0byB0aGUgbW9yZSBhY2N1cmF0ZVxyXG5cdFx0XHRcdFx0IG9mZnNldEhlaWdodC9XaWR0aCBwcm9wZXJ0eSwgd2hpY2ggaW5jbHVkZXMgdGhlIHRvdGFsIGRpbWVuc2lvbnMgZm9yIGludGVyaW9yLCBib3JkZXIsIHBhZGRpbmcsIGFuZCBzY3JvbGxiYXIuXHJcblx0XHRcdFx0XHQgV2Ugc3VidHJhY3QgYm9yZGVyIGFuZCBwYWRkaW5nIHRvIGdldCB0aGUgc3VtIG9mIGludGVyaW9yICsgc2Nyb2xsYmFyLiAqL1xyXG5cdFx0XHRcdFx0dmFyIGNvbXB1dGVkVmFsdWUgPSAwO1xyXG5cclxuXHRcdFx0XHRcdC8qIElFPD04IGRvZXNuJ3Qgc3VwcG9ydCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSwgdGh1cyB3ZSBkZWZlciB0byBqUXVlcnksIHdoaWNoIGhhcyBhbiBleHRlbnNpdmUgYXJyYXlcclxuXHRcdFx0XHRcdCBvZiBoYWNrcyB0byBhY2N1cmF0ZWx5IHJldHJpZXZlIElFOCBwcm9wZXJ0eSB2YWx1ZXMuIFJlLWltcGxlbWVudGluZyB0aGF0IGxvZ2ljIGhlcmUgaXMgbm90IHdvcnRoIGJsb2F0aW5nIHRoZVxyXG5cdFx0XHRcdFx0IGNvZGViYXNlIGZvciBhIGR5aW5nIGJyb3dzZXIuIFRoZSBwZXJmb3JtYW5jZSByZXBlcmN1c3Npb25zIG9mIHVzaW5nIGpRdWVyeSBoZXJlIGFyZSBtaW5pbWFsIHNpbmNlXHJcblx0XHRcdFx0XHQgVmVsb2NpdHkgaXMgb3B0aW1pemVkIHRvIHJhcmVseSAoYW5kIHNvbWV0aW1lcyBuZXZlcikgcXVlcnkgdGhlIERPTS4gRnVydGhlciwgdGhlICQuY3NzKCkgY29kZXBhdGggaXNuJ3QgdGhhdCBzbG93LiAqL1xyXG5cdFx0XHRcdFx0aWYgKElFIDw9IDgpIHtcclxuXHRcdFx0XHRcdFx0Y29tcHV0ZWRWYWx1ZSA9ICQuY3NzKGVsZW1lbnQsIHByb3BlcnR5KTsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdC8qIEFsbCBvdGhlciBicm93c2VycyBzdXBwb3J0IGdldENvbXB1dGVkU3R5bGUuIFRoZSByZXR1cm5lZCBsaXZlIG9iamVjdCByZWZlcmVuY2UgaXMgY2FjaGVkIG9udG8gaXRzXHJcblx0XHRcdFx0XHRcdCBhc3NvY2lhdGVkIGVsZW1lbnQgc28gdGhhdCBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlZmV0Y2hlZCB1cG9uIGV2ZXJ5IEdFVC4gKi9cclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdC8qIEJyb3dzZXJzIGRvIG5vdCByZXR1cm4gaGVpZ2h0IGFuZCB3aWR0aCB2YWx1ZXMgZm9yIGVsZW1lbnRzIHRoYXQgYXJlIHNldCB0byBkaXNwbGF5Olwibm9uZVwiLiBUaHVzLCB3ZSB0ZW1wb3JhcmlseVxyXG5cdFx0XHRcdFx0XHQgdG9nZ2xlIGRpc3BsYXkgdG8gdGhlIGVsZW1lbnQgdHlwZSdzIGRlZmF1bHQgdmFsdWUuICovXHJcblx0XHRcdFx0XHRcdHZhciB0b2dnbGVEaXNwbGF5ID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoL14od2lkdGh8aGVpZ2h0KSQvLnRlc3QocHJvcGVydHkpICYmIENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwiZGlzcGxheVwiKSA9PT0gMCkge1xyXG5cdFx0XHRcdFx0XHRcdHRvZ2dsZURpc3BsYXkgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdENTUy5zZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwiZGlzcGxheVwiLCBDU1MuVmFsdWVzLmdldERpc3BsYXlUeXBlKGVsZW1lbnQpKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0dmFyIHJldmVydERpc3BsYXkgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAodG9nZ2xlRGlzcGxheSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Q1NTLnNldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJkaXNwbGF5XCIsIFwibm9uZVwiKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAoIWZvcmNlU3R5bGVMb29rdXApIHtcclxuXHRcdFx0XHRcdFx0XHRpZiAocHJvcGVydHkgPT09IFwiaGVpZ2h0XCIgJiYgQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJib3hTaXppbmdcIikudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICE9PSBcImJvcmRlci1ib3hcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFyIGNvbnRlbnRCb3hIZWlnaHQgPSBlbGVtZW50Lm9mZnNldEhlaWdodCAtIChwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwiYm9yZGVyVG9wV2lkdGhcIikpIHx8IDApIC0gKHBhcnNlRmxvYXQoQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJib3JkZXJCb3R0b21XaWR0aFwiKSkgfHwgMCkgLSAocGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcInBhZGRpbmdUb3BcIikpIHx8IDApIC0gKHBhcnNlRmxvYXQoQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJwYWRkaW5nQm90dG9tXCIpKSB8fCAwKTtcclxuXHRcdFx0XHRcdFx0XHRcdHJldmVydERpc3BsYXkoKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gY29udGVudEJveEhlaWdodDtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHByb3BlcnR5ID09PSBcIndpZHRoXCIgJiYgQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJib3hTaXppbmdcIikudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICE9PSBcImJvcmRlci1ib3hcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFyIGNvbnRlbnRCb3hXaWR0aCA9IGVsZW1lbnQub2Zmc2V0V2lkdGggLSAocGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcImJvcmRlckxlZnRXaWR0aFwiKSkgfHwgMCkgLSAocGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcImJvcmRlclJpZ2h0V2lkdGhcIikpIHx8IDApIC0gKHBhcnNlRmxvYXQoQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJwYWRkaW5nTGVmdFwiKSkgfHwgMCkgLSAocGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcInBhZGRpbmdSaWdodFwiKSkgfHwgMCk7XHJcblx0XHRcdFx0XHRcdFx0XHRyZXZlcnREaXNwbGF5KCk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGNvbnRlbnRCb3hXaWR0aDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdHZhciBjb21wdXRlZFN0eWxlO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogRm9yIGVsZW1lbnRzIHRoYXQgVmVsb2NpdHkgaGFzbid0IGJlZW4gY2FsbGVkIG9uIGRpcmVjdGx5IChlLmcuIHdoZW4gVmVsb2NpdHkgcXVlcmllcyB0aGUgRE9NIG9uIGJlaGFsZlxyXG5cdFx0XHRcdFx0XHQgb2YgYSBwYXJlbnQgb2YgYW4gZWxlbWVudCBpdHMgYW5pbWF0aW5nKSwgcGVyZm9ybSBhIGRpcmVjdCBnZXRDb21wdXRlZFN0eWxlIGxvb2t1cCBzaW5jZSB0aGUgb2JqZWN0IGlzbid0IGNhY2hlZC4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKERhdGEoZWxlbWVudCkgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCBudWxsKTsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdFx0LyogSWYgdGhlIGNvbXB1dGVkU3R5bGUgb2JqZWN0IGhhcyB5ZXQgdG8gYmUgY2FjaGVkLCBkbyBzbyBub3cuICovXHJcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIURhdGEoZWxlbWVudCkuY29tcHV0ZWRTdHlsZSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbXB1dGVkU3R5bGUgPSBEYXRhKGVsZW1lbnQpLmNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCBudWxsKTsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdFx0LyogSWYgY29tcHV0ZWRTdHlsZSBpcyBjYWNoZWQsIHVzZSBpdC4gKi9cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRjb21wdXRlZFN0eWxlID0gRGF0YShlbGVtZW50KS5jb21wdXRlZFN0eWxlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBJRSBhbmQgRmlyZWZveCBkbyBub3QgcmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBnZW5lcmljIGJvcmRlckNvbG9yIC0tIHRoZXkgb25seSByZXR1cm4gaW5kaXZpZHVhbCB2YWx1ZXMgZm9yIGVhY2ggYm9yZGVyIHNpZGUncyBjb2xvci5cclxuXHRcdFx0XHRcdFx0IEFsc28sIGluIGFsbCBicm93c2Vycywgd2hlbiBib3JkZXIgY29sb3JzIGFyZW4ndCBhbGwgdGhlIHNhbWUsIGEgY29tcG91bmQgdmFsdWUgaXMgcmV0dXJuZWQgdGhhdCBWZWxvY2l0eSBpc24ndCBzZXR1cCB0byBwYXJzZS5cclxuXHRcdFx0XHRcdFx0IFNvLCBhcyBhIHBvbHlmaWxsIGZvciBxdWVyeWluZyBpbmRpdmlkdWFsIGJvcmRlciBzaWRlIGNvbG9ycywgd2UganVzdCByZXR1cm4gdGhlIHRvcCBib3JkZXIncyBjb2xvciBhbmQgYW5pbWF0ZSBhbGwgYm9yZGVycyBmcm9tIHRoYXQgdmFsdWUuICovXHJcblx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gXCJib3JkZXJDb2xvclwiKSB7XHJcblx0XHRcdFx0XHRcdFx0cHJvcGVydHkgPSBcImJvcmRlclRvcENvbG9yXCI7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIElFOSBoYXMgYSBidWcgaW4gd2hpY2ggdGhlIFwiZmlsdGVyXCIgcHJvcGVydHkgbXVzdCBiZSBhY2Nlc3NlZCBmcm9tIGNvbXB1dGVkU3R5bGUgdXNpbmcgdGhlIGdldFByb3BlcnR5VmFsdWUgbWV0aG9kXHJcblx0XHRcdFx0XHRcdCBpbnN0ZWFkIG9mIGEgZGlyZWN0IHByb3BlcnR5IGxvb2t1cC4gVGhlIGdldFByb3BlcnR5VmFsdWUgbWV0aG9kIGlzIHNsb3dlciB0aGFuIGEgZGlyZWN0IGxvb2t1cCwgd2hpY2ggaXMgd2h5IHdlIGF2b2lkIGl0IGJ5IGRlZmF1bHQuICovXHJcblx0XHRcdFx0XHRcdGlmIChJRSA9PT0gOSAmJiBwcm9wZXJ0eSA9PT0gXCJmaWx0ZXJcIikge1xyXG5cdFx0XHRcdFx0XHRcdGNvbXB1dGVkVmFsdWUgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHkpOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRjb21wdXRlZFZhbHVlID0gY29tcHV0ZWRTdHlsZVtwcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIEZhbGwgYmFjayB0byB0aGUgcHJvcGVydHkncyBzdHlsZSB2YWx1ZSAoaWYgZGVmaW5lZCkgd2hlbiBjb21wdXRlZFZhbHVlIHJldHVybnMgbm90aGluZyxcclxuXHRcdFx0XHRcdFx0IHdoaWNoIGNhbiBoYXBwZW4gd2hlbiB0aGUgZWxlbWVudCBoYXNuJ3QgYmVlbiBwYWludGVkLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoY29tcHV0ZWRWYWx1ZSA9PT0gXCJcIiB8fCBjb21wdXRlZFZhbHVlID09PSBudWxsKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29tcHV0ZWRWYWx1ZSA9IGVsZW1lbnQuc3R5bGVbcHJvcGVydHldO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRyZXZlcnREaXNwbGF5KCk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogRm9yIHRvcCwgcmlnaHQsIGJvdHRvbSwgYW5kIGxlZnQgKFRSQkwpIHZhbHVlcyB0aGF0IGFyZSBzZXQgdG8gXCJhdXRvXCIgb24gZWxlbWVudHMgb2YgXCJmaXhlZFwiIG9yIFwiYWJzb2x1dGVcIiBwb3NpdGlvbixcclxuXHRcdFx0XHRcdCBkZWZlciB0byBqUXVlcnkgZm9yIGNvbnZlcnRpbmcgXCJhdXRvXCIgdG8gYSBudW1lcmljIHZhbHVlLiAoRm9yIGVsZW1lbnRzIHdpdGggYSBcInN0YXRpY1wiIG9yIFwicmVsYXRpdmVcIiBwb3NpdGlvbiwgXCJhdXRvXCIgaGFzIHRoZSBzYW1lXHJcblx0XHRcdFx0XHQgZWZmZWN0IGFzIGJlaW5nIHNldCB0byAwLCBzbyBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeS4pICovXHJcblx0XHRcdFx0XHQvKiBBbiBleGFtcGxlIG9mIHdoeSBudW1lcmljIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5OiBXaGVuIGFuIGVsZW1lbnQgd2l0aCBcInBvc2l0aW9uOmFic29sdXRlXCIgaGFzIGFuIHVudG91Y2hlZCBcImxlZnRcIlxyXG5cdFx0XHRcdFx0IHByb3BlcnR5LCB3aGljaCByZXZlcnRzIHRvIFwiYXV0b1wiLCBsZWZ0J3MgdmFsdWUgaXMgMCByZWxhdGl2ZSB0byBpdHMgcGFyZW50IGVsZW1lbnQsIGJ1dCBpcyBvZnRlbiBub24temVybyByZWxhdGl2ZVxyXG5cdFx0XHRcdFx0IHRvIGl0cyAqY29udGFpbmluZyogKG5vdCBwYXJlbnQpIGVsZW1lbnQsIHdoaWNoIGlzIHRoZSBuZWFyZXN0IFwicG9zaXRpb246cmVsYXRpdmVcIiBhbmNlc3RvciBvciB0aGUgdmlld3BvcnQgKGFuZCBhbHdheXMgdGhlIHZpZXdwb3J0IGluIHRoZSBjYXNlIG9mIFwicG9zaXRpb246Zml4ZWRcIikuICovXHJcblx0XHRcdFx0XHRpZiAoY29tcHV0ZWRWYWx1ZSA9PT0gXCJhdXRvXCIgJiYgL14odG9wfHJpZ2h0fGJvdHRvbXxsZWZ0KSQvaS50ZXN0KHByb3BlcnR5KSkge1xyXG5cdFx0XHRcdFx0XHR2YXIgcG9zaXRpb24gPSBjb21wdXRlUHJvcGVydHlWYWx1ZShlbGVtZW50LCBcInBvc2l0aW9uXCIpOyAvKiBHRVQgKi9cclxuXHJcblx0XHRcdFx0XHRcdC8qIEZvciBhYnNvbHV0ZSBwb3NpdGlvbmluZywgalF1ZXJ5J3MgJC5wb3NpdGlvbigpIG9ubHkgcmV0dXJucyB2YWx1ZXMgZm9yIHRvcCBhbmQgbGVmdDtcclxuXHRcdFx0XHRcdFx0IHJpZ2h0IGFuZCBib3R0b20gd2lsbCBoYXZlIHRoZWlyIFwiYXV0b1wiIHZhbHVlIHJldmVydGVkIHRvIDAuICovXHJcblx0XHRcdFx0XHRcdC8qIE5vdGU6IEEgalF1ZXJ5IG9iamVjdCBtdXN0IGJlIGNyZWF0ZWQgaGVyZSBzaW5jZSBqUXVlcnkgZG9lc24ndCBoYXZlIGEgbG93LWxldmVsIGFsaWFzIGZvciAkLnBvc2l0aW9uKCkuXHJcblx0XHRcdFx0XHRcdCBOb3QgYSBiaWcgZGVhbCBzaW5jZSB3ZSdyZSBjdXJyZW50bHkgaW4gYSBHRVQgYmF0Y2ggYW55d2F5LiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAocG9zaXRpb24gPT09IFwiZml4ZWRcIiB8fCAocG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiAmJiAvdG9wfGxlZnQvaS50ZXN0KHByb3BlcnR5KSkpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBqUXVlcnkgc3RyaXBzIHRoZSBwaXhlbCB1bml0IGZyb20gaXRzIHJldHVybmVkIHZhbHVlczsgd2UgcmUtYWRkIGl0IGhlcmUgdG8gY29uZm9ybSB3aXRoIGNvbXB1dGVQcm9wZXJ0eVZhbHVlJ3MgYmVoYXZpb3IuICovXHJcblx0XHRcdFx0XHRcdFx0Y29tcHV0ZWRWYWx1ZSA9ICQoZWxlbWVudCkucG9zaXRpb24oKVtwcm9wZXJ0eV0gKyBcInB4XCI7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIGNvbXB1dGVkVmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHR2YXIgcHJvcGVydHlWYWx1ZTtcclxuXHJcblx0XHRcdFx0LyogSWYgdGhpcyBpcyBhIGhvb2tlZCBwcm9wZXJ0eSAoZS5nLiBcImNsaXBMZWZ0XCIgaW5zdGVhZCBvZiB0aGUgcm9vdCBwcm9wZXJ0eSBvZiBcImNsaXBcIiksXHJcblx0XHRcdFx0IGV4dHJhY3QgdGhlIGhvb2sncyB2YWx1ZSBmcm9tIGEgbm9ybWFsaXplZCByb290UHJvcGVydHlWYWx1ZSB1c2luZyBDU1MuSG9va3MuZXh0cmFjdFZhbHVlKCkuICovXHJcblx0XHRcdFx0aWYgKENTUy5Ib29rcy5yZWdpc3RlcmVkW3Byb3BlcnR5XSkge1xyXG5cdFx0XHRcdFx0dmFyIGhvb2sgPSBwcm9wZXJ0eSxcclxuXHRcdFx0XHRcdFx0XHRob29rUm9vdCA9IENTUy5Ib29rcy5nZXRSb290KGhvb2spO1xyXG5cclxuXHRcdFx0XHRcdC8qIElmIGEgY2FjaGVkIHJvb3RQcm9wZXJ0eVZhbHVlIHdhc24ndCBwYXNzZWQgaW4gKHdoaWNoIFZlbG9jaXR5IGFsd2F5cyBhdHRlbXB0cyB0byBkbyBpbiBvcmRlciB0byBhdm9pZCByZXF1ZXJ5aW5nIHRoZSBET00pLFxyXG5cdFx0XHRcdFx0IHF1ZXJ5IHRoZSBET00gZm9yIHRoZSByb290IHByb3BlcnR5J3MgdmFsdWUuICovXHJcblx0XHRcdFx0XHRpZiAocm9vdFByb3BlcnR5VmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHQvKiBTaW5jZSB0aGUgYnJvd3NlciBpcyBub3cgYmVpbmcgZGlyZWN0bHkgcXVlcmllZCwgdXNlIHRoZSBvZmZpY2lhbCBwb3N0LXByZWZpeGluZyBwcm9wZXJ0eSBuYW1lIGZvciB0aGlzIGxvb2t1cC4gKi9cclxuXHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSBDU1MuZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBDU1MuTmFtZXMucHJlZml4Q2hlY2soaG9va1Jvb3QpWzBdKTsgLyogR0VUICovXHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogSWYgdGhpcyByb290IGhhcyBhIG5vcm1hbGl6YXRpb24gcmVnaXN0ZXJlZCwgcGVmb3JtIHRoZSBhc3NvY2lhdGVkIG5vcm1hbGl6YXRpb24gZXh0cmFjdGlvbi4gKi9cclxuXHRcdFx0XHRcdGlmIChDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtob29rUm9vdF0pIHtcclxuXHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSBDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtob29rUm9vdF0oXCJleHRyYWN0XCIsIGVsZW1lbnQsIHJvb3RQcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBFeHRyYWN0IHRoZSBob29rJ3MgdmFsdWUuICovXHJcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gQ1NTLkhvb2tzLmV4dHJhY3RWYWx1ZShob29rLCByb290UHJvcGVydHlWYWx1ZSk7XHJcblxyXG5cdFx0XHRcdFx0LyogSWYgdGhpcyBpcyBhIG5vcm1hbGl6ZWQgcHJvcGVydHkgKGUuZy4gXCJvcGFjaXR5XCIgYmVjb21lcyBcImZpbHRlclwiIGluIDw9SUU4KSBvciBcInRyYW5zbGF0ZVhcIiBiZWNvbWVzIFwidHJhbnNmb3JtXCIpLFxyXG5cdFx0XHRcdFx0IG5vcm1hbGl6ZSB0aGUgcHJvcGVydHkncyBuYW1lIGFuZCB2YWx1ZSwgYW5kIGhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIHRyYW5zZm9ybXMuICovXHJcblx0XHRcdFx0XHQvKiBOb3RlOiBOb3JtYWxpemluZyBhIHByb3BlcnR5IGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSBmcm9tIGhvb2tpbmcgYSBwcm9wZXJ0eSBzaW5jZSBob29rLWV4dHJhY3RlZCB2YWx1ZXMgYXJlIHN0cmljdGx5XHJcblx0XHRcdFx0XHQgbnVtZXJpY2FsIGFuZCB0aGVyZWZvcmUgZG8gbm90IHJlcXVpcmUgbm9ybWFsaXphdGlvbiBleHRyYWN0aW9uLiAqL1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAoQ1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbcHJvcGVydHldKSB7XHJcblx0XHRcdFx0XHR2YXIgbm9ybWFsaXplZFByb3BlcnR5TmFtZSxcclxuXHRcdFx0XHRcdFx0XHRub3JtYWxpemVkUHJvcGVydHlWYWx1ZTtcclxuXHJcblx0XHRcdFx0XHRub3JtYWxpemVkUHJvcGVydHlOYW1lID0gQ1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbcHJvcGVydHldKFwibmFtZVwiLCBlbGVtZW50KTtcclxuXHJcblx0XHRcdFx0XHQvKiBUcmFuc2Zvcm0gdmFsdWVzIGFyZSBjYWxjdWxhdGVkIHZpYSBub3JtYWxpemF0aW9uIGV4dHJhY3Rpb24gKHNlZSBiZWxvdyksIHdoaWNoIGNoZWNrcyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgdHJhbnNmb3JtQ2FjaGUuXHJcblx0XHRcdFx0XHQgQXQgbm8gcG9pbnQgZG8gdHJhbnNmb3JtIEdFVHMgZXZlciBhY3R1YWxseSBxdWVyeSB0aGUgRE9NOyBpbml0aWFsIHN0eWxlc2hlZXQgdmFsdWVzIGFyZSBuZXZlciBwcm9jZXNzZWQuXHJcblx0XHRcdFx0XHQgVGhpcyBpcyBiZWNhdXNlIHBhcnNpbmcgM0QgdHJhbnNmb3JtIG1hdHJpY2VzIGlzIG5vdCBhbHdheXMgYWNjdXJhdGUgYW5kIHdvdWxkIGJsb2F0IG91ciBjb2RlYmFzZTtcclxuXHRcdFx0XHRcdCB0aHVzLCBub3JtYWxpemF0aW9uIGV4dHJhY3Rpb24gZGVmYXVsdHMgaW5pdGlhbCB0cmFuc2Zvcm0gdmFsdWVzIHRvIHRoZWlyIHplcm8tdmFsdWVzIChlLmcuIDEgZm9yIHNjYWxlWCBhbmQgMCBmb3IgdHJhbnNsYXRlWCkuICovXHJcblx0XHRcdFx0XHRpZiAobm9ybWFsaXplZFByb3BlcnR5TmFtZSAhPT0gXCJ0cmFuc2Zvcm1cIikge1xyXG5cdFx0XHRcdFx0XHRub3JtYWxpemVkUHJvcGVydHlWYWx1ZSA9IGNvbXB1dGVQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIENTUy5OYW1lcy5wcmVmaXhDaGVjayhub3JtYWxpemVkUHJvcGVydHlOYW1lKVswXSk7IC8qIEdFVCAqL1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIHZhbHVlIGlzIGEgQ1NTIG51bGwtdmFsdWUgYW5kIHRoaXMgcHJvcGVydHkgaGFzIGEgaG9vayB0ZW1wbGF0ZSwgdXNlIHRoYXQgemVyby12YWx1ZSB0ZW1wbGF0ZSBzbyB0aGF0IGhvb2tzIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBpdC4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKENTUy5WYWx1ZXMuaXNDU1NOdWxsVmFsdWUobm9ybWFsaXplZFByb3BlcnR5VmFsdWUpICYmIENTUy5Ib29rcy50ZW1wbGF0ZXNbcHJvcGVydHldKSB7XHJcblx0XHRcdFx0XHRcdFx0bm9ybWFsaXplZFByb3BlcnR5VmFsdWUgPSBDU1MuSG9va3MudGVtcGxhdGVzW3Byb3BlcnR5XVsxXTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSBDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtwcm9wZXJ0eV0oXCJleHRyYWN0XCIsIGVsZW1lbnQsIG5vcm1hbGl6ZWRQcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qIElmIGEgKG51bWVyaWMpIHZhbHVlIHdhc24ndCBwcm9kdWNlZCB2aWEgaG9vayBleHRyYWN0aW9uIG9yIG5vcm1hbGl6YXRpb24sIHF1ZXJ5IHRoZSBET00uICovXHJcblx0XHRcdFx0aWYgKCEvXltcXGQtXS8udGVzdChwcm9wZXJ0eVZhbHVlKSkge1xyXG5cdFx0XHRcdFx0LyogRm9yIFNWRyBlbGVtZW50cywgZGltZW5zaW9uYWwgcHJvcGVydGllcyAod2hpY2ggU1ZHQXR0cmlidXRlKCkgZGV0ZWN0cykgYXJlIHR3ZWVuZWQgdmlhXHJcblx0XHRcdFx0XHQgdGhlaXIgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzIGluc3RlYWQgb2YgdGhlaXIgQ1NTIHN0eWxlIHZhbHVlcy4gKi9cclxuXHRcdFx0XHRcdHZhciBkYXRhID0gRGF0YShlbGVtZW50KTtcclxuXHJcblx0XHRcdFx0XHRpZiAoZGF0YSAmJiBkYXRhLmlzU1ZHICYmIENTUy5OYW1lcy5TVkdBdHRyaWJ1dGUocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdC8qIFNpbmNlIHRoZSBoZWlnaHQvd2lkdGggYXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIHNldCBtYW51YWxseSwgdGhleSBkb24ndCByZWZsZWN0IGNvbXB1dGVkIHZhbHVlcy5cclxuXHRcdFx0XHRcdFx0IFRodXMsIHdlIHVzZSB1c2UgZ2V0QkJveCgpIHRvIGVuc3VyZSB3ZSBhbHdheXMgZ2V0IHZhbHVlcyBmb3IgZWxlbWVudHMgd2l0aCB1bmRlZmluZWQgaGVpZ2h0L3dpZHRoIGF0dHJpYnV0ZXMuICovXHJcblx0XHRcdFx0XHRcdGlmICgvXihoZWlnaHR8d2lkdGgpJC9pLnRlc3QocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogRmlyZWZveCB0aHJvd3MgYW4gZXJyb3IgaWYgLmdldEJCb3goKSBpcyBjYWxsZWQgb24gYW4gU1ZHIHRoYXQgaXNuJ3QgYXR0YWNoZWQgdG8gdGhlIERPTS4gKi9cclxuXHRcdFx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IGVsZW1lbnQuZ2V0QkJveCgpW3Byb3BlcnR5XTtcclxuXHRcdFx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xyXG5cdFx0XHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IDA7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdC8qIE90aGVyd2lzZSwgYWNjZXNzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZGlyZWN0bHkuICovXHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKHByb3BlcnR5KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IGNvbXB1dGVQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIENTUy5OYW1lcy5wcmVmaXhDaGVjayhwcm9wZXJ0eSlbMF0pOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qIFNpbmNlIHByb3BlcnR5IGxvb2t1cHMgYXJlIGZvciBhbmltYXRpb24gcHVycG9zZXMgKHdoaWNoIGVudGFpbHMgY29tcHV0aW5nIHRoZSBudW1lcmljIGRlbHRhIGJldHdlZW4gc3RhcnQgYW5kIGVuZCB2YWx1ZXMpLFxyXG5cdFx0XHRcdCBjb252ZXJ0IENTUyBudWxsLXZhbHVlcyB0byBhbiBpbnRlZ2VyIG9mIHZhbHVlIDAuICovXHJcblx0XHRcdFx0aWYgKENTUy5WYWx1ZXMuaXNDU1NOdWxsVmFsdWUocHJvcGVydHlWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSAwO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKFZlbG9jaXR5LmRlYnVnID49IDIpIHtcclxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiR2V0IFwiICsgcHJvcGVydHkgKyBcIjogXCIgKyBwcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiBwcm9wZXJ0eVZhbHVlO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKiBUaGUgc2luZ3VsYXIgc2V0UHJvcGVydHlWYWx1ZSwgd2hpY2ggcm91dGVzIHRoZSBsb2dpYyBmb3IgYWxsIG5vcm1hbGl6YXRpb25zLCBob29rcywgYW5kIHN0YW5kYXJkIENTUyBwcm9wZXJ0aWVzLiAqL1xyXG5cdFx0XHRzZXRQcm9wZXJ0eVZhbHVlOiBmdW5jdGlvbihlbGVtZW50LCBwcm9wZXJ0eSwgcHJvcGVydHlWYWx1ZSwgcm9vdFByb3BlcnR5VmFsdWUsIHNjcm9sbERhdGEpIHtcclxuXHRcdFx0XHR2YXIgcHJvcGVydHlOYW1lID0gcHJvcGVydHk7XHJcblxyXG5cdFx0XHRcdC8qIEluIG9yZGVyIHRvIGJlIHN1YmplY3RlZCB0byBjYWxsIG9wdGlvbnMgYW5kIGVsZW1lbnQgcXVldWVpbmcsIHNjcm9sbCBhbmltYXRpb24gaXMgcm91dGVkIHRocm91Z2ggVmVsb2NpdHkgYXMgaWYgaXQgd2VyZSBhIHN0YW5kYXJkIENTUyBwcm9wZXJ0eS4gKi9cclxuXHRcdFx0XHRpZiAocHJvcGVydHkgPT09IFwic2Nyb2xsXCIpIHtcclxuXHRcdFx0XHRcdC8qIElmIGEgY29udGFpbmVyIG9wdGlvbiBpcyBwcmVzZW50LCBzY3JvbGwgdGhlIGNvbnRhaW5lciBpbnN0ZWFkIG9mIHRoZSBicm93c2VyIHdpbmRvdy4gKi9cclxuXHRcdFx0XHRcdGlmIChzY3JvbGxEYXRhLmNvbnRhaW5lcikge1xyXG5cdFx0XHRcdFx0XHRzY3JvbGxEYXRhLmNvbnRhaW5lcltcInNjcm9sbFwiICsgc2Nyb2xsRGF0YS5kaXJlY3Rpb25dID0gcHJvcGVydHlWYWx1ZTtcclxuXHRcdFx0XHRcdFx0LyogT3RoZXJ3aXNlLCBWZWxvY2l0eSBkZWZhdWx0cyB0byBzY3JvbGxpbmcgdGhlIGJyb3dzZXIgd2luZG93LiAqL1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0aWYgKHNjcm9sbERhdGEuZGlyZWN0aW9uID09PSBcIkxlZnRcIikge1xyXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zY3JvbGxUbyhwcm9wZXJ0eVZhbHVlLCBzY3JvbGxEYXRhLmFsdGVybmF0ZVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHR3aW5kb3cuc2Nyb2xsVG8oc2Nyb2xsRGF0YS5hbHRlcm5hdGVWYWx1ZSwgcHJvcGVydHlWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0LyogVHJhbnNmb3JtcyAodHJhbnNsYXRlWCwgcm90YXRlWiwgZXRjLikgYXJlIGFwcGxpZWQgdG8gYSBwZXItZWxlbWVudCB0cmFuc2Zvcm1DYWNoZSBvYmplY3QsIHdoaWNoIGlzIG1hbnVhbGx5IGZsdXNoZWQgdmlhIGZsdXNoVHJhbnNmb3JtQ2FjaGUoKS5cclxuXHRcdFx0XHRcdCBUaHVzLCBmb3Igbm93LCB3ZSBtZXJlbHkgY2FjaGUgdHJhbnNmb3JtcyBiZWluZyBTRVQuICovXHJcblx0XHRcdFx0XHRpZiAoQ1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbcHJvcGVydHldICYmIENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkW3Byb3BlcnR5XShcIm5hbWVcIiwgZWxlbWVudCkgPT09IFwidHJhbnNmb3JtXCIpIHtcclxuXHRcdFx0XHRcdFx0LyogUGVyZm9ybSBhIG5vcm1hbGl6YXRpb24gaW5qZWN0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHQvKiBOb3RlOiBUaGUgbm9ybWFsaXphdGlvbiBsb2dpYyBoYW5kbGVzIHRoZSB0cmFuc2Zvcm1DYWNoZSB1cGRhdGluZy4gKi9cclxuXHRcdFx0XHRcdFx0Q1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbcHJvcGVydHldKFwiaW5qZWN0XCIsIGVsZW1lbnQsIHByb3BlcnR5VmFsdWUpO1xyXG5cclxuXHRcdFx0XHRcdFx0cHJvcGVydHlOYW1lID0gXCJ0cmFuc2Zvcm1cIjtcclxuXHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IERhdGEoZWxlbWVudCkudHJhbnNmb3JtQ2FjaGVbcHJvcGVydHldO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0LyogSW5qZWN0IGhvb2tzLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoQ1NTLkhvb2tzLnJlZ2lzdGVyZWRbcHJvcGVydHldKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIGhvb2tOYW1lID0gcHJvcGVydHksXHJcblx0XHRcdFx0XHRcdFx0XHRcdGhvb2tSb290ID0gQ1NTLkhvb2tzLmdldFJvb3QocHJvcGVydHkpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBJZiBhIGNhY2hlZCByb290UHJvcGVydHlWYWx1ZSB3YXMgbm90IHByb3ZpZGVkLCBxdWVyeSB0aGUgRE9NIGZvciB0aGUgaG9va1Jvb3QncyBjdXJyZW50IHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlID0gcm9vdFByb3BlcnR5VmFsdWUgfHwgQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgaG9va1Jvb3QpOyAvKiBHRVQgKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IENTUy5Ib29rcy5pbmplY3RWYWx1ZShob29rTmFtZSwgcHJvcGVydHlWYWx1ZSwgcm9vdFByb3BlcnR5VmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5ID0gaG9va1Jvb3Q7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIE5vcm1hbGl6ZSBuYW1lcyBhbmQgdmFsdWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoQ1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbcHJvcGVydHldKSB7XHJcblx0XHRcdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkW3Byb3BlcnR5XShcImluamVjdFwiLCBlbGVtZW50LCBwcm9wZXJ0eVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRwcm9wZXJ0eSA9IENTUy5Ob3JtYWxpemF0aW9ucy5yZWdpc3RlcmVkW3Byb3BlcnR5XShcIm5hbWVcIiwgZWxlbWVudCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIEFzc2lnbiB0aGUgYXBwcm9wcmlhdGUgdmVuZG9yIHByZWZpeCBiZWZvcmUgcGVyZm9ybWluZyBhbiBvZmZpY2lhbCBzdHlsZSB1cGRhdGUuICovXHJcblx0XHRcdFx0XHRcdHByb3BlcnR5TmFtZSA9IENTUy5OYW1lcy5wcmVmaXhDaGVjayhwcm9wZXJ0eSlbMF07XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBBIHRyeS9jYXRjaCBpcyB1c2VkIGZvciBJRTw9OCwgd2hpY2ggdGhyb3dzIGFuIGVycm9yIHdoZW4gXCJpbnZhbGlkXCIgQ1NTIHZhbHVlcyBhcmUgc2V0LCBlLmcuIGEgbmVnYXRpdmUgd2lkdGguXHJcblx0XHRcdFx0XHRcdCBUcnkvY2F0Y2ggaXMgYXZvaWRlZCBmb3Igb3RoZXIgYnJvd3NlcnMgc2luY2UgaXQgaW5jdXJzIGEgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQuICovXHJcblx0XHRcdFx0XHRcdGlmIChJRSA8PSA4KSB7XHJcblx0XHRcdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHRcdGVsZW1lbnQuc3R5bGVbcHJvcGVydHlOYW1lXSA9IHByb3BlcnR5VmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChWZWxvY2l0eS5kZWJ1Zykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhcIkJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBbXCIgKyBwcm9wZXJ0eVZhbHVlICsgXCJdIGZvciBbXCIgKyBwcm9wZXJ0eU5hbWUgKyBcIl1cIik7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdC8qIFNWRyBlbGVtZW50cyBoYXZlIHRoZWlyIGRpbWVuc2lvbmFsIHByb3BlcnRpZXMgKHdpZHRoLCBoZWlnaHQsIHgsIHksIGN4LCBldGMuKSBhcHBsaWVkIGRpcmVjdGx5IGFzIGF0dHJpYnV0ZXMgaW5zdGVhZCBvZiBhcyBzdHlsZXMuICovXHJcblx0XHRcdFx0XHRcdFx0LyogTm90ZTogSUU4IGRvZXMgbm90IHN1cHBvcnQgU1ZHIGVsZW1lbnRzLCBzbyBpdCdzIG9rYXkgdGhhdCB3ZSBza2lwIGl0IGZvciBTVkcgYW5pbWF0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdHZhciBkYXRhID0gRGF0YShlbGVtZW50KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKGRhdGEgJiYgZGF0YS5pc1NWRyAmJiBDU1MuTmFtZXMuU1ZHQXR0cmlidXRlKHByb3BlcnR5KSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogTm90ZTogRm9yIFNWRyBhdHRyaWJ1dGVzLCB2ZW5kb3ItcHJlZml4ZWQgcHJvcGVydHkgbmFtZXMgYXJlIG5ldmVyIHVzZWQuICovXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBOb3QgYWxsIENTUyBwcm9wZXJ0aWVzIGNhbiBiZSBhbmltYXRlZCB2aWEgYXR0cmlidXRlcywgYnV0IHRoZSBicm93c2VyIHdvbid0IHRocm93IGFuIGVycm9yIGZvciB1bnN1cHBvcnRlZCBwcm9wZXJ0aWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0ZWxlbWVudC5zZXRBdHRyaWJ1dGUocHJvcGVydHksIHByb3BlcnR5VmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlbGVtZW50LnN0eWxlW3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LmRlYnVnID49IDIpIHtcclxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhcIlNldCBcIiArIHByb3BlcnR5ICsgXCIgKFwiICsgcHJvcGVydHlOYW1lICsgXCIpOiBcIiArIHByb3BlcnR5VmFsdWUpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKiBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUgaW4gY2FzZSB0aGUgY2FsbGVyIHdhbnRzIHRvIGtub3cgaG93IHRoZXNlIHZhbHVlcyB3ZXJlIG1vZGlmaWVkIGJlZm9yZSBiZWluZyBhcHBsaWVkIHRvIHRoZSBET00uICovXHJcblx0XHRcdFx0cmV0dXJuIFtwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWVdO1xyXG5cdFx0XHR9LFxyXG5cdFx0XHQvKiBUbyBpbmNyZWFzZSBwZXJmb3JtYW5jZSBieSBiYXRjaGluZyB0cmFuc2Zvcm0gdXBkYXRlcyBpbnRvIGEgc2luZ2xlIFNFVCwgdHJhbnNmb3JtcyBhcmUgbm90IGRpcmVjdGx5IGFwcGxpZWQgdG8gYW4gZWxlbWVudCB1bnRpbCBmbHVzaFRyYW5zZm9ybUNhY2hlKCkgaXMgY2FsbGVkLiAqL1xyXG5cdFx0XHQvKiBOb3RlOiBWZWxvY2l0eSBhcHBsaWVzIHRyYW5zZm9ybSBwcm9wZXJ0aWVzIGluIHRoZSBzYW1lIG9yZGVyIHRoYXQgdGhleSBhcmUgY2hyb25vZ2ljYWxseSBpbnRyb2R1Y2VkIHRvIHRoZSBlbGVtZW50J3MgQ1NTIHN0eWxlcy4gKi9cclxuXHRcdFx0Zmx1c2hUcmFuc2Zvcm1DYWNoZTogZnVuY3Rpb24oZWxlbWVudCkge1xyXG5cdFx0XHRcdHZhciB0cmFuc2Zvcm1TdHJpbmcgPSBcIlwiLFxyXG5cdFx0XHRcdFx0XHRkYXRhID0gRGF0YShlbGVtZW50KTtcclxuXHJcblx0XHRcdFx0LyogQ2VydGFpbiBicm93c2VycyByZXF1aXJlIHRoYXQgU1ZHIHRyYW5zZm9ybXMgYmUgYXBwbGllZCBhcyBhbiBhdHRyaWJ1dGUuIEhvd2V2ZXIsIHRoZSBTVkcgdHJhbnNmb3JtIGF0dHJpYnV0ZSB0YWtlcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgQ1NTJ3MgdHJhbnNmb3JtIHN0cmluZ1xyXG5cdFx0XHRcdCAodW5pdHMgYXJlIGRyb3BwZWQgYW5kLCBleGNlcHQgZm9yIHNrZXdYL1ksIHN1YnByb3BlcnRpZXMgYXJlIG1lcmdlZCBpbnRvIHRoZWlyIG1hc3RlciBwcm9wZXJ0eSAtLSBlLmcuIHNjYWxlWCBhbmQgc2NhbGVZIGFyZSBtZXJnZWQgaW50byBzY2FsZShYIFkpLiAqL1xyXG5cdFx0XHRcdGlmICgoSUUgfHwgKFZlbG9jaXR5LlN0YXRlLmlzQW5kcm9pZCAmJiAhVmVsb2NpdHkuU3RhdGUuaXNDaHJvbWUpKSAmJiBkYXRhICYmIGRhdGEuaXNTVkcpIHtcclxuXHRcdFx0XHRcdC8qIFNpbmNlIHRyYW5zZm9ybSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGVpciBwYXJlbnRoZXNlcy13cmFwcGVkIGZvcm0sIHdlIHVzZSBhIGhlbHBlciBmdW5jdGlvbiB0byBzdHJpcCBvdXQgdGhlaXIgbnVtZXJpYyB2YWx1ZXMuXHJcblx0XHRcdFx0XHQgRnVydGhlciwgU1ZHIHRyYW5zZm9ybSBwcm9wZXJ0aWVzIG9ubHkgdGFrZSB1bml0bGVzcyAocmVwcmVzZW50aW5nIHBpeGVscykgdmFsdWVzLCBzbyBpdCdzIG9rYXkgdGhhdCBwYXJzZUZsb2F0KCkgc3RyaXBzIHRoZSB1bml0IHN1ZmZpeGVkIHRvIHRoZSBmbG9hdCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdHZhciBnZXRUcmFuc2Zvcm1GbG9hdCA9IGZ1bmN0aW9uKHRyYW5zZm9ybVByb3BlcnR5KSB7XHJcblx0XHRcdFx0XHRcdHJldHVybiBwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIHRyYW5zZm9ybVByb3BlcnR5KSk7XHJcblx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdC8qIENyZWF0ZSBhbiBvYmplY3QgdG8gb3JnYW5pemUgYWxsIHRoZSB0cmFuc2Zvcm1zIHRoYXQgd2UnbGwgYXBwbHkgdG8gdGhlIFNWRyBlbGVtZW50LiBUbyBrZWVwIHRoZSBsb2dpYyBzaW1wbGUsXHJcblx0XHRcdFx0XHQgd2UgcHJvY2VzcyAqYWxsKiB0cmFuc2Zvcm0gcHJvcGVydGllcyAtLSBldmVuIHRob3NlIHRoYXQgbWF5IG5vdCBiZSBleHBsaWNpdGx5IGFwcGxpZWQgKHNpbmNlIHRoZXkgZGVmYXVsdCB0byB0aGVpciB6ZXJvLXZhbHVlcyBhbnl3YXkpLiAqL1xyXG5cdFx0XHRcdFx0dmFyIFNWR1RyYW5zZm9ybXMgPSB7XHJcblx0XHRcdFx0XHRcdHRyYW5zbGF0ZTogW2dldFRyYW5zZm9ybUZsb2F0KFwidHJhbnNsYXRlWFwiKSwgZ2V0VHJhbnNmb3JtRmxvYXQoXCJ0cmFuc2xhdGVZXCIpXSxcclxuXHRcdFx0XHRcdFx0c2tld1g6IFtnZXRUcmFuc2Zvcm1GbG9hdChcInNrZXdYXCIpXSwgc2tld1k6IFtnZXRUcmFuc2Zvcm1GbG9hdChcInNrZXdZXCIpXSxcclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIHNjYWxlIHByb3BlcnR5IGlzIHNldCAobm9uLTEpLCB1c2UgdGhhdCB2YWx1ZSBmb3IgdGhlIHNjYWxlWCBhbmQgc2NhbGVZIHZhbHVlc1xyXG5cdFx0XHRcdFx0XHQgKHRoaXMgYmVoYXZpb3IgbWltaWNzIHRoZSByZXN1bHQgb2YgYW5pbWF0aW5nIGFsbCB0aGVzZSBwcm9wZXJ0aWVzIGF0IG9uY2Ugb24gSFRNTCBlbGVtZW50cykuICovXHJcblx0XHRcdFx0XHRcdHNjYWxlOiBnZXRUcmFuc2Zvcm1GbG9hdChcInNjYWxlXCIpICE9PSAxID8gW2dldFRyYW5zZm9ybUZsb2F0KFwic2NhbGVcIiksIGdldFRyYW5zZm9ybUZsb2F0KFwic2NhbGVcIildIDogW2dldFRyYW5zZm9ybUZsb2F0KFwic2NhbGVYXCIpLCBnZXRUcmFuc2Zvcm1GbG9hdChcInNjYWxlWVwiKV0sXHJcblx0XHRcdFx0XHRcdC8qIE5vdGU6IFNWRydzIHJvdGF0ZSB0cmFuc2Zvcm0gdGFrZXMgdGhyZWUgdmFsdWVzOiByb3RhdGlvbiBkZWdyZWVzIGZvbGxvd2VkIGJ5IHRoZSBYIGFuZCBZIHZhbHVlc1xyXG5cdFx0XHRcdFx0XHQgZGVmaW5pbmcgdGhlIHJvdGF0aW9uJ3Mgb3JpZ2luIHBvaW50LiBXZSBpZ25vcmUgdGhlIG9yaWdpbiB2YWx1ZXMgKGRlZmF1bHQgdGhlbSB0byAwKS4gKi9cclxuXHRcdFx0XHRcdFx0cm90YXRlOiBbZ2V0VHJhbnNmb3JtRmxvYXQoXCJyb3RhdGVaXCIpLCAwLCAwXVxyXG5cdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggdGhlIHRyYW5zZm9ybSBwcm9wZXJ0aWVzIGluIHRoZSB1c2VyLWRlZmluZWQgcHJvcGVydHkgbWFwIG9yZGVyLlxyXG5cdFx0XHRcdFx0IChUaGlzIG1pbWljcyB0aGUgYmVoYXZpb3Igb2Ygbm9uLVNWRyB0cmFuc2Zvcm0gYW5pbWF0aW9uLikgKi9cclxuXHRcdFx0XHRcdCQuZWFjaChEYXRhKGVsZW1lbnQpLnRyYW5zZm9ybUNhY2hlLCBmdW5jdGlvbih0cmFuc2Zvcm1OYW1lKSB7XHJcblx0XHRcdFx0XHRcdC8qIEV4Y2VwdCBmb3Igd2l0aCBza2V3WC9ZLCByZXZlcnQgdGhlIGF4aXMtc3BlY2lmaWMgdHJhbnNmb3JtIHN1YnByb3BlcnRpZXMgdG8gdGhlaXIgYXhpcy1mcmVlIG1hc3RlclxyXG5cdFx0XHRcdFx0XHQgcHJvcGVydGllcyBzbyB0aGF0IHRoZXkgbWF0Y2ggdXAgd2l0aCBTVkcncyBhY2NlcHRlZCB0cmFuc2Zvcm0gcHJvcGVydGllcy4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKC9edHJhbnNsYXRlL2kudGVzdCh0cmFuc2Zvcm1OYW1lKSkge1xyXG5cdFx0XHRcdFx0XHRcdHRyYW5zZm9ybU5hbWUgPSBcInRyYW5zbGF0ZVwiO1xyXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKC9ec2NhbGUvaS50ZXN0KHRyYW5zZm9ybU5hbWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0dHJhbnNmb3JtTmFtZSA9IFwic2NhbGVcIjtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICgvXnJvdGF0ZS9pLnRlc3QodHJhbnNmb3JtTmFtZSkpIHtcclxuXHRcdFx0XHRcdFx0XHR0cmFuc2Zvcm1OYW1lID0gXCJyb3RhdGVcIjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogQ2hlY2sgdGhhdCB3ZSBoYXZlbid0IHlldCBkZWxldGVkIHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSBTVkdUcmFuc2Zvcm1zIGNvbnRhaW5lci4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKFNWR1RyYW5zZm9ybXNbdHJhbnNmb3JtTmFtZV0pIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBBcHBlbmQgdGhlIHRyYW5zZm9ybSBwcm9wZXJ0eSBpbiB0aGUgU1ZHLXN1cHBvcnRlZCB0cmFuc2Zvcm0gZm9ybWF0LiBBcyBwZXIgdGhlIHNwZWMsIHN1cnJvdW5kIHRoZSBzcGFjZS1kZWxpbWl0ZWQgdmFsdWVzIGluIHBhcmVudGhlc2VzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHRyYW5zZm9ybVN0cmluZyArPSB0cmFuc2Zvcm1OYW1lICsgXCIoXCIgKyBTVkdUcmFuc2Zvcm1zW3RyYW5zZm9ybU5hbWVdLmpvaW4oXCIgXCIpICsgXCIpXCIgKyBcIiBcIjtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyogQWZ0ZXIgcHJvY2Vzc2luZyBhbiBTVkcgdHJhbnNmb3JtIHByb3BlcnR5LCBkZWxldGUgaXQgZnJvbSB0aGUgU1ZHVHJhbnNmb3JtcyBjb250YWluZXIgc28gd2UgZG9uJ3RcclxuXHRcdFx0XHRcdFx0XHQgcmUtaW5zZXJ0IHRoZSBzYW1lIG1hc3RlciBwcm9wZXJ0eSBpZiB3ZSBlbmNvdW50ZXIgYW5vdGhlciBvbmUgb2YgaXRzIGF4aXMtc3BlY2lmaWMgcHJvcGVydGllcy4gKi9cclxuXHRcdFx0XHRcdFx0XHRkZWxldGUgU1ZHVHJhbnNmb3Jtc1t0cmFuc2Zvcm1OYW1lXTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHZhciB0cmFuc2Zvcm1WYWx1ZSxcclxuXHRcdFx0XHRcdFx0XHRwZXJzcGVjdGl2ZTtcclxuXHJcblx0XHRcdFx0XHQvKiBUcmFuc2Zvcm0gcHJvcGVydGllcyBhcmUgc3RvcmVkIGFzIG1lbWJlcnMgb2YgdGhlIHRyYW5zZm9ybUNhY2hlIG9iamVjdC4gQ29uY2F0ZW5hdGUgYWxsIHRoZSBtZW1iZXJzIGludG8gYSBzdHJpbmcuICovXHJcblx0XHRcdFx0XHQkLmVhY2goRGF0YShlbGVtZW50KS50cmFuc2Zvcm1DYWNoZSwgZnVuY3Rpb24odHJhbnNmb3JtTmFtZSkge1xyXG5cdFx0XHRcdFx0XHR0cmFuc2Zvcm1WYWx1ZSA9IERhdGEoZWxlbWVudCkudHJhbnNmb3JtQ2FjaGVbdHJhbnNmb3JtTmFtZV07XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBUcmFuc2Zvcm0ncyBwZXJzcGVjdGl2ZSBzdWJwcm9wZXJ0eSBtdXN0IGJlIHNldCBmaXJzdCBpbiBvcmRlciB0byB0YWtlIGVmZmVjdC4gU3RvcmUgaXQgdGVtcG9yYXJpbHkuICovXHJcblx0XHRcdFx0XHRcdGlmICh0cmFuc2Zvcm1OYW1lID09PSBcInRyYW5zZm9ybVBlcnNwZWN0aXZlXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRwZXJzcGVjdGl2ZSA9IHRyYW5zZm9ybVZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBJRTkgb25seSBzdXBwb3J0cyBvbmUgcm90YXRpb24gdHlwZSwgcm90YXRlWiwgd2hpY2ggaXQgcmVmZXJzIHRvIGFzIFwicm90YXRlXCIuICovXHJcblx0XHRcdFx0XHRcdGlmIChJRSA9PT0gOSAmJiB0cmFuc2Zvcm1OYW1lID09PSBcInJvdGF0ZVpcIikge1xyXG5cdFx0XHRcdFx0XHRcdHRyYW5zZm9ybU5hbWUgPSBcInJvdGF0ZVwiO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR0cmFuc2Zvcm1TdHJpbmcgKz0gdHJhbnNmb3JtTmFtZSArIHRyYW5zZm9ybVZhbHVlICsgXCIgXCI7XHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHQvKiBJZiBwcmVzZW50LCBzZXQgdGhlIHBlcnNwZWN0aXZlIHN1YnByb3BlcnR5IGZpcnN0LiAqL1xyXG5cdFx0XHRcdFx0aWYgKHBlcnNwZWN0aXZlKSB7XHJcblx0XHRcdFx0XHRcdHRyYW5zZm9ybVN0cmluZyA9IFwicGVyc3BlY3RpdmVcIiArIHBlcnNwZWN0aXZlICsgXCIgXCIgKyB0cmFuc2Zvcm1TdHJpbmc7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRDU1Muc2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm1TdHJpbmcpO1xyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8qIFJlZ2lzdGVyIGhvb2tzIGFuZCBub3JtYWxpemF0aW9ucy4gKi9cclxuXHRcdENTUy5Ib29rcy5yZWdpc3RlcigpO1xyXG5cdFx0Q1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyKCk7XHJcblxyXG5cdFx0LyogQWxsb3cgaG9vayBzZXR0aW5nIGluIHRoZSBzYW1lIGZhc2hpb24gYXMgalF1ZXJ5J3MgJC5jc3MoKS4gKi9cclxuXHRcdFZlbG9jaXR5Lmhvb2sgPSBmdW5jdGlvbihlbGVtZW50cywgYXJnMiwgYXJnMykge1xyXG5cdFx0XHR2YXIgdmFsdWU7XHJcblxyXG5cdFx0XHRlbGVtZW50cyA9IHNhbml0aXplRWxlbWVudHMoZWxlbWVudHMpO1xyXG5cclxuXHRcdFx0JC5lYWNoKGVsZW1lbnRzLCBmdW5jdGlvbihpLCBlbGVtZW50KSB7XHJcblx0XHRcdFx0LyogSW5pdGlhbGl6ZSBWZWxvY2l0eSdzIHBlci1lbGVtZW50IGRhdGEgY2FjaGUgaWYgdGhpcyBlbGVtZW50IGhhc24ndCBwcmV2aW91c2x5IGJlZW4gYW5pbWF0ZWQuICovXHJcblx0XHRcdFx0aWYgKERhdGEoZWxlbWVudCkgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0VmVsb2NpdHkuaW5pdChlbGVtZW50KTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qIEdldCBwcm9wZXJ0eSB2YWx1ZS4gSWYgYW4gZWxlbWVudCBzZXQgd2FzIHBhc3NlZCBpbiwgb25seSByZXR1cm4gdGhlIHZhbHVlIGZvciB0aGUgZmlyc3QgZWxlbWVudC4gKi9cclxuXHRcdFx0XHRpZiAoYXJnMyA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIGFyZzIpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0LyogU2V0IHByb3BlcnR5IHZhbHVlLiAqL1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQvKiBzUFYgcmV0dXJucyBhbiBhcnJheSBvZiB0aGUgbm9ybWFsaXplZCBwcm9wZXJ0eU5hbWUvcHJvcGVydHlWYWx1ZSBwYWlyIHVzZWQgdG8gdXBkYXRlIHRoZSBET00uICovXHJcblx0XHRcdFx0XHR2YXIgYWRqdXN0ZWRTZXQgPSBDU1Muc2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBhcmcyLCBhcmczKTtcclxuXHJcblx0XHRcdFx0XHQvKiBUcmFuc2Zvcm0gcHJvcGVydGllcyBkb24ndCBhdXRvbWF0aWNhbGx5IHNldC4gVGhleSBoYXZlIHRvIGJlIGZsdXNoZWQgdG8gdGhlIERPTS4gKi9cclxuXHRcdFx0XHRcdGlmIChhZGp1c3RlZFNldFswXSA9PT0gXCJ0cmFuc2Zvcm1cIikge1xyXG5cdFx0XHRcdFx0XHRWZWxvY2l0eS5DU1MuZmx1c2hUcmFuc2Zvcm1DYWNoZShlbGVtZW50KTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR2YWx1ZSA9IGFkanVzdGVkU2V0O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRyZXR1cm4gdmFsdWU7XHJcblx0XHR9O1xyXG5cclxuXHRcdC8qKioqKioqKioqKioqKioqKlxyXG5cdFx0IEFuaW1hdGlvblxyXG5cdFx0ICoqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdHZhciBhbmltYXRlID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdHZhciBvcHRzO1xyXG5cclxuXHRcdFx0LyoqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHQgQ2FsbCBDaGFpblxyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogTG9naWMgZm9yIGRldGVybWluaW5nIHdoYXQgdG8gcmV0dXJuIHRvIHRoZSBjYWxsIHN0YWNrIHdoZW4gZXhpdGluZyBvdXQgb2YgVmVsb2NpdHkuICovXHJcblx0XHRcdGZ1bmN0aW9uIGdldENoYWluKCkge1xyXG5cdFx0XHRcdC8qIElmIHdlIGFyZSB1c2luZyB0aGUgdXRpbGl0eSBmdW5jdGlvbiwgYXR0ZW1wdCB0byByZXR1cm4gdGhpcyBjYWxsJ3MgcHJvbWlzZS4gSWYgbm8gcHJvbWlzZSBsaWJyYXJ5IHdhcyBkZXRlY3RlZCxcclxuXHRcdFx0XHQgZGVmYXVsdCB0byBudWxsIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSB0YXJnZXRlZCBlbGVtZW50cyBzbyB0aGF0IHV0aWxpdHkgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgaXMgc3RhbmRhcmRpemVkLiAqL1xyXG5cdFx0XHRcdGlmIChpc1V0aWxpdHkpIHtcclxuXHRcdFx0XHRcdHJldHVybiBwcm9taXNlRGF0YS5wcm9taXNlIHx8IG51bGw7XHJcblx0XHRcdFx0XHQvKiBPdGhlcndpc2UsIGlmIHdlJ3JlIHVzaW5nICQuZm4sIHJldHVybiB0aGUgalF1ZXJ5LS9aZXB0by13cmFwcGVkIGVsZW1lbnQgc2V0LiAqL1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZWxlbWVudHNXcmFwcGVkO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0IEFyZ3VtZW50cyBBc3NpZ25tZW50XHJcblx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogVG8gYWxsb3cgZm9yIGV4cHJlc3NpdmUgQ29mZmVlU2NyaXB0IGNvZGUsIFZlbG9jaXR5IHN1cHBvcnRzIGFuIGFsdGVybmF0aXZlIHN5bnRheCBpbiB3aGljaCBcImVsZW1lbnRzXCIgKG9yIFwiZVwiKSwgXCJwcm9wZXJ0aWVzXCIgKG9yIFwicFwiKSwgYW5kIFwib3B0aW9uc1wiIChvciBcIm9cIilcclxuXHRcdFx0IG9iamVjdHMgYXJlIGRlZmluZWQgb24gYSBjb250YWluZXIgb2JqZWN0IHRoYXQncyBwYXNzZWQgaW4gYXMgVmVsb2NpdHkncyBzb2xlIGFyZ3VtZW50LiAqL1xyXG5cdFx0XHQvKiBOb3RlOiBTb21lIGJyb3dzZXJzIGF1dG9tYXRpY2FsbHkgcG9wdWxhdGUgYXJndW1lbnRzIHdpdGggYSBcInByb3BlcnRpZXNcIiBvYmplY3QuIFdlIGRldGVjdCBpdCBieSBjaGVja2luZyBmb3IgaXRzIGRlZmF1bHQgXCJuYW1lc1wiIHByb3BlcnR5LiAqL1xyXG5cdFx0XHR2YXIgc3ludGFjdGljU3VnYXIgPSAoYXJndW1lbnRzWzBdICYmIChhcmd1bWVudHNbMF0ucCB8fCAoKCQuaXNQbGFpbk9iamVjdChhcmd1bWVudHNbMF0ucHJvcGVydGllcykgJiYgIWFyZ3VtZW50c1swXS5wcm9wZXJ0aWVzLm5hbWVzKSB8fCBUeXBlLmlzU3RyaW5nKGFyZ3VtZW50c1swXS5wcm9wZXJ0aWVzKSkpKSxcclxuXHRcdFx0XHRcdC8qIFdoZXRoZXIgVmVsb2NpdHkgd2FzIGNhbGxlZCB2aWEgdGhlIHV0aWxpdHkgZnVuY3Rpb24gKGFzIG9wcG9zZWQgdG8gb24gYSBqUXVlcnkvWmVwdG8gb2JqZWN0KS4gKi9cclxuXHRcdFx0XHRcdGlzVXRpbGl0eSxcclxuXHRcdFx0XHRcdC8qIFdoZW4gVmVsb2NpdHkgaXMgY2FsbGVkIHZpYSB0aGUgdXRpbGl0eSBmdW5jdGlvbiAoJC5WZWxvY2l0eSgpL1ZlbG9jaXR5KCkpLCBlbGVtZW50cyBhcmUgZXhwbGljaXRseVxyXG5cdFx0XHRcdFx0IHBhc3NlZCBpbiBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLiBUaHVzLCBhcmd1bWVudCBwb3NpdGlvbmluZyB2YXJpZXMuIFdlIG5vcm1hbGl6ZSB0aGVtIGhlcmUuICovXHJcblx0XHRcdFx0XHRlbGVtZW50c1dyYXBwZWQsXHJcblx0XHRcdFx0XHRhcmd1bWVudEluZGV4O1xyXG5cclxuXHRcdFx0dmFyIGVsZW1lbnRzLFxyXG5cdFx0XHRcdFx0cHJvcGVydGllc01hcCxcclxuXHRcdFx0XHRcdG9wdGlvbnM7XHJcblxyXG5cdFx0XHQvKiBEZXRlY3QgalF1ZXJ5L1plcHRvIGVsZW1lbnRzIGJlaW5nIGFuaW1hdGVkIHZpYSB0aGUgJC5mbiBtZXRob2QuICovXHJcblx0XHRcdGlmIChUeXBlLmlzV3JhcHBlZCh0aGlzKSkge1xyXG5cdFx0XHRcdGlzVXRpbGl0eSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRhcmd1bWVudEluZGV4ID0gMDtcclxuXHRcdFx0XHRlbGVtZW50cyA9IHRoaXM7XHJcblx0XHRcdFx0ZWxlbWVudHNXcmFwcGVkID0gdGhpcztcclxuXHRcdFx0XHQvKiBPdGhlcndpc2UsIHJhdyBlbGVtZW50cyBhcmUgYmVpbmcgYW5pbWF0ZWQgdmlhIHRoZSB1dGlsaXR5IGZ1bmN0aW9uLiAqL1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdGlzVXRpbGl0eSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdGFyZ3VtZW50SW5kZXggPSAxO1xyXG5cdFx0XHRcdGVsZW1lbnRzID0gc3ludGFjdGljU3VnYXIgPyAoYXJndW1lbnRzWzBdLmVsZW1lbnRzIHx8IGFyZ3VtZW50c1swXS5lKSA6IGFyZ3VtZW50c1swXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyoqKioqKioqKioqKioqKlxyXG5cdFx0XHQgUHJvbWlzZXNcclxuXHRcdFx0ICoqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdHZhciBwcm9taXNlRGF0YSA9IHtcclxuXHRcdFx0XHRwcm9taXNlOiBudWxsLFxyXG5cdFx0XHRcdHJlc29sdmVyOiBudWxsLFxyXG5cdFx0XHRcdHJlamVjdGVyOiBudWxsXHJcblx0XHRcdH07XHJcblxyXG5cdFx0XHQvKiBJZiB0aGlzIGNhbGwgd2FzIG1hZGUgdmlhIHRoZSB1dGlsaXR5IGZ1bmN0aW9uICh3aGljaCBpcyB0aGUgZGVmYXVsdCBtZXRob2Qgb2YgaW52b2NhdGlvbiB3aGVuIGpRdWVyeS9aZXB0byBhcmUgbm90IGJlaW5nIHVzZWQpLCBhbmQgaWZcclxuXHRcdFx0IHByb21pc2Ugc3VwcG9ydCB3YXMgZGV0ZWN0ZWQsIGNyZWF0ZSBhIHByb21pc2Ugb2JqZWN0IGZvciB0aGlzIGNhbGwgYW5kIHN0b3JlIHJlZmVyZW5jZXMgdG8gaXRzIHJlc29sdmVyIGFuZCByZWplY3RlciBtZXRob2RzLiBUaGUgcmVzb2x2ZVxyXG5cdFx0XHQgbWV0aG9kIGlzIHVzZWQgd2hlbiBhIGNhbGwgY29tcGxldGVzIG5hdHVyYWxseSBvciBpcyBwcmVtYXR1cmVseSBzdG9wcGVkIGJ5IHRoZSB1c2VyLiBJbiBib3RoIGNhc2VzLCBjb21wbGV0ZUNhbGwoKSBoYW5kbGVzIHRoZSBhc3NvY2lhdGVkXHJcblx0XHRcdCBjYWxsIGNsZWFudXAgYW5kIHByb21pc2UgcmVzb2x2aW5nIGxvZ2ljLiBUaGUgcmVqZWN0IG1ldGhvZCBpcyB1c2VkIHdoZW4gYW4gaW52YWxpZCBzZXQgb2YgYXJndW1lbnRzIGlzIHBhc3NlZCBpbnRvIGEgVmVsb2NpdHkgY2FsbC4gKi9cclxuXHRcdFx0LyogTm90ZTogVmVsb2NpdHkgZW1wbG95cyBhIGNhbGwtYmFzZWQgcXVldWVpbmcgYXJjaGl0ZWN0dXJlLCB3aGljaCBtZWFucyB0aGF0IHN0b3BwaW5nIGFuIGFuaW1hdGluZyBlbGVtZW50IGFjdHVhbGx5IHN0b3BzIHRoZSBmdWxsIGNhbGwgdGhhdFxyXG5cdFx0XHQgdHJpZ2dlcmVkIGl0IC0tIG5vdCB0aGF0IG9uZSBlbGVtZW50IGV4Y2x1c2l2ZWx5LiBTaW1pbGFybHksIHRoZXJlIGlzIG9uZSBwcm9taXNlIHBlciBjYWxsLCBhbmQgYWxsIGVsZW1lbnRzIHRhcmdldGVkIGJ5IGEgVmVsb2NpdHkgY2FsbCBhcmVcclxuXHRcdFx0IGdyb3VwZWQgdG9nZXRoZXIgZm9yIHRoZSBwdXJwb3NlcyBvZiByZXNvbHZpbmcgYW5kIHJlamVjdGluZyBhIHByb21pc2UuICovXHJcblx0XHRcdGlmIChpc1V0aWxpdHkgJiYgVmVsb2NpdHkuUHJvbWlzZSkge1xyXG5cdFx0XHRcdHByb21pc2VEYXRhLnByb21pc2UgPSBuZXcgVmVsb2NpdHkuUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcclxuXHRcdFx0XHRcdHByb21pc2VEYXRhLnJlc29sdmVyID0gcmVzb2x2ZTtcclxuXHRcdFx0XHRcdHByb21pc2VEYXRhLnJlamVjdGVyID0gcmVqZWN0O1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoc3ludGFjdGljU3VnYXIpIHtcclxuXHRcdFx0XHRwcm9wZXJ0aWVzTWFwID0gYXJndW1lbnRzWzBdLnByb3BlcnRpZXMgfHwgYXJndW1lbnRzWzBdLnA7XHJcblx0XHRcdFx0b3B0aW9ucyA9IGFyZ3VtZW50c1swXS5vcHRpb25zIHx8IGFyZ3VtZW50c1swXS5vO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHByb3BlcnRpZXNNYXAgPSBhcmd1bWVudHNbYXJndW1lbnRJbmRleF07XHJcblx0XHRcdFx0b3B0aW9ucyA9IGFyZ3VtZW50c1thcmd1bWVudEluZGV4ICsgMV07XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGVsZW1lbnRzID0gc2FuaXRpemVFbGVtZW50cyhlbGVtZW50cyk7XHJcblxyXG5cdFx0XHRpZiAoIWVsZW1lbnRzKSB7XHJcblx0XHRcdFx0aWYgKHByb21pc2VEYXRhLnByb21pc2UpIHtcclxuXHRcdFx0XHRcdGlmICghcHJvcGVydGllc01hcCB8fCAhb3B0aW9ucyB8fCBvcHRpb25zLnByb21pc2VSZWplY3RFbXB0eSAhPT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdFx0cHJvbWlzZURhdGEucmVqZWN0ZXIoKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHByb21pc2VEYXRhLnJlc29sdmVyKCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyogVGhlIGxlbmd0aCBvZiB0aGUgZWxlbWVudCBzZXQgKGluIHRoZSBmb3JtIG9mIGEgbm9kZUxpc3Qgb3IgYW4gYXJyYXkgb2YgZWxlbWVudHMpIGlzIGRlZmF1bHRlZCB0byAxIGluIGNhc2UgYVxyXG5cdFx0XHQgc2luZ2xlIHJhdyBET00gZWxlbWVudCBpcyBwYXNzZWQgaW4gKHdoaWNoIGRvZXNuJ3QgY29udGFpbiBhIGxlbmd0aCBwcm9wZXJ0eSkuICovXHJcblx0XHRcdHZhciBlbGVtZW50c0xlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aCxcclxuXHRcdFx0XHRcdGVsZW1lbnRzSW5kZXggPSAwO1xyXG5cclxuXHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHQgQXJndW1lbnQgT3ZlcmxvYWRpbmdcclxuXHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdC8qIFN1cHBvcnQgaXMgaW5jbHVkZWQgZm9yIGpRdWVyeSdzIGFyZ3VtZW50IG92ZXJsb2FkaW5nOiAkLmFuaW1hdGUocHJvcGVydHlNYXAgWywgZHVyYXRpb25dIFssIGVhc2luZ10gWywgY29tcGxldGVdKS5cclxuXHRcdFx0IE92ZXJsb2FkaW5nIGlzIGRldGVjdGVkIGJ5IGNoZWNraW5nIGZvciB0aGUgYWJzZW5jZSBvZiBhbiBvYmplY3QgYmVpbmcgcGFzc2VkIGludG8gb3B0aW9ucy4gKi9cclxuXHRcdFx0LyogTm90ZTogVGhlIHN0b3AvZmluaXNoL3BhdXNlL3Jlc3VtZSBhY3Rpb25zIGRvIG5vdCBhY2NlcHQgYW5pbWF0aW9uIG9wdGlvbnMsIGFuZCBhcmUgdGhlcmVmb3JlIGV4Y2x1ZGVkIGZyb20gdGhpcyBjaGVjay4gKi9cclxuXHRcdFx0aWYgKCEvXihzdG9wfGZpbmlzaHxmaW5pc2hBbGx8cGF1c2V8cmVzdW1lKSQvaS50ZXN0KHByb3BlcnRpZXNNYXApICYmICEkLmlzUGxhaW5PYmplY3Qob3B0aW9ucykpIHtcclxuXHRcdFx0XHQvKiBUaGUgdXRpbGl0eSBmdW5jdGlvbiBzaGlmdHMgYWxsIGFyZ3VtZW50cyBvbmUgcG9zaXRpb24gdG8gdGhlIHJpZ2h0LCBzbyB3ZSBhZGp1c3QgZm9yIHRoYXQgb2Zmc2V0LiAqL1xyXG5cdFx0XHRcdHZhciBzdGFydGluZ0FyZ3VtZW50UG9zaXRpb24gPSBhcmd1bWVudEluZGV4ICsgMTtcclxuXHJcblx0XHRcdFx0b3B0aW9ucyA9IHt9O1xyXG5cclxuXHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggYWxsIG9wdGlvbnMgYXJndW1lbnRzICovXHJcblx0XHRcdFx0Zm9yICh2YXIgaSA9IHN0YXJ0aW5nQXJndW1lbnRQb3NpdGlvbjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0LyogVHJlYXQgYSBudW1iZXIgYXMgYSBkdXJhdGlvbi4gUGFyc2UgaXQgb3V0LiAqL1xyXG5cdFx0XHRcdFx0LyogTm90ZTogVGhlIGZvbGxvd2luZyBSZWdFeCB3aWxsIHJldHVybiB0cnVlIGlmIHBhc3NlZCBhbiBhcnJheSB3aXRoIGEgbnVtYmVyIGFzIGl0cyBmaXJzdCBpdGVtLlxyXG5cdFx0XHRcdFx0IFRodXMsIGFycmF5cyBhcmUgc2tpcHBlZCBmcm9tIHRoaXMgY2hlY2suICovXHJcblx0XHRcdFx0XHRpZiAoIVR5cGUuaXNBcnJheShhcmd1bWVudHNbaV0pICYmICgvXihmYXN0fG5vcm1hbHxzbG93KSQvaS50ZXN0KGFyZ3VtZW50c1tpXSkgfHwgL15cXGQvLnRlc3QoYXJndW1lbnRzW2ldKSkpIHtcclxuXHRcdFx0XHRcdFx0b3B0aW9ucy5kdXJhdGlvbiA9IGFyZ3VtZW50c1tpXTtcclxuXHRcdFx0XHRcdFx0LyogVHJlYXQgc3RyaW5ncyBhbmQgYXJyYXlzIGFzIGVhc2luZ3MuICovXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFR5cGUuaXNTdHJpbmcoYXJndW1lbnRzW2ldKSB8fCBUeXBlLmlzQXJyYXkoYXJndW1lbnRzW2ldKSkge1xyXG5cdFx0XHRcdFx0XHRvcHRpb25zLmVhc2luZyA9IGFyZ3VtZW50c1tpXTtcclxuXHRcdFx0XHRcdFx0LyogVHJlYXQgYSBmdW5jdGlvbiBhcyBhIGNvbXBsZXRlIGNhbGxiYWNrLiAqL1xyXG5cdFx0XHRcdFx0fSBlbHNlIGlmIChUeXBlLmlzRnVuY3Rpb24oYXJndW1lbnRzW2ldKSkge1xyXG5cdFx0XHRcdFx0XHRvcHRpb25zLmNvbXBsZXRlID0gYXJndW1lbnRzW2ldO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHQgQWN0aW9uIERldGVjdGlvblxyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogVmVsb2NpdHkncyBiZWhhdmlvciBpcyBjYXRlZ29yaXplZCBpbnRvIFwiYWN0aW9uc1wiOiBFbGVtZW50cyBjYW4gZWl0aGVyIGJlIHNwZWNpYWxseSBzY3JvbGxlZCBpbnRvIHZpZXcsXHJcblx0XHRcdCBvciB0aGV5IGNhbiBiZSBzdGFydGVkLCBzdG9wcGVkLCBwYXVzZWQsIHJlc3VtZWQsIG9yIHJldmVyc2VkIC4gSWYgYSBsaXRlcmFsIG9yIHJlZmVyZW5jZWQgcHJvcGVydGllcyBtYXAgaXMgcGFzc2VkIGluIGFzIFZlbG9jaXR5J3NcclxuXHRcdFx0IGZpcnN0IGFyZ3VtZW50LCB0aGUgYXNzb2NpYXRlZCBhY3Rpb24gaXMgXCJzdGFydFwiLiBBbHRlcm5hdGl2ZWx5LCBcInNjcm9sbFwiLCBcInJldmVyc2VcIiwgXCJwYXVzZVwiLCBcInJlc3VtZVwiIG9yIFwic3RvcFwiIGNhbiBiZSBwYXNzZWQgaW4gXHJcblx0XHRcdCBpbnN0ZWFkIG9mIGEgcHJvcGVydGllcyBtYXAuICovXHJcblx0XHRcdHZhciBhY3Rpb247XHJcblxyXG5cdFx0XHRzd2l0Y2ggKHByb3BlcnRpZXNNYXApIHtcclxuXHRcdFx0XHRjYXNlIFwic2Nyb2xsXCI6XHJcblx0XHRcdFx0XHRhY3Rpb24gPSBcInNjcm9sbFwiO1xyXG5cdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdGNhc2UgXCJyZXZlcnNlXCI6XHJcblx0XHRcdFx0XHRhY3Rpb24gPSBcInJldmVyc2VcIjtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlIFwicGF1c2VcIjpcclxuXHJcblx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0IEFjdGlvbjogUGF1c2VcclxuXHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdHZhciBjdXJyZW50VGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XHJcblxyXG5cdFx0XHRcdFx0LyogSGFuZGxlIGRlbGF5IHRpbWVycyAqL1xyXG5cdFx0XHRcdFx0JC5lYWNoKGVsZW1lbnRzLCBmdW5jdGlvbihpLCBlbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdHBhdXNlRGVsYXlPbkVsZW1lbnQoZWxlbWVudCwgY3VycmVudFRpbWUpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0LyogUGF1c2UgYW5kIFJlc3VtZSBhcmUgY2FsbC13aWRlIChub3Qgb24gYSBwZXIgZWxlbWVudCBiYXNpcykuIFRodXMsIGNhbGxpbmcgcGF1c2Ugb3IgcmVzdW1lIG9uIGEgXHJcblx0XHRcdFx0XHQgc2luZ2xlIGVsZW1lbnQgd2lsbCBjYXVzZSBhbnkgY2FsbHMgdGhhdCBjb250YWludCB0d2VlbnMgZm9yIHRoYXQgZWxlbWVudCB0byBiZSBwYXVzZWQvcmVzdW1lZFxyXG5cdFx0XHRcdFx0IGFzIHdlbGwuICovXHJcblxyXG5cdFx0XHRcdFx0LyogSXRlcmF0ZSB0aHJvdWdoIGFsbCBjYWxscyBhbmQgcGF1c2UgYW55IHRoYXQgY29udGFpbiBhbnkgb2Ygb3VyIGVsZW1lbnRzICovXHJcblx0XHRcdFx0XHQkLmVhY2goVmVsb2NpdHkuU3RhdGUuY2FsbHMsIGZ1bmN0aW9uKGksIGFjdGl2ZUNhbGwpIHtcclxuXHJcblx0XHRcdFx0XHRcdHZhciBmb3VuZCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHQvKiBJbmFjdGl2ZSBjYWxscyBhcmUgc2V0IHRvIGZhbHNlIGJ5IHRoZSBsb2dpYyBpbnNpZGUgY29tcGxldGVDYWxsKCkuIFNraXAgdGhlbS4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKGFjdGl2ZUNhbGwpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGFjdGl2ZSBjYWxsJ3MgdGFyZ2V0ZWQgZWxlbWVudHMuICovXHJcblx0XHRcdFx0XHRcdFx0JC5lYWNoKGFjdGl2ZUNhbGxbMV0sIGZ1bmN0aW9uKGssIGFjdGl2ZUVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHZhciBxdWV1ZU5hbWUgPSAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSA/IFwiXCIgOiBvcHRpb25zO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChxdWV1ZU5hbWUgIT09IHRydWUgJiYgKGFjdGl2ZUNhbGxbMl0ucXVldWUgIT09IHF1ZXVlTmFtZSkgJiYgIShvcHRpb25zID09PSB1bmRlZmluZWQgJiYgYWN0aXZlQ2FsbFsyXS5xdWV1ZSA9PT0gZmFsc2UpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY2FsbHMgdGFyZ2V0ZWQgYnkgdGhlIHN0b3AgY29tbWFuZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdCQuZWFjaChlbGVtZW50cywgZnVuY3Rpb24obCwgZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBDaGVjayB0aGF0IHRoaXMgY2FsbCB3YXMgYXBwbGllZCB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChlbGVtZW50ID09PSBhY3RpdmVFbGVtZW50KSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFNldCBjYWxsIHRvIHBhdXNlZCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGFjdGl2ZUNhbGxbNV0gPSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXN1bWU6IGZhbHNlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogT25jZSB3ZSBtYXRjaCBhbiBlbGVtZW50LCB3ZSBjYW4gYm91bmNlIG91dCB0byB0aGUgbmV4dCBjYWxsIGVudGlyZWx5ICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm91bmQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogUHJvY2VlZCB0byBjaGVjayBuZXh0IGNhbGwgaWYgd2UgaGF2ZSBhbHJlYWR5IG1hdGNoZWQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChmb3VuZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHQvKiBTaW5jZSBwYXVzZSBjcmVhdGVzIG5vIG5ldyB0d2VlbnMsIGV4aXQgb3V0IG9mIFZlbG9jaXR5LiAqL1xyXG5cdFx0XHRcdFx0cmV0dXJuIGdldENoYWluKCk7XHJcblxyXG5cdFx0XHRcdGNhc2UgXCJyZXN1bWVcIjpcclxuXHJcblx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0IEFjdGlvbjogUmVzdW1lXHJcblx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHQvKiBIYW5kbGUgZGVsYXkgdGltZXJzICovXHJcblx0XHRcdFx0XHQkLmVhY2goZWxlbWVudHMsIGZ1bmN0aW9uKGksIGVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0cmVzdW1lRGVsYXlPbkVsZW1lbnQoZWxlbWVudCwgY3VycmVudFRpbWUpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0LyogUGF1c2UgYW5kIFJlc3VtZSBhcmUgY2FsbC13aWRlIChub3Qgb24gYSBwZXIgZWxlbW50IGJhc2lzKS4gVGh1cywgY2FsbGluZyBwYXVzZSBvciByZXN1bWUgb24gYSBcclxuXHRcdFx0XHRcdCBzaW5nbGUgZWxlbWVudCB3aWxsIGNhdXNlIGFueSBjYWxscyB0aGF0IGNvbnRhaW50IHR3ZWVucyBmb3IgdGhhdCBlbGVtZW50IHRvIGJlIHBhdXNlZC9yZXN1bWVkXHJcblx0XHRcdFx0XHQgYXMgd2VsbC4gKi9cclxuXHJcblx0XHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggYWxsIGNhbGxzIGFuZCBwYXVzZSBhbnkgdGhhdCBjb250YWluIGFueSBvZiBvdXIgZWxlbWVudHMgKi9cclxuXHRcdFx0XHRcdCQuZWFjaChWZWxvY2l0eS5TdGF0ZS5jYWxscywgZnVuY3Rpb24oaSwgYWN0aXZlQ2FsbCkge1xyXG5cdFx0XHRcdFx0XHR2YXIgZm91bmQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0LyogSW5hY3RpdmUgY2FsbHMgYXJlIHNldCB0byBmYWxzZSBieSB0aGUgbG9naWMgaW5zaWRlIGNvbXBsZXRlQ2FsbCgpLiBTa2lwIHRoZW0uICovXHJcblx0XHRcdFx0XHRcdGlmIChhY3RpdmVDYWxsKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBhY3RpdmUgY2FsbCdzIHRhcmdldGVkIGVsZW1lbnRzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdCQuZWFjaChhY3RpdmVDYWxsWzFdLCBmdW5jdGlvbihrLCBhY3RpdmVFbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgcXVldWVOYW1lID0gKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgPyBcIlwiIDogb3B0aW9ucztcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAocXVldWVOYW1lICE9PSB0cnVlICYmIChhY3RpdmVDYWxsWzJdLnF1ZXVlICE9PSBxdWV1ZU5hbWUpICYmICEob3B0aW9ucyA9PT0gdW5kZWZpbmVkICYmIGFjdGl2ZUNhbGxbMl0ucXVldWUgPT09IGZhbHNlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBTa2lwIGFueSBjYWxscyB0aGF0IGhhdmUgbmV2ZXIgYmVlbiBwYXVzZWQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmICghYWN0aXZlQ2FsbFs1XSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGNhbGxzIHRhcmdldGVkIGJ5IHRoZSBzdG9wIGNvbW1hbmQuICovXHJcblx0XHRcdFx0XHRcdFx0XHQkLmVhY2goZWxlbWVudHMsIGZ1bmN0aW9uKGwsIGVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogQ2hlY2sgdGhhdCB0aGlzIGNhbGwgd2FzIGFwcGxpZWQgdG8gdGhlIHRhcmdldCBlbGVtZW50LiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZWxlbWVudCA9PT0gYWN0aXZlRWxlbWVudCkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBGbGFnIGEgcGF1c2Ugb2JqZWN0IHRvIGJlIHJlc3VtZWQsIHdoaWNoIHdpbGwgb2NjdXIgZHVyaW5nIHRoZSBuZXh0IHRpY2suIEluXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IGFkZGl0aW9uLCB0aGUgcGF1c2Ugb2JqZWN0IHdpbGwgYXQgdGhhdCB0aW1lIGJlIGRlbGV0ZWQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhY3RpdmVDYWxsWzVdLnJlc3VtZSA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIE9uY2Ugd2UgbWF0Y2ggYW4gZWxlbWVudCwgd2UgY2FuIGJvdW5jZSBvdXQgdG8gdGhlIG5leHQgY2FsbCBlbnRpcmVseSAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZvdW5kID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIFByb2NlZWQgdG8gY2hlY2sgbmV4dCBjYWxsIGlmIHdlIGhhdmUgYWxyZWFkeSBtYXRjaGVkICovXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoZm91bmQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0LyogU2luY2UgcmVzdW1lIGNyZWF0ZXMgbm8gbmV3IHR3ZWVucywgZXhpdCBvdXQgb2YgVmVsb2NpdHkuICovXHJcblx0XHRcdFx0XHRyZXR1cm4gZ2V0Q2hhaW4oKTtcclxuXHJcblx0XHRcdFx0Y2FzZSBcImZpbmlzaFwiOlxyXG5cdFx0XHRcdGNhc2UgXCJmaW5pc2hBbGxcIjpcclxuXHRcdFx0XHRjYXNlIFwic3RvcFwiOlxyXG5cdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdCBBY3Rpb246IFN0b3BcclxuXHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdC8qIENsZWFyIHRoZSBjdXJyZW50bHktYWN0aXZlIGRlbGF5IG9uIGVhY2ggdGFyZ2V0ZWQgZWxlbWVudC4gKi9cclxuXHRcdFx0XHRcdCQuZWFjaChlbGVtZW50cywgZnVuY3Rpb24oaSwgZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHRpZiAoRGF0YShlbGVtZW50KSAmJiBEYXRhKGVsZW1lbnQpLmRlbGF5VGltZXIpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBTdG9wIHRoZSB0aW1lciBmcm9tIHRyaWdnZXJpbmcgaXRzIGNhY2hlZCBuZXh0KCkgZnVuY3Rpb24uICovXHJcblx0XHRcdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KERhdGEoZWxlbWVudCkuZGVsYXlUaW1lci5zZXRUaW1lb3V0KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyogTWFudWFsbHkgY2FsbCB0aGUgbmV4dCgpIGZ1bmN0aW9uIHNvIHRoYXQgdGhlIHN1YnNlcXVlbnQgcXVldWUgaXRlbXMgY2FuIHByb2dyZXNzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChEYXRhKGVsZW1lbnQpLmRlbGF5VGltZXIubmV4dCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0RGF0YShlbGVtZW50KS5kZWxheVRpbWVyLm5leHQoKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBEYXRhKGVsZW1lbnQpLmRlbGF5VGltZXI7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIElmIHdlIHdhbnQgdG8gZmluaXNoIGV2ZXJ5dGhpbmcgaW4gdGhlIHF1ZXVlLCB3ZSBoYXZlIHRvIGl0ZXJhdGUgdGhyb3VnaCBpdFxyXG5cdFx0XHRcdFx0XHQgYW5kIGNhbGwgZWFjaCBmdW5jdGlvbi4gVGhpcyB3aWxsIG1ha2UgdGhlbSBhY3RpdmUgY2FsbHMgYmVsb3csIHdoaWNoIHdpbGxcclxuXHRcdFx0XHRcdFx0IGNhdXNlIHRoZW0gdG8gYmUgYXBwbGllZCB2aWEgdGhlIGR1cmF0aW9uIHNldHRpbmcuICovXHJcblx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0aWVzTWFwID09PSBcImZpbmlzaEFsbFwiICYmIChvcHRpb25zID09PSB0cnVlIHx8IFR5cGUuaXNTdHJpbmcob3B0aW9ucykpKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBpdGVtcyBpbiB0aGUgZWxlbWVudCdzIHF1ZXVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdCQuZWFjaCgkLnF1ZXVlKGVsZW1lbnQsIFR5cGUuaXNTdHJpbmcob3B0aW9ucykgPyBvcHRpb25zIDogXCJcIiksIGZ1bmN0aW9uKF8sIGl0ZW0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIFRoZSBxdWV1ZSBhcnJheSBjYW4gY29udGFpbiBhbiBcImlucHJvZ3Jlc3NcIiBzdHJpbmcsIHdoaWNoIHdlIHNraXAuICovXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoVHlwZS5pc0Z1bmN0aW9uKGl0ZW0pKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW0oKTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyogQ2xlYXJpbmcgdGhlICQucXVldWUoKSBhcnJheSBpcyBhY2hpZXZlZCBieSByZXNldHRpbmcgaXQgdG8gW10uICovXHJcblx0XHRcdFx0XHRcdFx0JC5xdWV1ZShlbGVtZW50LCBUeXBlLmlzU3RyaW5nKG9wdGlvbnMpID8gb3B0aW9ucyA6IFwiXCIsIFtdKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdFx0dmFyIGNhbGxzVG9TdG9wID0gW107XHJcblxyXG5cdFx0XHRcdFx0LyogV2hlbiB0aGUgc3RvcCBhY3Rpb24gaXMgdHJpZ2dlcmVkLCB0aGUgZWxlbWVudHMnIGN1cnJlbnRseSBhY3RpdmUgY2FsbCBpcyBpbW1lZGlhdGVseSBzdG9wcGVkLiBUaGUgYWN0aXZlIGNhbGwgbWlnaHQgaGF2ZVxyXG5cdFx0XHRcdFx0IGJlZW4gYXBwbGllZCB0byBtdWx0aXBsZSBlbGVtZW50cywgaW4gd2hpY2ggY2FzZSBhbGwgb2YgdGhlIGNhbGwncyBlbGVtZW50cyB3aWxsIGJlIHN0b3BwZWQuIFdoZW4gYW4gZWxlbWVudFxyXG5cdFx0XHRcdFx0IGlzIHN0b3BwZWQsIHRoZSBuZXh0IGl0ZW0gaW4gaXRzIGFuaW1hdGlvbiBxdWV1ZSBpcyBpbW1lZGlhdGVseSB0cmlnZ2VyZWQuICovXHJcblx0XHRcdFx0XHQvKiBBbiBhZGRpdGlvbmFsIGFyZ3VtZW50IG1heSBiZSBwYXNzZWQgaW4gdG8gY2xlYXIgYW4gZWxlbWVudCdzIHJlbWFpbmluZyBxdWV1ZWQgY2FsbHMuIEVpdGhlciB0cnVlICh3aGljaCBkZWZhdWx0cyB0byB0aGUgXCJmeFwiIHF1ZXVlKVxyXG5cdFx0XHRcdFx0IG9yIGEgY3VzdG9tIHF1ZXVlIHN0cmluZyBjYW4gYmUgcGFzc2VkIGluLiAqL1xyXG5cdFx0XHRcdFx0LyogTm90ZTogVGhlIHN0b3AgY29tbWFuZCBydW5zIHByaW9yIHRvIFZlbG9jaXR5J3MgUXVldWVpbmcgcGhhc2Ugc2luY2UgaXRzIGJlaGF2aW9yIGlzIGludGVuZGVkIHRvIHRha2UgZWZmZWN0ICppbW1lZGlhdGVseSosXHJcblx0XHRcdFx0XHQgcmVnYXJkbGVzcyBvZiB0aGUgZWxlbWVudCdzIGN1cnJlbnQgcXVldWUgc3RhdGUuICovXHJcblxyXG5cdFx0XHRcdFx0LyogSXRlcmF0ZSB0aHJvdWdoIGV2ZXJ5IGFjdGl2ZSBjYWxsLiAqL1xyXG5cdFx0XHRcdFx0JC5lYWNoKFZlbG9jaXR5LlN0YXRlLmNhbGxzLCBmdW5jdGlvbihpLCBhY3RpdmVDYWxsKSB7XHJcblx0XHRcdFx0XHRcdC8qIEluYWN0aXZlIGNhbGxzIGFyZSBzZXQgdG8gZmFsc2UgYnkgdGhlIGxvZ2ljIGluc2lkZSBjb21wbGV0ZUNhbGwoKS4gU2tpcCB0aGVtLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoYWN0aXZlQ2FsbCkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYWN0aXZlIGNhbGwncyB0YXJnZXRlZCBlbGVtZW50cy4gKi9cclxuXHRcdFx0XHRcdFx0XHQkLmVhY2goYWN0aXZlQ2FsbFsxXSwgZnVuY3Rpb24oaywgYWN0aXZlRWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogSWYgdHJ1ZSB3YXMgcGFzc2VkIGluIGFzIGEgc2Vjb25kYXJ5IGFyZ3VtZW50LCBjbGVhciBhYnNvbHV0ZWx5IGFsbCBjYWxscyBvbiB0aGlzIGVsZW1lbnQuIE90aGVyd2lzZSwgb25seVxyXG5cdFx0XHRcdFx0XHRcdFx0IGNsZWFyIGNhbGxzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsZXZhbnQgcXVldWUuICovXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBDYWxsIHN0b3BwaW5nIGxvZ2ljIHdvcmtzIGFzIGZvbGxvd3M6XHJcblx0XHRcdFx0XHRcdFx0XHQgLSBvcHRpb25zID09PSB0cnVlIC0tPiBzdG9wIGN1cnJlbnQgZGVmYXVsdCBxdWV1ZSBjYWxscyAoYW5kIHF1ZXVlOmZhbHNlIGNhbGxzKSwgaW5jbHVkaW5nIHJlbWFpbmluZyBxdWV1ZWQgb25lcy5cclxuXHRcdFx0XHRcdFx0XHRcdCAtIG9wdGlvbnMgPT09IHVuZGVmaW5lZCAtLT4gc3RvcCBjdXJyZW50IHF1ZXVlOlwiXCIgY2FsbCBhbmQgYWxsIHF1ZXVlOmZhbHNlIGNhbGxzLlxyXG5cdFx0XHRcdFx0XHRcdFx0IC0gb3B0aW9ucyA9PT0gZmFsc2UgLS0+IHN0b3Agb25seSBxdWV1ZTpmYWxzZSBjYWxscy5cclxuXHRcdFx0XHRcdFx0XHRcdCAtIG9wdGlvbnMgPT09IFwiY3VzdG9tXCIgLS0+IHN0b3AgY3VycmVudCBxdWV1ZTpcImN1c3RvbVwiIGNhbGwsIGluY2x1ZGluZyByZW1haW5pbmcgcXVldWVkIG9uZXMgKHRoZXJlIGlzIG5vIGZ1bmN0aW9uYWxpdHkgdG8gb25seSBjbGVhciB0aGUgY3VycmVudGx5LXJ1bm5pbmcgcXVldWU6XCJjdXN0b21cIiBjYWxsKS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdHZhciBxdWV1ZU5hbWUgPSAob3B0aW9ucyA9PT0gdW5kZWZpbmVkKSA/IFwiXCIgOiBvcHRpb25zO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChxdWV1ZU5hbWUgIT09IHRydWUgJiYgKGFjdGl2ZUNhbGxbMl0ucXVldWUgIT09IHF1ZXVlTmFtZSkgJiYgIShvcHRpb25zID09PSB1bmRlZmluZWQgJiYgYWN0aXZlQ2FsbFsyXS5xdWV1ZSA9PT0gZmFsc2UpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCB0aGUgY2FsbHMgdGFyZ2V0ZWQgYnkgdGhlIHN0b3AgY29tbWFuZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdCQuZWFjaChlbGVtZW50cywgZnVuY3Rpb24obCwgZWxlbWVudCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBDaGVjayB0aGF0IHRoaXMgY2FsbCB3YXMgYXBwbGllZCB0byB0aGUgdGFyZ2V0IGVsZW1lbnQuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChlbGVtZW50ID09PSBhY3RpdmVFbGVtZW50KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogT3B0aW9uYWxseSBjbGVhciB0aGUgcmVtYWluaW5nIHF1ZXVlZCBjYWxscy4gSWYgd2UncmUgZG9pbmcgXCJmaW5pc2hBbGxcIiB0aGlzIHdvbid0IGZpbmQgYW55dGhpbmcsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IGR1ZSB0byB0aGUgcXVldWUtY2xlYXJpbmcgYWJvdmUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9wdGlvbnMgPT09IHRydWUgfHwgVHlwZS5pc1N0cmluZyhvcHRpb25zKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogSXRlcmF0ZSB0aHJvdWdoIHRoZSBpdGVtcyBpbiB0aGUgZWxlbWVudCdzIHF1ZXVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JC5lYWNoKCQucXVldWUoZWxlbWVudCwgVHlwZS5pc1N0cmluZyhvcHRpb25zKSA/IG9wdGlvbnMgOiBcIlwiKSwgZnVuY3Rpb24oXywgaXRlbSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBUaGUgcXVldWUgYXJyYXkgY2FuIGNvbnRhaW4gYW4gXCJpbnByb2dyZXNzXCIgc3RyaW5nLCB3aGljaCB3ZSBza2lwLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoVHlwZS5pc0Z1bmN0aW9uKGl0ZW0pKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogUGFzcyB0aGUgaXRlbSdzIGNhbGxiYWNrIGEgZmxhZyBpbmRpY2F0aW5nIHRoYXQgd2Ugd2FudCB0byBhYm9ydCBmcm9tIHRoZSBxdWV1ZSBjYWxsLlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAoU3BlY2lmaWNhbGx5LCB0aGUgcXVldWUgd2lsbCByZXNvbHZlIHRoZSBjYWxsJ3MgYXNzb2NpYXRlZCBwcm9taXNlIHRoZW4gYWJvcnQuKSAgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtKG51bGwsIHRydWUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBDbGVhcmluZyB0aGUgJC5xdWV1ZSgpIGFycmF5IGlzIGFjaGlldmVkIGJ5IHJlc2V0dGluZyBpdCB0byBbXS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCQucXVldWUoZWxlbWVudCwgVHlwZS5pc1N0cmluZyhvcHRpb25zKSA/IG9wdGlvbnMgOiBcIlwiLCBbXSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAocHJvcGVydGllc01hcCA9PT0gXCJzdG9wXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFNpbmNlIFwicmV2ZXJzZVwiIHVzZXMgY2FjaGVkIHN0YXJ0IHZhbHVlcyAodGhlIHByZXZpb3VzIGNhbGwncyBlbmRWYWx1ZXMpLCB0aGVzZSB2YWx1ZXMgbXVzdCBiZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0IGNoYW5nZWQgdG8gcmVmbGVjdCB0aGUgZmluYWwgdmFsdWUgdGhhdCB0aGUgZWxlbWVudHMgd2VyZSBhY3R1YWxseSB0d2VlbmVkIHRvLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogTm90ZTogSWYgb25seSBxdWV1ZTpmYWxzZS9xdWV1ZTpcImN1c3RvbVwiIGFuaW1hdGlvbnMgYXJlIGN1cnJlbnRseSBydW5uaW5nIG9uIGFuIGVsZW1lbnQsIGl0IHdvbid0IGhhdmUgYSB0d2VlbnNDb250YWluZXJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCBvYmplY3QuIEFsc28sIHF1ZXVlOmZhbHNlL3F1ZXVlOlwiY3VzdG9tXCIgYW5pbWF0aW9ucyBjYW4ndCBiZSByZXZlcnNlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBkYXRhID0gRGF0YShlbGVtZW50KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChkYXRhICYmIGRhdGEudHdlZW5zQ29udGFpbmVyICYmIChxdWV1ZU5hbWUgPT09IHRydWUgfHwgcXVldWVOYW1lID09PSBcIlwiKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkLmVhY2goZGF0YS50d2VlbnNDb250YWluZXIsIGZ1bmN0aW9uKG0sIGFjdGl2ZVR3ZWVuKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YWN0aXZlVHdlZW4uZW5kVmFsdWUgPSBhY3RpdmVUd2Vlbi5jdXJyZW50VmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNhbGxzVG9TdG9wLnB1c2goaSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChwcm9wZXJ0aWVzTWFwID09PSBcImZpbmlzaFwiIHx8IHByb3BlcnRpZXNNYXAgPT09IFwiZmluaXNoQWxsXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIFRvIGdldCBhY3RpdmUgdHdlZW5zIHRvIGZpbmlzaCBpbW1lZGlhdGVseSwgd2UgZm9yY2VmdWxseSBzaG9ydGVuIHRoZWlyIGR1cmF0aW9ucyB0byAxbXMgc28gdGhhdFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0IHRoZXkgZmluaXNoIHVwb24gdGhlIG5leHQgckFmIHRpY2sgdGhlbiBwcm9jZWVkIHdpdGggbm9ybWFsIGNhbGwgY29tcGxldGlvbiBsb2dpYy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFjdGl2ZUNhbGxbMl0uZHVyYXRpb24gPSAxO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdC8qIFByZW1hdHVyZWx5IGNhbGwgY29tcGxldGVDYWxsKCkgb24gZWFjaCBtYXRjaGVkIGFjdGl2ZSBjYWxsLiBQYXNzIGFuIGFkZGl0aW9uYWwgZmxhZyBmb3IgXCJzdG9wXCIgdG8gaW5kaWNhdGVcclxuXHRcdFx0XHRcdCB0aGF0IHRoZSBjb21wbGV0ZSBjYWxsYmFjayBhbmQgZGlzcGxheTpub25lIHNldHRpbmcgc2hvdWxkIGJlIHNraXBwZWQgc2luY2Ugd2UncmUgY29tcGxldGluZyBwcmVtYXR1cmVseS4gKi9cclxuXHRcdFx0XHRcdGlmIChwcm9wZXJ0aWVzTWFwID09PSBcInN0b3BcIikge1xyXG5cdFx0XHRcdFx0XHQkLmVhY2goY2FsbHNUb1N0b3AsIGZ1bmN0aW9uKGksIGopIHtcclxuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZUNhbGwoaiwgdHJ1ZSk7XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKHByb21pc2VEYXRhLnByb21pc2UpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBJbW1lZGlhdGVseSByZXNvbHZlIHRoZSBwcm9taXNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0b3AgY2FsbCBzaW5jZSBzdG9wIHJ1bnMgc3luY2hyb25vdXNseS4gKi9cclxuXHRcdFx0XHRcdFx0XHRwcm9taXNlRGF0YS5yZXNvbHZlcihlbGVtZW50cyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBTaW5jZSB3ZSdyZSBzdG9wcGluZywgYW5kIG5vdCBwcm9jZWVkaW5nIHdpdGggcXVldWVpbmcsIGV4aXQgb3V0IG9mIFZlbG9jaXR5LiAqL1xyXG5cdFx0XHRcdFx0cmV0dXJuIGdldENoYWluKCk7XHJcblxyXG5cdFx0XHRcdGRlZmF1bHQ6XHJcblx0XHRcdFx0XHQvKiBUcmVhdCBhIG5vbi1lbXB0eSBwbGFpbiBvYmplY3QgYXMgYSBsaXRlcmFsIHByb3BlcnRpZXMgbWFwLiAqL1xyXG5cdFx0XHRcdFx0aWYgKCQuaXNQbGFpbk9iamVjdChwcm9wZXJ0aWVzTWFwKSAmJiAhVHlwZS5pc0VtcHR5T2JqZWN0KHByb3BlcnRpZXNNYXApKSB7XHJcblx0XHRcdFx0XHRcdGFjdGlvbiA9IFwic3RhcnRcIjtcclxuXHJcblx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdCBSZWRpcmVjdHNcclxuXHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHQvKiBDaGVjayBpZiBhIHN0cmluZyBtYXRjaGVzIGEgcmVnaXN0ZXJlZCByZWRpcmVjdCAoc2VlIFJlZGlyZWN0cyBhYm92ZSkuICovXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKFR5cGUuaXNTdHJpbmcocHJvcGVydGllc01hcCkgJiYgVmVsb2NpdHkuUmVkaXJlY3RzW3Byb3BlcnRpZXNNYXBdKSB7XHJcblx0XHRcdFx0XHRcdG9wdHMgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucyk7XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgZHVyYXRpb25PcmlnaW5hbCA9IG9wdHMuZHVyYXRpb24sXHJcblx0XHRcdFx0XHRcdFx0XHRkZWxheU9yaWdpbmFsID0gb3B0cy5kZWxheSB8fCAwO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIGJhY2t3YXJkcyBvcHRpb24gd2FzIHBhc3NlZCBpbiwgcmV2ZXJzZSB0aGUgZWxlbWVudCBzZXQgc28gdGhhdCBlbGVtZW50cyBhbmltYXRlIGZyb20gdGhlIGxhc3QgdG8gdGhlIGZpcnN0LiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAob3B0cy5iYWNrd2FyZHMgPT09IHRydWUpIHtcclxuXHRcdFx0XHRcdFx0XHRlbGVtZW50cyA9ICQuZXh0ZW5kKHRydWUsIFtdLCBlbGVtZW50cykucmV2ZXJzZSgpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBJbmRpdmlkdWFsbHkgdHJpZ2dlciB0aGUgcmVkaXJlY3QgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgc2V0IHRvIHByZXZlbnQgdXNlcnMgZnJvbSBoYXZpbmcgdG8gaGFuZGxlIGl0ZXJhdGlvbiBsb2dpYyBpbiB0aGVpciByZWRpcmVjdC4gKi9cclxuXHRcdFx0XHRcdFx0JC5lYWNoKGVsZW1lbnRzLCBmdW5jdGlvbihlbGVtZW50SW5kZXgsIGVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBJZiB0aGUgc3RhZ2dlciBvcHRpb24gd2FzIHBhc3NlZCBpbiwgc3VjY2Vzc2l2ZWx5IGRlbGF5IGVhY2ggZWxlbWVudCBieSB0aGUgc3RhZ2dlciB2YWx1ZSAoaW4gbXMpLiBSZXRhaW4gdGhlIG9yaWdpbmFsIGRlbGF5IHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChwYXJzZUZsb2F0KG9wdHMuc3RhZ2dlcikpIHtcclxuXHRcdFx0XHRcdFx0XHRcdG9wdHMuZGVsYXkgPSBkZWxheU9yaWdpbmFsICsgKHBhcnNlRmxvYXQob3B0cy5zdGFnZ2VyKSAqIGVsZW1lbnRJbmRleCk7XHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChUeXBlLmlzRnVuY3Rpb24ob3B0cy5zdGFnZ2VyKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0b3B0cy5kZWxheSA9IGRlbGF5T3JpZ2luYWwgKyBvcHRzLnN0YWdnZXIuY2FsbChlbGVtZW50LCBlbGVtZW50SW5kZXgsIGVsZW1lbnRzTGVuZ3RoKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBkcmFnIG9wdGlvbiB3YXMgcGFzc2VkIGluLCBzdWNjZXNzaXZlbHkgaW5jcmVhc2UvZGVjcmVhc2UgKGRlcGVuZGluZyBvbiB0aGUgcHJlc2Vuc2Ugb2Ygb3B0cy5iYWNrd2FyZHMpXHJcblx0XHRcdFx0XHRcdFx0IHRoZSBkdXJhdGlvbiBvZiBlYWNoIGVsZW1lbnQncyBhbmltYXRpb24sIHVzaW5nIGZsb29ycyB0byBwcmV2ZW50IHByb2R1Y2luZyB2ZXJ5IHNob3J0IGR1cmF0aW9ucy4gKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAob3B0cy5kcmFnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBEZWZhdWx0IHRoZSBkdXJhdGlvbiBvZiBVSSBwYWNrIGVmZmVjdHMgKGNhbGxvdXRzIGFuZCB0cmFuc2l0aW9ucykgdG8gMTAwMG1zIGluc3RlYWQgb2YgdGhlIHVzdWFsIGRlZmF1bHQgZHVyYXRpb24gb2YgNDAwbXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRvcHRzLmR1cmF0aW9uID0gcGFyc2VGbG9hdChkdXJhdGlvbk9yaWdpbmFsKSB8fCAoL14oY2FsbG91dHx0cmFuc2l0aW9uKS8udGVzdChwcm9wZXJ0aWVzTWFwKSA/IDEwMDAgOiBEVVJBVElPTl9ERUZBVUxUKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBGb3IgZWFjaCBlbGVtZW50LCB0YWtlIHRoZSBncmVhdGVyIGR1cmF0aW9uIG9mOiBBKSBhbmltYXRpb24gY29tcGxldGlvbiBwZXJjZW50YWdlIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW5hbCBkdXJhdGlvbixcclxuXHRcdFx0XHRcdFx0XHRcdCBCKSA3NSUgb2YgdGhlIG9yaWdpbmFsIGR1cmF0aW9uLCBvciBDKSBhIDIwMG1zIGZhbGxiYWNrIChpbiBjYXNlIGR1cmF0aW9uIGlzIGFscmVhZHkgc2V0IHRvIGEgbG93IHZhbHVlKS5cclxuXHRcdFx0XHRcdFx0XHRcdCBUaGUgZW5kIHJlc3VsdCBpcyBhIGJhc2VsaW5lIG9mIDc1JSBvZiB0aGUgcmVkaXJlY3QncyBkdXJhdGlvbiB0aGF0IGluY3JlYXNlcy9kZWNyZWFzZXMgYXMgdGhlIGVuZCBvZiB0aGUgZWxlbWVudCBzZXQgaXMgYXBwcm9hY2hlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdG9wdHMuZHVyYXRpb24gPSBNYXRoLm1heChvcHRzLmR1cmF0aW9uICogKG9wdHMuYmFja3dhcmRzID8gMSAtIGVsZW1lbnRJbmRleCAvIGVsZW1lbnRzTGVuZ3RoIDogKGVsZW1lbnRJbmRleCArIDEpIC8gZWxlbWVudHNMZW5ndGgpLCBvcHRzLmR1cmF0aW9uICogMC43NSwgMjAwKTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIFBhc3MgaW4gdGhlIGNhbGwncyBvcHRzIG9iamVjdCBzbyB0aGF0IHRoZSByZWRpcmVjdCBjYW4gb3B0aW9uYWxseSBleHRlbmQgaXQuIEl0IGRlZmF1bHRzIHRvIGFuIGVtcHR5IG9iamVjdCBpbnN0ZWFkIG9mIG51bGwgdG9cclxuXHRcdFx0XHRcdFx0XHQgcmVkdWNlIHRoZSBvcHRzIGNoZWNraW5nIGxvZ2ljIHJlcXVpcmVkIGluc2lkZSB0aGUgcmVkaXJlY3QuICovXHJcblx0XHRcdFx0XHRcdFx0VmVsb2NpdHkuUmVkaXJlY3RzW3Byb3BlcnRpZXNNYXBdLmNhbGwoZWxlbWVudCwgZWxlbWVudCwgb3B0cyB8fCB7fSwgZWxlbWVudEluZGV4LCBlbGVtZW50c0xlbmd0aCwgZWxlbWVudHMsIHByb21pc2VEYXRhLnByb21pc2UgPyBwcm9taXNlRGF0YSA6IHVuZGVmaW5lZCk7XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogU2luY2UgdGhlIGFuaW1hdGlvbiBsb2dpYyByZXNpZGVzIHdpdGhpbiB0aGUgcmVkaXJlY3QncyBvd24gY29kZSwgYWJvcnQgdGhlIHJlbWFpbmRlciBvZiB0aGlzIGNhbGwuXHJcblx0XHRcdFx0XHRcdCAoVGhlIHBlcmZvcm1hbmNlIG92ZXJoZWFkIHVwIHRvIHRoaXMgcG9pbnQgaXMgdmlydHVhbGx5IG5vbi1leGlzdGFudC4pICovXHJcblx0XHRcdFx0XHRcdC8qIE5vdGU6IFRoZSBqUXVlcnkgY2FsbCBjaGFpbiBpcyBrZXB0IGludGFjdCBieSByZXR1cm5pbmcgdGhlIGNvbXBsZXRlIGVsZW1lbnQgc2V0LiAqL1xyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZ2V0Q2hhaW4oKTtcclxuXHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdHZhciBhYm9ydEVycm9yID0gXCJWZWxvY2l0eTogRmlyc3QgYXJndW1lbnQgKFwiICsgcHJvcGVydGllc01hcCArIFwiKSB3YXMgbm90IGEgcHJvcGVydHkgbWFwLCBhIGtub3duIGFjdGlvbiwgb3IgYSByZWdpc3RlcmVkIHJlZGlyZWN0LiBBYm9ydGluZy5cIjtcclxuXHJcblx0XHRcdFx0XHRcdGlmIChwcm9taXNlRGF0YS5wcm9taXNlKSB7XHJcblx0XHRcdFx0XHRcdFx0cHJvbWlzZURhdGEucmVqZWN0ZXIobmV3IEVycm9yKGFib3J0RXJyb3IpKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh3aW5kb3cuY29uc29sZSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKGFib3J0RXJyb3IpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRyZXR1cm4gZ2V0Q2hhaW4oKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBDYWxsLVdpZGUgVmFyaWFibGVzXHJcblx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdC8qIEEgY29udGFpbmVyIGZvciBDU1MgdW5pdCBjb252ZXJzaW9uIHJhdGlvcyAoZS5nLiAlLCByZW0sIGFuZCBlbSA9PT4gcHgpIHRoYXQgaXMgdXNlZCB0byBjYWNoZSByYXRpb3MgYWNyb3NzIGFsbCBlbGVtZW50c1xyXG5cdFx0XHQgYmVpbmcgYW5pbWF0ZWQgaW4gYSBzaW5nbGUgVmVsb2NpdHkgY2FsbC4gQ2FsY3VsYXRpbmcgdW5pdCByYXRpb3MgbmVjZXNzaXRhdGVzIERPTSBxdWVyeWluZyBhbmQgdXBkYXRpbmcsIGFuZCBpcyB0aGVyZWZvcmVcclxuXHRcdFx0IGF2b2lkZWQgKHZpYSBjYWNoaW5nKSB3aGVyZXZlciBwb3NzaWJsZS4gVGhpcyBjb250YWluZXIgaXMgY2FsbC13aWRlIGluc3RlYWQgb2YgcGFnZS13aWRlIHRvIGF2b2lkIHRoZSByaXNrIG9mIHVzaW5nIHN0YWxlXHJcblx0XHRcdCBjb252ZXJzaW9uIG1ldHJpY3MgYWNyb3NzIFZlbG9jaXR5IGFuaW1hdGlvbnMgdGhhdCBhcmUgbm90IGltbWVkaWF0ZWx5IGNvbnNlY3V0aXZlbHkgY2hhaW5lZC4gKi9cclxuXHRcdFx0dmFyIGNhbGxVbml0Q29udmVyc2lvbkRhdGEgPSB7XHJcblx0XHRcdFx0bGFzdFBhcmVudDogbnVsbCxcclxuXHRcdFx0XHRsYXN0UG9zaXRpb246IG51bGwsXHJcblx0XHRcdFx0bGFzdEZvbnRTaXplOiBudWxsLFxyXG5cdFx0XHRcdGxhc3RQZXJjZW50VG9QeFdpZHRoOiBudWxsLFxyXG5cdFx0XHRcdGxhc3RQZXJjZW50VG9QeEhlaWdodDogbnVsbCxcclxuXHRcdFx0XHRsYXN0RW1Ub1B4OiBudWxsLFxyXG5cdFx0XHRcdHJlbVRvUHg6IG51bGwsXHJcblx0XHRcdFx0dndUb1B4OiBudWxsLFxyXG5cdFx0XHRcdHZoVG9QeDogbnVsbFxyXG5cdFx0XHR9O1xyXG5cclxuXHRcdFx0LyogQSBjb250YWluZXIgZm9yIGFsbCB0aGUgZW5zdWluZyB0d2VlbiBkYXRhIGFuZCBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWxsLiBUaGlzIGNvbnRhaW5lciBnZXRzIHB1c2hlZCB0byB0aGUgcGFnZS13aWRlXHJcblx0XHRcdCBWZWxvY2l0eS5TdGF0ZS5jYWxscyBhcnJheSB0aGF0IGlzIHByb2Nlc3NlZCBkdXJpbmcgYW5pbWF0aW9uIHRpY2tpbmcuICovXHJcblx0XHRcdHZhciBjYWxsID0gW107XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBFbGVtZW50IFByb2Nlc3NpbmdcclxuXHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdC8qIEVsZW1lbnQgcHJvY2Vzc2luZyBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0cyAtLSBkYXRhIHByb2Nlc3NpbmcgdGhhdCBjYW5ub3QgZ28gc3RhbGUgYW5kIGRhdGEgcHJvY2Vzc2luZyB0aGF0ICpjYW4qIGdvIHN0YWxlIChpLmUuIHRoaXJkLXBhcnR5IHN0eWxlIG1vZGlmaWNhdGlvbnMpOlxyXG5cdFx0XHQgMSkgUHJlLVF1ZXVlaW5nOiBFbGVtZW50LXdpZGUgdmFyaWFibGVzLCBpbmNsdWRpbmcgdGhlIGVsZW1lbnQncyBkYXRhIHN0b3JhZ2UsIGFyZSBpbnN0YW50aWF0ZWQuIENhbGwgb3B0aW9ucyBhcmUgcHJlcGFyZWQuIElmIHRyaWdnZXJlZCwgdGhlIFN0b3AgYWN0aW9uIGlzIGV4ZWN1dGVkLlxyXG5cdFx0XHQgMikgUXVldWVpbmc6IFRoZSBsb2dpYyB0aGF0IHJ1bnMgb25jZSB0aGlzIGNhbGwgaGFzIHJlYWNoZWQgaXRzIHBvaW50IG9mIGV4ZWN1dGlvbiBpbiB0aGUgZWxlbWVudCdzICQucXVldWUoKSBzdGFjay4gTW9zdCBsb2dpYyBpcyBwbGFjZWQgaGVyZSB0byBhdm9pZCByaXNraW5nIGl0IGJlY29taW5nIHN0YWxlLlxyXG5cdFx0XHQgMykgUHVzaGluZzogQ29uc29saWRhdGlvbiBvZiB0aGUgdHdlZW4gZGF0YSBmb2xsb3dlZCBieSBpdHMgcHVzaCBvbnRvIHRoZSBnbG9iYWwgaW4tcHJvZ3Jlc3MgY2FsbHMgY29udGFpbmVyLlxyXG5cdFx0XHQgYGVsZW1lbnRBcnJheUluZGV4YCBhbGxvd3MgcGFzc2luZyBpbmRleCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgYXJyYXkgdG8gdmFsdWUgZnVuY3Rpb25zLlxyXG5cdFx0XHQgSWYgYGVsZW1lbnRzSW5kZXhgIHdlcmUgdXNlZCBpbnN0ZWFkIHRoZSBpbmRleCB3b3VsZCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBlbGVtZW50cycgcGVyLWVsZW1lbnQgcXVldWUuXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRmdW5jdGlvbiBwcm9jZXNzRWxlbWVudChlbGVtZW50LCBlbGVtZW50QXJyYXlJbmRleCkge1xyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBQYXJ0IEk6IFByZS1RdWV1ZWluZ1xyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0IEVsZW1lbnQtV2lkZSBWYXJpYWJsZXNcclxuXHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHR2YXIgLyogVGhlIHJ1bnRpbWUgb3B0cyBvYmplY3QgaXMgdGhlIGV4dGVuc2lvbiBvZiB0aGUgY3VycmVudCBjYWxsJ3Mgb3B0aW9ucyBhbmQgVmVsb2NpdHkncyBwYWdlLXdpZGUgb3B0aW9uIGRlZmF1bHRzLiAqL1xyXG5cdFx0XHRcdFx0XHRvcHRzID0gJC5leHRlbmQoe30sIFZlbG9jaXR5LmRlZmF1bHRzLCBvcHRpb25zKSxcclxuXHRcdFx0XHRcdFx0LyogQSBjb250YWluZXIgZm9yIHRoZSBwcm9jZXNzZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggZWFjaCBwcm9wZXJ0eSBpbiB0aGUgcHJvcGVydHlNYXAuXHJcblx0XHRcdFx0XHRcdCAoRWFjaCBwcm9wZXJ0eSBpbiB0aGUgbWFwIHByb2R1Y2VzIGl0cyBvd24gXCJ0d2VlblwiLikgKi9cclxuXHRcdFx0XHRcdFx0dHdlZW5zQ29udGFpbmVyID0ge30sXHJcblx0XHRcdFx0XHRcdGVsZW1lbnRVbml0Q29udmVyc2lvbkRhdGE7XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgRWxlbWVudCBJbml0XHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0aWYgKERhdGEoZWxlbWVudCkgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0VmVsb2NpdHkuaW5pdChlbGVtZW50KTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgT3B0aW9uOiBEZWxheVxyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIFNpbmNlIHF1ZXVlOmZhbHNlIGRvZXNuJ3QgcmVzcGVjdCB0aGUgaXRlbSdzIGV4aXN0aW5nIHF1ZXVlLCB3ZSBhdm9pZCBpbmplY3RpbmcgaXRzIGRlbGF5IGhlcmUgKGl0J3Mgc2V0IGxhdGVyIG9uKS4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBWZWxvY2l0eSByb2xscyBpdHMgb3duIGRlbGF5IGZ1bmN0aW9uIHNpbmNlIGpRdWVyeSBkb2Vzbid0IGhhdmUgYSB1dGlsaXR5IGFsaWFzIGZvciAkLmZuLmRlbGF5KClcclxuXHRcdFx0XHQgKGFuZCB0aHVzIHJlcXVpcmVzIGpRdWVyeSBlbGVtZW50IGNyZWF0aW9uLCB3aGljaCB3ZSBhdm9pZCBzaW5jZSBpdHMgb3ZlcmhlYWQgaW5jbHVkZXMgRE9NIHF1ZXJ5aW5nKS4gKi9cclxuXHRcdFx0XHRpZiAocGFyc2VGbG9hdChvcHRzLmRlbGF5KSAmJiBvcHRzLnF1ZXVlICE9PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0JC5xdWV1ZShlbGVtZW50LCBvcHRzLnF1ZXVlLCBmdW5jdGlvbihuZXh0LCBjbGVhclF1ZXVlKSB7XHJcblx0XHRcdFx0XHRcdGlmIChjbGVhclF1ZXVlID09PSB0cnVlKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogRG8gbm90IGNvbnRpbnVlIHdpdGggYW5pbWF0aW9uIHF1ZXVlaW5nLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBUaGlzIGlzIGEgZmxhZyB1c2VkIHRvIGluZGljYXRlIHRvIHRoZSB1cGNvbWluZyBjb21wbGV0ZUNhbGwoKSBmdW5jdGlvbiB0aGF0IHRoaXMgcXVldWUgZW50cnkgd2FzIGluaXRpYXRlZCBieSBWZWxvY2l0eS4gU2VlIGNvbXBsZXRlQ2FsbCgpIGZvciBmdXJ0aGVyIGRldGFpbHMuICovXHJcblx0XHRcdFx0XHRcdFZlbG9jaXR5LnZlbG9jaXR5UXVldWVFbnRyeUZsYWcgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogVGhlIGVuc3VpbmcgcXVldWUgaXRlbSAod2hpY2ggaXMgYXNzaWduZWQgdG8gdGhlIFwibmV4dFwiIGFyZ3VtZW50IHRoYXQgJC5xdWV1ZSgpIGF1dG9tYXRpY2FsbHkgcGFzc2VzIGluKSB3aWxsIGJlIHRyaWdnZXJlZCBhZnRlciBhIHNldFRpbWVvdXQgZGVsYXkuXHJcblx0XHRcdFx0XHRcdCBUaGUgc2V0VGltZW91dCBpcyBzdG9yZWQgc28gdGhhdCBpdCBjYW4gYmUgc3ViamVjdGVkIHRvIGNsZWFyVGltZW91dCgpIGlmIHRoaXMgYW5pbWF0aW9uIGlzIHByZW1hdHVyZWx5IHN0b3BwZWQgdmlhIFZlbG9jaXR5J3MgXCJzdG9wXCIgY29tbWFuZCwgYW5kXHJcblx0XHRcdFx0XHRcdCBkZWxheUJlZ2luL2RlbGF5VGltZSBpcyB1c2VkIHRvIGVuc3VyZSB3ZSBjYW4gXCJwYXVzZVwiIGFuZCBcInJlc3VtZVwiIGEgdHdlZW4gdGhhdCBpcyBzdGlsbCBtaWQtZGVsYXkuICovXHJcblxyXG5cdFx0XHRcdFx0XHQvKiBUZW1wb3JhcmlseSBzdG9yZSBkZWxheWVkIGVsZW1lbnRzIHRvIGZhY2lsaXRlIGFjY2VzcyBmb3IgZ2xvYmFsIHBhdXNlL3Jlc3VtZSAqL1xyXG5cdFx0XHRcdFx0XHR2YXIgY2FsbEluZGV4ID0gVmVsb2NpdHkuU3RhdGUuZGVsYXllZEVsZW1lbnRzLmNvdW50Kys7XHJcblx0XHRcdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmRlbGF5ZWRFbGVtZW50c1tjYWxsSW5kZXhdID0gZWxlbWVudDtcclxuXHJcblx0XHRcdFx0XHRcdHZhciBkZWxheUNvbXBsZXRlID0gKGZ1bmN0aW9uKGluZGV4KSB7XHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogQ2xlYXIgdGhlIHRlbXBvcmFyeSBlbGVtZW50ICovXHJcblx0XHRcdFx0XHRcdFx0XHRWZWxvY2l0eS5TdGF0ZS5kZWxheWVkRWxlbWVudHNbaW5kZXhdID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogRmluYWxseSwgaXNzdWUgdGhlIGNhbGwgKi9cclxuXHRcdFx0XHRcdFx0XHRcdG5leHQoKTtcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHR9KShjYWxsSW5kZXgpO1xyXG5cclxuXHJcblx0XHRcdFx0XHRcdERhdGEoZWxlbWVudCkuZGVsYXlCZWdpbiA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XHJcblx0XHRcdFx0XHRcdERhdGEoZWxlbWVudCkuZGVsYXkgPSBwYXJzZUZsb2F0KG9wdHMuZGVsYXkpO1xyXG5cdFx0XHRcdFx0XHREYXRhKGVsZW1lbnQpLmRlbGF5VGltZXIgPSB7XHJcblx0XHRcdFx0XHRcdFx0c2V0VGltZW91dDogc2V0VGltZW91dChuZXh0LCBwYXJzZUZsb2F0KG9wdHMuZGVsYXkpKSxcclxuXHRcdFx0XHRcdFx0XHRuZXh0OiBkZWxheUNvbXBsZXRlXHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgT3B0aW9uOiBEdXJhdGlvblxyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIFN1cHBvcnQgZm9yIGpRdWVyeSdzIG5hbWVkIGR1cmF0aW9ucy4gKi9cclxuXHRcdFx0XHRzd2l0Y2ggKG9wdHMuZHVyYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcblx0XHRcdFx0XHRjYXNlIFwiZmFzdFwiOlxyXG5cdFx0XHRcdFx0XHRvcHRzLmR1cmF0aW9uID0gMjAwO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIFwibm9ybWFsXCI6XHJcblx0XHRcdFx0XHRcdG9wdHMuZHVyYXRpb24gPSBEVVJBVElPTl9ERUZBVUxUO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRjYXNlIFwic2xvd1wiOlxyXG5cdFx0XHRcdFx0XHRvcHRzLmR1cmF0aW9uID0gNjAwO1xyXG5cdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHQvKiBSZW1vdmUgdGhlIHBvdGVudGlhbCBcIm1zXCIgc3VmZml4IGFuZCBkZWZhdWx0IHRvIDEgaWYgdGhlIHVzZXIgaXMgYXR0ZW1wdGluZyB0byBzZXQgYSBkdXJhdGlvbiBvZiAwIChpbiBvcmRlciB0byBwcm9kdWNlIGFuIGltbWVkaWF0ZSBzdHlsZSBjaGFuZ2UpLiAqL1xyXG5cdFx0XHRcdFx0XHRvcHRzLmR1cmF0aW9uID0gcGFyc2VGbG9hdChvcHRzLmR1cmF0aW9uKSB8fCAxO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBHbG9iYWwgT3B0aW9uOiBNb2NrXHJcblx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0aWYgKFZlbG9jaXR5Lm1vY2sgIT09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHQvKiBJbiBtb2NrIG1vZGUsIGFsbCBhbmltYXRpb25zIGFyZSBmb3JjZWQgdG8gMW1zIHNvIHRoYXQgdGhleSBvY2N1ciBpbW1lZGlhdGVseSB1cG9uIHRoZSBuZXh0IHJBRiB0aWNrLlxyXG5cdFx0XHRcdFx0IEFsdGVybmF0aXZlbHksIGEgbXVsdGlwbGllciBjYW4gYmUgcGFzc2VkIGluIHRvIHRpbWUgcmVtYXAgYWxsIGRlbGF5cyBhbmQgZHVyYXRpb25zLiAqL1xyXG5cdFx0XHRcdFx0aWYgKFZlbG9jaXR5Lm1vY2sgPT09IHRydWUpIHtcclxuXHRcdFx0XHRcdFx0b3B0cy5kdXJhdGlvbiA9IG9wdHMuZGVsYXkgPSAxO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0b3B0cy5kdXJhdGlvbiAqPSBwYXJzZUZsb2F0KFZlbG9jaXR5Lm1vY2spIHx8IDE7XHJcblx0XHRcdFx0XHRcdG9wdHMuZGVsYXkgKj0gcGFyc2VGbG9hdChWZWxvY2l0eS5tb2NrKSB8fCAxO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgT3B0aW9uOiBFYXNpbmdcclxuXHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0b3B0cy5lYXNpbmcgPSBnZXRFYXNpbmcob3B0cy5lYXNpbmcsIG9wdHMuZHVyYXRpb24pO1xyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBPcHRpb246IENhbGxiYWNrc1xyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHQvKiBDYWxsYmFja3MgbXVzdCBmdW5jdGlvbnMuIE90aGVyd2lzZSwgZGVmYXVsdCB0byBudWxsLiAqL1xyXG5cdFx0XHRcdGlmIChvcHRzLmJlZ2luICYmICFUeXBlLmlzRnVuY3Rpb24ob3B0cy5iZWdpbikpIHtcclxuXHRcdFx0XHRcdG9wdHMuYmVnaW4gPSBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKG9wdHMucHJvZ3Jlc3MgJiYgIVR5cGUuaXNGdW5jdGlvbihvcHRzLnByb2dyZXNzKSkge1xyXG5cdFx0XHRcdFx0b3B0cy5wcm9ncmVzcyA9IG51bGw7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAob3B0cy5jb21wbGV0ZSAmJiAhVHlwZS5pc0Z1bmN0aW9uKG9wdHMuY29tcGxldGUpKSB7XHJcblx0XHRcdFx0XHRvcHRzLmNvbXBsZXRlID0gbnVsbDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgT3B0aW9uOiBEaXNwbGF5ICYgVmlzaWJpbGl0eVxyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIFJlZmVyIHRvIFZlbG9jaXR5J3MgZG9jdW1lbnRhdGlvbiAoVmVsb2NpdHlKUy5vcmcvI2Rpc3BsYXlBbmRWaXNpYmlsaXR5KSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZGlzcGxheSBhbmQgdmlzaWJpbGl0eSBvcHRpb25zJyBiZWhhdmlvci4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBXZSBzdHJpY3RseSBjaGVjayBmb3IgdW5kZWZpbmVkIGluc3RlYWQgb2YgZmFsc2luZXNzIGJlY2F1c2UgZGlzcGxheSBhY2NlcHRzIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4gKi9cclxuXHRcdFx0XHRpZiAob3B0cy5kaXNwbGF5ICE9PSB1bmRlZmluZWQgJiYgb3B0cy5kaXNwbGF5ICE9PSBudWxsKSB7XHJcblx0XHRcdFx0XHRvcHRzLmRpc3BsYXkgPSBvcHRzLmRpc3BsYXkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuXHRcdFx0XHRcdC8qIFVzZXJzIGNhbiBwYXNzIGluIGEgc3BlY2lhbCBcImF1dG9cIiB2YWx1ZSB0byBpbnN0cnVjdCBWZWxvY2l0eSB0byBzZXQgdGhlIGVsZW1lbnQgdG8gaXRzIGRlZmF1bHQgZGlzcGxheSB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdGlmIChvcHRzLmRpc3BsYXkgPT09IFwiYXV0b1wiKSB7XHJcblx0XHRcdFx0XHRcdG9wdHMuZGlzcGxheSA9IFZlbG9jaXR5LkNTUy5WYWx1ZXMuZ2V0RGlzcGxheVR5cGUoZWxlbWVudCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRpZiAob3B0cy52aXNpYmlsaXR5ICE9PSB1bmRlZmluZWQgJiYgb3B0cy52aXNpYmlsaXR5ICE9PSBudWxsKSB7XHJcblx0XHRcdFx0XHRvcHRzLnZpc2liaWxpdHkgPSBvcHRzLnZpc2liaWxpdHkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgT3B0aW9uOiBtb2JpbGVIQVxyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHQvKiBXaGVuIHNldCB0byB0cnVlLCBhbmQgaWYgdGhpcyBpcyBhIG1vYmlsZSBkZXZpY2UsIG1vYmlsZUhBIGF1dG9tYXRpY2FsbHkgZW5hYmxlcyBoYXJkd2FyZSBhY2NlbGVyYXRpb24gKHZpYSBhIG51bGwgdHJhbnNmb3JtIGhhY2spXHJcblx0XHRcdFx0IG9uIGFuaW1hdGluZyBlbGVtZW50cy4gSEEgaXMgcmVtb3ZlZCBmcm9tIHRoZSBlbGVtZW50IGF0IHRoZSBjb21wbGV0aW9uIG9mIGl0cyBhbmltYXRpb24uICovXHJcblx0XHRcdFx0LyogTm90ZTogQW5kcm9pZCBHaW5nZXJicmVhZCBkb2Vzbid0IHN1cHBvcnQgSEEuIElmIGEgbnVsbCB0cmFuc2Zvcm0gaGFjayAobW9iaWxlSEEpIGlzIGluIGZhY3Qgc2V0LCBpdCB3aWxsIHByZXZlbnQgb3RoZXIgdHJhbmZvcm0gc3VicHJvcGVydGllcyBmcm9tIHRha2luZyBlZmZlY3QuICovXHJcblx0XHRcdFx0LyogTm90ZTogWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgdGhlIHVzZSBvZiBtb2JpbGVIQSBpbiBWZWxvY2l0eSdzIGRvY3VtZW50YXRpb246IFZlbG9jaXR5SlMub3JnLyNtb2JpbGVIQS4gKi9cclxuXHRcdFx0XHRvcHRzLm1vYmlsZUhBID0gKG9wdHMubW9iaWxlSEEgJiYgVmVsb2NpdHkuU3RhdGUuaXNNb2JpbGUgJiYgIVZlbG9jaXR5LlN0YXRlLmlzR2luZ2VyYnJlYWQpO1xyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgUGFydCBJSTogUXVldWVpbmdcclxuXHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIFdoZW4gYSBzZXQgb2YgZWxlbWVudHMgaXMgdGFyZ2V0ZWQgYnkgYSBWZWxvY2l0eSBjYWxsLCB0aGUgc2V0IGlzIGJyb2tlbiB1cCBhbmQgZWFjaCBlbGVtZW50IGhhcyB0aGUgY3VycmVudCBWZWxvY2l0eSBjYWxsIGluZGl2aWR1YWxseSBxdWV1ZWQgb250byBpdC5cclxuXHRcdFx0XHQgSW4gdGhpcyB3YXksIGVhY2ggZWxlbWVudCdzIGV4aXN0aW5nIHF1ZXVlIGlzIHJlc3BlY3RlZDsgc29tZSBlbGVtZW50cyBtYXkgYWxyZWFkeSBiZSBhbmltYXRpbmcgYW5kIGFjY29yZGluZ2x5IHNob3VsZCBub3QgaGF2ZSB0aGlzIGN1cnJlbnQgVmVsb2NpdHkgY2FsbCB0cmlnZ2VyZWQgaW1tZWRpYXRlbHkuICovXHJcblx0XHRcdFx0LyogSW4gZWFjaCBxdWV1ZSwgdHdlZW4gZGF0YSBpcyBwcm9jZXNzZWQgZm9yIGVhY2ggYW5pbWF0aW5nIHByb3BlcnR5IHRoZW4gcHVzaGVkIG9udG8gdGhlIGNhbGwtd2lkZSBjYWxscyBhcnJheS4gV2hlbiB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBzZXQgaGFzIGhhZCBpdHMgdHdlZW5zIHByb2Nlc3NlZCxcclxuXHRcdFx0XHQgdGhlIGNhbGwgYXJyYXkgaXMgcHVzaGVkIHRvIFZlbG9jaXR5LlN0YXRlLmNhbGxzIGZvciBsaXZlIHByb2Nlc3NpbmcgYnkgdGhlIHJlcXVlc3RBbmltYXRpb25GcmFtZSB0aWNrLiAqL1xyXG5cdFx0XHRcdGZ1bmN0aW9uIGJ1aWxkUXVldWUobmV4dCkge1xyXG5cdFx0XHRcdFx0dmFyIGRhdGEsIGxhc3RUd2VlbnNDb250YWluZXI7XHJcblxyXG5cdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdCBPcHRpb246IEJlZ2luXHJcblx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHQvKiBUaGUgYmVnaW4gY2FsbGJhY2sgaXMgZmlyZWQgb25jZSBwZXIgY2FsbCAtLSBub3Qgb25jZSBwZXIgZWxlbWVuZXQgLS0gYW5kIGlzIHBhc3NlZCB0aGUgZnVsbCByYXcgRE9NIGVsZW1lbnQgc2V0IGFzIGJvdGggaXRzIGNvbnRleHQgYW5kIGl0cyBmaXJzdCBhcmd1bWVudC4gKi9cclxuXHRcdFx0XHRcdGlmIChvcHRzLmJlZ2luICYmIGVsZW1lbnRzSW5kZXggPT09IDApIHtcclxuXHRcdFx0XHRcdFx0LyogV2UgdGhyb3cgY2FsbGJhY2tzIGluIGEgc2V0VGltZW91dCBzbyB0aGF0IHRocm93biBlcnJvcnMgZG9uJ3QgaGFsdCB0aGUgZXhlY3V0aW9uIG9mIFZlbG9jaXR5IGl0c2VsZi4gKi9cclxuXHRcdFx0XHRcdFx0dHJ5IHtcclxuXHRcdFx0XHRcdFx0XHRvcHRzLmJlZ2luLmNhbGwoZWxlbWVudHMsIGVsZW1lbnRzKTtcclxuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhyb3cgZXJyb3I7XHJcblx0XHRcdFx0XHRcdFx0fSwgMSk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdCBUd2VlbiBEYXRhIENvbnN0cnVjdGlvbiAoZm9yIFNjcm9sbClcclxuXHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHQvKiBOb3RlOiBJbiBvcmRlciB0byBiZSBzdWJqZWN0ZWQgdG8gY2hhaW5pbmcgYW5kIGFuaW1hdGlvbiBvcHRpb25zLCBzY3JvbGwncyB0d2VlbmluZyBpcyByb3V0ZWQgdGhyb3VnaCBWZWxvY2l0eSBhcyBpZiBpdCB3ZXJlIGEgc3RhbmRhcmQgQ1NTIHByb3BlcnR5IGFuaW1hdGlvbi4gKi9cclxuXHRcdFx0XHRcdGlmIChhY3Rpb24gPT09IFwic2Nyb2xsXCIpIHtcclxuXHRcdFx0XHRcdFx0LyogVGhlIHNjcm9sbCBhY3Rpb24gdW5pcXVlbHkgdGFrZXMgYW4gb3B0aW9uYWwgXCJvZmZzZXRcIiBvcHRpb24gLS0gc3BlY2lmaWVkIGluIHBpeGVscyAtLSB0aGF0IG9mZnNldHMgdGhlIHRhcmdldGVkIHNjcm9sbCBwb3NpdGlvbi4gKi9cclxuXHRcdFx0XHRcdFx0dmFyIHNjcm9sbERpcmVjdGlvbiA9ICgvXngkL2kudGVzdChvcHRzLmF4aXMpID8gXCJMZWZ0XCIgOiBcIlRvcFwiKSxcclxuXHRcdFx0XHRcdFx0XHRcdHNjcm9sbE9mZnNldCA9IHBhcnNlRmxvYXQob3B0cy5vZmZzZXQpIHx8IDAsXHJcblx0XHRcdFx0XHRcdFx0XHRzY3JvbGxQb3NpdGlvbkN1cnJlbnQsXHJcblx0XHRcdFx0XHRcdFx0XHRzY3JvbGxQb3NpdGlvbkN1cnJlbnRBbHRlcm5hdGUsXHJcblx0XHRcdFx0XHRcdFx0XHRzY3JvbGxQb3NpdGlvbkVuZDtcclxuXHJcblx0XHRcdFx0XHRcdC8qIFNjcm9sbCBhbHNvIHVuaXF1ZWx5IHRha2VzIGFuIG9wdGlvbmFsIFwiY29udGFpbmVyXCIgb3B0aW9uLCB3aGljaCBpbmRpY2F0ZXMgdGhlIHBhcmVudCBlbGVtZW50IHRoYXQgc2hvdWxkIGJlIHNjcm9sbGVkIC0tXHJcblx0XHRcdFx0XHRcdCBhcyBvcHBvc2VkIHRvIHRoZSBicm93c2VyIHdpbmRvdyBpdHNlbGYuIFRoaXMgaXMgdXNlZnVsIGZvciBzY3JvbGxpbmcgdG93YXJkIGFuIGVsZW1lbnQgdGhhdCdzIGluc2lkZSBhbiBvdmVyZmxvd2luZyBwYXJlbnQgZWxlbWVudC4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKG9wdHMuY29udGFpbmVyKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogRW5zdXJlIHRoYXQgZWl0aGVyIGEgalF1ZXJ5IG9iamVjdCBvciBhIHJhdyBET00gZWxlbWVudCB3YXMgcGFzc2VkIGluLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChUeXBlLmlzV3JhcHBlZChvcHRzLmNvbnRhaW5lcikgfHwgVHlwZS5pc05vZGUob3B0cy5jb250YWluZXIpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBFeHRyYWN0IHRoZSByYXcgRE9NIGVsZW1lbnQgZnJvbSB0aGUgalF1ZXJ5IHdyYXBwZXIuICovXHJcblx0XHRcdFx0XHRcdFx0XHRvcHRzLmNvbnRhaW5lciA9IG9wdHMuY29udGFpbmVyWzBdIHx8IG9wdHMuY29udGFpbmVyO1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogTm90ZTogVW5saWtlIG90aGVyIHByb3BlcnRpZXMgaW4gVmVsb2NpdHksIHRoZSBicm93c2VyJ3Mgc2Nyb2xsIHBvc2l0aW9uIGlzIG5ldmVyIGNhY2hlZCBzaW5jZSBpdCBzbyBmcmVxdWVudGx5IGNoYW5nZXNcclxuXHRcdFx0XHRcdFx0XHRcdCAoZHVlIHRvIHRoZSB1c2VyJ3MgbmF0dXJhbCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBwYWdlKS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdHNjcm9sbFBvc2l0aW9uQ3VycmVudCA9IG9wdHMuY29udGFpbmVyW1wic2Nyb2xsXCIgKyBzY3JvbGxEaXJlY3Rpb25dOyAvKiBHRVQgKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiAkLnBvc2l0aW9uKCkgdmFsdWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgY29udGFpbmVyJ3MgY3VycmVudGx5IHZpZXdhYmxlIGFyZWEgKHdpdGhvdXQgdGFraW5nIGludG8gYWNjb3VudCB0aGUgY29udGFpbmVyJ3MgdHJ1ZSBkaW1lbnNpb25zXHJcblx0XHRcdFx0XHRcdFx0XHQgLS0gc2F5LCBmb3IgZXhhbXBsZSwgaWYgdGhlIGNvbnRhaW5lciB3YXMgbm90IG92ZXJmbG93aW5nKS4gVGh1cywgdGhlIHNjcm9sbCBlbmQgdmFsdWUgaXMgdGhlIHN1bSBvZiB0aGUgY2hpbGQgZWxlbWVudCdzIHBvc2l0aW9uICphbmQqXHJcblx0XHRcdFx0XHRcdFx0XHQgdGhlIHNjcm9sbCBjb250YWluZXIncyBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbi4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdHNjcm9sbFBvc2l0aW9uRW5kID0gKHNjcm9sbFBvc2l0aW9uQ3VycmVudCArICQoZWxlbWVudCkucG9zaXRpb24oKVtzY3JvbGxEaXJlY3Rpb24udG9Mb3dlckNhc2UoKV0pICsgc2Nyb2xsT2Zmc2V0OyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdC8qIElmIGEgdmFsdWUgb3RoZXIgdGhhbiBhIGpRdWVyeSBvYmplY3Qgb3IgYSByYXcgRE9NIGVsZW1lbnQgd2FzIHBhc3NlZCBpbiwgZGVmYXVsdCB0byBudWxsIHNvIHRoYXQgdGhpcyBvcHRpb24gaXMgaWdub3JlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0b3B0cy5jb250YWluZXIgPSBudWxsO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBJZiB0aGUgd2luZG93IGl0c2VsZiBpcyBiZWluZyBzY3JvbGxlZCAtLSBub3QgYSBjb250YWluaW5nIGVsZW1lbnQgLS0gcGVyZm9ybSBhIGxpdmUgc2Nyb2xsIHBvc2l0aW9uIGxvb2t1cCB1c2luZ1xyXG5cdFx0XHRcdFx0XHRcdCB0aGUgYXBwcm9wcmlhdGUgY2FjaGVkIHByb3BlcnR5IG5hbWVzICh3aGljaCBkaWZmZXIgYmFzZWQgb24gYnJvd3NlciB0eXBlKS4gKi9cclxuXHRcdFx0XHRcdFx0XHRzY3JvbGxQb3NpdGlvbkN1cnJlbnQgPSBWZWxvY2l0eS5TdGF0ZS5zY3JvbGxBbmNob3JbVmVsb2NpdHkuU3RhdGVbXCJzY3JvbGxQcm9wZXJ0eVwiICsgc2Nyb2xsRGlyZWN0aW9uXV07IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdC8qIFdoZW4gc2Nyb2xsaW5nIHRoZSBicm93c2VyIHdpbmRvdywgY2FjaGUgdGhlIGFsdGVybmF0ZSBheGlzJ3MgY3VycmVudCB2YWx1ZSBzaW5jZSB3aW5kb3cuc2Nyb2xsVG8oKSBkb2Vzbid0IGxldCB1cyBjaGFuZ2Ugb25seSBvbmUgdmFsdWUgYXQgYSB0aW1lLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHNjcm9sbFBvc2l0aW9uQ3VycmVudEFsdGVybmF0ZSA9IFZlbG9jaXR5LlN0YXRlLnNjcm9sbEFuY2hvcltWZWxvY2l0eS5TdGF0ZVtcInNjcm9sbFByb3BlcnR5XCIgKyAoc2Nyb2xsRGlyZWN0aW9uID09PSBcIkxlZnRcIiA/IFwiVG9wXCIgOiBcIkxlZnRcIildXTsgLyogR0VUICovXHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIFVubGlrZSAkLnBvc2l0aW9uKCksICQub2Zmc2V0KCkgdmFsdWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgYnJvd3NlciB3aW5kb3cncyB0cnVlIGRpbWVuc2lvbnMgLS0gbm90IG1lcmVseSBpdHMgY3VycmVudGx5IHZpZXdhYmxlIGFyZWEgLS1cclxuXHRcdFx0XHRcdFx0XHQgYW5kIHRoZXJlZm9yZSBlbmQgdmFsdWVzIGRvIG5vdCBuZWVkIHRvIGJlIGNvbXBvdW5kZWQgb250byBjdXJyZW50IHZhbHVlcy4gKi9cclxuXHRcdFx0XHRcdFx0XHRzY3JvbGxQb3NpdGlvbkVuZCA9ICQoZWxlbWVudCkub2Zmc2V0KClbc2Nyb2xsRGlyZWN0aW9uLnRvTG93ZXJDYXNlKCldICsgc2Nyb2xsT2Zmc2V0OyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogU2luY2UgdGhlcmUncyBvbmx5IG9uZSBmb3JtYXQgdGhhdCBzY3JvbGwncyBhc3NvY2lhdGVkIHR3ZWVuc0NvbnRhaW5lciBjYW4gdGFrZSwgd2UgY3JlYXRlIGl0IG1hbnVhbGx5LiAqL1xyXG5cdFx0XHRcdFx0XHR0d2VlbnNDb250YWluZXIgPSB7XHJcblx0XHRcdFx0XHRcdFx0c2Nyb2xsOiB7XHJcblx0XHRcdFx0XHRcdFx0XHRyb290UHJvcGVydHlWYWx1ZTogZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlOiBzY3JvbGxQb3NpdGlvbkN1cnJlbnQsXHJcblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VmFsdWU6IHNjcm9sbFBvc2l0aW9uQ3VycmVudCxcclxuXHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlOiBzY3JvbGxQb3NpdGlvbkVuZCxcclxuXHRcdFx0XHRcdFx0XHRcdHVuaXRUeXBlOiBcIlwiLFxyXG5cdFx0XHRcdFx0XHRcdFx0ZWFzaW5nOiBvcHRzLmVhc2luZyxcclxuXHRcdFx0XHRcdFx0XHRcdHNjcm9sbERhdGE6IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y29udGFpbmVyOiBvcHRzLmNvbnRhaW5lcixcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBzY3JvbGxEaXJlY3Rpb24sXHJcblx0XHRcdFx0XHRcdFx0XHRcdGFsdGVybmF0ZVZhbHVlOiBzY3JvbGxQb3NpdGlvbkN1cnJlbnRBbHRlcm5hdGVcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9LFxyXG5cdFx0XHRcdFx0XHRcdGVsZW1lbnQ6IGVsZW1lbnRcclxuXHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRcdGlmIChWZWxvY2l0eS5kZWJ1Zykge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwidHdlZW5zQ29udGFpbmVyIChzY3JvbGwpOiBcIiwgdHdlZW5zQ29udGFpbmVyLnNjcm9sbCwgZWxlbWVudCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0IFR3ZWVuIERhdGEgQ29uc3RydWN0aW9uIChmb3IgUmV2ZXJzZSlcclxuXHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdC8qIFJldmVyc2UgYWN0cyBsaWtlIGEgXCJzdGFydFwiIGFjdGlvbiBpbiB0aGF0IGEgcHJvcGVydHkgbWFwIGlzIGFuaW1hdGVkIHRvd2FyZC4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpc1xyXG5cdFx0XHRcdFx0XHQgdGhhdCB0aGUgcHJvcGVydHkgbWFwIHVzZWQgZm9yIHJldmVyc2UgaXMgdGhlIGludmVyc2Ugb2YgdGhlIG1hcCB1c2VkIGluIHRoZSBwcmV2aW91cyBjYWxsLiBUaHVzLCB3ZSBtYW5pcHVsYXRlXHJcblx0XHRcdFx0XHRcdCB0aGUgcHJldmlvdXMgY2FsbCB0byBjb25zdHJ1Y3Qgb3VyIG5ldyBtYXA6IHVzZSB0aGUgcHJldmlvdXMgbWFwJ3MgZW5kIHZhbHVlcyBhcyBvdXIgbmV3IG1hcCdzIHN0YXJ0IHZhbHVlcy4gQ29weSBvdmVyIGFsbCBvdGhlciBkYXRhLiAqL1xyXG5cdFx0XHRcdFx0XHQvKiBOb3RlOiBSZXZlcnNlIGNhbiBiZSBkaXJlY3RseSBjYWxsZWQgdmlhIHRoZSBcInJldmVyc2VcIiBwYXJhbWV0ZXIsIG9yIGl0IGNhbiBiZSBpbmRpcmVjdGx5IHRyaWdnZXJlZCB2aWEgdGhlIGxvb3Agb3B0aW9uLiAoTG9vcHMgYXJlIGNvbXBvc2VkIG9mIG11bHRpcGxlIHJldmVyc2VzLikgKi9cclxuXHRcdFx0XHRcdFx0LyogTm90ZTogUmV2ZXJzZSBjYWxscyBkbyBub3QgbmVlZCB0byBiZSBjb25zZWN1dGl2ZWx5IGNoYWluZWQgb250byBhIGN1cnJlbnRseS1hbmltYXRpbmcgZWxlbWVudCBpbiBvcmRlciB0byBvcGVyYXRlIG9uIGNhY2hlZCB2YWx1ZXM7XHJcblx0XHRcdFx0XHRcdCB0aGVyZSBpcyBubyBoYXJtIHRvIHJldmVyc2UgYmVpbmcgY2FsbGVkIG9uIGEgcG90ZW50aWFsbHkgc3RhbGUgZGF0YSBjYWNoZSBzaW5jZSByZXZlcnNlJ3MgYmVoYXZpb3IgaXMgc2ltcGx5IGRlZmluZWRcclxuXHRcdFx0XHRcdFx0IGFzIHJldmVydGluZyB0byB0aGUgZWxlbWVudCdzIHZhbHVlcyBhcyB0aGV5IHdlcmUgcHJpb3IgdG8gdGhlIHByZXZpb3VzICpWZWxvY2l0eSogY2FsbC4gKi9cclxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uID09PSBcInJldmVyc2VcIikge1xyXG5cdFx0XHRcdFx0XHRkYXRhID0gRGF0YShlbGVtZW50KTtcclxuXHJcblx0XHRcdFx0XHRcdC8qIEFib3J0IGlmIHRoZXJlIGlzIG5vIHByaW9yIGFuaW1hdGlvbiBkYXRhIHRvIHJldmVyc2UgdG8uICovXHJcblx0XHRcdFx0XHRcdGlmICghZGF0YSkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0aWYgKCFkYXRhLnR3ZWVuc0NvbnRhaW5lcikge1xyXG5cdFx0XHRcdFx0XHRcdC8qIERlcXVldWUgdGhlIGVsZW1lbnQgc28gdGhhdCB0aGlzIHF1ZXVlIGVudHJ5IHJlbGVhc2VzIGl0c2VsZiBpbW1lZGlhdGVseSwgYWxsb3dpbmcgc3Vic2VxdWVudCBxdWV1ZSBlbnRyaWVzIHRvIHJ1bi4gKi9cclxuXHRcdFx0XHRcdFx0XHQkLmRlcXVldWUoZWxlbWVudCwgb3B0cy5xdWV1ZSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0IE9wdGlvbnMgUGFyc2luZ1xyXG5cdFx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIElmIHRoZSBlbGVtZW50IHdhcyBoaWRkZW4gdmlhIHRoZSBkaXNwbGF5IG9wdGlvbiBpbiB0aGUgcHJldmlvdXMgY2FsbCxcclxuXHRcdFx0XHRcdFx0XHQgcmV2ZXJ0IGRpc3BsYXkgdG8gXCJhdXRvXCIgcHJpb3IgdG8gcmV2ZXJzYWwgc28gdGhhdCB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGFnYWluLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChkYXRhLm9wdHMuZGlzcGxheSA9PT0gXCJub25lXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGRhdGEub3B0cy5kaXNwbGF5ID0gXCJhdXRvXCI7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoZGF0YS5vcHRzLnZpc2liaWxpdHkgPT09IFwiaGlkZGVuXCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGRhdGEub3B0cy52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBJZiB0aGUgbG9vcCBvcHRpb24gd2FzIHNldCBpbiB0aGUgcHJldmlvdXMgY2FsbCwgZGlzYWJsZSBpdCBzbyB0aGF0IFwicmV2ZXJzZVwiIGNhbGxzIGFyZW4ndCByZWN1cnNpdmVseSBnZW5lcmF0ZWQuXHJcblx0XHRcdFx0XHRcdFx0IEZ1cnRoZXIsIHJlbW92ZSB0aGUgcHJldmlvdXMgY2FsbCdzIGNhbGxiYWNrIG9wdGlvbnM7IHR5cGljYWxseSwgdXNlcnMgZG8gbm90IHdhbnQgdGhlc2UgdG8gYmUgcmVmaXJlZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wdHMubG9vcCA9IGZhbHNlO1xyXG5cdFx0XHRcdFx0XHRcdGRhdGEub3B0cy5iZWdpbiA9IG51bGw7XHJcblx0XHRcdFx0XHRcdFx0ZGF0YS5vcHRzLmNvbXBsZXRlID0gbnVsbDtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyogU2luY2Ugd2UncmUgZXh0ZW5kaW5nIGFuIG9wdHMgb2JqZWN0IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBleHRlbmRlZCB3aXRoIHRoZSBkZWZhdWx0cyBvcHRpb25zIG9iamVjdCxcclxuXHRcdFx0XHRcdFx0XHQgd2UgcmVtb3ZlIG5vbi1leHBsaWNpdGx5LWRlZmluZWQgcHJvcGVydGllcyB0aGF0IGFyZSBhdXRvLWFzc2lnbmVkIHZhbHVlcy4gKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoIW9wdGlvbnMuZWFzaW5nKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgb3B0cy5lYXNpbmc7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIW9wdGlvbnMuZHVyYXRpb24pIHtcclxuXHRcdFx0XHRcdFx0XHRcdGRlbGV0ZSBvcHRzLmR1cmF0aW9uO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogVGhlIG9wdHMgb2JqZWN0IHVzZWQgZm9yIHJldmVyc2FsIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgb3B0aW9ucyBvYmplY3Qgb3B0aW9uYWxseSBwYXNzZWQgaW50byB0aGlzXHJcblx0XHRcdFx0XHRcdFx0IHJldmVyc2UgY2FsbCBwbHVzIHRoZSBvcHRpb25zIHVzZWQgaW4gdGhlIHByZXZpb3VzIFZlbG9jaXR5IGNhbGwuICovXHJcblx0XHRcdFx0XHRcdFx0b3B0cyA9ICQuZXh0ZW5kKHt9LCBkYXRhLm9wdHMsIG9wdHMpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdCBUd2VlbnMgQ29udGFpbmVyIFJlY29uc3RydWN0aW9uXHJcblx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIENyZWF0ZSBhIGRlZXB5IGNvcHkgKGluZGljYXRlZCB2aWEgdGhlIHRydWUgZmxhZykgb2YgdGhlIHByZXZpb3VzIGNhbGwncyB0d2VlbnNDb250YWluZXIuICovXHJcblx0XHRcdFx0XHRcdFx0bGFzdFR3ZWVuc0NvbnRhaW5lciA9ICQuZXh0ZW5kKHRydWUsIHt9LCBkYXRhID8gZGF0YS50d2VlbnNDb250YWluZXIgOiBudWxsKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyogTWFuaXB1bGF0ZSB0aGUgcHJldmlvdXMgdHdlZW5zQ29udGFpbmVyIGJ5IHJlcGxhY2luZyBpdHMgZW5kIHZhbHVlcyBhbmQgY3VycmVudFZhbHVlcyB3aXRoIGl0cyBzdGFydCB2YWx1ZXMuICovXHJcblx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgbGFzdFR3ZWVuIGluIGxhc3RUd2VlbnNDb250YWluZXIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIEluIGFkZGl0aW9uIHRvIHR3ZWVuIGRhdGEsIHR3ZWVuc0NvbnRhaW5lcnMgY29udGFpbiBhbiBlbGVtZW50IHByb3BlcnR5IHRoYXQgd2UgaWdub3JlIGhlcmUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAobGFzdFR3ZWVuc0NvbnRhaW5lci5oYXNPd25Qcm9wZXJ0eShsYXN0VHdlZW4pICYmIGxhc3RUd2VlbiAhPT0gXCJlbGVtZW50XCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGxhc3RTdGFydFZhbHVlID0gbGFzdFR3ZWVuc0NvbnRhaW5lcltsYXN0VHdlZW5dLnN0YXJ0VmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRsYXN0VHdlZW5zQ29udGFpbmVyW2xhc3RUd2Vlbl0uc3RhcnRWYWx1ZSA9IGxhc3RUd2VlbnNDb250YWluZXJbbGFzdFR3ZWVuXS5jdXJyZW50VmFsdWUgPSBsYXN0VHdlZW5zQ29udGFpbmVyW2xhc3RUd2Vlbl0uZW5kVmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGxhc3RUd2VlbnNDb250YWluZXJbbGFzdFR3ZWVuXS5lbmRWYWx1ZSA9IGxhc3RTdGFydFZhbHVlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogRWFzaW5nIGlzIHRoZSBvbmx5IG9wdGlvbiB0aGF0IGVtYmVkcyBpbnRvIHRoZSBpbmRpdmlkdWFsIHR3ZWVuIGRhdGEgKHNpbmNlIGl0IGNhbiBiZSBkZWZpbmVkIG9uIGEgcGVyLXByb3BlcnR5IGJhc2lzKS5cclxuXHRcdFx0XHRcdFx0XHRcdFx0IEFjY29yZGluZ2x5LCBldmVyeSBwcm9wZXJ0eSdzIGVhc2luZyB2YWx1ZSBtdXN0IGJlIHVwZGF0ZWQgd2hlbiBhbiBvcHRpb25zIG9iamVjdCBpcyBwYXNzZWQgaW4gd2l0aCBhIHJldmVyc2UgY2FsbC5cclxuXHRcdFx0XHRcdFx0XHRcdFx0IFRoZSBzaWRlIGVmZmVjdCBvZiB0aGlzIGV4dGVuc2liaWxpdHkgaXMgdGhhdCBhbGwgcGVyLXByb3BlcnR5IGVhc2luZyB2YWx1ZXMgYXJlIGZvcmNlZnVsbHkgcmVzZXQgdG8gdGhlIG5ldyB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCFUeXBlLmlzRW1wdHlPYmplY3Qob3B0aW9ucykpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRsYXN0VHdlZW5zQ29udGFpbmVyW2xhc3RUd2Vlbl0uZWFzaW5nID0gb3B0cy5lYXNpbmc7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChWZWxvY2l0eS5kZWJ1Zykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwicmV2ZXJzZSB0d2VlbnNDb250YWluZXIgKFwiICsgbGFzdFR3ZWVuICsgXCIpOiBcIiArIEpTT04uc3RyaW5naWZ5KGxhc3RUd2VlbnNDb250YWluZXJbbGFzdFR3ZWVuXSksIGVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHR0d2VlbnNDb250YWluZXIgPSBsYXN0VHdlZW5zQ29udGFpbmVyO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0IFR3ZWVuIERhdGEgQ29uc3RydWN0aW9uIChmb3IgU3RhcnQpXHJcblx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKGFjdGlvbiA9PT0gXCJzdGFydFwiKSB7XHJcblxyXG5cdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHQgVmFsdWUgVHJhbnNmZXJyaW5nXHJcblx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0LyogSWYgdGhpcyBxdWV1ZSBlbnRyeSBmb2xsb3dzIGEgcHJldmlvdXMgVmVsb2NpdHktaW5pdGlhdGVkIHF1ZXVlIGVudHJ5ICphbmQqIGlmIHRoaXMgZW50cnkgd2FzIGNyZWF0ZWRcclxuXHRcdFx0XHRcdFx0IHdoaWxlIHRoZSBlbGVtZW50IHdhcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBhbmltYXRlZCBieSBWZWxvY2l0eSwgdGhlbiB0aGlzIGN1cnJlbnQgY2FsbCBpcyBzYWZlIHRvIHVzZVxyXG5cdFx0XHRcdFx0XHQgdGhlIGVuZCB2YWx1ZXMgZnJvbSB0aGUgcHJpb3IgY2FsbCBhcyBpdHMgc3RhcnQgdmFsdWVzLiBWZWxvY2l0eSBhdHRlbXB0cyB0byBwZXJmb3JtIHRoaXMgdmFsdWUgdHJhbnNmZXJcclxuXHRcdFx0XHRcdFx0IHByb2Nlc3Mgd2hlbmV2ZXIgcG9zc2libGUgaW4gb3JkZXIgdG8gYXZvaWQgcmVxdWVyeWluZyB0aGUgRE9NLiAqL1xyXG5cdFx0XHRcdFx0XHQvKiBJZiB2YWx1ZXMgYXJlbid0IHRyYW5zZmVycmVkIGZyb20gYSBwcmlvciBjYWxsIGFuZCBzdGFydCB2YWx1ZXMgd2VyZSBub3QgZm9yY2VmZWQgYnkgdGhlIHVzZXIgKG1vcmUgb24gdGhpcyBiZWxvdyksXHJcblx0XHRcdFx0XHRcdCB0aGVuIHRoZSBET00gaXMgcXVlcmllZCBmb3IgdGhlIGVsZW1lbnQncyBjdXJyZW50IHZhbHVlcyBhcyBhIGxhc3QgcmVzb3J0LiAqL1xyXG5cdFx0XHRcdFx0XHQvKiBOb3RlOiBDb252ZXJzZWx5LCBhbmltYXRpb24gcmV2ZXJzYWwgKGFuZCBsb29waW5nKSAqYWx3YXlzKiBwZXJmb3JtIGludGVyLWNhbGwgdmFsdWUgdHJhbnNmZXJzOyB0aGV5IG5ldmVyIHJlcXVlcnkgdGhlIERPTS4gKi9cclxuXHJcblx0XHRcdFx0XHRcdGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogVGhlIHBlci1lbGVtZW50IGlzQW5pbWF0aW5nIGZsYWcgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIGl0J3Mgc2FmZSAoaS5lLiB0aGUgZGF0YSBpc24ndCBzdGFsZSlcclxuXHRcdFx0XHRcdFx0IHRvIHRyYW5zZmVyIG92ZXIgZW5kIHZhbHVlcyB0byB1c2UgYXMgc3RhcnQgdmFsdWVzLiBJZiBpdCdzIHNldCB0byB0cnVlIGFuZCB0aGVyZSBpcyBhIHByZXZpb3VzXHJcblx0XHRcdFx0XHRcdCBWZWxvY2l0eSBjYWxsIHRvIHB1bGwgdmFsdWVzIGZyb20sIGRvIHNvLiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoZGF0YSAmJiBkYXRhLnR3ZWVuc0NvbnRhaW5lciAmJiBkYXRhLmlzQW5pbWF0aW5nID09PSB0cnVlKSB7XHJcblx0XHRcdFx0XHRcdFx0bGFzdFR3ZWVuc0NvbnRhaW5lciA9IGRhdGEudHdlZW5zQ29udGFpbmVyO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdCBUd2VlbiBEYXRhIENhbGN1bGF0aW9uXHJcblx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHQvKiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBwcm9wZXJ0eSBkYXRhIGFuZCBkZWZhdWx0cyBlbmRWYWx1ZSwgZWFzaW5nLCBhbmQgc3RhcnRWYWx1ZSBhcyBhcHByb3ByaWF0ZS4gKi9cclxuXHRcdFx0XHRcdFx0LyogUHJvcGVydHkgbWFwIHZhbHVlcyBjYW4gZWl0aGVyIHRha2UgdGhlIGZvcm0gb2YgMSkgYSBzaW5nbGUgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBlbmQgdmFsdWUsXHJcblx0XHRcdFx0XHRcdCBvciAyKSBhbiBhcnJheSBpbiB0aGUgZm9ybSBvZiBbIGVuZFZhbHVlLCBbLCBlYXNpbmddIFssIHN0YXJ0VmFsdWVdIF0uXHJcblx0XHRcdFx0XHRcdCBUaGUgb3B0aW9uYWwgdGhpcmQgcGFyYW1ldGVyIGlzIGEgZm9yY2VmZWQgc3RhcnRWYWx1ZSB0byBiZSB1c2VkIGluc3RlYWQgb2YgcXVlcnlpbmcgdGhlIERPTSBmb3JcclxuXHRcdFx0XHRcdFx0IHRoZSBlbGVtZW50J3MgY3VycmVudCB2YWx1ZS4gUmVhZCBWZWxvY2l0eSdzIGRvY21lbnRhdGlvbiB0byBsZWFybiBtb3JlIGFib3V0IGZvcmNlZmVlZGluZzogVmVsb2NpdHlKUy5vcmcvI2ZvcmNlZmVlZGluZyAqL1xyXG5cdFx0XHRcdFx0XHR2YXIgcGFyc2VQcm9wZXJ0eVZhbHVlID0gZnVuY3Rpb24odmFsdWVEYXRhLCBza2lwUmVzb2x2aW5nRWFzaW5nKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIGVuZFZhbHVlLCBlYXNpbmcsIHN0YXJ0VmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIElmIHdlIGhhdmUgYSBmdW5jdGlvbiBhcyB0aGUgbWFpbiBhcmd1bWVudCB0aGVuIHJlc29sdmUgaXQgZmlyc3QsIGluIGNhc2UgaXQgcmV0dXJucyBhbiBhcnJheSB0aGF0IG5lZWRzIHRvIGJlIHNwbGl0ICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKFR5cGUuaXNGdW5jdGlvbih2YWx1ZURhdGEpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZURhdGEgPSB2YWx1ZURhdGEuY2FsbChlbGVtZW50LCBlbGVtZW50QXJyYXlJbmRleCwgZWxlbWVudHNMZW5ndGgpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogSGFuZGxlIHRoZSBhcnJheSBmb3JtYXQsIHdoaWNoIGNhbiBiZSBzdHJ1Y3R1cmVkIGFzIG9uZSBvZiB0aHJlZSBwb3RlbnRpYWwgb3ZlcmxvYWRzOlxyXG5cdFx0XHRcdFx0XHRcdCBBKSBbIGVuZFZhbHVlLCBlYXNpbmcsIHN0YXJ0VmFsdWUgXSwgQikgWyBlbmRWYWx1ZSwgZWFzaW5nIF0sIG9yIEMpIFsgZW5kVmFsdWUsIHN0YXJ0VmFsdWUgXSAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChUeXBlLmlzQXJyYXkodmFsdWVEYXRhKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogZW5kVmFsdWUgaXMgYWx3YXlzIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBhcnJheS4gRG9uJ3QgYm90aGVyIHZhbGlkYXRpbmcgZW5kVmFsdWUncyB2YWx1ZSBub3dcclxuXHRcdFx0XHRcdFx0XHRcdCBzaW5jZSB0aGUgZW5zdWluZyBwcm9wZXJ0eSBjeWNsaW5nIGxvZ2ljIGRvZXMgdGhhdC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlID0gdmFsdWVEYXRhWzBdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIFR3by1pdGVtIGFycmF5IGZvcm1hdDogSWYgdGhlIHNlY29uZCBpdGVtIGlzIGEgbnVtYmVyLCBmdW5jdGlvbiwgb3IgaGV4IHN0cmluZywgdHJlYXQgaXQgYXMgYVxyXG5cdFx0XHRcdFx0XHRcdFx0IHN0YXJ0IHZhbHVlIHNpbmNlIGVhc2luZ3MgY2FuIG9ubHkgYmUgbm9uLWhleCBzdHJpbmdzIG9yIGFycmF5cy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmICgoIVR5cGUuaXNBcnJheSh2YWx1ZURhdGFbMV0pICYmIC9eW1xcZC1dLy50ZXN0KHZhbHVlRGF0YVsxXSkpIHx8IFR5cGUuaXNGdW5jdGlvbih2YWx1ZURhdGFbMV0pIHx8IENTUy5SZWdFeC5pc0hleC50ZXN0KHZhbHVlRGF0YVsxXSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSA9IHZhbHVlRGF0YVsxXTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogVHdvIG9yIHRocmVlLWl0ZW0gYXJyYXk6IElmIHRoZSBzZWNvbmQgaXRlbSBpcyBhIG5vbi1oZXggc3RyaW5nIGVhc2luZyBuYW1lIG9yIGFuIGFycmF5LCB0cmVhdCBpdCBhcyBhbiBlYXNpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKChUeXBlLmlzU3RyaW5nKHZhbHVlRGF0YVsxXSkgJiYgIUNTUy5SZWdFeC5pc0hleC50ZXN0KHZhbHVlRGF0YVsxXSkgJiYgVmVsb2NpdHkuRWFzaW5nc1t2YWx1ZURhdGFbMV1dKSB8fCBUeXBlLmlzQXJyYXkodmFsdWVEYXRhWzFdKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRlYXNpbmcgPSBza2lwUmVzb2x2aW5nRWFzaW5nID8gdmFsdWVEYXRhWzFdIDogZ2V0RWFzaW5nKHZhbHVlRGF0YVsxXSwgb3B0cy5kdXJhdGlvbik7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBEb24ndCBib3RoZXIgdmFsaWRhdGluZyBzdGFydFZhbHVlJ3MgdmFsdWUgbm93IHNpbmNlIHRoZSBlbnN1aW5nIHByb3BlcnR5IGN5Y2xpbmcgbG9naWMgaW5oZXJlbnRseSBkb2VzIHRoYXQuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgPSB2YWx1ZURhdGFbMl07XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gdmFsdWVEYXRhWzFdIHx8IHZhbHVlRGF0YVsyXTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdC8qIEhhbmRsZSB0aGUgc2luZ2xlLXZhbHVlIGZvcm1hdC4gKi9cclxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSB2YWx1ZURhdGE7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBEZWZhdWx0IHRvIHRoZSBjYWxsJ3MgZWFzaW5nIGlmIGEgcGVyLXByb3BlcnR5IGVhc2luZyB0eXBlIHdhcyBub3QgZGVmaW5lZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoIXNraXBSZXNvbHZpbmdFYXNpbmcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVhc2luZyA9IGVhc2luZyB8fCBvcHRzLmVhc2luZztcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIElmIGZ1bmN0aW9ucyB3ZXJlIHBhc3NlZCBpbiBhcyB2YWx1ZXMsIHBhc3MgdGhlIGZ1bmN0aW9uIHRoZSBjdXJyZW50IGVsZW1lbnQgYXMgaXRzIGNvbnRleHQsXHJcblx0XHRcdFx0XHRcdFx0IHBsdXMgdGhlIGVsZW1lbnQncyBpbmRleCBhbmQgdGhlIGVsZW1lbnQgc2V0J3Mgc2l6ZSBhcyBhcmd1bWVudHMuIFRoZW4sIGFzc2lnbiB0aGUgcmV0dXJuZWQgdmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKFR5cGUuaXNGdW5jdGlvbihlbmRWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlID0gZW5kVmFsdWUuY2FsbChlbGVtZW50LCBlbGVtZW50QXJyYXlJbmRleCwgZWxlbWVudHNMZW5ndGgpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKFR5cGUuaXNGdW5jdGlvbihzdGFydFZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSA9IHN0YXJ0VmFsdWUuY2FsbChlbGVtZW50LCBlbGVtZW50QXJyYXlJbmRleCwgZWxlbWVudHNMZW5ndGgpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogQWxsb3cgc3RhcnRWYWx1ZSB0byBiZSBsZWZ0IGFzIHVuZGVmaW5lZCB0byBpbmRpY2F0ZSB0byB0aGUgZW5zdWluZyBjb2RlIHRoYXQgaXRzIHZhbHVlIHdhcyBub3QgZm9yY2VmZWQuICovXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFtlbmRWYWx1ZSB8fCAwLCBlYXNpbmcsIHN0YXJ0VmFsdWVdO1xyXG5cdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0dmFyIGZpeFByb3BlcnR5VmFsdWUgPSBmdW5jdGlvbihwcm9wZXJ0eSwgdmFsdWVEYXRhKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogSW4gY2FzZSB0aGlzIHByb3BlcnR5IGlzIGEgaG9vaywgdGhlcmUgYXJlIGNpcmN1bXN0YW5jZXMgd2hlcmUgd2Ugd2lsbCBpbnRlbmQgdG8gd29yayBvbiB0aGUgaG9vaydzIHJvb3QgcHJvcGVydHkgYW5kIG5vdCB0aGUgaG9va2VkIHN1YnByb3BlcnR5LiAqL1xyXG5cdFx0XHRcdFx0XHRcdHZhciByb290UHJvcGVydHkgPSBDU1MuSG9va3MuZ2V0Um9vdChwcm9wZXJ0eSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlID0gZmFsc2UsXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIFBhcnNlIG91dCBlbmRWYWx1ZSwgZWFzaW5nLCBhbmQgc3RhcnRWYWx1ZSBmcm9tIHRoZSBwcm9wZXJ0eSdzIGRhdGEuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlID0gdmFsdWVEYXRhWzBdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlYXNpbmcgPSB2YWx1ZURhdGFbMV0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgPSB2YWx1ZURhdGFbMl0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdHBhdHRlcm47XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdCBTdGFydCBWYWx1ZSBTb3VyY2luZ1xyXG5cdFx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogT3RoZXIgdGhhbiBmb3IgdGhlIGR1bW15IHR3ZWVuIHByb3BlcnR5LCBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGJyb3dzZXIgKGFuZCBkbyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIG5vcm1hbGl6YXRpb24pIHdpbGxcclxuXHRcdFx0XHRcdFx0XHQgaW5oZXJlbnRseSBwcm9kdWNlIG5vIHN0eWxlIGNoYW5nZXMgd2hlbiBzZXQsIHNvIHRoZXkgYXJlIHNraXBwZWQgaW4gb3JkZXIgdG8gZGVjcmVhc2UgYW5pbWF0aW9uIHRpY2sgb3ZlcmhlYWQuXHJcblx0XHRcdFx0XHRcdFx0IFByb3BlcnR5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZCB2aWEgcHJlZml4Q2hlY2soKSwgd2hpY2ggcmV0dXJucyBhIGZhbHNlIGZsYWcgd2hlbiBubyBzdXBwb3J0ZWQgaXMgZGV0ZWN0ZWQuICovXHJcblx0XHRcdFx0XHRcdFx0LyogTm90ZTogU2luY2UgU1ZHIGVsZW1lbnRzIGhhdmUgc29tZSBvZiB0aGVpciBwcm9wZXJ0aWVzIGRpcmVjdGx5IGFwcGxpZWQgYXMgSFRNTCBhdHRyaWJ1dGVzLFxyXG5cdFx0XHRcdFx0XHRcdCB0aGVyZSBpcyBubyB3YXkgdG8gY2hlY2sgZm9yIHRoZWlyIGV4cGxpY2l0IGJyb3dzZXIgc3VwcG9ydCwgYW5kIHNvIHdlIHNraXAgc2tpcCB0aGlzIGNoZWNrIGZvciB0aGVtLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmICgoIWRhdGEgfHwgIWRhdGEuaXNTVkcpICYmIHJvb3RQcm9wZXJ0eSAhPT0gXCJ0d2VlblwiICYmIENTUy5OYW1lcy5wcmVmaXhDaGVjayhyb290UHJvcGVydHkpWzFdID09PSBmYWxzZSAmJiBDU1MuTm9ybWFsaXphdGlvbnMucmVnaXN0ZXJlZFtyb290UHJvcGVydHldID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGlmIChWZWxvY2l0eS5kZWJ1Zykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhcIlNraXBwaW5nIFtcIiArIHJvb3RQcm9wZXJ0eSArIFwiXSBkdWUgdG8gYSBsYWNrIG9mIGJyb3dzZXIgc3VwcG9ydC5cIik7XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBJZiB0aGUgZGlzcGxheSBvcHRpb24gaXMgYmVpbmcgc2V0IHRvIGEgbm9uLVwibm9uZVwiIChlLmcuIFwiYmxvY2tcIikgYW5kIG9wYWNpdHkgKGZpbHRlciBvbiBJRTw9OCkgaXMgYmVpbmdcclxuXHRcdFx0XHRcdFx0XHQgYW5pbWF0ZWQgdG8gYW4gZW5kVmFsdWUgb2Ygbm9uLXplcm8sIHRoZSB1c2VyJ3MgaW50ZW50aW9uIGlzIHRvIGZhZGUgaW4gZnJvbSBpbnZpc2libGUsIHRodXMgd2UgZm9yY2VmZWVkIG9wYWNpdHlcclxuXHRcdFx0XHRcdFx0XHQgYSBzdGFydFZhbHVlIG9mIDAgaWYgaXRzIHN0YXJ0VmFsdWUgaGFzbid0IGFscmVhZHkgYmVlbiBzb3VyY2VkIGJ5IHZhbHVlIHRyYW5zZmVycmluZyBvciBwcmlvciBmb3JjZWZlZWRpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKCgob3B0cy5kaXNwbGF5ICE9PSB1bmRlZmluZWQgJiYgb3B0cy5kaXNwbGF5ICE9PSBudWxsICYmIG9wdHMuZGlzcGxheSAhPT0gXCJub25lXCIpIHx8IChvcHRzLnZpc2liaWxpdHkgIT09IHVuZGVmaW5lZCAmJiBvcHRzLnZpc2liaWxpdHkgIT09IFwiaGlkZGVuXCIpKSAmJiAvb3BhY2l0eXxmaWx0ZXIvLnRlc3QocHJvcGVydHkpICYmICFzdGFydFZhbHVlICYmIGVuZFZhbHVlICE9PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gMDtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIElmIHZhbHVlcyBoYXZlIGJlZW4gdHJhbnNmZXJyZWQgZnJvbSB0aGUgcHJldmlvdXMgVmVsb2NpdHkgY2FsbCwgZXh0cmFjdCB0aGUgZW5kVmFsdWUgYW5kIHJvb3RQcm9wZXJ0eVZhbHVlXHJcblx0XHRcdFx0XHRcdFx0IGZvciBhbGwgb2YgdGhlIGN1cnJlbnQgY2FsbCdzIHByb3BlcnRpZXMgdGhhdCB3ZXJlICphbHNvKiBhbmltYXRlZCBpbiB0aGUgcHJldmlvdXMgY2FsbC4gKi9cclxuXHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBWYWx1ZSB0cmFuc2ZlcnJpbmcgY2FuIG9wdGlvbmFsbHkgYmUgZGlzYWJsZWQgYnkgdGhlIHVzZXIgdmlhIHRoZSBfY2FjaGVWYWx1ZXMgb3B0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChvcHRzLl9jYWNoZVZhbHVlcyAmJiBsYXN0VHdlZW5zQ29udGFpbmVyICYmIGxhc3RUd2VlbnNDb250YWluZXJbcHJvcGVydHldKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoc3RhcnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgPSBsYXN0VHdlZW5zQ29udGFpbmVyW3Byb3BlcnR5XS5lbmRWYWx1ZSArIGxhc3RUd2VlbnNDb250YWluZXJbcHJvcGVydHldLnVuaXRUeXBlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIFRoZSBwcmV2aW91cyBjYWxsJ3Mgcm9vdFByb3BlcnR5VmFsdWUgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGVsZW1lbnQncyBkYXRhIGNhY2hlIHNpbmNlIHRoYXQncyB0aGVcclxuXHRcdFx0XHRcdFx0XHRcdCBpbnN0YW5jZSBvZiByb290UHJvcGVydHlWYWx1ZSB0aGF0IGdldHMgZnJlc2hseSB1cGRhdGVkIGJ5IHRoZSB0d2VlbmluZyBwcm9jZXNzLCB3aGVyZWFzIHRoZSByb290UHJvcGVydHlWYWx1ZVxyXG5cdFx0XHRcdFx0XHRcdFx0IGF0dGFjaGVkIHRvIHRoZSBpbmNvbWluZyBsYXN0VHdlZW5zQ29udGFpbmVyIGlzIGVxdWFsIHRvIHRoZSByb290IHByb3BlcnR5J3MgdmFsdWUgcHJpb3IgdG8gYW55IHR3ZWVuaW5nLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWUgPSBkYXRhLnJvb3RQcm9wZXJ0eVZhbHVlQ2FjaGVbcm9vdFByb3BlcnR5XTtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIElmIHZhbHVlcyB3ZXJlIG5vdCB0cmFuc2ZlcnJlZCBmcm9tIGEgcHJldmlvdXMgVmVsb2NpdHkgY2FsbCwgcXVlcnkgdGhlIERPTSBhcyBuZWVkZWQuICovXHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIEhhbmRsZSBob29rZWQgcHJvcGVydGllcy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChDU1MuSG9va3MucmVnaXN0ZXJlZFtwcm9wZXJ0eV0pIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHN0YXJ0VmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlID0gQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgcm9vdFByb3BlcnR5KTsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogTm90ZTogVGhlIGZvbGxvd2luZyBnZXRQcm9wZXJ0eVZhbHVlKCkgY2FsbCBkb2VzIG5vdCBhY3R1YWxseSB0cmlnZ2VyIGEgRE9NIHF1ZXJ5O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCBnZXRQcm9wZXJ0eVZhbHVlKCkgd2lsbCBleHRyYWN0IHRoZSBob29rIGZyb20gcm9vdFByb3BlcnR5VmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSA9IENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIHByb3BlcnR5LCByb290UHJvcGVydHlWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogSWYgc3RhcnRWYWx1ZSBpcyBhbHJlYWR5IGRlZmluZWQgdmlhIGZvcmNlZmVlZGluZywgZG8gbm90IHF1ZXJ5IHRoZSBET00gZm9yIHRoZSByb290IHByb3BlcnR5J3MgdmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0IGp1c3QgZ3JhYiByb290UHJvcGVydHkncyB6ZXJvLXZhbHVlIHRlbXBsYXRlIGZyb20gQ1NTLkhvb2tzLiBUaGlzIG92ZXJ3cml0ZXMgdGhlIGVsZW1lbnQncyBhY3R1YWxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQgcm9vdCBwcm9wZXJ0eSB2YWx1ZSAoaWYgb25lIGlzIHNldCksIGJ1dCB0aGlzIGlzIGFjY2VwdGFibGUgc2luY2UgdGhlIHByaW1hcnkgcmVhc29uIHVzZXJzIGZvcmNlZmVlZCBpc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCB0byBhdm9pZCBET00gcXVlcmllcywgYW5kIHRodXMgd2UgbGlrZXdpc2UgYXZvaWQgcXVlcnlpbmcgdGhlIERPTSBmb3IgdGhlIHJvb3QgcHJvcGVydHkncyB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBHcmFiIHRoaXMgaG9vaydzIHplcm8tdmFsdWUgdGVtcGxhdGUsIGUuZy4gXCIwcHggMHB4IDBweCBibGFja1wiLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJvb3RQcm9wZXJ0eVZhbHVlID0gQ1NTLkhvb2tzLnRlbXBsYXRlc1tyb290UHJvcGVydHldWzFdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIEhhbmRsZSBub24taG9va2VkIHByb3BlcnRpZXMgdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiBkZWZpbmVkIHZpYSBmb3JjZWZlZWRpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHN0YXJ0VmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgcHJvcGVydHkpOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdCBWYWx1ZSBEYXRhIEV4dHJhY3Rpb25cclxuXHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHRcdHZhciBzZXBhcmF0ZWRWYWx1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWVVbml0VHlwZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZVVuaXRUeXBlLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRvcGVyYXRvciA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBTZXBhcmF0ZXMgYSBwcm9wZXJ0eSB2YWx1ZSBpbnRvIGl0cyBudW1lcmljIHZhbHVlIGFuZCBpdHMgdW5pdCB0eXBlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHZhciBzZXBhcmF0ZVZhbHVlID0gZnVuY3Rpb24ocHJvcGVydHksIHZhbHVlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgdW5pdFR5cGUsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0bnVtZXJpY1ZhbHVlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdG51bWVyaWNWYWx1ZSA9ICh2YWx1ZSB8fCBcIjBcIilcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQudG9TdHJpbmcoKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC50b0xvd2VyQ2FzZSgpXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogTWF0Y2ggdGhlIHVuaXQgdHlwZSBhdCB0aGUgZW5kIG9mIHRoZSB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQucmVwbGFjZSgvWyVBLXpdKyQvLCBmdW5jdGlvbihtYXRjaCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0LyogR3JhYiB0aGUgdW5pdCB0eXBlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pdFR5cGUgPSBtYXRjaDtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBTdHJpcCB0aGUgdW5pdCB0eXBlIG9mZiBvZiB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBcIlwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIElmIG5vIHVuaXQgdHlwZSB3YXMgc3VwcGxpZWQsIGFzc2lnbiBvbmUgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhpcyBwcm9wZXJ0eSAoZS5nLiBcImRlZ1wiIGZvciByb3RhdGVaIG9yIFwicHhcIiBmb3Igd2lkdGgpLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCF1bml0VHlwZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR1bml0VHlwZSA9IENTUy5WYWx1ZXMuZ2V0VW5pdFR5cGUocHJvcGVydHkpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBbbnVtZXJpY1ZhbHVlLCB1bml0VHlwZV07XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKHN0YXJ0VmFsdWUgIT09IGVuZFZhbHVlICYmIFR5cGUuaXNTdHJpbmcoc3RhcnRWYWx1ZSkgJiYgVHlwZS5pc1N0cmluZyhlbmRWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHBhdHRlcm4gPSBcIlwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFyIGlTdGFydCA9IDAsIC8vIGluZGV4IGluIHN0YXJ0VmFsdWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpRW5kID0gMCwgLy8gaW5kZXggaW4gZW5kVmFsdWVcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRhU3RhcnQgPSBbXSwgLy8gYXJyYXkgb2Ygc3RhcnRWYWx1ZSBudW1iZXJzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0YUVuZCA9IFtdLCAvLyBhcnJheSBvZiBlbmRWYWx1ZSBudW1iZXJzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aW5DYWxjID0gMCwgLy8gS2VlcCB0cmFjayBvZiBiZWluZyBpbnNpZGUgYSBcImNhbGMoKVwiIHNvIHdlIGRvbid0IGR1cGxpY2F0ZSBpdFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGluUkdCID0gMCwgLy8gS2VlcCB0cmFjayBvZiBiZWluZyBpbnNpZGUgYW4gUkdCIGFzIHdlIGNhbid0IHVzZSBmcmFjdGlvbmFsIHZhbHVlc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGluUkdCQSA9IDA7IC8vIEtlZXAgdHJhY2sgb2YgYmVpbmcgaW5zaWRlIGFuIFJHQkEgYXMgd2UgbXVzdCBwYXNzIGZyYWN0aW9uYWwgZm9yIHRoZSBhbHBoYSBjaGFubmVsXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSA9IENTUy5Ib29rcy5maXhDb2xvcnMoc3RhcnRWYWx1ZSk7XHJcblx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZSA9IENTUy5Ib29rcy5maXhDb2xvcnMoZW5kVmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKGlTdGFydCA8IHN0YXJ0VmFsdWUubGVuZ3RoICYmIGlFbmQgPCBlbmRWYWx1ZS5sZW5ndGgpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGNTdGFydCA9IHN0YXJ0VmFsdWVbaVN0YXJ0XSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNFbmQgPSBlbmRWYWx1ZVtpRW5kXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmICgvW1xcZFxcLi1dLy50ZXN0KGNTdGFydCkgJiYgL1tcXGRcXC4tXS8udGVzdChjRW5kKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZhciB0U3RhcnQgPSBjU3RhcnQsIC8vIHRlbXBvcmFyeSBjaGFyYWN0ZXIgYnVmZmVyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRFbmQgPSBjRW5kLCAvLyB0ZW1wb3JhcnkgY2hhcmFjdGVyIGJ1ZmZlclxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkb3RTdGFydCA9IFwiLlwiLCAvLyBNYWtlIHN1cmUgd2UgY2FuIG9ubHkgZXZlciBtYXRjaCBhIHNpbmdsZSBkb3QgaW4gYSBkZWNpbWFsXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvdEVuZCA9IFwiLlwiOyAvLyBNYWtlIHN1cmUgd2UgY2FuIG9ubHkgZXZlciBtYXRjaCBhIHNpbmdsZSBkb3QgaW4gYSBkZWNpbWFsXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdoaWxlICgrK2lTdGFydCA8IHN0YXJ0VmFsdWUubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjU3RhcnQgPSBzdGFydFZhbHVlW2lTdGFydF07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY1N0YXJ0ID09PSBkb3RTdGFydCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkb3RTdGFydCA9IFwiLi5cIjsgLy8gQ2FuIG5ldmVyIG1hdGNoIHR3byBjaGFyYWN0ZXJzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCEvXFxkLy50ZXN0KGNTdGFydCkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0U3RhcnQgKz0gY1N0YXJ0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoKytpRW5kIDwgZW5kVmFsdWUubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjRW5kID0gZW5kVmFsdWVbaUVuZF07XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoY0VuZCA9PT0gZG90RW5kKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRvdEVuZCA9IFwiLi5cIjsgLy8gQ2FuIG5ldmVyIG1hdGNoIHR3byBjaGFyYWN0ZXJzXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCEvXFxkLy50ZXN0KGNFbmQpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dEVuZCArPSBjRW5kO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgdVN0YXJ0ID0gQ1NTLkhvb2tzLmdldFVuaXQoc3RhcnRWYWx1ZSwgaVN0YXJ0KSwgLy8gdGVtcG9yYXJ5IHVuaXQgdHlwZVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1RW5kID0gQ1NTLkhvb2tzLmdldFVuaXQoZW5kVmFsdWUsIGlFbmQpOyAvLyB0ZW1wb3JhcnkgdW5pdCB0eXBlXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlTdGFydCArPSB1U3RhcnQubGVuZ3RoO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlFbmQgKz0gdUVuZC5sZW5ndGg7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHVTdGFydCA9PT0gdUVuZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU2FtZSB1bml0c1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKHRTdGFydCA9PT0gdEVuZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTYW1lIG51bWJlcnMsIHNvIGp1c3QgY29weSBvdmVyXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhdHRlcm4gKz0gdFN0YXJ0ICsgdVN0YXJ0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGlmZmVyZW50IG51bWJlcnMsIHNvIHN0b3JlIHRoZW1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGF0dGVybiArPSBcIntcIiArIGFTdGFydC5sZW5ndGggKyAoaW5SR0IgPyBcIiFcIiA6IFwiXCIpICsgXCJ9XCIgKyB1U3RhcnQ7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFTdGFydC5wdXNoKHBhcnNlRmxvYXQodFN0YXJ0KSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFFbmQucHVzaChwYXJzZUZsb2F0KHRFbmQpKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGlmZmVyZW50IHVuaXRzLCBzbyBwdXQgaW50byBhIFwiY2FsYyhmcm9tICsgdG8pXCIgYW5kIGFuaW1hdGUgZWFjaCBzaWRlIHRvL2Zyb20gemVyb1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIG5TdGFydCA9IHBhcnNlRmxvYXQodFN0YXJ0KSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRuRW5kID0gcGFyc2VGbG9hdCh0RW5kKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuICs9IChpbkNhbGMgPCA1ID8gXCJjYWxjXCIgOiBcIlwiKSArIFwiKFwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAoblN0YXJ0ID8gXCJ7XCIgKyBhU3RhcnQubGVuZ3RoICsgKGluUkdCID8gXCIhXCIgOiBcIlwiKSArIFwifVwiIDogXCIwXCIpICsgdVN0YXJ0XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyBcIiArIFwiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KyAobkVuZCA/IFwie1wiICsgKGFTdGFydC5sZW5ndGggKyAoblN0YXJ0ID8gMSA6IDApKSArIChpblJHQiA/IFwiIVwiIDogXCJcIikgKyBcIn1cIiA6IFwiMFwiKSArIHVFbmRcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQrIFwiKVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKG5TdGFydCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhU3RhcnQucHVzaChuU3RhcnQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhRW5kLnB1c2goMCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAobkVuZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhU3RhcnQucHVzaCgwKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YUVuZC5wdXNoKG5FbmQpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChjU3RhcnQgPT09IGNFbmQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuICs9IGNTdGFydDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpU3RhcnQrKztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpRW5kKys7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gS2VlcCB0cmFjayBvZiBiZWluZyBpbnNpZGUgYSBjYWxjKClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoaW5DYWxjID09PSAwICYmIGNTdGFydCA9PT0gXCJjXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fHwgaW5DYWxjID09PSAxICYmIGNTdGFydCA9PT0gXCJhXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fHwgaW5DYWxjID09PSAyICYmIGNTdGFydCA9PT0gXCJsXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fHwgaW5DYWxjID09PSAzICYmIGNTdGFydCA9PT0gXCJjXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fHwgaW5DYWxjID49IDQgJiYgY1N0YXJ0ID09PSBcIihcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGluQ2FsYysrO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoKGluQ2FsYyAmJiBpbkNhbGMgPCA1KVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR8fCBpbkNhbGMgPj0gNCAmJiBjU3RhcnQgPT09IFwiKVwiICYmIC0taW5DYWxjIDwgNSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5DYWxjID0gMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gS2VlcCB0cmFjayBvZiBiZWluZyBpbnNpZGUgYW4gcmdiKCkgLyByZ2JhKClcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoaW5SR0IgPT09IDAgJiYgY1N0YXJ0ID09PSBcInJcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR8fCBpblJHQiA9PT0gMSAmJiBjU3RhcnQgPT09IFwiZ1wiXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHx8IGluUkdCID09PSAyICYmIGNTdGFydCA9PT0gXCJiXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fHwgaW5SR0IgPT09IDMgJiYgY1N0YXJ0ID09PSBcImFcIlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR8fCBpblJHQiA+PSAzICYmIGNTdGFydCA9PT0gXCIoXCJcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoaW5SR0IgPT09IDMgJiYgY1N0YXJ0ID09PSBcImFcIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpblJHQkEgPSAxO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aW5SR0IrKztcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGluUkdCQSAmJiBjU3RhcnQgPT09IFwiLFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoKytpblJHQkEgPiAzKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGluUkdCID0gaW5SR0JBID0gMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKChpblJHQkEgJiYgaW5SR0IgPCAoaW5SR0JBID8gNSA6IDQpKVxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR8fCBpblJHQiA+PSAoaW5SR0JBID8gNCA6IDMpICYmIGNTdGFydCA9PT0gXCIpXCIgJiYgLS1pblJHQiA8IChpblJHQkEgPyA1IDogNCkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGluUkdCID0gaW5SR0JBID0gMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aW5DYWxjID0gMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBjaGFuZ2luZyB1bml0cywgZml4aW5nIGNvbG91cnNcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGlTdGFydCAhPT0gc3RhcnRWYWx1ZS5sZW5ndGggfHwgaUVuZCAhPT0gZW5kVmFsdWUubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChWZWxvY2l0eS5kZWJ1Zykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXCJUcnlpbmcgdG8gcGF0dGVybiBtYXRjaCBtaXMtbWF0Y2hlZCBzdHJpbmdzIFtcXFwiXCIgKyBlbmRWYWx1ZSArIFwiXFxcIiwgXFxcIlwiICsgc3RhcnRWYWx1ZSArIFwiXFxcIl1cIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0cGF0dGVybiA9IHVuZGVmaW5lZDtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChwYXR0ZXJuKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGlmIChhU3RhcnQubGVuZ3RoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LmRlYnVnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhcIlBhdHRlcm4gZm91bmQgXFxcIlwiICsgcGF0dGVybiArIFwiXFxcIiAtPiBcIiwgYVN0YXJ0LCBhRW5kLCBcIltcIiArIHN0YXJ0VmFsdWUgKyBcIixcIiArIGVuZFZhbHVlICsgXCJdXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gYVN0YXJ0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlID0gYUVuZDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZVVuaXRUeXBlID0gc3RhcnRWYWx1ZVVuaXRUeXBlID0gXCJcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuID0gdW5kZWZpbmVkO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoIXBhdHRlcm4pIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIFNlcGFyYXRlIHN0YXJ0VmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRzZXBhcmF0ZWRWYWx1ZSA9IHNlcGFyYXRlVmFsdWUocHJvcGVydHksIHN0YXJ0VmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSA9IHNlcGFyYXRlZFZhbHVlWzBdO1xyXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZVVuaXRUeXBlID0gc2VwYXJhdGVkVmFsdWVbMV07XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogU2VwYXJhdGUgZW5kVmFsdWUsIGFuZCBleHRyYWN0IGEgdmFsdWUgb3BlcmF0b3IgKGUuZy4gXCIrPVwiLCBcIi09XCIpIGlmIG9uZSBleGlzdHMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRzZXBhcmF0ZWRWYWx1ZSA9IHNlcGFyYXRlVmFsdWUocHJvcGVydHksIGVuZFZhbHVlKTtcclxuXHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlID0gc2VwYXJhdGVkVmFsdWVbMF0ucmVwbGFjZSgvXihbKy1cXC8qXSk9LywgZnVuY3Rpb24obWF0Y2gsIHN1Yk1hdGNoKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdG9wZXJhdG9yID0gc3ViTWF0Y2g7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBTdHJpcCB0aGUgb3BlcmF0b3Igb2ZmIG9mIHRoZSB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIFwiXCI7XHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlVW5pdFR5cGUgPSBzZXBhcmF0ZWRWYWx1ZVsxXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBQYXJzZSBmbG9hdCB2YWx1ZXMgZnJvbSBlbmRWYWx1ZSBhbmQgc3RhcnRWYWx1ZS4gRGVmYXVsdCB0byAwIGlmIE5hTiBpcyByZXR1cm5lZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgPSBwYXJzZUZsb2F0KHN0YXJ0VmFsdWUpIHx8IDA7XHJcblx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZSA9IHBhcnNlRmxvYXQoZW5kVmFsdWUpIHx8IDA7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdFx0IFByb3BlcnR5LVNwZWNpZmljIFZhbHVlIENvbnZlcnNpb25cclxuXHRcdFx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogQ3VzdG9tIHN1cHBvcnQgZm9yIHByb3BlcnRpZXMgdGhhdCBkb24ndCBhY3R1YWxseSBhY2NlcHQgdGhlICUgdW5pdCB0eXBlLCBidXQgd2hlcmUgcG9sbHlmaWxsaW5nIGlzIHRyaXZpYWwgYW5kIHJlbGF0aXZlbHkgZm9vbHByb29mLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGVuZFZhbHVlVW5pdFR5cGUgPT09IFwiJVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIEEgJS12YWx1ZSBmb250U2l6ZS9saW5lSGVpZ2h0IGlzIHJlbGF0aXZlIHRvIHRoZSBwYXJlbnQncyBmb250U2l6ZSAoYXMgb3Bwb3NlZCB0byB0aGUgcGFyZW50J3MgZGltZW5zaW9ucyksXHJcblx0XHRcdFx0XHRcdFx0XHRcdCB3aGljaCBpcyBpZGVudGljYWwgdG8gdGhlIGVtIHVuaXQncyBiZWhhdmlvciwgc28gd2UgcGlnZ3liYWNrIG9mZiBvZiB0aGF0LiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoL14oZm9udFNpemV8bGluZUhlaWdodCkkLy50ZXN0KHByb3BlcnR5KSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIENvbnZlcnQgJSBpbnRvIGFuIGVtIGRlY2ltYWwgdmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSBlbmRWYWx1ZSAvIDEwMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZVVuaXRUeXBlID0gXCJlbVwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIEZvciBzY2FsZVggYW5kIHNjYWxlWSwgY29udmVydCB0aGUgdmFsdWUgaW50byBpdHMgZGVjaW1hbCBmb3JtYXQgYW5kIHN0cmlwIG9mZiB0aGUgdW5pdCB0eXBlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKC9ec2NhbGUvLnRlc3QocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSBlbmRWYWx1ZSAvIDEwMDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZVVuaXRUeXBlID0gXCJcIjtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBGb3IgUkdCIGNvbXBvbmVudHMsIHRha2UgdGhlIGRlZmluZWQgcGVyY2VudGFnZSBvZiAyNTUgYW5kIHN0cmlwIG9mZiB0aGUgdW5pdCB0eXBlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKC8oUmVkfEdyZWVufEJsdWUpJC9pLnRlc3QocHJvcGVydHkpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSAoZW5kVmFsdWUgLyAxMDApICogMjU1O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlVW5pdFR5cGUgPSBcIlwiO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0IFVuaXQgUmF0aW8gQ2FsY3VsYXRpb25cclxuXHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBXaGVuIHF1ZXJpZWQsIHRoZSBicm93c2VyIHJldHVybnMgKG1vc3QpIENTUyBwcm9wZXJ0eSB2YWx1ZXMgaW4gcGl4ZWxzLiBUaGVyZWZvcmUsIGlmIGFuIGVuZFZhbHVlIHdpdGggYSB1bml0IHR5cGUgb2ZcclxuXHRcdFx0XHRcdFx0XHQgJSwgZW0sIG9yIHJlbSBpcyBhbmltYXRlZCB0b3dhcmQsIHN0YXJ0VmFsdWUgbXVzdCBiZSBjb252ZXJ0ZWQgZnJvbSBwaXhlbHMgaW50byB0aGUgc2FtZSB1bml0IHR5cGUgYXMgZW5kVmFsdWUgaW4gb3JkZXJcclxuXHRcdFx0XHRcdFx0XHQgZm9yIHZhbHVlIG1hbmlwdWxhdGlvbiBsb2dpYyAoaW5jcmVtZW50L2RlY3JlbWVudCkgdG8gcHJvY2VlZC4gRnVydGhlciwgaWYgdGhlIHN0YXJ0VmFsdWUgd2FzIGZvcmNlZmVkIG9yIHRyYW5zZmVycmVkXHJcblx0XHRcdFx0XHRcdFx0IGZyb20gYSBwcmV2aW91cyBjYWxsLCBzdGFydFZhbHVlIG1heSBhbHNvIG5vdCBiZSBpbiBwaXhlbHMuIFVuaXQgY29udmVyc2lvbiBsb2dpYyB0aGVyZWZvcmUgY29uc2lzdHMgb2YgdHdvIHN0ZXBzOlxyXG5cdFx0XHRcdFx0XHRcdCAxKSBDYWxjdWxhdGluZyB0aGUgcmF0aW8gb2YgJS9lbS9yZW0vdmgvdncgcmVsYXRpdmUgdG8gcGl4ZWxzXHJcblx0XHRcdFx0XHRcdFx0IDIpIENvbnZlcnRpbmcgc3RhcnRWYWx1ZSBpbnRvIHRoZSBzYW1lIHVuaXQgb2YgbWVhc3VyZW1lbnQgYXMgZW5kVmFsdWUgYmFzZWQgb24gdGhlc2UgcmF0aW9zLiAqL1xyXG5cdFx0XHRcdFx0XHRcdC8qIFVuaXQgY29udmVyc2lvbiByYXRpb3MgYXJlIGNhbGN1bGF0ZWQgYnkgaW5zZXJ0aW5nIGEgc2libGluZyBub2RlIG5leHQgdG8gdGhlIHRhcmdldCBub2RlLCBjb3B5aW5nIG92ZXIgaXRzIHBvc2l0aW9uIHByb3BlcnR5LFxyXG5cdFx0XHRcdFx0XHRcdCBzZXR0aW5nIHZhbHVlcyB3aXRoIHRoZSB0YXJnZXQgdW5pdCB0eXBlIHRoZW4gY29tcGFyaW5nIHRoZSByZXR1cm5lZCBwaXhlbCB2YWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBFdmVuIGlmIG9ubHkgb25lIG9mIHRoZXNlIHVuaXQgdHlwZXMgaXMgYmVpbmcgYW5pbWF0ZWQsIGFsbCB1bml0IHJhdGlvcyBhcmUgY2FsY3VsYXRlZCBhdCBvbmNlIHNpbmNlIHRoZSBvdmVyaGVhZFxyXG5cdFx0XHRcdFx0XHRcdCBvZiBiYXRjaGluZyB0aGUgU0VUcyBhbmQgR0VUcyB0b2dldGhlciB1cGZyb250IG91dHdlaWdodHMgdGhlIHBvdGVudGlhbCBvdmVyaGVhZFxyXG5cdFx0XHRcdFx0XHRcdCBvZiBsYXlvdXQgdGhyYXNoaW5nIGNhdXNlZCBieSByZS1xdWVyeWluZyBmb3IgdW5jYWxjdWxhdGVkIHJhdGlvcyBmb3Igc3Vic2VxdWVudGx5LXByb2Nlc3NlZCBwcm9wZXJ0aWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdC8qIFRvZG86IFNoaWZ0IHRoaXMgbG9naWMgaW50byB0aGUgY2FsbHMnIGZpcnN0IHRpY2sgaW5zdGFuY2Ugc28gdGhhdCBpdCdzIHN5bmNlZCB3aXRoIFJBRi4gKi9cclxuXHRcdFx0XHRcdFx0XHR2YXIgY2FsY3VsYXRlVW5pdFJhdGlvcyA9IGZ1bmN0aW9uKCkge1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHRcdCBTYW1lIFJhdGlvIENoZWNrc1xyXG5cdFx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBUaGUgcHJvcGVydGllcyBiZWxvdyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZWxlbWVudCBkaWZmZXJzIHN1ZmZpY2llbnRseSBmcm9tIHRoaXMgY2FsbCdzXHJcblx0XHRcdFx0XHRcdFx0XHQgcHJldmlvdXNseSBpdGVyYXRlZCBlbGVtZW50IHRvIGFsc28gZGlmZmVyIGluIGl0cyB1bml0IGNvbnZlcnNpb24gcmF0aW9zLiBJZiB0aGUgcHJvcGVydGllcyBtYXRjaCB1cCB3aXRoIHRob3NlXHJcblx0XHRcdFx0XHRcdFx0XHQgb2YgdGhlIHByaW9yIGVsZW1lbnQsIHRoZSBwcmlvciBlbGVtZW50J3MgY29udmVyc2lvbiByYXRpb3MgYXJlIHVzZWQuIExpa2UgbW9zdCBvcHRpbWl6YXRpb25zIGluIFZlbG9jaXR5LFxyXG5cdFx0XHRcdFx0XHRcdFx0IHRoaXMgaXMgZG9uZSB0byBtaW5pbWl6ZSBET00gcXVlcnlpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgc2FtZVJhdGlvSW5kaWNhdG9ycyA9IHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0bXlQYXJlbnQ6IGVsZW1lbnQucGFyZW50Tm9kZSB8fCBkb2N1bWVudC5ib2R5LCAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0cG9zaXRpb246IENTUy5nZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwicG9zaXRpb25cIiksIC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRmb250U2l6ZTogQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJmb250U2l6ZVwiKSAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdH0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogRGV0ZXJtaW5lIGlmIHRoZSBzYW1lICUgcmF0aW8gY2FuIGJlIHVzZWQuICUgaXMgYmFzZWQgb24gdGhlIGVsZW1lbnQncyBwb3NpdGlvbiB2YWx1ZSBhbmQgaXRzIHBhcmVudCdzIHdpZHRoIGFuZCBoZWlnaHQgZGltZW5zaW9ucy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzYW1lUGVyY2VudFJhdGlvID0gKChzYW1lUmF0aW9JbmRpY2F0b3JzLnBvc2l0aW9uID09PSBjYWxsVW5pdENvbnZlcnNpb25EYXRhLmxhc3RQb3NpdGlvbikgJiYgKHNhbWVSYXRpb0luZGljYXRvcnMubXlQYXJlbnQgPT09IGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdFBhcmVudCkpLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8qIERldGVybWluZSBpZiB0aGUgc2FtZSBlbSByYXRpbyBjYW4gYmUgdXNlZC4gZW0gaXMgcmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQncyBmb250U2l6ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzYW1lRW1SYXRpbyA9IChzYW1lUmF0aW9JbmRpY2F0b3JzLmZvbnRTaXplID09PSBjYWxsVW5pdENvbnZlcnNpb25EYXRhLmxhc3RGb250U2l6ZSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogU3RvcmUgdGhlc2UgcmF0aW8gaW5kaWNhdG9ycyBjYWxsLXdpZGUgZm9yIHRoZSBuZXh0IGVsZW1lbnQgdG8gY29tcGFyZSBhZ2FpbnN0LiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0Y2FsbFVuaXRDb252ZXJzaW9uRGF0YS5sYXN0UGFyZW50ID0gc2FtZVJhdGlvSW5kaWNhdG9ycy5teVBhcmVudDtcclxuXHRcdFx0XHRcdFx0XHRcdGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdFBvc2l0aW9uID0gc2FtZVJhdGlvSW5kaWNhdG9ycy5wb3NpdGlvbjtcclxuXHRcdFx0XHRcdFx0XHRcdGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdEZvbnRTaXplID0gc2FtZVJhdGlvSW5kaWNhdG9ycy5mb250U2l6ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0XHQgRWxlbWVudC1TcGVjaWZpYyBVbml0c1xyXG5cdFx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBJRTggcm91bmRzIHRvIHRoZSBuZWFyZXN0IHBpeGVsIHdoZW4gcmV0dXJuaW5nIENTUyB2YWx1ZXMsIHRodXMgd2UgcGVyZm9ybSBjb252ZXJzaW9ucyB1c2luZyBhIG1lYXN1cmVtZW50XHJcblx0XHRcdFx0XHRcdFx0XHQgb2YgMTAwIChpbnN0ZWFkIG9mIDEpIHRvIGdpdmUgb3VyIHJhdGlvcyBhIHByZWNpc2lvbiBvZiBhdCBsZWFzdCAyIGRlY2ltYWwgdmFsdWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFyIG1lYXN1cmVtZW50ID0gMTAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHVuaXRSYXRpb3MgPSB7fTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoIXNhbWVFbVJhdGlvIHx8ICFzYW1lUGVyY2VudFJhdGlvKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBkdW1teSA9IGRhdGEgJiYgZGF0YS5pc1NWRyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwicmVjdFwiKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRWZWxvY2l0eS5pbml0KGR1bW15KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0c2FtZVJhdGlvSW5kaWNhdG9ycy5teVBhcmVudC5hcHBlbmRDaGlsZChkdW1teSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBUbyBhY2N1cmF0ZWx5IGFuZCBjb25zaXN0ZW50bHkgY2FsY3VsYXRlIGNvbnZlcnNpb24gcmF0aW9zLCB0aGUgZWxlbWVudCdzIGNhc2NhZGVkIG92ZXJmbG93IGFuZCBib3gtc2l6aW5nIGFyZSBzdHJpcHBlZC5cclxuXHRcdFx0XHRcdFx0XHRcdFx0IFNpbWlsYXJseSwgc2luY2Ugd2lkdGgvaGVpZ2h0IGNhbiBiZSBhcnRpZmljaWFsbHkgY29uc3RyYWluZWQgYnkgdGhlaXIgbWluLS9tYXgtIGVxdWl2YWxlbnRzLCB0aGVzZSBhcmUgY29udHJvbGxlZCBmb3IgYXMgd2VsbC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogTm90ZTogT3ZlcmZsb3cgbXVzdCBiZSBhbHNvIGJlIGNvbnRyb2xsZWQgZm9yIHBlci1heGlzIHNpbmNlIHRoZSBvdmVyZmxvdyBwcm9wZXJ0eSBvdmVyd3JpdGVzIGl0cyBwZXItYXhpcyB2YWx1ZXMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdCQuZWFjaChbXCJvdmVyZmxvd1wiLCBcIm92ZXJmbG93WFwiLCBcIm92ZXJmbG93WVwiXSwgZnVuY3Rpb24oaSwgcHJvcGVydHkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRWZWxvY2l0eS5DU1Muc2V0UHJvcGVydHlWYWx1ZShkdW1teSwgcHJvcGVydHksIFwiaGlkZGVuXCIpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0VmVsb2NpdHkuQ1NTLnNldFByb3BlcnR5VmFsdWUoZHVtbXksIFwicG9zaXRpb25cIiwgc2FtZVJhdGlvSW5kaWNhdG9ycy5wb3NpdGlvbik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LkNTUy5zZXRQcm9wZXJ0eVZhbHVlKGR1bW15LCBcImZvbnRTaXplXCIsIHNhbWVSYXRpb0luZGljYXRvcnMuZm9udFNpemUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRWZWxvY2l0eS5DU1Muc2V0UHJvcGVydHlWYWx1ZShkdW1teSwgXCJib3hTaXppbmdcIiwgXCJjb250ZW50LWJveFwiKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIHdpZHRoIGFuZCBoZWlnaHQgYWN0IGFzIG91ciBwcm94eSBwcm9wZXJ0aWVzIGZvciBtZWFzdXJpbmcgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsICUgcmF0aW9zLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQkLmVhY2goW1wibWluV2lkdGhcIiwgXCJtYXhXaWR0aFwiLCBcIndpZHRoXCIsIFwibWluSGVpZ2h0XCIsIFwibWF4SGVpZ2h0XCIsIFwiaGVpZ2h0XCJdLCBmdW5jdGlvbihpLCBwcm9wZXJ0eSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFZlbG9jaXR5LkNTUy5zZXRQcm9wZXJ0eVZhbHVlKGR1bW15LCBwcm9wZXJ0eSwgbWVhc3VyZW1lbnQgKyBcIiVcIik7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBwYWRkaW5nTGVmdCBhcmJpdHJhcmlseSBhY3RzIGFzIG91ciBwcm94eSBwcm9wZXJ0eSBmb3IgdGhlIGVtIHJhdGlvLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRWZWxvY2l0eS5DU1Muc2V0UHJvcGVydHlWYWx1ZShkdW1teSwgXCJwYWRkaW5nTGVmdFwiLCBtZWFzdXJlbWVudCArIFwiZW1cIik7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBEaXZpZGUgdGhlIHJldHVybmVkIHZhbHVlIGJ5IHRoZSBtZWFzdXJlbWVudCB0byBnZXQgdGhlIHJhdGlvIGJldHdlZW4gMSUgYW5kIDFweC4gRGVmYXVsdCB0byAxIHNpbmNlIHdvcmtpbmcgd2l0aCAwIGNhbiBwcm9kdWNlIEluZmluaXRlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR1bml0UmF0aW9zLnBlcmNlbnRUb1B4V2lkdGggPSBjYWxsVW5pdENvbnZlcnNpb25EYXRhLmxhc3RQZXJjZW50VG9QeFdpZHRoID0gKHBhcnNlRmxvYXQoQ1NTLmdldFByb3BlcnR5VmFsdWUoZHVtbXksIFwid2lkdGhcIiwgbnVsbCwgdHJ1ZSkpIHx8IDEpIC8gbWVhc3VyZW1lbnQ7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR1bml0UmF0aW9zLnBlcmNlbnRUb1B4SGVpZ2h0ID0gY2FsbFVuaXRDb252ZXJzaW9uRGF0YS5sYXN0UGVyY2VudFRvUHhIZWlnaHQgPSAocGFyc2VGbG9hdChDU1MuZ2V0UHJvcGVydHlWYWx1ZShkdW1teSwgXCJoZWlnaHRcIiwgbnVsbCwgdHJ1ZSkpIHx8IDEpIC8gbWVhc3VyZW1lbnQ7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR1bml0UmF0aW9zLmVtVG9QeCA9IGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdEVtVG9QeCA9IChwYXJzZUZsb2F0KENTUy5nZXRQcm9wZXJ0eVZhbHVlKGR1bW15LCBcInBhZGRpbmdMZWZ0XCIpKSB8fCAxKSAvIG1lYXN1cmVtZW50OyAvKiBHRVQgKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdHNhbWVSYXRpb0luZGljYXRvcnMubXlQYXJlbnQucmVtb3ZlQ2hpbGQoZHVtbXkpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0dW5pdFJhdGlvcy5lbVRvUHggPSBjYWxsVW5pdENvbnZlcnNpb25EYXRhLmxhc3RFbVRvUHg7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXRSYXRpb3MucGVyY2VudFRvUHhXaWR0aCA9IGNhbGxVbml0Q29udmVyc2lvbkRhdGEubGFzdFBlcmNlbnRUb1B4V2lkdGg7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXRSYXRpb3MucGVyY2VudFRvUHhIZWlnaHQgPSBjYWxsVW5pdENvbnZlcnNpb25EYXRhLmxhc3RQZXJjZW50VG9QeEhlaWdodDtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0XHQgRWxlbWVudC1BZ25vc3RpYyBVbml0c1xyXG5cdFx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKiBXaGVyZWFzICUgYW5kIGVtIHJhdGlvcyBhcmUgZGV0ZXJtaW5lZCBvbiBhIHBlci1lbGVtZW50IGJhc2lzLCB0aGUgcmVtIHVuaXQgb25seSBuZWVkcyB0byBiZSBjaGVja2VkXHJcblx0XHRcdFx0XHRcdFx0XHQgb25jZSBwZXIgY2FsbCBzaW5jZSBpdCdzIGV4Y2x1c2l2ZWx5IGRlcGVuZGFudCB1cG9uIGRvY3VtZW50LmJvZHkncyBmb250U2l6ZS4gSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZVxyXG5cdFx0XHRcdFx0XHRcdFx0IHRoYXQgY2FsY3VsYXRlVW5pdFJhdGlvcygpIGlzIGJlaW5nIHJ1biBkdXJpbmcgdGhpcyBjYWxsLCByZW1Ub1B4IHdpbGwgc3RpbGwgYmUgc2V0IHRvIGl0cyBkZWZhdWx0IHZhbHVlIG9mIG51bGwsXHJcblx0XHRcdFx0XHRcdFx0XHQgc28gd2UgY2FsY3VsYXRlIGl0IG5vdy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChjYWxsVW5pdENvbnZlcnNpb25EYXRhLnJlbVRvUHggPT09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogRGVmYXVsdCB0byBicm93c2VycycgZGVmYXVsdCBmb250U2l6ZSBvZiAxNnB4IGluIHRoZSBjYXNlIG9mIDAuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNhbGxVbml0Q29udmVyc2lvbkRhdGEucmVtVG9QeCA9IHBhcnNlRmxvYXQoQ1NTLmdldFByb3BlcnR5VmFsdWUoZG9jdW1lbnQuYm9keSwgXCJmb250U2l6ZVwiKSkgfHwgMTY7IC8qIEdFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIFNpbWlsYXJseSwgdmlld3BvcnQgdW5pdHMgYXJlICUtcmVsYXRpdmUgdG8gdGhlIHdpbmRvdydzIGlubmVyIGRpbWVuc2lvbnMuICovXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoY2FsbFVuaXRDb252ZXJzaW9uRGF0YS52d1RvUHggPT09IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y2FsbFVuaXRDb252ZXJzaW9uRGF0YS52d1RvUHggPSBwYXJzZUZsb2F0KHdpbmRvdy5pbm5lcldpZHRoKSAvIDEwMDsgLyogR0VUICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNhbGxVbml0Q29udmVyc2lvbkRhdGEudmhUb1B4ID0gcGFyc2VGbG9hdCh3aW5kb3cuaW5uZXJIZWlnaHQpIC8gMTAwOyAvKiBHRVQgKi9cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHR1bml0UmF0aW9zLnJlbVRvUHggPSBjYWxsVW5pdENvbnZlcnNpb25EYXRhLnJlbVRvUHg7XHJcblx0XHRcdFx0XHRcdFx0XHR1bml0UmF0aW9zLnZ3VG9QeCA9IGNhbGxVbml0Q29udmVyc2lvbkRhdGEudndUb1B4O1xyXG5cdFx0XHRcdFx0XHRcdFx0dW5pdFJhdGlvcy52aFRvUHggPSBjYWxsVW5pdENvbnZlcnNpb25EYXRhLnZoVG9QeDtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoVmVsb2NpdHkuZGVidWcgPj0gMSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhcIlVuaXQgcmF0aW9zOiBcIiArIEpTT04uc3RyaW5naWZ5KHVuaXRSYXRpb3MpLCBlbGVtZW50KTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB1bml0UmF0aW9zO1xyXG5cdFx0XHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdCBVbml0IENvbnZlcnNpb25cclxuXHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIFRoZSAqIGFuZCAvIG9wZXJhdG9ycywgd2hpY2ggYXJlIG5vdCBwYXNzZWQgaW4gd2l0aCBhbiBhc3NvY2lhdGVkIHVuaXQsIGluaGVyZW50bHkgdXNlIHN0YXJ0VmFsdWUncyB1bml0LiBTa2lwIHZhbHVlIGFuZCB1bml0IGNvbnZlcnNpb24uICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKC9bXFwvKl0vLnRlc3Qob3BlcmF0b3IpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZVVuaXRUeXBlID0gc3RhcnRWYWx1ZVVuaXRUeXBlO1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogSWYgc3RhcnRWYWx1ZSBhbmQgZW5kVmFsdWUgZGlmZmVyIGluIHVuaXQgdHlwZSwgY29udmVydCBzdGFydFZhbHVlIGludG8gdGhlIHNhbWUgdW5pdCB0eXBlIGFzIGVuZFZhbHVlIHNvIHRoYXQgaWYgZW5kVmFsdWVVbml0VHlwZVxyXG5cdFx0XHRcdFx0XHRcdFx0IGlzIGEgcmVsYXRpdmUgdW5pdCAoJSwgZW0sIHJlbSksIHRoZSB2YWx1ZXMgc2V0IGR1cmluZyB0d2VlbmluZyB3aWxsIGNvbnRpbnVlIHRvIGJlIGFjY3VyYXRlbHkgcmVsYXRpdmUgZXZlbiBpZiB0aGUgbWV0cmljcyB0aGV5IGRlcGVuZFxyXG5cdFx0XHRcdFx0XHRcdFx0IG9uIGFyZSBkeW5hbWljYWxseSBjaGFuZ2luZyBkdXJpbmcgdGhlIGNvdXJzZSBvZiB0aGUgYW5pbWF0aW9uLiBDb252ZXJzZWx5LCBpZiB3ZSBhbHdheXMgbm9ybWFsaXplZCBpbnRvIHB4IGFuZCB1c2VkIHB4IGZvciBzZXR0aW5nIHZhbHVlcywgdGhlIHB4IHJhdGlvXHJcblx0XHRcdFx0XHRcdFx0XHQgd291bGQgYmVjb21lIHN0YWxlIGlmIHRoZSBvcmlnaW5hbCB1bml0IGJlaW5nIGFuaW1hdGVkIHRvd2FyZCB3YXMgcmVsYXRpdmUgYW5kIHRoZSB1bmRlcmx5aW5nIG1ldHJpY3MgY2hhbmdlIGR1cmluZyB0aGUgYW5pbWF0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogU2luY2UgMCBpcyAwIGluIGFueSB1bml0IHR5cGUsIG5vIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5IHdoZW4gc3RhcnRWYWx1ZSBpcyAwIC0tIHdlIGp1c3Qgc3RhcnQgYXQgMCB3aXRoIGVuZFZhbHVlVW5pdFR5cGUuICovXHJcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICgoc3RhcnRWYWx1ZVVuaXRUeXBlICE9PSBlbmRWYWx1ZVVuaXRUeXBlKSAmJiBzdGFydFZhbHVlICE9PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBVbml0IGNvbnZlcnNpb24gaXMgYWxzbyBza2lwcGVkIHdoZW4gZW5kVmFsdWUgaXMgMCwgYnV0ICpzdGFydFZhbHVlVW5pdFR5cGUqIG11c3QgYmUgdXNlZCBmb3IgdHdlZW4gdmFsdWVzIHRvIHJlbWFpbiBhY2N1cmF0ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdC8qIE5vdGU6IFNraXBwaW5nIHVuaXQgY29udmVyc2lvbiBoZXJlIG1lYW5zIHRoYXQgaWYgZW5kVmFsdWVVbml0VHlwZSB3YXMgb3JpZ2luYWxseSBhIHJlbGF0aXZlIHVuaXQsIHRoZSBhbmltYXRpb24gd29uJ3QgcmVsYXRpdmVseVxyXG5cdFx0XHRcdFx0XHRcdFx0IG1hdGNoIHRoZSB1bmRlcmx5aW5nIG1ldHJpY3MgaWYgdGhleSBjaGFuZ2UsIGJ1dCB0aGlzIGlzIGFjY2VwdGFibGUgc2luY2Ugd2UncmUgYW5pbWF0aW5nIHRvd2FyZCBpbnZpc2liaWxpdHkgaW5zdGVhZCBvZiB0b3dhcmQgdmlzaWJpbGl0eSxcclxuXHRcdFx0XHRcdFx0XHRcdCB3aGljaCByZW1haW5zIHBhc3QgdGhlIHBvaW50IG9mIHRoZSBhbmltYXRpb24ncyBjb21wbGV0aW9uLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGVuZFZhbHVlID09PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlVW5pdFR5cGUgPSBzdGFydFZhbHVlVW5pdFR5cGU7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBCeSB0aGlzIHBvaW50LCB3ZSBjYW5ub3QgYXZvaWQgdW5pdCBjb252ZXJzaW9uIChpdCdzIHVuZGVzaXJhYmxlIHNpbmNlIGl0IGNhdXNlcyBsYXlvdXQgdGhyYXNoaW5nKS5cclxuXHRcdFx0XHRcdFx0XHRcdFx0IElmIHdlIGhhdmVuJ3QgYWxyZWFkeSwgd2UgdHJpZ2dlciBjYWxjdWxhdGVVbml0UmF0aW9zKCksIHdoaWNoIHJ1bnMgb25jZSBwZXIgZWxlbWVudCBwZXIgY2FsbC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxlbWVudFVuaXRDb252ZXJzaW9uRGF0YSA9IGVsZW1lbnRVbml0Q29udmVyc2lvbkRhdGEgfHwgY2FsY3VsYXRlVW5pdFJhdGlvcygpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogVGhlIGZvbGxvd2luZyBSZWdFeCBtYXRjaGVzIENTUyBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSB0aGVpciAlIHZhbHVlcyBtZWFzdXJlZCByZWxhdGl2ZSB0byB0aGUgeC1heGlzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiBXM0Mgc3BlYyBtYW5kYXRlcyB0aGF0IGFsbCBvZiBtYXJnaW4gYW5kIHBhZGRpbmcncyBwcm9wZXJ0aWVzIChldmVuIHRvcCBhbmQgYm90dG9tKSBhcmUgJS1yZWxhdGl2ZSB0byB0aGUgKndpZHRoKiBvZiB0aGUgcGFyZW50IGVsZW1lbnQuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhciBheGlzID0gKC9tYXJnaW58cGFkZGluZ3xsZWZ0fHJpZ2h0fHdpZHRofHRleHR8d29yZHxsZXR0ZXIvaS50ZXN0KHByb3BlcnR5KSB8fCAvWCQvLnRlc3QocHJvcGVydHkpIHx8IHByb3BlcnR5ID09PSBcInhcIikgPyBcInhcIiA6IFwieVwiO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogSW4gb3JkZXIgdG8gYXZvaWQgZ2VuZXJhdGluZyBuXjIgYmVzcG9rZSBjb252ZXJzaW9uIGZ1bmN0aW9ucywgdW5pdCBjb252ZXJzaW9uIGlzIGEgdHdvLXN0ZXAgcHJvY2VzczpcclxuXHRcdFx0XHRcdFx0XHRcdFx0IDEpIENvbnZlcnQgc3RhcnRWYWx1ZSBpbnRvIHBpeGVscy4gMikgQ29udmVydCB0aGlzIG5ldyBwaXhlbCB2YWx1ZSBpbnRvIGVuZFZhbHVlJ3MgdW5pdCB0eXBlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRzd2l0Y2ggKHN0YXJ0VmFsdWVVbml0VHlwZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIlXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBOb3RlOiB0cmFuc2xhdGVYIGFuZCB0cmFuc2xhdGVZIGFyZSB0aGUgb25seSBwcm9wZXJ0aWVzIHRoYXQgYXJlICUtcmVsYXRpdmUgdG8gYW4gZWxlbWVudCdzIG93biBkaW1lbnNpb25zIC0tIG5vdCBpdHMgcGFyZW50J3MgZGltZW5zaW9ucy5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCBWZWxvY2l0eSBkb2VzIG5vdCBpbmNsdWRlIGEgc3BlY2lhbCBjb252ZXJzaW9uIHByb2Nlc3MgdG8gYWNjb3VudCBmb3IgdGhpcyBiZWhhdmlvci4gVGhlcmVmb3JlLCBhbmltYXRpbmcgdHJhbnNsYXRlWC9ZIGZyb20gYSAlIHZhbHVlXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgdG8gYSBub24tJSB2YWx1ZSB3aWxsIHByb2R1Y2UgYW4gaW5jb3JyZWN0IHN0YXJ0IHZhbHVlLiBGb3J0dW5hdGVseSwgdGhpcyBzb3J0IG9mIGNyb3NzLXVuaXQgY29udmVyc2lvbiBpcyByYXJlbHkgZG9uZSBieSB1c2VycyBpbiBwcmFjdGljZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgKj0gKGF4aXMgPT09IFwieFwiID8gZWxlbWVudFVuaXRDb252ZXJzaW9uRGF0YS5wZXJjZW50VG9QeFdpZHRoIDogZWxlbWVudFVuaXRDb252ZXJzaW9uRGF0YS5wZXJjZW50VG9QeEhlaWdodCk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInB4XCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBweCBhY3RzIGFzIG91ciBtaWRwb2ludCBpbiB0aGUgdW5pdCBjb252ZXJzaW9uIHByb2Nlc3M7IGRvIG5vdGhpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHN0YXJ0VmFsdWUgKj0gZWxlbWVudFVuaXRDb252ZXJzaW9uRGF0YVtzdGFydFZhbHVlVW5pdFR5cGUgKyBcIlRvUHhcIl07XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIEludmVydCB0aGUgcHggcmF0aW9zIHRvIGNvbnZlcnQgaW50byB0byB0aGUgdGFyZ2V0IHVuaXQuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdHN3aXRjaCAoZW5kVmFsdWVVbml0VHlwZSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIlXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlICo9IDEgLyAoYXhpcyA9PT0gXCJ4XCIgPyBlbGVtZW50VW5pdENvbnZlcnNpb25EYXRhLnBlcmNlbnRUb1B4V2lkdGggOiBlbGVtZW50VW5pdENvbnZlcnNpb25EYXRhLnBlcmNlbnRUb1B4SGVpZ2h0KTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRjYXNlIFwicHhcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8qIHN0YXJ0VmFsdWUgaXMgYWxyZWFkeSBpbiBweCwgZG8gbm90aGluZzsgd2UncmUgZG9uZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZSAqPSAxIC8gZWxlbWVudFVuaXRDb252ZXJzaW9uRGF0YVtlbmRWYWx1ZVVuaXRUeXBlICsgXCJUb1B4XCJdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0IFJlbGF0aXZlIFZhbHVlc1xyXG5cdFx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIE9wZXJhdG9yIGxvZ2ljIG11c3QgYmUgcGVyZm9ybWVkIGxhc3Qgc2luY2UgaXQgcmVxdWlyZXMgdW5pdC1ub3JtYWxpemVkIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiAqL1xyXG5cdFx0XHRcdFx0XHRcdC8qIE5vdGU6IFJlbGF0aXZlICpwZXJjZW50IHZhbHVlcyogZG8gbm90IGJlaGF2ZSBob3cgbW9zdCBwZW9wbGUgdGhpbms7IHdoaWxlIG9uZSB3b3VsZCBleHBlY3QgXCIrPTUwJVwiXHJcblx0XHRcdFx0XHRcdFx0IHRvIGluY3JlYXNlIHRoZSBwcm9wZXJ0eSAxLjV4IGl0cyBjdXJyZW50IHZhbHVlLCBpdCBpbiBmYWN0IGluY3JlYXNlcyB0aGUgcGVyY2VudCB1bml0cyBpbiBhYnNvbHV0ZSB0ZXJtczpcclxuXHRcdFx0XHRcdFx0XHQgNTAgcG9pbnRzIGlzIGFkZGVkIG9uIHRvcCBvZiB0aGUgY3VycmVudCAlIHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0XHRcdHN3aXRjaCAob3BlcmF0b3IpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIrXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlID0gc3RhcnRWYWx1ZSArIGVuZFZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiLVwiOlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRlbmRWYWx1ZSA9IHN0YXJ0VmFsdWUgLSBlbmRWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcIipcIjpcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZW5kVmFsdWUgPSBzdGFydFZhbHVlICogZW5kVmFsdWU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCIvXCI6XHJcblx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlID0gc3RhcnRWYWx1ZSAvIGVuZFZhbHVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdCB0d2VlbnNDb250YWluZXIgUHVzaFxyXG5cdFx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogQ29uc3RydWN0IHRoZSBwZXItcHJvcGVydHkgdHdlZW4gb2JqZWN0LCBhbmQgcHVzaCBpdCB0byB0aGUgZWxlbWVudCdzIHR3ZWVuc0NvbnRhaW5lci4gKi9cclxuXHRcdFx0XHRcdFx0XHR0d2VlbnNDb250YWluZXJbcHJvcGVydHldID0ge1xyXG5cdFx0XHRcdFx0XHRcdFx0cm9vdFByb3BlcnR5VmFsdWU6IHJvb3RQcm9wZXJ0eVZhbHVlLFxyXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnRWYWx1ZTogc3RhcnRWYWx1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRWYWx1ZTogc3RhcnRWYWx1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlOiBlbmRWYWx1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdHVuaXRUeXBlOiBlbmRWYWx1ZVVuaXRUeXBlLFxyXG5cdFx0XHRcdFx0XHRcdFx0ZWFzaW5nOiBlYXNpbmdcclxuXHRcdFx0XHRcdFx0XHR9O1xyXG5cdFx0XHRcdFx0XHRcdGlmIChwYXR0ZXJuKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0d2VlbnNDb250YWluZXJbcHJvcGVydHldLnBhdHRlcm4gPSBwYXR0ZXJuO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKFZlbG9jaXR5LmRlYnVnKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhcInR3ZWVuc0NvbnRhaW5lciAoXCIgKyBwcm9wZXJ0eSArIFwiKTogXCIgKyBKU09OLnN0cmluZ2lmeSh0d2VlbnNDb250YWluZXJbcHJvcGVydHldKSwgZWxlbWVudCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRcdFx0LyogQ3JlYXRlIGEgdHdlZW4gb3V0IG9mIGVhY2ggcHJvcGVydHksIGFuZCBhcHBlbmQgaXRzIGFzc29jaWF0ZWQgZGF0YSB0byB0d2VlbnNDb250YWluZXIuICovXHJcblx0XHRcdFx0XHRcdGZvciAodmFyIHByb3BlcnR5IGluIHByb3BlcnRpZXNNYXApIHtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKCFwcm9wZXJ0aWVzTWFwLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdC8qIFRoZSBvcmlnaW5hbCBwcm9wZXJ0eSBuYW1lJ3MgZm9ybWF0IG11c3QgYmUgdXNlZCBmb3IgdGhlIHBhcnNlUHJvcGVydHlWYWx1ZSgpIGxvb2t1cCxcclxuXHRcdFx0XHRcdFx0XHQgYnV0IHdlIHRoZW4gdXNlIGl0cyBjYW1lbENhc2Ugc3R5bGluZyB0byBub3JtYWxpemUgaXQgZm9yIG1hbmlwdWxhdGlvbi4gKi9cclxuXHRcdFx0XHRcdFx0XHR2YXIgcHJvcGVydHlOYW1lID0gQ1NTLk5hbWVzLmNhbWVsQ2FzZShwcm9wZXJ0eSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhbHVlRGF0YSA9IHBhcnNlUHJvcGVydHlWYWx1ZShwcm9wZXJ0aWVzTWFwW3Byb3BlcnR5XSk7XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIEZpbmQgc2hvcnRoYW5kIGNvbG9yIHByb3BlcnRpZXMgdGhhdCBoYXZlIGJlZW4gcGFzc2VkIGEgaGV4IHN0cmluZy4gKi9cclxuXHRcdFx0XHRcdFx0XHQvKiBXb3VsZCBiZSBxdWlja2VyIHRvIHVzZSBDU1MuTGlzdHMuY29sb3JzLmluY2x1ZGVzKCkgaWYgcG9zc2libGUgKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoX2luQXJyYXkoQ1NTLkxpc3RzLmNvbG9ycywgcHJvcGVydHlOYW1lKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0LyogUGFyc2UgdGhlIHZhbHVlIGRhdGEgZm9yIGVhY2ggc2hvcnRoYW5kLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0dmFyIGVuZFZhbHVlID0gdmFsdWVEYXRhWzBdLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVhc2luZyA9IHZhbHVlRGF0YVsxXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlID0gdmFsdWVEYXRhWzJdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChDU1MuUmVnRXguaXNIZXgudGVzdChlbmRWYWx1ZSkpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogQ29udmVydCB0aGUgaGV4IHN0cmluZ3MgaW50byB0aGVpciBSR0IgY29tcG9uZW50IGFycmF5cy4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGNvbG9yQ29tcG9uZW50cyA9IFtcIlJlZFwiLCBcIkdyZWVuXCIsIFwiQmx1ZVwiXSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGVuZFZhbHVlUkdCID0gQ1NTLlZhbHVlcy5oZXhUb1JnYihlbmRWYWx1ZSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRzdGFydFZhbHVlUkdCID0gc3RhcnRWYWx1ZSA/IENTUy5WYWx1ZXMuaGV4VG9SZ2Ioc3RhcnRWYWx1ZSkgOiB1bmRlZmluZWQ7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBJbmplY3QgdGhlIFJHQiBjb21wb25lbnQgdHdlZW5zIGludG8gcHJvcGVydGllc01hcC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBjb2xvckNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgZGF0YUFycmF5ID0gW2VuZFZhbHVlUkdCW2ldXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVhc2luZykge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0YUFycmF5LnB1c2goZWFzaW5nKTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChzdGFydFZhbHVlUkdCICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGFBcnJheS5wdXNoKHN0YXJ0VmFsdWVSR0JbaV0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zml4UHJvcGVydHlWYWx1ZShwcm9wZXJ0eU5hbWUgKyBjb2xvckNvbXBvbmVudHNbaV0sIGRhdGFBcnJheSk7XHJcblx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogSWYgd2UgaGF2ZSByZXBsYWNlZCBhIHNob3J0Y3V0IGNvbG9yIHZhbHVlIHRoZW4gZG9uJ3QgdXBkYXRlIHRoZSBzdGFuZGFyZCBwcm9wZXJ0eSBuYW1lICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRmaXhQcm9wZXJ0eVZhbHVlKHByb3BlcnR5TmFtZSwgdmFsdWVEYXRhKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogQWxvbmcgd2l0aCBpdHMgcHJvcGVydHkgZGF0YSwgc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgaXRzZWxmIG9udG8gdHdlZW5zQ29udGFpbmVyLiAqL1xyXG5cdFx0XHRcdFx0XHR0d2VlbnNDb250YWluZXIuZWxlbWVudCA9IGVsZW1lbnQ7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHQgQ2FsbCBQdXNoXHJcblx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdFx0LyogTm90ZTogdHdlZW5zQ29udGFpbmVyIGNhbiBiZSBlbXB0eSBpZiBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4gdGhpcyBjYWxsJ3MgcHJvcGVydHkgbWFwIHdlcmUgc2tpcHBlZCBkdWUgdG8gbm90XHJcblx0XHRcdFx0XHQgYmVpbmcgc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyLiBUaGUgZWxlbWVudCBwcm9wZXJ0eSBpcyB1c2VkIGZvciBjaGVja2luZyB0aGF0IHRoZSB0d2VlbnNDb250YWluZXIgaGFzIGJlZW4gYXBwZW5kZWQgdG8uICovXHJcblx0XHRcdFx0XHRpZiAodHdlZW5zQ29udGFpbmVyLmVsZW1lbnQpIHtcclxuXHRcdFx0XHRcdFx0LyogQXBwbHkgdGhlIFwidmVsb2NpdHktYW5pbWF0aW5nXCIgaW5kaWNhdG9yIGNsYXNzLiAqL1xyXG5cdFx0XHRcdFx0XHRDU1MuVmFsdWVzLmFkZENsYXNzKGVsZW1lbnQsIFwidmVsb2NpdHktYW5pbWF0aW5nXCIpO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogVGhlIGNhbGwgYXJyYXkgaG91c2VzIHRoZSB0d2VlbnNDb250YWluZXJzIGZvciBlYWNoIGVsZW1lbnQgYmVpbmcgYW5pbWF0ZWQgaW4gdGhlIGN1cnJlbnQgY2FsbC4gKi9cclxuXHRcdFx0XHRcdFx0Y2FsbC5wdXNoKHR3ZWVuc0NvbnRhaW5lcik7XHJcblxyXG5cdFx0XHRcdFx0XHRkYXRhID0gRGF0YShlbGVtZW50KTtcclxuXHJcblx0XHRcdFx0XHRcdGlmIChkYXRhKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogU3RvcmUgdGhlIHR3ZWVuc0NvbnRhaW5lciBhbmQgb3B0aW9ucyBpZiB3ZSdyZSB3b3JraW5nIG9uIHRoZSBkZWZhdWx0IGVmZmVjdHMgcXVldWUsIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBieSB0aGUgcmV2ZXJzZSBjb21tYW5kLiAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChvcHRzLnF1ZXVlID09PSBcIlwiKSB7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YS50d2VlbnNDb250YWluZXIgPSB0d2VlbnNDb250YWluZXI7XHJcblx0XHRcdFx0XHRcdFx0XHRkYXRhLm9wdHMgPSBvcHRzO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogU3dpdGNoIG9uIHRoZSBlbGVtZW50J3MgYW5pbWF0aW5nIGZsYWcuICovXHJcblx0XHRcdFx0XHRcdFx0ZGF0YS5pc0FuaW1hdGluZyA9IHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIE9uY2UgdGhlIGZpbmFsIGVsZW1lbnQgaW4gdGhpcyBjYWxsJ3MgZWxlbWVudCBzZXQgaGFzIGJlZW4gcHJvY2Vzc2VkLCBwdXNoIHRoZSBjYWxsIGFycmF5IG9udG9cclxuXHRcdFx0XHRcdFx0IFZlbG9jaXR5LlN0YXRlLmNhbGxzIGZvciB0aGUgYW5pbWF0aW9uIHRpY2sgdG8gaW1tZWRpYXRlbHkgYmVnaW4gcHJvY2Vzc2luZy4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKGVsZW1lbnRzSW5kZXggPT09IGVsZW1lbnRzTGVuZ3RoIC0gMSkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIEFkZCB0aGUgY3VycmVudCBjYWxsIHBsdXMgaXRzIGFzc29jaWF0ZWQgbWV0YWRhdGEgKHRoZSBlbGVtZW50IHNldCBhbmQgdGhlIGNhbGwncyBvcHRpb25zKSBvbnRvIHRoZSBnbG9iYWwgY2FsbCBjb250YWluZXIuXHJcblx0XHRcdFx0XHRcdFx0IEFueXRoaW5nIG9uIHRoaXMgY2FsbCBjb250YWluZXIgaXMgc3ViamVjdGVkIHRvIHRpY2soKSBwcm9jZXNzaW5nLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmNhbGxzLnB1c2goW2NhbGwsIGVsZW1lbnRzLCBvcHRzLCBudWxsLCBwcm9taXNlRGF0YS5yZXNvbHZlciwgbnVsbCwgMF0pO1xyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBJZiB0aGUgYW5pbWF0aW9uIHRpY2sgaXNuJ3QgcnVubmluZywgc3RhcnQgaXQuIChWZWxvY2l0eSBzaHV0cyBpdCBvZmYgd2hlbiB0aGVyZSBhcmUgbm8gYWN0aXZlIGNhbGxzIHRvIHByb2Nlc3MuKSAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmIChWZWxvY2l0eS5TdGF0ZS5pc1RpY2tpbmcgPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRWZWxvY2l0eS5TdGF0ZS5pc1RpY2tpbmcgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIFN0YXJ0IHRoZSB0aWNrIGxvb3AuICovXHJcblx0XHRcdFx0XHRcdFx0XHR0aWNrKCk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRcdGVsZW1lbnRzSW5kZXgrKztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyogV2hlbiB0aGUgcXVldWUgb3B0aW9uIGlzIHNldCB0byBmYWxzZSwgdGhlIGNhbGwgc2tpcHMgdGhlIGVsZW1lbnQncyBxdWV1ZSBhbmQgZmlyZXMgaW1tZWRpYXRlbHkuICovXHJcblx0XHRcdFx0aWYgKG9wdHMucXVldWUgPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0XHQvKiBTaW5jZSB0aGlzIGJ1aWxkUXVldWUgY2FsbCBkb2Vzbid0IHJlc3BlY3QgdGhlIGVsZW1lbnQncyBleGlzdGluZyBxdWV1ZSAod2hpY2ggaXMgd2hlcmUgYSBkZWxheSBvcHRpb24gd291bGQgaGF2ZSBiZWVuIGFwcGVuZGVkKSxcclxuXHRcdFx0XHRcdCB3ZSBtYW51YWxseSBpbmplY3QgdGhlIGRlbGF5IHByb3BlcnR5IGhlcmUgd2l0aCBhbiBleHBsaWNpdCBzZXRUaW1lb3V0LiAqL1xyXG5cdFx0XHRcdFx0aWYgKG9wdHMuZGVsYXkpIHtcclxuXHJcblx0XHRcdFx0XHRcdC8qIFRlbXBvcmFyaWx5IHN0b3JlIGRlbGF5ZWQgZWxlbWVudHMgdG8gZmFjaWxpdGF0ZSBhY2Nlc3MgZm9yIGdsb2JhbCBwYXVzZS9yZXN1bWUgKi9cclxuXHRcdFx0XHRcdFx0dmFyIGNhbGxJbmRleCA9IFZlbG9jaXR5LlN0YXRlLmRlbGF5ZWRFbGVtZW50cy5jb3VudCsrO1xyXG5cdFx0XHRcdFx0XHRWZWxvY2l0eS5TdGF0ZS5kZWxheWVkRWxlbWVudHNbY2FsbEluZGV4XSA9IGVsZW1lbnQ7XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgZGVsYXlDb21wbGV0ZSA9IChmdW5jdGlvbihpbmRleCkge1xyXG5cdFx0XHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0XHRcdC8qIENsZWFyIHRoZSB0ZW1wb3JhcnkgZWxlbWVudCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0VmVsb2NpdHkuU3RhdGUuZGVsYXllZEVsZW1lbnRzW2luZGV4XSA9IGZhbHNlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdC8qIEZpbmFsbHksIGlzc3VlIHRoZSBjYWxsICovXHJcblx0XHRcdFx0XHRcdFx0XHRidWlsZFF1ZXVlKCk7XHJcblx0XHRcdFx0XHRcdFx0fTtcclxuXHRcdFx0XHRcdFx0fSkoY2FsbEluZGV4KTtcclxuXHJcblx0XHRcdFx0XHRcdERhdGEoZWxlbWVudCkuZGVsYXlCZWdpbiA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XHJcblx0XHRcdFx0XHRcdERhdGEoZWxlbWVudCkuZGVsYXkgPSBwYXJzZUZsb2F0KG9wdHMuZGVsYXkpO1xyXG5cdFx0XHRcdFx0XHREYXRhKGVsZW1lbnQpLmRlbGF5VGltZXIgPSB7XHJcblx0XHRcdFx0XHRcdFx0c2V0VGltZW91dDogc2V0VGltZW91dChidWlsZFF1ZXVlLCBwYXJzZUZsb2F0KG9wdHMuZGVsYXkpKSxcclxuXHRcdFx0XHRcdFx0XHRuZXh0OiBkZWxheUNvbXBsZXRlXHJcblx0XHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0XHRidWlsZFF1ZXVlKCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQvKiBPdGhlcndpc2UsIHRoZSBjYWxsIHVuZGVyZ29lcyBlbGVtZW50IHF1ZXVlaW5nIGFzIG5vcm1hbC4gKi9cclxuXHRcdFx0XHRcdC8qIE5vdGU6IFRvIGludGVyb3BlcmF0ZSB3aXRoIGpRdWVyeSwgVmVsb2NpdHkgdXNlcyBqUXVlcnkncyBvd24gJC5xdWV1ZSgpIHN0YWNrIGZvciBxdWV1aW5nIGxvZ2ljLiAqL1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHQkLnF1ZXVlKGVsZW1lbnQsIG9wdHMucXVldWUsIGZ1bmN0aW9uKG5leHQsIGNsZWFyUXVldWUpIHtcclxuXHRcdFx0XHRcdFx0LyogSWYgdGhlIGNsZWFyUXVldWUgZmxhZyB3YXMgcGFzc2VkIGluIGJ5IHRoZSBzdG9wIGNvbW1hbmQsIHJlc29sdmUgdGhpcyBjYWxsJ3MgcHJvbWlzZS4gKFByb21pc2VzIGNhbiBvbmx5IGJlIHJlc29sdmVkIG9uY2UsXHJcblx0XHRcdFx0XHRcdCBzbyBpdCdzIGZpbmUgaWYgdGhpcyBpcyByZXBlYXRlZGx5IHRyaWdnZXJlZCBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBhc3NvY2lhdGVkIGNhbGwuKSAqL1xyXG5cdFx0XHRcdFx0XHRpZiAoY2xlYXJRdWV1ZSA9PT0gdHJ1ZSkge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChwcm9taXNlRGF0YS5wcm9taXNlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRwcm9taXNlRGF0YS5yZXNvbHZlcihlbGVtZW50cyk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBEbyBub3QgY29udGludWUgd2l0aCBhbmltYXRpb24gcXVldWVpbmcuICovXHJcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdG8gdGhlIHVwY29taW5nIGNvbXBsZXRlQ2FsbCgpIGZ1bmN0aW9uIHRoYXQgdGhpcyBxdWV1ZSBlbnRyeSB3YXMgaW5pdGlhdGVkIGJ5IFZlbG9jaXR5LlxyXG5cdFx0XHRcdFx0XHQgU2VlIGNvbXBsZXRlQ2FsbCgpIGZvciBmdXJ0aGVyIGRldGFpbHMuICovXHJcblx0XHRcdFx0XHRcdFZlbG9jaXR5LnZlbG9jaXR5UXVldWVFbnRyeUZsYWcgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0YnVpbGRRdWV1ZShuZXh0KTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBBdXRvLURlcXVldWluZ1xyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIEFzIHBlciBqUXVlcnkncyAkLnF1ZXVlKCkgYmVoYXZpb3IsIHRvIGZpcmUgdGhlIGZpcnN0IG5vbi1jdXN0b20tcXVldWUgZW50cnkgb24gYW4gZWxlbWVudCwgdGhlIGVsZW1lbnRcclxuXHRcdFx0XHQgbXVzdCBiZSBkZXF1ZXVlZCBpZiBpdHMgcXVldWUgc3RhY2sgY29uc2lzdHMgKnNvbGVseSogb2YgdGhlIGN1cnJlbnQgY2FsbC4gKFRoaXMgY2FuIGJlIGRldGVybWluZWQgYnkgY2hlY2tpbmdcclxuXHRcdFx0XHQgZm9yIHRoZSBcImlucHJvZ3Jlc3NcIiBpdGVtIHRoYXQgalF1ZXJ5IHByZXBlbmRzIHRvIGFjdGl2ZSBxdWV1ZSBzdGFjayBhcnJheXMuKSBSZWdhcmRsZXNzLCB3aGVuZXZlciB0aGUgZWxlbWVudCdzXHJcblx0XHRcdFx0IHF1ZXVlIGlzIGZ1cnRoZXIgYXBwZW5kZWQgd2l0aCBhZGRpdGlvbmFsIGl0ZW1zIC0tIGluY2x1ZGluZyAkLmRlbGF5KCkncyBvciBldmVuICQuYW5pbWF0ZSgpIGNhbGxzLCB0aGUgcXVldWUnc1xyXG5cdFx0XHRcdCBmaXJzdCBlbnRyeSBpcyBhdXRvbWF0aWNhbGx5IGZpcmVkLiBUaGlzIGJlaGF2aW9yIGNvbnRyYXN0cyB0aGF0IG9mIGN1c3RvbSBxdWV1ZXMsIHdoaWNoIG5ldmVyIGF1dG8tZmlyZS4gKi9cclxuXHRcdFx0XHQvKiBOb3RlOiBXaGVuIGFuIGVsZW1lbnQgc2V0IGlzIGJlaW5nIHN1YmplY3RlZCB0byBhIG5vbi1wYXJhbGxlbCBWZWxvY2l0eSBjYWxsLCB0aGUgYW5pbWF0aW9uIHdpbGwgbm90IGJlZ2luIHVudGlsXHJcblx0XHRcdFx0IGVhY2ggb25lIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc2V0IGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgaXRzIGluZGl2aWR1YWxseSBwcmUtZXhpc3RpbmcgcXVldWUgY2hhaW4uICovXHJcblx0XHRcdFx0LyogTm90ZTogVW5mb3J0dW5hdGVseSwgbW9zdCBwZW9wbGUgZG9uJ3QgZnVsbHkgZ3Jhc3AgalF1ZXJ5J3MgcG93ZXJmdWwsIHlldCBxdWlya3ksICQucXVldWUoKSBmdW5jdGlvbi5cclxuXHRcdFx0XHQgTGVhbiBtb3JlIGhlcmU6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1ODE1OC9jYW4tc29tZWJvZHktZXhwbGFpbi1qcXVlcnktcXVldWUtdG8tbWUgKi9cclxuXHRcdFx0XHRpZiAoKG9wdHMucXVldWUgPT09IFwiXCIgfHwgb3B0cy5xdWV1ZSA9PT0gXCJmeFwiKSAmJiAkLnF1ZXVlKGVsZW1lbnQpWzBdICE9PSBcImlucHJvZ3Jlc3NcIikge1xyXG5cdFx0XHRcdFx0JC5kZXF1ZXVlKGVsZW1lbnQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBFbGVtZW50IFNldCBJdGVyYXRpb25cclxuXHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogSWYgdGhlIFwibm9kZVR5cGVcIiBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIGVsZW1lbnRzIHZhcmlhYmxlLCB3ZSdyZSBhbmltYXRpbmcgYSBzaW5nbGUgZWxlbWVudC5cclxuXHRcdFx0IFBsYWNlIGl0IGluIGFuIGFycmF5IHNvIHRoYXQgJC5lYWNoKCkgY2FuIGl0ZXJhdGUgb3ZlciBpdC4gKi9cclxuXHRcdFx0JC5lYWNoKGVsZW1lbnRzLCBmdW5jdGlvbihpLCBlbGVtZW50KSB7XHJcblx0XHRcdFx0LyogRW5zdXJlIGVhY2ggZWxlbWVudCBpbiBhIHNldCBoYXMgYSBub2RlVHlwZSAoaXMgYSByZWFsIGVsZW1lbnQpIHRvIGF2b2lkIHRocm93aW5nIGVycm9ycy4gKi9cclxuXHRcdFx0XHRpZiAoVHlwZS5pc05vZGUoZWxlbWVudCkpIHtcclxuXHRcdFx0XHRcdHByb2Nlc3NFbGVtZW50KGVsZW1lbnQsIGkpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdCBPcHRpb246IExvb3BcclxuXHRcdFx0ICoqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdC8qIFRoZSBsb29wIG9wdGlvbiBhY2NlcHRzIGFuIGludGVnZXIgaW5kaWNhdGluZyBob3cgbWFueSB0aW1lcyB0aGUgZWxlbWVudCBzaG91bGQgbG9vcCBiZXR3ZWVuIHRoZSB2YWx1ZXMgaW4gdGhlXHJcblx0XHRcdCBjdXJyZW50IGNhbGwncyBwcm9wZXJ0aWVzIG1hcCBhbmQgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eSB2YWx1ZXMgcHJpb3IgdG8gdGhpcyBjYWxsLiAqL1xyXG5cdFx0XHQvKiBOb3RlOiBUaGUgbG9vcCBvcHRpb24ncyBsb2dpYyBpcyBwZXJmb3JtZWQgaGVyZSAtLSBhZnRlciBlbGVtZW50IHByb2Nlc3NpbmcgLS0gYmVjYXVzZSB0aGUgY3VycmVudCBjYWxsIG5lZWRzXHJcblx0XHRcdCB0byB1bmRlcmdvIGl0cyBxdWV1ZSBpbnNlcnRpb24gcHJpb3IgdG8gdGhlIGxvb3Agb3B0aW9uIGdlbmVyYXRpbmcgaXRzIHNlcmllcyBvZiBjb25zdGl0dWVudCBcInJldmVyc2VcIiBjYWxscyxcclxuXHRcdFx0IHdoaWNoIGNoYWluIGFmdGVyIHRoZSBjdXJyZW50IGNhbGwuIFR3byByZXZlcnNlIGNhbGxzICh0d28gXCJhbHRlcm5hdGlvbnNcIikgY29uc3RpdHV0ZSBvbmUgbG9vcC4gKi9cclxuXHRcdFx0b3B0cyA9ICQuZXh0ZW5kKHt9LCBWZWxvY2l0eS5kZWZhdWx0cywgb3B0aW9ucyk7XHJcblx0XHRcdG9wdHMubG9vcCA9IHBhcnNlSW50KG9wdHMubG9vcCwgMTApO1xyXG5cdFx0XHR2YXIgcmV2ZXJzZUNhbGxzQ291bnQgPSAob3B0cy5sb29wICogMikgLSAxO1xyXG5cclxuXHRcdFx0aWYgKG9wdHMubG9vcCkge1xyXG5cdFx0XHRcdC8qIERvdWJsZSB0aGUgbG9vcCBjb3VudCB0byBjb252ZXJ0IGl0IGludG8gaXRzIGFwcHJvcHJpYXRlIG51bWJlciBvZiBcInJldmVyc2VcIiBjYWxscy5cclxuXHRcdFx0XHQgU3VidHJhY3QgMSBmcm9tIHRoZSByZXN1bHRpbmcgdmFsdWUgc2luY2UgdGhlIGN1cnJlbnQgY2FsbCBpcyBpbmNsdWRlZCBpbiB0aGUgdG90YWwgYWx0ZXJuYXRpb24gY291bnQuICovXHJcblx0XHRcdFx0Zm9yICh2YXIgeCA9IDA7IHggPCByZXZlcnNlQ2FsbHNDb3VudDsgeCsrKSB7XHJcblx0XHRcdFx0XHQvKiBTaW5jZSB0aGUgbG9naWMgZm9yIHRoZSByZXZlcnNlIGFjdGlvbiBvY2N1cnMgaW5zaWRlIFF1ZXVlaW5nIGFuZCB0aGVyZWZvcmUgdGhpcyBjYWxsJ3Mgb3B0aW9ucyBvYmplY3RcclxuXHRcdFx0XHRcdCBpc24ndCBwYXJzZWQgdW50aWwgdGhlbiBhcyB3ZWxsLCB0aGUgY3VycmVudCBjYWxsJ3MgZGVsYXkgb3B0aW9uIG11c3QgYmUgZXhwbGljaXRseSBwYXNzZWQgaW50byB0aGUgcmV2ZXJzZVxyXG5cdFx0XHRcdFx0IGNhbGwgc28gdGhhdCB0aGUgZGVsYXkgbG9naWMgdGhhdCBvY2N1cnMgaW5zaWRlICpQcmUtUXVldWVpbmcqIGNhbiBwcm9jZXNzIGl0LiAqL1xyXG5cdFx0XHRcdFx0dmFyIHJldmVyc2VPcHRpb25zID0ge1xyXG5cdFx0XHRcdFx0XHRkZWxheTogb3B0cy5kZWxheSxcclxuXHRcdFx0XHRcdFx0cHJvZ3Jlc3M6IG9wdHMucHJvZ3Jlc3NcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0LyogSWYgYSBjb21wbGV0ZSBjYWxsYmFjayB3YXMgcGFzc2VkIGludG8gdGhpcyBjYWxsLCB0cmFuc2ZlciBpdCB0byB0aGUgbG9vcCByZWRpcmVjdCdzIGZpbmFsIFwicmV2ZXJzZVwiIGNhbGxcclxuXHRcdFx0XHRcdCBzbyB0aGF0IGl0J3MgdHJpZ2dlcmVkIHdoZW4gdGhlIGVudGlyZSByZWRpcmVjdCBpcyBjb21wbGV0ZSAoYW5kIG5vdCB3aGVuIHRoZSB2ZXJ5IGZpcnN0IGFuaW1hdGlvbiBpcyBjb21wbGV0ZSkuICovXHJcblx0XHRcdFx0XHRpZiAoeCA9PT0gcmV2ZXJzZUNhbGxzQ291bnQgLSAxKSB7XHJcblx0XHRcdFx0XHRcdHJldmVyc2VPcHRpb25zLmRpc3BsYXkgPSBvcHRzLmRpc3BsYXk7XHJcblx0XHRcdFx0XHRcdHJldmVyc2VPcHRpb25zLnZpc2liaWxpdHkgPSBvcHRzLnZpc2liaWxpdHk7XHJcblx0XHRcdFx0XHRcdHJldmVyc2VPcHRpb25zLmNvbXBsZXRlID0gb3B0cy5jb21wbGV0ZTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRhbmltYXRlKGVsZW1lbnRzLCBcInJldmVyc2VcIiwgcmV2ZXJzZU9wdGlvbnMpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyoqKioqKioqKioqKioqKlxyXG5cdFx0XHQgQ2hhaW5pbmdcclxuXHRcdFx0ICoqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdC8qIFJldHVybiB0aGUgZWxlbWVudHMgYmFjayB0byB0aGUgY2FsbCBjaGFpbiwgd2l0aCB3cmFwcGVkIGVsZW1lbnRzIHRha2luZyBwcmVjZWRlbmNlIGluIGNhc2UgVmVsb2NpdHkgd2FzIGNhbGxlZCB2aWEgdGhlICQuZm4uIGV4dGVuc2lvbi4gKi9cclxuXHRcdFx0cmV0dXJuIGdldENoYWluKCk7XHJcblx0XHR9O1xyXG5cclxuXHRcdC8qIFR1cm4gVmVsb2NpdHkgaW50byB0aGUgYW5pbWF0aW9uIGZ1bmN0aW9uLCBleHRlbmRlZCB3aXRoIHRoZSBwcmUtZXhpc3RpbmcgVmVsb2NpdHkgb2JqZWN0LiAqL1xyXG5cdFx0VmVsb2NpdHkgPSAkLmV4dGVuZChhbmltYXRlLCBWZWxvY2l0eSk7XHJcblx0XHQvKiBGb3IgbGVnYWN5IHN1cHBvcnQsIGFsc28gZXhwb3NlIHRoZSBsaXRlcmFsIGFuaW1hdGUgbWV0aG9kLiAqL1xyXG5cdFx0VmVsb2NpdHkuYW5pbWF0ZSA9IGFuaW1hdGU7XHJcblxyXG5cdFx0LyoqKioqKioqKioqKioqXHJcblx0XHQgVGltaW5nXHJcblx0XHQgKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0LyogVGlja2VyIGZ1bmN0aW9uLiAqL1xyXG5cdFx0dmFyIHRpY2tlciA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgckFGU2hpbTtcclxuXHJcblx0XHQvKiBJbmFjdGl2ZSBicm93c2VyIHRhYnMgcGF1c2UgckFGLCB3aGljaCByZXN1bHRzIGluIGFsbCBhY3RpdmUgYW5pbWF0aW9ucyBpbW1lZGlhdGVseSBzcHJpbnRpbmcgdG8gdGhlaXIgY29tcGxldGlvbiBzdGF0ZXMgd2hlbiB0aGUgdGFiIHJlZm9jdXNlcy5cclxuXHRcdCBUbyBnZXQgYXJvdW5kIHRoaXMsIHdlIGR5bmFtaWNhbGx5IHN3aXRjaCByQUYgdG8gc2V0VGltZW91dCAod2hpY2ggdGhlIGJyb3dzZXIgKmRvZXNuJ3QqIHBhdXNlKSB3aGVuIHRoZSB0YWIgbG9zZXMgZm9jdXMuIFdlIHNraXAgdGhpcyBmb3IgbW9iaWxlXHJcblx0XHQgZGV2aWNlcyB0byBhdm9pZCB3YXN0aW5nIGJhdHRlcnkgcG93ZXIgb24gaW5hY3RpdmUgdGFicy4gKi9cclxuXHRcdC8qIE5vdGU6IFRhYiBmb2N1cyBkZXRlY3Rpb24gZG9lc24ndCB3b3JrIG9uIG9sZGVyIHZlcnNpb25zIG9mIElFLCBidXQgdGhhdCdzIG9rYXkgc2luY2UgdGhleSBkb24ndCBzdXBwb3J0IHJBRiB0byBiZWdpbiB3aXRoLiAqL1xyXG5cdFx0aWYgKCFWZWxvY2l0eS5TdGF0ZS5pc01vYmlsZSAmJiBkb2N1bWVudC5oaWRkZW4gIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHR2YXIgdXBkYXRlVGlja2VyID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0LyogUmVhc3NpZ24gdGhlIHJBRiBmdW5jdGlvbiAod2hpY2ggdGhlIGdsb2JhbCB0aWNrKCkgZnVuY3Rpb24gdXNlcykgYmFzZWQgb24gdGhlIHRhYidzIGZvY3VzIHN0YXRlLiAqL1xyXG5cdFx0XHRcdGlmIChkb2N1bWVudC5oaWRkZW4pIHtcclxuXHRcdFx0XHRcdHRpY2tlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XHJcblx0XHRcdFx0XHRcdC8qIFRoZSB0aWNrIGZ1bmN0aW9uIG5lZWRzIGEgdHJ1dGh5IGZpcnN0IGFyZ3VtZW50IGluIG9yZGVyIHRvIHBhc3MgaXRzIGludGVybmFsIHRpbWVzdGFtcCBjaGVjay4gKi9cclxuXHRcdFx0XHRcdFx0cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sodHJ1ZSk7XHJcblx0XHRcdFx0XHRcdH0sIDE2KTtcclxuXHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0LyogVGhlIHJBRiBsb29wIGhhcyBiZWVuIHBhdXNlZCBieSB0aGUgYnJvd3Nlciwgc28gd2UgbWFudWFsbHkgcmVzdGFydCB0aGUgdGljay4gKi9cclxuXHRcdFx0XHRcdHRpY2soKTtcclxuXHRcdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdFx0dGlja2VyID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCByQUZTaGltO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fTtcclxuXHJcblx0XHRcdC8qIFBhZ2UgY291bGQgYmUgc2l0dGluZyBpbiB0aGUgYmFja2dyb3VuZCBhdCB0aGlzIHRpbWUgKGkuZS4gb3BlbmVkIGFzIG5ldyB0YWIpIHNvIG1ha2luZyBzdXJlIHdlIHVzZSBjb3JyZWN0IHRpY2tlciBmcm9tIHRoZSBzdGFydCAqL1xyXG5cdFx0XHR1cGRhdGVUaWNrZXIoKTtcclxuXHJcblx0XHRcdC8qIEFuZCB0aGVuIHJ1biBjaGVjayBhZ2FpbiBldmVyeSB0aW1lIHZpc2liaWxpdHkgY2hhbmdlcyAqL1xyXG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLCB1cGRhdGVUaWNrZXIpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qKioqKioqKioqKipcclxuXHRcdCBUaWNrXHJcblx0XHQgKioqKioqKioqKioqL1xyXG5cclxuXHRcdC8qIE5vdGU6IEFsbCBjYWxscyB0byBWZWxvY2l0eSBhcmUgcHVzaGVkIHRvIHRoZSBWZWxvY2l0eS5TdGF0ZS5jYWxscyBhcnJheSwgd2hpY2ggaXMgZnVsbHkgaXRlcmF0ZWQgdGhyb3VnaCB1cG9uIGVhY2ggdGljay4gKi9cclxuXHRcdGZ1bmN0aW9uIHRpY2sodGltZXN0YW1wKSB7XHJcblx0XHRcdC8qIEFuIGVtcHR5IHRpbWVzdGFtcCBhcmd1bWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIHRoZSBmaXJzdCB0aWNrIG9jY3VyZW5jZSBzaW5jZSB0aWNraW5nIHdhcyB0dXJuZWQgb24uXHJcblx0XHRcdCBXZSBsZXZlcmFnZSB0aGlzIG1ldGFkYXRhIHRvIGZ1bGx5IGlnbm9yZSB0aGUgZmlyc3QgdGljayBwYXNzIHNpbmNlIFJBRidzIGluaXRpYWwgcGFzcyBpcyBmaXJlZCB3aGVuZXZlclxyXG5cdFx0XHQgdGhlIGJyb3dzZXIncyBuZXh0IHRpY2sgc3luYyB0aW1lIG9jY3Vycywgd2hpY2ggcmVzdWx0cyBpbiB0aGUgZmlyc3QgZWxlbWVudHMgc3ViamVjdGVkIHRvIFZlbG9jaXR5XHJcblx0XHRcdCBjYWxscyBiZWluZyBhbmltYXRlZCBvdXQgb2Ygc3luYyB3aXRoIGFueSBlbGVtZW50cyBhbmltYXRlZCBpbW1lZGlhdGVseSB0aGVyZWFmdGVyLiBJbiBzaG9ydCwgd2UgaWdub3JlXHJcblx0XHRcdCB0aGUgZmlyc3QgUkFGIHRpY2sgcGFzcyBzbyB0aGF0IGVsZW1lbnRzIGJlaW5nIGltbWVkaWF0ZWx5IGNvbnNlY3V0aXZlbHkgYW5pbWF0ZWQgLS0gaW5zdGVhZCBvZiBzaW11bHRhbmVvdXNseSBhbmltYXRlZFxyXG5cdFx0XHQgYnkgdGhlIHNhbWUgVmVsb2NpdHkgY2FsbCAtLSBhcmUgcHJvcGVybHkgYmF0Y2hlZCBpbnRvIHRoZSBzYW1lIGluaXRpYWwgUkFGIHRpY2sgYW5kIGNvbnNlcXVlbnRseSByZW1haW4gaW4gc3luYyB0aGVyZWFmdGVyLiAqL1xyXG5cdFx0XHRpZiAodGltZXN0YW1wKSB7XHJcblx0XHRcdFx0LyogV2Ugbm9ybWFsbHkgdXNlIFJBRidzIGhpZ2ggcmVzb2x1dGlvbiB0aW1lc3RhbXAgYnV0IGFzIGl0IGNhbiBiZSBzaWduaWZpY2FudGx5IG9mZnNldCB3aGVuIHRoZSBicm93c2VyIGlzXHJcblx0XHRcdFx0IHVuZGVyIGhpZ2ggc3RyZXNzIHdlIGdpdmUgdGhlIG9wdGlvbiBmb3IgY2hvcHBpbmVzcyBvdmVyIGFsbG93aW5nIHRoZSBicm93c2VyIHRvIGRyb3AgaHVnZSBjaHVua3Mgb2YgZnJhbWVzLlxyXG5cdFx0XHRcdCBXZSB1c2UgcGVyZm9ybWFuY2Uubm93KCkgYW5kIHNoaW0gaXQgaWYgaXQgZG9lc24ndCBleGlzdCBmb3Igd2hlbiB0aGUgdGFiIGlzIGhpZGRlbi4gKi9cclxuXHRcdFx0XHR2YXIgdGltZUN1cnJlbnQgPSBWZWxvY2l0eS50aW1lc3RhbXAgJiYgdGltZXN0YW1wICE9PSB0cnVlID8gdGltZXN0YW1wIDogcGVyZm9ybWFuY2Uubm93KCk7XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBDYWxsIEl0ZXJhdGlvblxyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0dmFyIGNhbGxzTGVuZ3RoID0gVmVsb2NpdHkuU3RhdGUuY2FsbHMubGVuZ3RoO1xyXG5cclxuXHRcdFx0XHQvKiBUbyBzcGVlZCB1cCBpdGVyYXRpbmcgb3ZlciB0aGlzIGFycmF5LCBpdCBpcyBjb21wYWN0ZWQgKGZhbHNleSBpdGVtcyAtLSBjYWxscyB0aGF0IGhhdmUgY29tcGxldGVkIC0tIGFyZSByZW1vdmVkKVxyXG5cdFx0XHRcdCB3aGVuIGl0cyBsZW5ndGggaGFzIGJhbGxvb25lZCB0byBhIHBvaW50IHRoYXQgY2FuIGltcGFjdCB0aWNrIHBlcmZvcm1hbmNlLiBUaGlzIG9ubHkgYmVjb21lcyBuZWNlc3Nhcnkgd2hlbiBhbmltYXRpb25cclxuXHRcdFx0XHQgaGFzIGJlZW4gY29udGludW91cyB3aXRoIG1hbnkgZWxlbWVudHMgb3ZlciBhIGxvbmcgcGVyaW9kIG9mIHRpbWU7IHdoZW5ldmVyIGFsbCBhY3RpdmUgY2FsbHMgYXJlIGNvbXBsZXRlZCwgY29tcGxldGVDYWxsKCkgY2xlYXJzIFZlbG9jaXR5LlN0YXRlLmNhbGxzLiAqL1xyXG5cdFx0XHRcdGlmIChjYWxsc0xlbmd0aCA+IDEwMDAwKSB7XHJcblx0XHRcdFx0XHRWZWxvY2l0eS5TdGF0ZS5jYWxscyA9IGNvbXBhY3RTcGFyc2VBcnJheShWZWxvY2l0eS5TdGF0ZS5jYWxscyk7XHJcblx0XHRcdFx0XHRjYWxsc0xlbmd0aCA9IFZlbG9jaXR5LlN0YXRlLmNhbGxzLmxlbmd0aDtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qIEl0ZXJhdGUgdGhyb3VnaCBlYWNoIGFjdGl2ZSBjYWxsLiAqL1xyXG5cdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbHNMZW5ndGg7IGkrKykge1xyXG5cdFx0XHRcdFx0LyogV2hlbiBhIFZlbG9jaXR5IGNhbGwgaXMgY29tcGxldGVkLCBpdHMgVmVsb2NpdHkuU3RhdGUuY2FsbHMgZW50cnkgaXMgc2V0IHRvIGZhbHNlLiBDb250aW51ZSBvbiB0byB0aGUgbmV4dCBjYWxsLiAqL1xyXG5cdFx0XHRcdFx0aWYgKCFWZWxvY2l0eS5TdGF0ZS5jYWxsc1tpXSkge1xyXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHQgQ2FsbC1XaWRlIFZhcmlhYmxlc1xyXG5cdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHR2YXIgY2FsbENvbnRhaW5lciA9IFZlbG9jaXR5LlN0YXRlLmNhbGxzW2ldLFxyXG5cdFx0XHRcdFx0XHRcdGNhbGwgPSBjYWxsQ29udGFpbmVyWzBdLFxyXG5cdFx0XHRcdFx0XHRcdG9wdHMgPSBjYWxsQ29udGFpbmVyWzJdLFxyXG5cdFx0XHRcdFx0XHRcdHRpbWVTdGFydCA9IGNhbGxDb250YWluZXJbM10sXHJcblx0XHRcdFx0XHRcdFx0Zmlyc3RUaWNrID0gIXRpbWVTdGFydCxcclxuXHRcdFx0XHRcdFx0XHR0d2VlbkR1bW15VmFsdWUgPSBudWxsLFxyXG5cdFx0XHRcdFx0XHRcdHBhdXNlT2JqZWN0ID0gY2FsbENvbnRhaW5lcls1XSxcclxuXHRcdFx0XHRcdFx0XHRtaWxsaXNlY29uZHNFbGxhcHNlZCA9IGNhbGxDb250YWluZXJbNl07XHJcblxyXG5cclxuXHJcblx0XHRcdFx0XHQvKiBJZiB0aW1lU3RhcnQgaXMgdW5kZWZpbmVkLCB0aGVuIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhhdCB0aGlzIGNhbGwgaGFzIGJlZW4gcHJvY2Vzc2VkIGJ5IHRpY2soKS5cclxuXHRcdFx0XHRcdCBXZSBhc3NpZ24gdGltZVN0YXJ0IG5vdyBzbyB0aGF0IGl0cyB2YWx1ZSBpcyBhcyBjbG9zZSB0byB0aGUgcmVhbCBhbmltYXRpb24gc3RhcnQgdGltZSBhcyBwb3NzaWJsZS5cclxuXHRcdFx0XHRcdCAoQ29udmVyc2VseSwgaGFkIHRpbWVTdGFydCBiZWVuIGRlZmluZWQgd2hlbiB0aGlzIGNhbGwgd2FzIGFkZGVkIHRvIFZlbG9jaXR5LlN0YXRlLmNhbGxzLCB0aGUgZGVsYXlcclxuXHRcdFx0XHRcdCBiZXR3ZWVuIHRoYXQgdGltZSBhbmQgbm93IHdvdWxkIGNhdXNlIHRoZSBmaXJzdCBmZXcgZnJhbWVzIG9mIHRoZSB0d2VlbiB0byBiZSBza2lwcGVkIHNpbmNlXHJcblx0XHRcdFx0XHQgcGVyY2VudENvbXBsZXRlIGlzIGNhbGN1bGF0ZWQgcmVsYXRpdmUgdG8gdGltZVN0YXJ0LikgKi9cclxuXHRcdFx0XHRcdC8qIEZ1cnRoZXIsIHN1YnRyYWN0IDE2bXMgKHRoZSBhcHByb3hpbWF0ZSByZXNvbHV0aW9uIG9mIFJBRikgZnJvbSB0aGUgY3VycmVudCB0aW1lIHZhbHVlIHNvIHRoYXQgdGhlXHJcblx0XHRcdFx0XHQgZmlyc3QgdGljayBpdGVyYXRpb24gaXNuJ3Qgd2FzdGVkIGJ5IGFuaW1hdGluZyBhdCAwJSB0d2VlbiBjb21wbGV0aW9uLCB3aGljaCB3b3VsZCBwcm9kdWNlIHRoZVxyXG5cdFx0XHRcdFx0IHNhbWUgc3R5bGUgdmFsdWUgYXMgdGhlIGVsZW1lbnQncyBjdXJyZW50IHZhbHVlLiAqL1xyXG5cdFx0XHRcdFx0aWYgKCF0aW1lU3RhcnQpIHtcclxuXHRcdFx0XHRcdFx0dGltZVN0YXJ0ID0gVmVsb2NpdHkuU3RhdGUuY2FsbHNbaV1bM10gPSB0aW1lQ3VycmVudCAtIDE2O1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIElmIGEgcGF1c2Ugb2JqZWN0IGlzIHByZXNlbnQsIHNraXAgcHJvY2Vzc2luZyB1bmxlc3MgaXQgaGFzIGJlZW4gc2V0IHRvIHJlc3VtZSAqL1xyXG5cdFx0XHRcdFx0aWYgKHBhdXNlT2JqZWN0KSB7XHJcblx0XHRcdFx0XHRcdGlmIChwYXVzZU9iamVjdC5yZXN1bWUgPT09IHRydWUpIHtcclxuXHRcdFx0XHRcdFx0XHQvKiBVcGRhdGUgdGhlIHRpbWUgc3RhcnQgdG8gYWNjb21vZGF0ZSB0aGUgcGF1c2VkIGNvbXBsZXRpb24gYW1vdW50ICovXHJcblx0XHRcdFx0XHRcdFx0dGltZVN0YXJ0ID0gY2FsbENvbnRhaW5lclszXSA9IE1hdGgucm91bmQodGltZUN1cnJlbnQgLSBtaWxsaXNlY29uZHNFbGxhcHNlZCAtIDE2KTtcclxuXHJcblx0XHRcdFx0XHRcdFx0LyogUmVtb3ZlIHBhdXNlIG9iamVjdCBhZnRlciBwcm9jZXNzaW5nICovXHJcblx0XHRcdFx0XHRcdFx0Y2FsbENvbnRhaW5lcls1XSA9IG51bGw7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRtaWxsaXNlY29uZHNFbGxhcHNlZCA9IGNhbGxDb250YWluZXJbNl0gPSB0aW1lQ3VycmVudCAtIHRpbWVTdGFydDtcclxuXHJcblx0XHRcdFx0XHQvKiBUaGUgdHdlZW4ncyBjb21wbGV0aW9uIHBlcmNlbnRhZ2UgaXMgcmVsYXRpdmUgdG8gdGhlIHR3ZWVuJ3Mgc3RhcnQgdGltZSwgbm90IHRoZSB0d2VlbidzIHN0YXJ0IHZhbHVlXHJcblx0XHRcdFx0XHQgKHdoaWNoIHdvdWxkIHJlc3VsdCBpbiB1bnByZWRpY3RhYmxlIHR3ZWVuIGR1cmF0aW9ucyBzaW5jZSBKYXZhU2NyaXB0J3MgdGltZXJzIGFyZSBub3QgcGFydGljdWxhcmx5IGFjY3VyYXRlKS5cclxuXHRcdFx0XHRcdCBBY2NvcmRpbmdseSwgd2UgZW5zdXJlIHRoYXQgcGVyY2VudENvbXBsZXRlIGRvZXMgbm90IGV4Y2VlZCAxLiAqL1xyXG5cdFx0XHRcdFx0dmFyIHBlcmNlbnRDb21wbGV0ZSA9IE1hdGgubWluKChtaWxsaXNlY29uZHNFbGxhcHNlZCkgLyBvcHRzLmR1cmF0aW9uLCAxKTtcclxuXHJcblx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0IEVsZW1lbnQgSXRlcmF0aW9uXHJcblx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHQvKiBGb3IgZXZlcnkgY2FsbCwgaXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgdGhlIGVsZW1lbnRzIGluIGl0cyBzZXQuICovXHJcblx0XHRcdFx0XHRmb3IgKHZhciBqID0gMCwgY2FsbExlbmd0aCA9IGNhbGwubGVuZ3RoOyBqIDwgY2FsbExlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0XHRcdHZhciB0d2VlbnNDb250YWluZXIgPSBjYWxsW2pdLFxyXG5cdFx0XHRcdFx0XHRcdFx0ZWxlbWVudCA9IHR3ZWVuc0NvbnRhaW5lci5lbGVtZW50O1xyXG5cclxuXHRcdFx0XHRcdFx0LyogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgZWxlbWVudCBoYXMgYmVlbiBkZWxldGVkIG1pZHdheSB0aHJvdWdoIHRoZSBhbmltYXRpb24gYnkgY2hlY2tpbmcgZm9yIHRoZVxyXG5cdFx0XHRcdFx0XHQgY29udGludWVkIGV4aXN0ZW5jZSBvZiBpdHMgZGF0YSBjYWNoZS4gSWYgaXQncyBnb25lLCBvciB0aGUgZWxlbWVudCBpcyBjdXJyZW50bHkgcGF1c2VkLCBza2lwIGFuaW1hdGluZyB0aGlzIGVsZW1lbnQuICovXHJcblx0XHRcdFx0XHRcdGlmICghRGF0YShlbGVtZW50KSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHR2YXIgdHJhbnNmb3JtUHJvcGVydHlFeGlzdHMgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdCBEaXNwbGF5ICYgVmlzaWJpbGl0eSBUb2dnbGluZ1xyXG5cdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdC8qIElmIHRoZSBkaXNwbGF5IG9wdGlvbiBpcyBzZXQgdG8gbm9uLVwibm9uZVwiLCBzZXQgaXQgdXBmcm9udCBzbyB0aGF0IHRoZSBlbGVtZW50IGNhbiBiZWNvbWUgdmlzaWJsZSBiZWZvcmUgdHdlZW5pbmcgYmVnaW5zLlxyXG5cdFx0XHRcdFx0XHQgKE90aGVyd2lzZSwgZGlzcGxheSdzIFwibm9uZVwiIHZhbHVlIGlzIHNldCBpbiBjb21wbGV0ZUNhbGwoKSBvbmNlIHRoZSBhbmltYXRpb24gaGFzIGNvbXBsZXRlZC4pICovXHJcblx0XHRcdFx0XHRcdGlmIChvcHRzLmRpc3BsYXkgIT09IHVuZGVmaW5lZCAmJiBvcHRzLmRpc3BsYXkgIT09IG51bGwgJiYgb3B0cy5kaXNwbGF5ICE9PSBcIm5vbmVcIikge1xyXG5cdFx0XHRcdFx0XHRcdGlmIChvcHRzLmRpc3BsYXkgPT09IFwiZmxleFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgZmxleFZhbHVlcyA9IFtcIi13ZWJraXQtYm94XCIsIFwiLW1vei1ib3hcIiwgXCItbXMtZmxleGJveFwiLCBcIi13ZWJraXQtZmxleFwiXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQkLmVhY2goZmxleFZhbHVlcywgZnVuY3Rpb24oaSwgZmxleFZhbHVlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdENTUy5zZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwiZGlzcGxheVwiLCBmbGV4VmFsdWUpO1xyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRDU1Muc2V0UHJvcGVydHlWYWx1ZShlbGVtZW50LCBcImRpc3BsYXlcIiwgb3B0cy5kaXNwbGF5KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogU2FtZSBnb2VzIHdpdGggdGhlIHZpc2liaWxpdHkgb3B0aW9uLCBidXQgaXRzIFwibm9uZVwiIGVxdWl2YWxlbnQgaXMgXCJoaWRkZW5cIi4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKG9wdHMudmlzaWJpbGl0eSAhPT0gdW5kZWZpbmVkICYmIG9wdHMudmlzaWJpbGl0eSAhPT0gXCJoaWRkZW5cIikge1xyXG5cdFx0XHRcdFx0XHRcdENTUy5zZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwidmlzaWJpbGl0eVwiLCBvcHRzLnZpc2liaWxpdHkpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdCBQcm9wZXJ0eSBJdGVyYXRpb25cclxuXHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdC8qIEZvciBldmVyeSBlbGVtZW50LCBpdGVyYXRlIHRocm91Z2ggZWFjaCBwcm9wZXJ0eS4gKi9cclxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgcHJvcGVydHkgaW4gdHdlZW5zQ29udGFpbmVyKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogTm90ZTogSW4gYWRkaXRpb24gdG8gcHJvcGVydHkgdHdlZW4gZGF0YSwgdHdlZW5zQ29udGFpbmVyIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGl0cyBhc3NvY2lhdGVkIGVsZW1lbnQuICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKHR3ZWVuc0NvbnRhaW5lci5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkgJiYgcHJvcGVydHkgIT09IFwiZWxlbWVudFwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR2YXIgdHdlZW4gPSB0d2VlbnNDb250YWluZXJbcHJvcGVydHldLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRWYWx1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvKiBFYXNpbmcgY2FuIGVpdGhlciBiZSBhIHByZS1nZW5lcmVhdGVkIGZ1bmN0aW9uIG9yIGEgc3RyaW5nIHRoYXQgcmVmZXJlbmNlcyBhIHByZS1yZWdpc3RlcmVkIGVhc2luZ1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCBvbiB0aGUgVmVsb2NpdHkuRWFzaW5ncyBvYmplY3QuIEluIGVpdGhlciBjYXNlLCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGVhc2luZyAqZnVuY3Rpb24qLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGVhc2luZyA9IFR5cGUuaXNTdHJpbmcodHdlZW4uZWFzaW5nKSA/IFZlbG9jaXR5LkVhc2luZ3NbdHdlZW4uZWFzaW5nXSA6IHR3ZWVuLmVhc2luZztcclxuXHJcblx0XHRcdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdFx0XHQgQ3VycmVudCBWYWx1ZSBDYWxjdWxhdGlvblxyXG5cdFx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdFx0XHRpZiAoVHlwZS5pc1N0cmluZyh0d2Vlbi5wYXR0ZXJuKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgcGF0dGVyblJlcGxhY2UgPSBwZXJjZW50Q29tcGxldGUgPT09IDEgP1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24oJDAsIGluZGV4LCByb3VuZCkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgcmVzdWx0ID0gdHdlZW4uZW5kVmFsdWVbaW5kZXhdO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJvdW5kID8gTWF0aC5yb3VuZChyZXN1bHQpIDogcmVzdWx0O1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSA6XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigkMCwgaW5kZXgsIHJvdW5kKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHZhciBzdGFydFZhbHVlID0gdHdlZW4uc3RhcnRWYWx1ZVtpbmRleF0sXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0d2VlbkRlbHRhID0gdHdlZW4uZW5kVmFsdWVbaW5kZXhdIC0gc3RhcnRWYWx1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc3VsdCA9IHN0YXJ0VmFsdWUgKyAodHdlZW5EZWx0YSAqIGVhc2luZyhwZXJjZW50Q29tcGxldGUsIG9wdHMsIHR3ZWVuRGVsdGEpKTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiByb3VuZCA/IE1hdGgucm91bmQocmVzdWx0KSA6IHJlc3VsdDtcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VmFsdWUgPSB0d2Vlbi5wYXR0ZXJuLnJlcGxhY2UoL3soXFxkKykoISk/fS9nLCBwYXR0ZXJuUmVwbGFjZSk7XHJcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHBlcmNlbnRDb21wbGV0ZSA9PT0gMSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IHRpY2sgcGFzcyAoaWYgd2UndmUgcmVhY2hlZCAxMDAlIGNvbXBsZXRpb24gZm9yIHRoaXMgdHdlZW4pLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgZW5zdXJlIHRoYXQgY3VycmVudFZhbHVlIGlzIGV4cGxpY2l0bHkgc2V0IHRvIGl0cyB0YXJnZXQgZW5kVmFsdWUgc28gdGhhdCBpdCdzIG5vdCBzdWJqZWN0ZWQgdG8gYW55IHJvdW5kaW5nLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50VmFsdWUgPSB0d2Vlbi5lbmRWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qIE90aGVyd2lzZSwgY2FsY3VsYXRlIGN1cnJlbnRWYWx1ZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkZWx0YSBmcm9tIHN0YXJ0VmFsdWUuICovXHJcblx0XHRcdFx0XHRcdFx0XHRcdHZhciB0d2VlbkRlbHRhID0gdHdlZW4uZW5kVmFsdWUgLSB0d2Vlbi5zdGFydFZhbHVlO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudFZhbHVlID0gdHdlZW4uc3RhcnRWYWx1ZSArICh0d2VlbkRlbHRhICogZWFzaW5nKHBlcmNlbnRDb21wbGV0ZSwgb3B0cywgdHdlZW5EZWx0YSkpO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKiBJZiBubyB2YWx1ZSBjaGFuZ2UgaXMgb2NjdXJyaW5nLCBkb24ndCBwcm9jZWVkIHdpdGggRE9NIHVwZGF0aW5nLiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCFmaXJzdFRpY2sgJiYgKGN1cnJlbnRWYWx1ZSA9PT0gdHdlZW4uY3VycmVudFZhbHVlKSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0XHR0d2Vlbi5jdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0LyogSWYgd2UncmUgdHdlZW5pbmcgYSBmYWtlICd0d2VlbicgcHJvcGVydHkgaW4gb3JkZXIgdG8gbG9nIHRyYW5zaXRpb24gdmFsdWVzLCB1cGRhdGUgdGhlIG9uZS1wZXItY2FsbCB2YXJpYWJsZSBzbyB0aGF0XHJcblx0XHRcdFx0XHRcdFx0XHQgaXQgY2FuIGJlIHBhc3NlZCBpbnRvIHRoZSBwcm9ncmVzcyBjYWxsYmFjay4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdGlmIChwcm9wZXJ0eSA9PT0gXCJ0d2VlblwiKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdHR3ZWVuRHVtbXlWYWx1ZSA9IGN1cnJlbnRWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHRcdFx0IEhvb2tzOiBQYXJ0IElcclxuXHRcdFx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGhvb2tSb290O1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogRm9yIGhvb2tlZCBwcm9wZXJ0aWVzLCB0aGUgbmV3bHktdXBkYXRlZCByb290UHJvcGVydHlWYWx1ZUNhY2hlIGlzIGNhY2hlZCBvbnRvIHRoZSBlbGVtZW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWRcclxuXHRcdFx0XHRcdFx0XHRcdFx0IGZvciBzdWJzZXF1ZW50IGhvb2tzIGluIHRoaXMgY2FsbCB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgcm9vdCBwcm9wZXJ0eS4gSWYgd2UgZGlkbid0IGNhY2hlIHRoZSB1cGRhdGVkXHJcblx0XHRcdFx0XHRcdFx0XHRcdCByb290UHJvcGVydHlWYWx1ZSwgZWFjaCBzdWJzZXF1ZW50IHVwZGF0ZSB0byB0aGUgcm9vdCBwcm9wZXJ0eSBpbiB0aGlzIHRpY2sgcGFzcyB3b3VsZCByZXNldCB0aGUgcHJldmlvdXMgaG9vaydzXHJcblx0XHRcdFx0XHRcdFx0XHRcdCB1cGRhdGVzIHRvIHJvb3RQcm9wZXJ0eVZhbHVlIHByaW9yIHRvIGluamVjdGlvbi4gQSBuaWNlIHBlcmZvcm1hbmNlIGJ5cHJvZHVjdCBvZiByb290UHJvcGVydHlWYWx1ZSBjYWNoaW5nIGlzIHRoYXRcclxuXHRcdFx0XHRcdFx0XHRcdFx0IHN1YnNlcXVlbnRseSBjaGFpbmVkIGFuaW1hdGlvbnMgdXNpbmcgdGhlIHNhbWUgaG9va1Jvb3QgYnV0IGEgZGlmZmVyZW50IGhvb2sgY2FuIHVzZSB0aGlzIGNhY2hlZCByb290UHJvcGVydHlWYWx1ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKENTUy5Ib29rcy5yZWdpc3RlcmVkW3Byb3BlcnR5XSkge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGhvb2tSb290ID0gQ1NTLkhvb2tzLmdldFJvb3QocHJvcGVydHkpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgcm9vdFByb3BlcnR5VmFsdWVDYWNoZSA9IERhdGEoZWxlbWVudCkucm9vdFByb3BlcnR5VmFsdWVDYWNoZVtob29rUm9vdF07XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmIChyb290UHJvcGVydHlWYWx1ZUNhY2hlKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0d2Vlbi5yb290UHJvcGVydHlWYWx1ZSA9IHJvb3RQcm9wZXJ0eVZhbHVlQ2FjaGU7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHQvKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHRcdFx0IERPTSBVcGRhdGVcclxuXHRcdFx0XHRcdFx0XHRcdFx0ICoqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0Lyogc2V0UHJvcGVydHlWYWx1ZSgpIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHByb3BlcnR5IG5hbWUgYW5kIHByb3BlcnR5IHZhbHVlIHBvc3QgYW55IG5vcm1hbGl6YXRpb24gdGhhdCBtYXkgaGF2ZSBiZWVuIHBlcmZvcm1lZC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogTm90ZTogVG8gc29sdmUgYW4gSUU8PTggcG9zaXRpb25pbmcgYnVnLCB0aGUgdW5pdCB0eXBlIGlzIGRyb3BwZWQgd2hlbiBzZXR0aW5nIGEgcHJvcGVydHkgdmFsdWUgb2YgMC4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGFkanVzdGVkU2V0RGF0YSA9IENTUy5zZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIC8qIFNFVCAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvcGVydHksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0d2Vlbi5jdXJyZW50VmFsdWUgKyAoSUUgPCA5ICYmIHBhcnNlRmxvYXQoY3VycmVudFZhbHVlKSA9PT0gMCA/IFwiXCIgOiB0d2Vlbi51bml0VHlwZSksXHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0d2Vlbi5yb290UHJvcGVydHlWYWx1ZSxcclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR3ZWVuLnNjcm9sbERhdGEpO1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHRcdFx0XHRcdFx0IEhvb2tzOiBQYXJ0IElJXHJcblx0XHRcdFx0XHRcdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogTm93IHRoYXQgd2UgaGF2ZSB0aGUgaG9vaydzIHVwZGF0ZWQgcm9vdFByb3BlcnR5VmFsdWUgKHRoZSBwb3N0LXByb2Nlc3NlZCB2YWx1ZSBwcm92aWRlZCBieSBhZGp1c3RlZFNldERhdGEpLCBjYWNoZSBpdCBvbnRvIHRoZSBlbGVtZW50LiAqL1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoQ1NTLkhvb2tzLnJlZ2lzdGVyZWRbcHJvcGVydHldKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0LyogU2luY2UgYWRqdXN0ZWRTZXREYXRhIGNvbnRhaW5zIG5vcm1hbGl6ZWQgZGF0YSByZWFkeSBmb3IgRE9NIHVwZGF0aW5nLCB0aGUgcm9vdFByb3BlcnR5VmFsdWUgbmVlZHMgdG8gYmUgcmUtZXh0cmFjdGVkIGZyb20gaXRzIG5vcm1hbGl6ZWQgZm9ybS4gPz8gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoQ1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbaG9va1Jvb3RdKSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHREYXRhKGVsZW1lbnQpLnJvb3RQcm9wZXJ0eVZhbHVlQ2FjaGVbaG9va1Jvb3RdID0gQ1NTLk5vcm1hbGl6YXRpb25zLnJlZ2lzdGVyZWRbaG9va1Jvb3RdKFwiZXh0cmFjdFwiLCBudWxsLCBhZGp1c3RlZFNldERhdGFbMV0pO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHREYXRhKGVsZW1lbnQpLnJvb3RQcm9wZXJ0eVZhbHVlQ2FjaGVbaG9va1Jvb3RdID0gYWRqdXN0ZWRTZXREYXRhWzFdO1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyoqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQgVHJhbnNmb3Jtc1xyXG5cdFx0XHRcdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0LyogRmxhZyB3aGV0aGVyIGEgdHJhbnNmb3JtIHByb3BlcnR5IGlzIGJlaW5nIGFuaW1hdGVkIHNvIHRoYXQgZmx1c2hUcmFuc2Zvcm1DYWNoZSgpIGNhbiBiZSB0cmlnZ2VyZWQgb25jZSB0aGlzIHRpY2sgcGFzcyBpcyBjb21wbGV0ZS4gKi9cclxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGFkanVzdGVkU2V0RGF0YVswXSA9PT0gXCJ0cmFuc2Zvcm1cIikge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRyYW5zZm9ybVByb3BlcnR5RXhpc3RzID0gdHJ1ZTtcclxuXHRcdFx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdC8qKioqKioqKioqKioqKioqXHJcblx0XHRcdFx0XHRcdCBtb2JpbGVIQVxyXG5cdFx0XHRcdFx0XHQgKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0XHRcdC8qIElmIG1vYmlsZUhBIGlzIGVuYWJsZWQsIHNldCB0aGUgdHJhbnNsYXRlM2QgdHJhbnNmb3JtIHRvIG51bGwgdG8gZm9yY2UgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLlxyXG5cdFx0XHRcdFx0XHQgSXQncyBzYWZlIHRvIG92ZXJyaWRlIHRoaXMgcHJvcGVydHkgc2luY2UgVmVsb2NpdHkgZG9lc24ndCBhY3R1YWxseSBzdXBwb3J0IGl0cyBhbmltYXRpb24gKGhvb2tzIGFyZSB1c2VkIGluIGl0cyBwbGFjZSkuICovXHJcblx0XHRcdFx0XHRcdGlmIChvcHRzLm1vYmlsZUhBKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogRG9uJ3Qgc2V0IHRoZSBudWxsIHRyYW5zZm9ybSBoYWNrIGlmIHdlJ3ZlIGFscmVhZHkgZG9uZSBzby4gKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoRGF0YShlbGVtZW50KS50cmFuc2Zvcm1DYWNoZS50cmFuc2xhdGUzZCA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdFx0XHRcdFx0XHQvKiBBbGwgZW50cmllcyBvbiB0aGUgdHJhbnNmb3JtQ2FjaGUgb2JqZWN0IGFyZSBsYXRlciBjb25jYXRlbmF0ZWQgaW50byBhIHNpbmdsZSB0cmFuc2Zvcm0gc3RyaW5nIHZpYSBmbHVzaFRyYW5zZm9ybUNhY2hlKCkuICovXHJcblx0XHRcdFx0XHRcdFx0XHREYXRhKGVsZW1lbnQpLnRyYW5zZm9ybUNhY2hlLnRyYW5zbGF0ZTNkID0gXCIoMHB4LCAwcHgsIDBweClcIjtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHR0cmFuc2Zvcm1Qcm9wZXJ0eUV4aXN0cyA9IHRydWU7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRpZiAodHJhbnNmb3JtUHJvcGVydHlFeGlzdHMpIHtcclxuXHRcdFx0XHRcdFx0XHRDU1MuZmx1c2hUcmFuc2Zvcm1DYWNoZShlbGVtZW50KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIFRoZSBub24tXCJub25lXCIgZGlzcGxheSB2YWx1ZSBpcyBvbmx5IGFwcGxpZWQgdG8gYW4gZWxlbWVudCBvbmNlIC0tIHdoZW4gaXRzIGFzc29jaWF0ZWQgY2FsbCBpcyBmaXJzdCB0aWNrZWQgdGhyb3VnaC5cclxuXHRcdFx0XHRcdCBBY2NvcmRpbmdseSwgaXQncyBzZXQgdG8gZmFsc2Ugc28gdGhhdCBpdCBpc24ndCByZS1wcm9jZXNzZWQgYnkgdGhpcyBjYWxsIGluIHRoZSBuZXh0IHRpY2suICovXHJcblx0XHRcdFx0XHRpZiAob3B0cy5kaXNwbGF5ICE9PSB1bmRlZmluZWQgJiYgb3B0cy5kaXNwbGF5ICE9PSBcIm5vbmVcIikge1xyXG5cdFx0XHRcdFx0XHRWZWxvY2l0eS5TdGF0ZS5jYWxsc1tpXVsyXS5kaXNwbGF5ID0gZmFsc2U7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRpZiAob3B0cy52aXNpYmlsaXR5ICE9PSB1bmRlZmluZWQgJiYgb3B0cy52aXNpYmlsaXR5ICE9PSBcImhpZGRlblwiKSB7XHJcblx0XHRcdFx0XHRcdFZlbG9jaXR5LlN0YXRlLmNhbGxzW2ldWzJdLnZpc2liaWxpdHkgPSBmYWxzZTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBQYXNzIHRoZSBlbGVtZW50cyBhbmQgdGhlIHRpbWluZyBkYXRhIChwZXJjZW50Q29tcGxldGUsIG1zUmVtYWluaW5nLCB0aW1lU3RhcnQsIHR3ZWVuRHVtbXlWYWx1ZSkgaW50byB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2suICovXHJcblx0XHRcdFx0XHRpZiAob3B0cy5wcm9ncmVzcykge1xyXG5cdFx0XHRcdFx0XHRvcHRzLnByb2dyZXNzLmNhbGwoY2FsbENvbnRhaW5lclsxXSxcclxuXHRcdFx0XHRcdFx0XHRcdGNhbGxDb250YWluZXJbMV0sXHJcblx0XHRcdFx0XHRcdFx0XHRwZXJjZW50Q29tcGxldGUsXHJcblx0XHRcdFx0XHRcdFx0XHRNYXRoLm1heCgwLCAodGltZVN0YXJ0ICsgb3B0cy5kdXJhdGlvbikgLSB0aW1lQ3VycmVudCksXHJcblx0XHRcdFx0XHRcdFx0XHR0aW1lU3RhcnQsXHJcblx0XHRcdFx0XHRcdFx0XHR0d2VlbkR1bW15VmFsdWUpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIElmIHRoaXMgY2FsbCBoYXMgZmluaXNoZWQgdHdlZW5pbmcsIHBhc3MgaXRzIGluZGV4IHRvIGNvbXBsZXRlQ2FsbCgpIHRvIGhhbmRsZSBjYWxsIGNsZWFudXAuICovXHJcblx0XHRcdFx0XHRpZiAocGVyY2VudENvbXBsZXRlID09PSAxKSB7XHJcblx0XHRcdFx0XHRcdGNvbXBsZXRlQ2FsbChpKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIE5vdGU6IGNvbXBsZXRlQ2FsbCgpIHNldHMgdGhlIGlzVGlja2luZyBmbGFnIHRvIGZhbHNlIHdoZW4gdGhlIGxhc3QgY2FsbCBvbiBWZWxvY2l0eS5TdGF0ZS5jYWxscyBoYXMgY29tcGxldGVkLiAqL1xyXG5cdFx0XHRpZiAoVmVsb2NpdHkuU3RhdGUuaXNUaWNraW5nKSB7XHJcblx0XHRcdFx0dGlja2VyKHRpY2spO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdCBDYWxsIENvbXBsZXRpb25cclxuXHRcdCAqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdC8qIE5vdGU6IFVubGlrZSB0aWNrKCksIHdoaWNoIHByb2Nlc3NlcyBhbGwgYWN0aXZlIGNhbGxzIGF0IG9uY2UsIGNhbGwgY29tcGxldGlvbiBpcyBoYW5kbGVkIG9uIGEgcGVyLWNhbGwgYmFzaXMuICovXHJcblx0XHRmdW5jdGlvbiBjb21wbGV0ZUNhbGwoY2FsbEluZGV4LCBpc1N0b3BwZWQpIHtcclxuXHRcdFx0LyogRW5zdXJlIHRoZSBjYWxsIGV4aXN0cy4gKi9cclxuXHRcdFx0aWYgKCFWZWxvY2l0eS5TdGF0ZS5jYWxsc1tjYWxsSW5kZXhdKSB7XHJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBQdWxsIHRoZSBtZXRhZGF0YSBmcm9tIHRoZSBjYWxsLiAqL1xyXG5cdFx0XHR2YXIgY2FsbCA9IFZlbG9jaXR5LlN0YXRlLmNhbGxzW2NhbGxJbmRleF1bMF0sXHJcblx0XHRcdFx0XHRlbGVtZW50cyA9IFZlbG9jaXR5LlN0YXRlLmNhbGxzW2NhbGxJbmRleF1bMV0sXHJcblx0XHRcdFx0XHRvcHRzID0gVmVsb2NpdHkuU3RhdGUuY2FsbHNbY2FsbEluZGV4XVsyXSxcclxuXHRcdFx0XHRcdHJlc29sdmVyID0gVmVsb2NpdHkuU3RhdGUuY2FsbHNbY2FsbEluZGV4XVs0XTtcclxuXHJcblx0XHRcdHZhciByZW1haW5pbmdDYWxsc0V4aXN0ID0gZmFsc2U7XHJcblxyXG5cdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHQgRWxlbWVudCBGaW5hbGl6YXRpb25cclxuXHRcdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRmb3IgKHZhciBpID0gMCwgY2FsbExlbmd0aCA9IGNhbGwubGVuZ3RoOyBpIDwgY2FsbExlbmd0aDsgaSsrKSB7XHJcblx0XHRcdFx0dmFyIGVsZW1lbnQgPSBjYWxsW2ldLmVsZW1lbnQ7XHJcblxyXG5cdFx0XHRcdC8qIElmIHRoZSB1c2VyIHNldCBkaXNwbGF5IHRvIFwibm9uZVwiIChpbnRlbmRpbmcgdG8gaGlkZSB0aGUgZWxlbWVudCksIHNldCBpdCBub3cgdGhhdCB0aGUgYW5pbWF0aW9uIGhhcyBjb21wbGV0ZWQuICovXHJcblx0XHRcdFx0LyogTm90ZTogZGlzcGxheTpub25lIGlzbid0IHNldCB3aGVuIGNhbGxzIGFyZSBtYW51YWxseSBzdG9wcGVkICh2aWEgVmVsb2NpdHkoXCJzdG9wXCIpLiAqL1xyXG5cdFx0XHRcdC8qIE5vdGU6IERpc3BsYXkgZ2V0cyBpZ25vcmVkIHdpdGggXCJyZXZlcnNlXCIgY2FsbHMgYW5kIGluZmluaXRlIGxvb3BzLCBzaW5jZSB0aGlzIGJlaGF2aW9yIHdvdWxkIGJlIHVuZGVzaXJhYmxlLiAqL1xyXG5cdFx0XHRcdGlmICghaXNTdG9wcGVkICYmICFvcHRzLmxvb3ApIHtcclxuXHRcdFx0XHRcdGlmIChvcHRzLmRpc3BsYXkgPT09IFwibm9uZVwiKSB7XHJcblx0XHRcdFx0XHRcdENTUy5zZXRQcm9wZXJ0eVZhbHVlKGVsZW1lbnQsIFwiZGlzcGxheVwiLCBvcHRzLmRpc3BsYXkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdGlmIChvcHRzLnZpc2liaWxpdHkgPT09IFwiaGlkZGVuXCIpIHtcclxuXHRcdFx0XHRcdFx0Q1NTLnNldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgXCJ2aXNpYmlsaXR5XCIsIG9wdHMudmlzaWJpbGl0eSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKiBJZiB0aGUgZWxlbWVudCdzIHF1ZXVlIGlzIGVtcHR5IChpZiBvbmx5IHRoZSBcImlucHJvZ3Jlc3NcIiBpdGVtIGlzIGxlZnQgYXQgcG9zaXRpb24gMCkgb3IgaWYgaXRzIHF1ZXVlIGlzIGFib3V0IHRvIHJ1blxyXG5cdFx0XHRcdCBhIG5vbi1WZWxvY2l0eS1pbml0aWF0ZWQgZW50cnksIHR1cm4gb2ZmIHRoZSBpc0FuaW1hdGluZyBmbGFnLiBBIG5vbi1WZWxvY2l0eS1pbml0aWF0aWVkIHF1ZXVlIGVudHJ5J3MgbG9naWMgbWlnaHQgYWx0ZXJcclxuXHRcdFx0XHQgYW4gZWxlbWVudCdzIENTUyB2YWx1ZXMgYW5kIHRoZXJlYnkgY2F1c2UgVmVsb2NpdHkncyBjYWNoZWQgdmFsdWUgZGF0YSB0byBnbyBzdGFsZS4gVG8gZGV0ZWN0IGlmIGEgcXVldWUgZW50cnkgd2FzIGluaXRpYXRlZCBieSBWZWxvY2l0eSxcclxuXHRcdFx0XHQgd2UgY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2Ygb3VyIHNwZWNpYWwgVmVsb2NpdHkucXVldWVFbnRyeUZsYWcgZGVjbGFyYXRpb24sIHdoaWNoIG1pbmlmaWVycyB3b24ndCByZW5hbWUgc2luY2UgdGhlIGZsYWdcclxuXHRcdFx0XHQgaXMgYXNzaWduZWQgdG8galF1ZXJ5J3MgZ2xvYmFsICQgb2JqZWN0IGFuZCB0aHVzIGV4aXN0cyBvdXQgb2YgVmVsb2NpdHkncyBvd24gc2NvcGUuICovXHJcblx0XHRcdFx0dmFyIGRhdGEgPSBEYXRhKGVsZW1lbnQpO1xyXG5cclxuXHRcdFx0XHRpZiAob3B0cy5sb29wICE9PSB0cnVlICYmICgkLnF1ZXVlKGVsZW1lbnQpWzFdID09PSB1bmRlZmluZWQgfHwgIS9cXC52ZWxvY2l0eVF1ZXVlRW50cnlGbGFnL2kudGVzdCgkLnF1ZXVlKGVsZW1lbnQpWzFdKSkpIHtcclxuXHRcdFx0XHRcdC8qIFRoZSBlbGVtZW50IG1heSBoYXZlIGJlZW4gZGVsZXRlZC4gRW5zdXJlIHRoYXQgaXRzIGRhdGEgY2FjaGUgc3RpbGwgZXhpc3RzIGJlZm9yZSBhY3Rpbmcgb24gaXQuICovXHJcblx0XHRcdFx0XHRpZiAoZGF0YSkge1xyXG5cdFx0XHRcdFx0XHRkYXRhLmlzQW5pbWF0aW5nID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdC8qIENsZWFyIHRoZSBlbGVtZW50J3Mgcm9vdFByb3BlcnR5VmFsdWVDYWNoZSwgd2hpY2ggd2lsbCBiZWNvbWUgc3RhbGUuICovXHJcblx0XHRcdFx0XHRcdGRhdGEucm9vdFByb3BlcnR5VmFsdWVDYWNoZSA9IHt9O1xyXG5cclxuXHRcdFx0XHRcdFx0dmFyIHRyYW5zZm9ybUhBUHJvcGVydHlFeGlzdHMgPSBmYWxzZTtcclxuXHRcdFx0XHRcdFx0LyogSWYgYW55IDNEIHRyYW5zZm9ybSBzdWJwcm9wZXJ0eSBpcyBhdCBpdHMgZGVmYXVsdCB2YWx1ZSAocmVnYXJkbGVzcyBvZiB1bml0IHR5cGUpLCByZW1vdmUgaXQuICovXHJcblx0XHRcdFx0XHRcdCQuZWFjaChDU1MuTGlzdHMudHJhbnNmb3JtczNELCBmdW5jdGlvbihpLCB0cmFuc2Zvcm1OYW1lKSB7XHJcblx0XHRcdFx0XHRcdFx0dmFyIGRlZmF1bHRWYWx1ZSA9IC9ec2NhbGUvLnRlc3QodHJhbnNmb3JtTmFtZSkgPyAxIDogMCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0Y3VycmVudFZhbHVlID0gZGF0YS50cmFuc2Zvcm1DYWNoZVt0cmFuc2Zvcm1OYW1lXTtcclxuXHJcblx0XHRcdFx0XHRcdFx0aWYgKGRhdGEudHJhbnNmb3JtQ2FjaGVbdHJhbnNmb3JtTmFtZV0gIT09IHVuZGVmaW5lZCAmJiBuZXcgUmVnRXhwKFwiXlxcXFwoXCIgKyBkZWZhdWx0VmFsdWUgKyBcIlteLl1cIikudGVzdChjdXJyZW50VmFsdWUpKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0cmFuc2Zvcm1IQVByb3BlcnR5RXhpc3RzID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHRcdFx0XHRkZWxldGUgZGF0YS50cmFuc2Zvcm1DYWNoZVt0cmFuc2Zvcm1OYW1lXTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFx0LyogTW9iaWxlIGRldmljZXMgaGF2ZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24gcmVtb3ZlZCBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb24gaW4gb3JkZXIgdG8gYXZvaWQgaG9nZ2luZyB0aGUgR1BVJ3MgbWVtb3J5LiAqL1xyXG5cdFx0XHRcdFx0XHRpZiAob3B0cy5tb2JpbGVIQSkge1xyXG5cdFx0XHRcdFx0XHRcdHRyYW5zZm9ybUhBUHJvcGVydHlFeGlzdHMgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBkYXRhLnRyYW5zZm9ybUNhY2hlLnRyYW5zbGF0ZTNkO1xyXG5cdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHQvKiBGbHVzaCB0aGUgc3VicHJvcGVydHkgcmVtb3ZhbHMgdG8gdGhlIERPTS4gKi9cclxuXHRcdFx0XHRcdFx0aWYgKHRyYW5zZm9ybUhBUHJvcGVydHlFeGlzdHMpIHtcclxuXHRcdFx0XHRcdFx0XHRDU1MuZmx1c2hUcmFuc2Zvcm1DYWNoZShlbGVtZW50KTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0LyogUmVtb3ZlIHRoZSBcInZlbG9jaXR5LWFuaW1hdGluZ1wiIGluZGljYXRvciBjbGFzcy4gKi9cclxuXHRcdFx0XHRcdFx0Q1NTLlZhbHVlcy5yZW1vdmVDbGFzcyhlbGVtZW50LCBcInZlbG9jaXR5LWFuaW1hdGluZ1wiKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgT3B0aW9uOiBDb21wbGV0ZVxyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIENvbXBsZXRlIGlzIGZpcmVkIG9uY2UgcGVyIGNhbGwgKG5vdCBvbmNlIHBlciBlbGVtZW50KSBhbmQgaXMgcGFzc2VkIHRoZSBmdWxsIHJhdyBET00gZWxlbWVudCBzZXQgYXMgYm90aCBpdHMgY29udGV4dCBhbmQgaXRzIGZpcnN0IGFyZ3VtZW50LiAqL1xyXG5cdFx0XHRcdC8qIE5vdGU6IENhbGxiYWNrcyBhcmVuJ3QgZmlyZWQgd2hlbiBjYWxscyBhcmUgbWFudWFsbHkgc3RvcHBlZCAodmlhIFZlbG9jaXR5KFwic3RvcFwiKS4gKi9cclxuXHRcdFx0XHRpZiAoIWlzU3RvcHBlZCAmJiBvcHRzLmNvbXBsZXRlICYmICFvcHRzLmxvb3AgJiYgKGkgPT09IGNhbGxMZW5ndGggLSAxKSkge1xyXG5cdFx0XHRcdFx0LyogV2UgdGhyb3cgY2FsbGJhY2tzIGluIGEgc2V0VGltZW91dCBzbyB0aGF0IHRocm93biBlcnJvcnMgZG9uJ3QgaGFsdCB0aGUgZXhlY3V0aW9uIG9mIFZlbG9jaXR5IGl0c2VsZi4gKi9cclxuXHRcdFx0XHRcdHRyeSB7XHJcblx0XHRcdFx0XHRcdG9wdHMuY29tcGxldGUuY2FsbChlbGVtZW50cywgZWxlbWVudHMpO1xyXG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcclxuXHRcdFx0XHRcdFx0fSwgMSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHRcdCBQcm9taXNlIFJlc29sdmluZ1xyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0XHQvKiBOb3RlOiBJbmZpbml0ZSBsb29wcyBkb24ndCByZXR1cm4gcHJvbWlzZXMuICovXHJcblx0XHRcdFx0aWYgKHJlc29sdmVyICYmIG9wdHMubG9vcCAhPT0gdHJ1ZSkge1xyXG5cdFx0XHRcdFx0cmVzb2x2ZXIoZWxlbWVudHMpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgT3B0aW9uOiBMb29wIChJbmZpbml0ZSlcclxuXHRcdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcblx0XHRcdFx0aWYgKGRhdGEgJiYgb3B0cy5sb29wID09PSB0cnVlICYmICFpc1N0b3BwZWQpIHtcclxuXHRcdFx0XHRcdC8qIElmIGEgcm90YXRlWC9ZL1ogcHJvcGVydHkgaXMgYmVpbmcgYW5pbWF0ZWQgYnkgMzYwIGRlZyB3aXRoIGxvb3A6dHJ1ZSwgc3dhcCB0d2VlbiBzdGFydC9lbmQgdmFsdWVzIHRvIGVuYWJsZVxyXG5cdFx0XHRcdFx0IGNvbnRpbnVvdXMgaXRlcmF0aXZlIHJvdGF0aW9uIGxvb3BpbmcuIChPdGhlcmlzZSwgdGhlIGVsZW1lbnQgd291bGQganVzdCByb3RhdGUgYmFjayBhbmQgZm9ydGguKSAqL1xyXG5cdFx0XHRcdFx0JC5lYWNoKGRhdGEudHdlZW5zQ29udGFpbmVyLCBmdW5jdGlvbihwcm9wZXJ0eU5hbWUsIHR3ZWVuQ29udGFpbmVyKSB7XHJcblx0XHRcdFx0XHRcdGlmICgvXnJvdGF0ZS8udGVzdChwcm9wZXJ0eU5hbWUpICYmICgocGFyc2VGbG9hdCh0d2VlbkNvbnRhaW5lci5zdGFydFZhbHVlKSAtIHBhcnNlRmxvYXQodHdlZW5Db250YWluZXIuZW5kVmFsdWUpKSAlIDM2MCA9PT0gMCkpIHtcclxuXHRcdFx0XHRcdFx0XHR2YXIgb2xkU3RhcnRWYWx1ZSA9IHR3ZWVuQ29udGFpbmVyLnN0YXJ0VmFsdWU7XHJcblxyXG5cdFx0XHRcdFx0XHRcdHR3ZWVuQ29udGFpbmVyLnN0YXJ0VmFsdWUgPSB0d2VlbkNvbnRhaW5lci5lbmRWYWx1ZTtcclxuXHRcdFx0XHRcdFx0XHR0d2VlbkNvbnRhaW5lci5lbmRWYWx1ZSA9IG9sZFN0YXJ0VmFsdWU7XHJcblx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdGlmICgvXmJhY2tncm91bmRQb3NpdGlvbi8udGVzdChwcm9wZXJ0eU5hbWUpICYmIHBhcnNlRmxvYXQodHdlZW5Db250YWluZXIuZW5kVmFsdWUpID09PSAxMDAgJiYgdHdlZW5Db250YWluZXIudW5pdFR5cGUgPT09IFwiJVwiKSB7XHJcblx0XHRcdFx0XHRcdFx0dHdlZW5Db250YWluZXIuZW5kVmFsdWUgPSAwO1xyXG5cdFx0XHRcdFx0XHRcdHR3ZWVuQ29udGFpbmVyLnN0YXJ0VmFsdWUgPSAxMDA7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdFZlbG9jaXR5KGVsZW1lbnQsIFwicmV2ZXJzZVwiLCB7bG9vcDogdHJ1ZSwgZGVsYXk6IG9wdHMuZGVsYXl9KTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qKioqKioqKioqKioqKipcclxuXHRcdFx0XHQgRGVxdWV1ZWluZ1xyXG5cdFx0XHRcdCAqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0XHRcdC8qIEZpcmUgdGhlIG5leHQgY2FsbCBpbiB0aGUgcXVldWUgc28gbG9uZyBhcyB0aGlzIGNhbGwncyBxdWV1ZSB3YXNuJ3Qgc2V0IHRvIGZhbHNlICh0byB0cmlnZ2VyIGEgcGFyYWxsZWwgYW5pbWF0aW9uKSxcclxuXHRcdFx0XHQgd2hpY2ggd291bGQgaGF2ZSBhbHJlYWR5IGNhdXNlZCB0aGUgbmV4dCBjYWxsIHRvIGZpcmUuIE5vdGU6IEV2ZW4gaWYgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uIHF1ZXVlIGhhcyBiZWVuIHJlYWNoZWQsXHJcblx0XHRcdFx0ICQuZGVxdWV1ZSgpIG11c3Qgc3RpbGwgYmUgY2FsbGVkIGluIG9yZGVyIHRvIGNvbXBsZXRlbHkgY2xlYXIgalF1ZXJ5J3MgYW5pbWF0aW9uIHF1ZXVlLiAqL1xyXG5cdFx0XHRcdGlmIChvcHRzLnF1ZXVlICE9PSBmYWxzZSkge1xyXG5cdFx0XHRcdFx0JC5kZXF1ZXVlKGVsZW1lbnQsIG9wdHMucXVldWUpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cdFx0XHQgQ2FsbHMgQXJyYXkgQ2xlYW51cFxyXG5cdFx0XHQgKioqKioqKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdFx0LyogU2luY2UgdGhpcyBjYWxsIGlzIGNvbXBsZXRlLCBzZXQgaXQgdG8gZmFsc2Ugc28gdGhhdCB0aGUgckFGIHRpY2sgc2tpcHMgaXQuIFRoaXMgYXJyYXkgaXMgbGF0ZXIgY29tcGFjdGVkIHZpYSBjb21wYWN0U3BhcnNlQXJyYXkoKS5cclxuXHRcdFx0IChGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlIGNhbGwgaXMgc2V0IHRvIGZhbHNlIGluc3RlYWQgb2YgYmVpbmcgZGVsZXRlZCBmcm9tIHRoZSBhcnJheTogaHR0cDovL3d3dy5odG1sNXJvY2tzLmNvbS9lbi90dXRvcmlhbHMvc3BlZWQvdjgvKSAqL1xyXG5cdFx0XHRWZWxvY2l0eS5TdGF0ZS5jYWxsc1tjYWxsSW5kZXhdID0gZmFsc2U7XHJcblxyXG5cdFx0XHQvKiBJdGVyYXRlIHRocm91Z2ggdGhlIGNhbGxzIGFycmF5IHRvIGRldGVybWluZSBpZiB0aGlzIHdhcyB0aGUgZmluYWwgaW4tcHJvZ3Jlc3MgYW5pbWF0aW9uLlxyXG5cdFx0XHQgSWYgc28sIHNldCBhIGZsYWcgdG8gZW5kIHRpY2tpbmcgYW5kIGNsZWFyIHRoZSBjYWxscyBhcnJheS4gKi9cclxuXHRcdFx0Zm9yICh2YXIgaiA9IDAsIGNhbGxzTGVuZ3RoID0gVmVsb2NpdHkuU3RhdGUuY2FsbHMubGVuZ3RoOyBqIDwgY2FsbHNMZW5ndGg7IGorKykge1xyXG5cdFx0XHRcdGlmIChWZWxvY2l0eS5TdGF0ZS5jYWxsc1tqXSAhPT0gZmFsc2UpIHtcclxuXHRcdFx0XHRcdHJlbWFpbmluZ0NhbGxzRXhpc3QgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKHJlbWFpbmluZ0NhbGxzRXhpc3QgPT09IGZhbHNlKSB7XHJcblx0XHRcdFx0LyogdGljaygpIHdpbGwgZGV0ZWN0IHRoaXMgZmxhZyB1cG9uIGl0cyBuZXh0IGl0ZXJhdGlvbiBhbmQgc3Vic2VxdWVudGx5IHR1cm4gaXRzZWxmIG9mZi4gKi9cclxuXHRcdFx0XHRWZWxvY2l0eS5TdGF0ZS5pc1RpY2tpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0LyogQ2xlYXIgdGhlIGNhbGxzIGFycmF5IHNvIHRoYXQgaXRzIGxlbmd0aCBpcyByZXNldC4gKi9cclxuXHRcdFx0XHRkZWxldGUgVmVsb2NpdHkuU3RhdGUuY2FsbHM7XHJcblx0XHRcdFx0VmVsb2NpdHkuU3RhdGUuY2FsbHMgPSBbXTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qKioqKioqKioqKioqKioqKipcclxuXHRcdCBGcmFtZXdvcmtzXHJcblx0XHQgKioqKioqKioqKioqKioqKioqL1xyXG5cclxuXHRcdC8qIEJvdGggalF1ZXJ5IGFuZCBaZXB0byBhbGxvdyB0aGVpciAkLmZuIG9iamVjdCB0byBiZSBleHRlbmRlZCB0byBhbGxvdyB3cmFwcGVkIGVsZW1lbnRzIHRvIGJlIHN1YmplY3RlZCB0byBwbHVnaW4gY2FsbHMuXHJcblx0XHQgSWYgZWl0aGVyIGZyYW1ld29yayBpcyBsb2FkZWQsIHJlZ2lzdGVyIGEgXCJ2ZWxvY2l0eVwiIGV4dGVuc2lvbiBwb2ludGluZyB0byBWZWxvY2l0eSdzIGNvcmUgYW5pbWF0ZSgpIG1ldGhvZC4gIFZlbG9jaXR5XHJcblx0XHQgYWxzbyByZWdpc3RlcnMgaXRzZWxmIG9udG8gYSBnbG9iYWwgY29udGFpbmVyICh3aW5kb3cualF1ZXJ5IHx8IHdpbmRvdy5aZXB0byB8fCB3aW5kb3cpIHNvIHRoYXQgY2VydGFpbiBmZWF0dXJlcyBhcmVcclxuXHRcdCBhY2Nlc3NpYmxlIGJleW9uZCBqdXN0IGEgcGVyLWVsZW1lbnQgc2NvcGUuIFRoaXMgbWFzdGVyIG9iamVjdCBjb250YWlucyBhbiAuYW5pbWF0ZSgpIG1ldGhvZCwgd2hpY2ggaXMgbGF0ZXIgYXNzaWduZWQgdG8gJC5mblxyXG5cdFx0IChpZiBqUXVlcnkgb3IgWmVwdG8gYXJlIHByZXNlbnQpLiBBY2NvcmRpbmdseSwgVmVsb2NpdHkgY2FuIGJvdGggYWN0IG9uIHdyYXBwZWQgRE9NIGVsZW1lbnRzIGFuZCBzdGFuZCBhbG9uZSBmb3IgdGFyZ2V0aW5nIHJhdyBET00gZWxlbWVudHMuICovXHJcblx0XHRnbG9iYWwuVmVsb2NpdHkgPSBWZWxvY2l0eTtcclxuXHJcblx0XHRpZiAoZ2xvYmFsICE9PSB3aW5kb3cpIHtcclxuXHRcdFx0LyogQXNzaWduIHRoZSBlbGVtZW50IGZ1bmN0aW9uIHRvIFZlbG9jaXR5J3MgY29yZSBhbmltYXRlKCkgbWV0aG9kLiAqL1xyXG5cdFx0XHRnbG9iYWwuZm4udmVsb2NpdHkgPSBhbmltYXRlO1xyXG5cdFx0XHQvKiBBc3NpZ24gdGhlIG9iamVjdCBmdW5jdGlvbidzIGRlZmF1bHRzIHRvIFZlbG9jaXR5J3MgZ2xvYmFsIGRlZmF1bHRzIG9iamVjdC4gKi9cclxuXHRcdFx0Z2xvYmFsLmZuLnZlbG9jaXR5LmRlZmF1bHRzID0gVmVsb2NpdHkuZGVmYXVsdHM7XHJcblx0XHR9XHJcblxyXG5cdFx0LyoqKioqKioqKioqKioqKioqKioqKioqXHJcblx0XHQgUGFja2FnZWQgUmVkaXJlY3RzXHJcblx0XHQgKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG5cdFx0Lyogc2xpZGVVcCwgc2xpZGVEb3duICovXHJcblx0XHQkLmVhY2goW1wiRG93blwiLCBcIlVwXCJdLCBmdW5jdGlvbihpLCBkaXJlY3Rpb24pIHtcclxuXHRcdFx0VmVsb2NpdHkuUmVkaXJlY3RzW1wic2xpZGVcIiArIGRpcmVjdGlvbl0gPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zLCBlbGVtZW50c0luZGV4LCBlbGVtZW50c1NpemUsIGVsZW1lbnRzLCBwcm9taXNlRGF0YSkge1xyXG5cdFx0XHRcdHZhciBvcHRzID0gJC5leHRlbmQoe30sIG9wdGlvbnMpLFxyXG5cdFx0XHRcdFx0XHRiZWdpbiA9IG9wdHMuYmVnaW4sXHJcblx0XHRcdFx0XHRcdGNvbXBsZXRlID0gb3B0cy5jb21wbGV0ZSxcclxuXHRcdFx0XHRcdFx0aW5saW5lVmFsdWVzID0ge30sXHJcblx0XHRcdFx0XHRcdGNvbXB1dGVkVmFsdWVzID0ge2hlaWdodDogXCJcIiwgbWFyZ2luVG9wOiBcIlwiLCBtYXJnaW5Cb3R0b206IFwiXCIsIHBhZGRpbmdUb3A6IFwiXCIsIHBhZGRpbmdCb3R0b206IFwiXCJ9O1xyXG5cclxuXHRcdFx0XHRpZiAob3B0cy5kaXNwbGF5ID09PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0XHRcdC8qIFNob3cgdGhlIGVsZW1lbnQgYmVmb3JlIHNsaWRlRG93biBiZWdpbnMgYW5kIGhpZGUgdGhlIGVsZW1lbnQgYWZ0ZXIgc2xpZGVVcCBjb21wbGV0ZXMuICovXHJcblx0XHRcdFx0XHQvKiBOb3RlOiBJbmxpbmUgZWxlbWVudHMgY2Fubm90IGhhdmUgZGltZW5zaW9ucyBhbmltYXRlZCwgc28gdGhleSdyZSByZXZlcnRlZCB0byBpbmxpbmUtYmxvY2suICovXHJcblx0XHRcdFx0XHRvcHRzLmRpc3BsYXkgPSAoZGlyZWN0aW9uID09PSBcIkRvd25cIiA/IChWZWxvY2l0eS5DU1MuVmFsdWVzLmdldERpc3BsYXlUeXBlKGVsZW1lbnQpID09PSBcImlubGluZVwiID8gXCJpbmxpbmUtYmxvY2tcIiA6IFwiYmxvY2tcIikgOiBcIm5vbmVcIik7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRvcHRzLmJlZ2luID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHQvKiBJZiB0aGUgdXNlciBwYXNzZWQgaW4gYSBiZWdpbiBjYWxsYmFjaywgZmlyZSBpdCBub3cuICovXHJcblx0XHRcdFx0XHRpZiAoZWxlbWVudHNJbmRleCA9PT0gMCAmJiBiZWdpbikge1xyXG5cdFx0XHRcdFx0XHRiZWdpbi5jYWxsKGVsZW1lbnRzLCBlbGVtZW50cyk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogQ2FjaGUgdGhlIGVsZW1lbnRzJyBvcmlnaW5hbCB2ZXJ0aWNhbCBkaW1lbnNpb25hbCBwcm9wZXJ0eSB2YWx1ZXMgc28gdGhhdCB3ZSBjYW4gYW5pbWF0ZSBiYWNrIHRvIHRoZW0uICovXHJcblx0XHRcdFx0XHRmb3IgKHZhciBwcm9wZXJ0eSBpbiBjb21wdXRlZFZhbHVlcykge1xyXG5cdFx0XHRcdFx0XHRpZiAoIWNvbXB1dGVkVmFsdWVzLmhhc093blByb3BlcnR5KHByb3BlcnR5KSkge1xyXG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlubGluZVZhbHVlc1twcm9wZXJ0eV0gPSBlbGVtZW50LnN0eWxlW3Byb3BlcnR5XTtcclxuXHJcblx0XHRcdFx0XHRcdC8qIEZvciBzbGlkZURvd24sIHVzZSBmb3JjZWZlZWRpbmcgdG8gYW5pbWF0ZSBhbGwgdmVydGljYWwgcHJvcGVydGllcyBmcm9tIDAuIEZvciBzbGlkZVVwLFxyXG5cdFx0XHRcdFx0XHQgdXNlIGZvcmNlZmVlZGluZyB0byBzdGFydCBmcm9tIGNvbXB1dGVkIHZhbHVlcyBhbmQgYW5pbWF0ZSBkb3duIHRvIDAuICovXHJcblx0XHRcdFx0XHRcdHZhciBwcm9wZXJ0eVZhbHVlID0gQ1NTLmdldFByb3BlcnR5VmFsdWUoZWxlbWVudCwgcHJvcGVydHkpO1xyXG5cdFx0XHRcdFx0XHRjb21wdXRlZFZhbHVlc1twcm9wZXJ0eV0gPSAoZGlyZWN0aW9uID09PSBcIkRvd25cIikgPyBbcHJvcGVydHlWYWx1ZSwgMF0gOiBbMCwgcHJvcGVydHlWYWx1ZV07XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogRm9yY2UgdmVydGljYWwgb3ZlcmZsb3cgY29udGVudCB0byBjbGlwIHNvIHRoYXQgc2xpZGluZyB3b3JrcyBhcyBleHBlY3RlZC4gKi9cclxuXHRcdFx0XHRcdGlubGluZVZhbHVlcy5vdmVyZmxvdyA9IGVsZW1lbnQuc3R5bGUub3ZlcmZsb3c7XHJcblx0XHRcdFx0XHRlbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcclxuXHRcdFx0XHR9O1xyXG5cclxuXHRcdFx0XHRvcHRzLmNvbXBsZXRlID0gZnVuY3Rpb24oKSB7XHJcblx0XHRcdFx0XHQvKiBSZXNldCBlbGVtZW50IHRvIGl0cyBwcmUtc2xpZGUgaW5saW5lIHZhbHVlcyBvbmNlIGl0cyBzbGlkZSBhbmltYXRpb24gaXMgY29tcGxldGUuICovXHJcblx0XHRcdFx0XHRmb3IgKHZhciBwcm9wZXJ0eSBpbiBpbmxpbmVWYWx1ZXMpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGlubGluZVZhbHVlcy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpIHtcclxuXHRcdFx0XHRcdFx0XHRlbGVtZW50LnN0eWxlW3Byb3BlcnR5XSA9IGlubGluZVZhbHVlc1twcm9wZXJ0eV07XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBJZiB0aGUgdXNlciBwYXNzZWQgaW4gYSBjb21wbGV0ZSBjYWxsYmFjaywgZmlyZSBpdCBub3cuICovXHJcblx0XHRcdFx0XHRpZiAoZWxlbWVudHNJbmRleCA9PT0gZWxlbWVudHNTaXplIC0gMSkge1xyXG5cdFx0XHRcdFx0XHRpZiAoY29tcGxldGUpIHtcclxuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZS5jYWxsKGVsZW1lbnRzLCBlbGVtZW50cyk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0aWYgKHByb21pc2VEYXRhKSB7XHJcblx0XHRcdFx0XHRcdFx0cHJvbWlzZURhdGEucmVzb2x2ZXIoZWxlbWVudHMpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fTtcclxuXHJcblx0XHRcdFx0VmVsb2NpdHkoZWxlbWVudCwgY29tcHV0ZWRWYWx1ZXMsIG9wdHMpO1xyXG5cdFx0XHR9O1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyogZmFkZUluLCBmYWRlT3V0ICovXHJcblx0XHQkLmVhY2goW1wiSW5cIiwgXCJPdXRcIl0sIGZ1bmN0aW9uKGksIGRpcmVjdGlvbikge1xyXG5cdFx0XHRWZWxvY2l0eS5SZWRpcmVjdHNbXCJmYWRlXCIgKyBkaXJlY3Rpb25dID0gZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucywgZWxlbWVudHNJbmRleCwgZWxlbWVudHNTaXplLCBlbGVtZW50cywgcHJvbWlzZURhdGEpIHtcclxuXHRcdFx0XHR2YXIgb3B0cyA9ICQuZXh0ZW5kKHt9LCBvcHRpb25zKSxcclxuXHRcdFx0XHRcdFx0Y29tcGxldGUgPSBvcHRzLmNvbXBsZXRlLFxyXG5cdFx0XHRcdFx0XHRwcm9wZXJ0aWVzTWFwID0ge29wYWNpdHk6IChkaXJlY3Rpb24gPT09IFwiSW5cIikgPyAxIDogMH07XHJcblxyXG5cdFx0XHRcdC8qIFNpbmNlIHJlZGlyZWN0cyBhcmUgdHJpZ2dlcmVkIGluZGl2aWR1YWxseSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSBhbmltYXRlZCBzZXQsIGF2b2lkIHJlcGVhdGVkbHkgdHJpZ2dlcmluZ1xyXG5cdFx0XHRcdCBjYWxsYmFja3MgYnkgZmlyaW5nIHRoZW0gb25seSB3aGVuIHRoZSBmaW5hbCBlbGVtZW50IGhhcyBiZWVuIHJlYWNoZWQuICovXHJcblx0XHRcdFx0aWYgKGVsZW1lbnRzSW5kZXggIT09IDApIHtcclxuXHRcdFx0XHRcdG9wdHMuYmVnaW4gPSBudWxsO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRpZiAoZWxlbWVudHNJbmRleCAhPT0gZWxlbWVudHNTaXplIC0gMSkge1xyXG5cdFx0XHRcdFx0b3B0cy5jb21wbGV0ZSA9IG51bGw7XHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdG9wdHMuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcclxuXHRcdFx0XHRcdFx0aWYgKGNvbXBsZXRlKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29tcGxldGUuY2FsbChlbGVtZW50cywgZWxlbWVudHMpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGlmIChwcm9taXNlRGF0YSkge1xyXG5cdFx0XHRcdFx0XHRcdHByb21pc2VEYXRhLnJlc29sdmVyKGVsZW1lbnRzKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fTtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qIElmIGEgZGlzcGxheSB3YXMgcGFzc2VkIGluLCB1c2UgaXQuIE90aGVyd2lzZSwgZGVmYXVsdCB0byBcIm5vbmVcIiBmb3IgZmFkZU91dCBvciB0aGUgZWxlbWVudC1zcGVjaWZpYyBkZWZhdWx0IGZvciBmYWRlSW4uICovXHJcblx0XHRcdFx0LyogTm90ZTogV2UgYWxsb3cgdXNlcnMgdG8gcGFzcyBpbiBcIm51bGxcIiB0byBza2lwIGRpc3BsYXkgc2V0dGluZyBhbHRvZ2V0aGVyLiAqL1xyXG5cdFx0XHRcdGlmIChvcHRzLmRpc3BsYXkgPT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHRcdFx0b3B0cy5kaXNwbGF5ID0gKGRpcmVjdGlvbiA9PT0gXCJJblwiID8gXCJhdXRvXCIgOiBcIm5vbmVcIik7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRWZWxvY2l0eSh0aGlzLCBwcm9wZXJ0aWVzTWFwLCBvcHRzKTtcclxuXHRcdFx0fTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHJldHVybiBWZWxvY2l0eTtcclxuXHR9KCh3aW5kb3cualF1ZXJ5IHx8IHdpbmRvdy5aZXB0byB8fCB3aW5kb3cpLCB3aW5kb3csICh3aW5kb3cgPyB3aW5kb3cuZG9jdW1lbnQgOiB1bmRlZmluZWQpKTtcclxufSkpO1xyXG5cclxuLyoqKioqKioqKioqKioqKioqKlxyXG4gS25vd24gSXNzdWVzXHJcbiAqKioqKioqKioqKioqKioqKiovXHJcblxyXG4vKiBUaGUgQ1NTIHNwZWMgbWFuZGF0ZXMgdGhhdCB0aGUgdHJhbnNsYXRlWC9ZL1ogdHJhbnNmb3JtcyBhcmUgJS1yZWxhdGl2ZSB0byB0aGUgZWxlbWVudCBpdHNlbGYgLS0gbm90IGl0cyBwYXJlbnQuXHJcbiBWZWxvY2l0eSwgaG93ZXZlciwgZG9lc24ndCBtYWtlIHRoaXMgZGlzdGluY3Rpb24uIFRodXMsIGNvbnZlcnRpbmcgdG8gb3IgZnJvbSB0aGUgJSB1bml0IHdpdGggdGhlc2Ugc3VicHJvcGVydGllc1xyXG4gd2lsbCBwcm9kdWNlIGFuIGluYWNjdXJhdGUgY29udmVyc2lvbiB2YWx1ZS4gVGhlIHNhbWUgaXNzdWUgZXhpc3RzIHdpdGggdGhlIGN4L2N5IGF0dHJpYnV0ZXMgb2YgU1ZHIGNpcmNsZXMgYW5kIGVsbGlwc2VzLiAqL1xyXG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVwZGF0ZVNvdXJjZXMoaW1nLCBzb3VyY2VzKSB7XG4gIGlmIChzb3VyY2VzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBHZXQgc291cmNlIHNpYmxpbmdzIG9mIHRoZSBpbWcgdGFnXG4gIGNvbnN0IGltZ1NpYmxpbmdXZWJwID0gJChpbWcpLnNpYmxpbmdzKCdzb3VyY2VbdHlwZT1cImltYWdlL3dlYnBcIl0nKTtcbiAgY29uc3QgaW1nU2libGluZ0F2aWYgPSAkKGltZykuc2libGluZ3MoJ3NvdXJjZVt0eXBlPVwiaW1hZ2UvYXZpZlwiXScpO1xuXG4gIC8vIFVwZGF0ZSB0aGVtIGlmIHRoZXkgZXhpc3QgYW5kIHdlIGhhdmUgYSBzb3VyY2UgZm9yIHRoZW1cbiAgaWYgKHNvdXJjZXMud2VicCAhPT0gdW5kZWZpbmVkICYmIGltZ1NpYmxpbmdXZWJwLmxlbmd0aCkge1xuICAgIGltZ1NpYmxpbmdXZWJwLmF0dHIoJ3NyY3NldCcsIHNvdXJjZXMud2VicCk7XG4gIH1cbiAgaWYgKHNvdXJjZXMuYXZpZiAhPT0gdW5kZWZpbmVkICYmIGltZ1NpYmxpbmdBdmlmLmxlbmd0aCkge1xuICAgIGltZ1NpYmxpbmdBdmlmLmF0dHIoJ3NyY3NldCcsIHNvdXJjZXMuYXZpZik7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjAgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZHVjdE1pbml0YXR1cmUge1xuICBpbml0KCkge1xuICAgICQoJy5qcy1wcm9kdWN0LW1pbmlhdHVyZScpLmVhY2goKGluZGV4LCBlbGVtZW50KSA9PiB7XG4gICAgICAvLyBMaW1pdCBudW1iZXIgb2Ygc2hvd24gY29sb3JzXG4gICAgICBpZiAoJChlbGVtZW50KS5maW5kKCcuY29sb3InKS5sZW5ndGggPiA1KSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG5cbiAgICAgICAgJChlbGVtZW50KVxuICAgICAgICAgIC5maW5kKCcuY29sb3InKVxuICAgICAgICAgIC5lYWNoKChjb2xvckluZGV4LCBjb2xvckVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChjb2xvckluZGV4ID4gNCkge1xuICAgICAgICAgICAgICAkKGNvbG9yRWxlbWVudCkuaGlkZSgpO1xuICAgICAgICAgICAgICBjb3VudCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICQoZWxlbWVudCkuZmluZCgnLmpzLWNvdW50JykuYXBwZW5kKGArJHtjb3VudH1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHByZXN0YXNob3AgZnJvbSAncHJlc3Rhc2hvcCc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmltcG9ydCBcInZlbG9jaXR5LWFuaW1hdGVcIjtcbmltcG9ydCB1cGRhdGVTb3VyY2VzIGZyb20gJy4vY29tcG9uZW50cy91cGRhdGUtc291cmNlcyc7XG5pbXBvcnQgUHJvZHVjdE1pbml0YXR1cmUgZnJvbSAnLi9jb21wb25lbnRzL3Byb2R1Y3QtbWluaWF0dXJlJztcblxuJChkb2N1bWVudCkucmVhZHkoKCkgPT4ge1xuICBjb25zdCBtb3ZlID0gKGRpcmVjdGlvbikgPT4ge1xuICAgIGNvbnN0IFRIVU1CX01BUkdJTiA9IDIwO1xuICAgIGNvbnN0ICR0aHVtYm5haWxzID0gJCgnLmpzLXF2LXByb2R1Y3QtaW1hZ2VzJyk7XG4gICAgY29uc3QgdGh1bWJIZWlnaHQgPSAkKCcuanMtcXYtcHJvZHVjdC1pbWFnZXMgbGkgaW1nJykuaGVpZ2h0KCkgKyBUSFVNQl9NQVJHSU47XG4gICAgY29uc3QgY3VycmVudFBvc2l0aW9uID0gJHRodW1ibmFpbHMucG9zaXRpb24oKS50b3A7XG4gICAgJHRodW1ibmFpbHMudmVsb2NpdHkoXG4gICAgICB7XG4gICAgICAgIHRyYW5zbGF0ZVk6XG4gICAgICAgICAgZGlyZWN0aW9uID09PSAndXAnXG4gICAgICAgICAgICA/IGN1cnJlbnRQb3NpdGlvbiArIHRodW1iSGVpZ2h0XG4gICAgICAgICAgICA6IGN1cnJlbnRQb3NpdGlvbiAtIHRodW1iSGVpZ2h0LFxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKCR0aHVtYm5haWxzLnBvc2l0aW9uKCkudG9wID49IDApIHtcbiAgICAgICAgICAkKCcuYXJyb3ctdXAnKS5jc3MoJ29wYWNpdHknLCAnLjInKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAkdGh1bWJuYWlscy5wb3NpdGlvbigpLnRvcCArICR0aHVtYm5haWxzLmhlaWdodCgpXG4gICAgICAgICAgPD0gJCgnLmpzLXF2LW1hc2snKS5oZWlnaHQoKVxuICAgICAgICApIHtcbiAgICAgICAgICAkKCcuYXJyb3ctZG93bicpLmNzcygnb3BhY2l0eScsICcuMicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgcHJvZHVjdENvbmZpZyA9IChxdikgPT4ge1xuICAgIGNvbnN0IE1BWF9USFVNQlMgPSA0O1xuICAgIGNvbnN0ICRhcnJvd3MgPSAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5hcnJvd3MpO1xuICAgIGNvbnN0ICR0aHVtYm5haWxzID0gcXYuZmluZCgnLmpzLXF2LXByb2R1Y3QtaW1hZ2VzJyk7XG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QudGh1bWIpLm9uKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgLy8gU3dhcCBhY3RpdmUgY2xhc3NlcyBvbiB0aHVtYm5haWxcbiAgICAgIGlmICgkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC50aHVtYikuaGFzQ2xhc3MoJ3NlbGVjdGVkJykpIHtcbiAgICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QudGh1bWIpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpO1xuICAgICAgfVxuICAgICAgJChldmVudC5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcblxuICAgICAgLy8gR2V0IGRhdGEgZnJvbSB0aHVtYm5haWwgYW5kIHVwZGF0ZSBjb3ZlciBzcmMsIGFsdCBhbmQgdGl0bGVcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmNvdmVyKS5hdHRyKCdzcmMnLCAkKGV2ZW50LnRhcmdldCkuZGF0YSgnaW1hZ2UtbGFyZ2Utc3JjJykpO1xuICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QuY292ZXIpLmF0dHIoJ2FsdCcsICQoZXZlbnQudGFyZ2V0KS5hdHRyKCdhbHQnKSk7XG4gICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5jb3ZlcikuYXR0cigndGl0bGUnLCAkKGV2ZW50LnRhcmdldCkuYXR0cigndGl0bGUnKSk7XG5cbiAgICAgIC8vIEdldCBkYXRhIGZyb20gdGh1bWJuYWlsIGFuZCB1cGRhdGUgY292ZXIgc291cmNlc1xuICAgICAgdXBkYXRlU291cmNlcyhcbiAgICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QuY292ZXIpLFxuICAgICAgICAkKGV2ZW50LnRhcmdldCkuZGF0YSgnaW1hZ2UtbGFyZ2Utc291cmNlcycpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpZiAoJHRodW1ibmFpbHMuZmluZCgnbGknKS5sZW5ndGggPD0gTUFYX1RIVU1CUykge1xuICAgICAgJGFycm93cy5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRhcnJvd3Mub24oJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAkKGV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ2Fycm93LXVwJylcbiAgICAgICAgICAmJiAkKCcuanMtcXYtcHJvZHVjdC1pbWFnZXMnKS5wb3NpdGlvbigpLnRvcCA8IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgbW92ZSgndXAnKTtcbiAgICAgICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuYXJyb3dEb3duKS5jc3MoJ29wYWNpdHknLCAnMScpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICQoZXZlbnQudGFyZ2V0KS5oYXNDbGFzcygnYXJyb3ctZG93bicpXG4gICAgICAgICAgJiYgJHRodW1ibmFpbHMucG9zaXRpb24oKS50b3AgKyAkdGh1bWJuYWlscy5oZWlnaHQoKVxuICAgICAgICAgICAgPiAkKCcuanMtcXYtbWFzaycpLmhlaWdodCgpXG4gICAgICAgICkge1xuICAgICAgICAgIG1vdmUoJ2Rvd24nKTtcbiAgICAgICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuYXJyb3dVcCkuY3NzKCdvcGFjaXR5JywgJzEnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHF2LmZpbmQocHJlc3Rhc2hvcC5zZWxlY3RvcnMucXVhbnRpdHlXYW50ZWQpLlRvdWNoU3Bpbih7XG4gICAgICB2ZXJ0aWNhbGJ1dHRvbnM6IHRydWUsXG4gICAgICB2ZXJ0aWNhbHVwY2xhc3M6ICdtYXRlcmlhbC1pY29ucyB0b3VjaHNwaW4tdXAnLFxuICAgICAgdmVydGljYWxkb3duY2xhc3M6ICdtYXRlcmlhbC1pY29ucyB0b3VjaHNwaW4tZG93bicsXG4gICAgICBidXR0b25kb3duX2NsYXNzOiAnYnRuIGJ0bi10b3VjaHNwaW4ganMtdG91Y2hzcGluJyxcbiAgICAgIGJ1dHRvbnVwX2NsYXNzOiAnYnRuIGJ0bi10b3VjaHNwaW4ganMtdG91Y2hzcGluJyxcbiAgICAgIG1pbjogMSxcbiAgICAgIG1heDogMTAwMDAwMCxcbiAgICB9KTtcblxuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy50b3VjaHNwaW4pLm9mZigndG91Y2hzdGFydC50b3VjaHNwaW4nKTtcbiAgfTtcblxuICBwcmVzdGFzaG9wLm9uKCdjbGlja1F1aWNrVmlldycsIChlbG0pID0+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgYWN0aW9uOiAncXVpY2t2aWV3JyxcbiAgICAgIGlkX3Byb2R1Y3Q6IGVsbS5kYXRhc2V0LmlkUHJvZHVjdCxcbiAgICAgIGlkX3Byb2R1Y3RfYXR0cmlidXRlOiBlbG0uZGF0YXNldC5pZFByb2R1Y3RBdHRyaWJ1dGUsXG4gICAgfTtcbiAgICAkLnBvc3QocHJlc3Rhc2hvcC51cmxzLnBhZ2VzLnByb2R1Y3QsIGRhdGEsIG51bGwsICdqc29uJylcbiAgICAgIC50aGVuKChyZXNwKSA9PiB7XG4gICAgICAgICQoJ2JvZHknKS5hcHBlbmQocmVzcC5xdWlja3ZpZXdfaHRtbCk7XG4gICAgICAgIGNvbnN0IHByb2R1Y3RNb2RhbCA9ICQoXG4gICAgICAgICAgYCNxdWlja3ZpZXctbW9kYWwtJHtyZXNwLnByb2R1Y3QuaWR9LSR7cmVzcC5wcm9kdWN0LmlkX3Byb2R1Y3RfYXR0cmlidXRlfWAsXG4gICAgICAgICk7XG4gICAgICAgIHByb2R1Y3RNb2RhbC5tb2RhbCgnc2hvdycpO1xuICAgICAgICBwcm9kdWN0Q29uZmlnKHByb2R1Y3RNb2RhbCk7XG4gICAgICAgIHByb2R1Y3RNb2RhbC5vbignaGlkZGVuLmJzLm1vZGFsJywgKCkgPT4ge1xuICAgICAgICAgIHByb2R1Y3RNb2RhbC5yZW1vdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmZhaWwoKHJlc3ApID0+IHtcbiAgICAgICAgcHJlc3Rhc2hvcC5lbWl0KCdoYW5kbGVFcnJvcicsIHtcbiAgICAgICAgICBldmVudFR5cGU6ICdjbGlja1F1aWNrVmlldycsXG4gICAgICAgICAgcmVzcCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfSk7XG5cbiAgJCgnYm9keScpLm9uKFxuICAgICdjbGljaycsXG4gICAgcHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLnNlYXJjaEZpbHRlclRvZ2dsZXIsXG4gICAgKCkgPT4ge1xuICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3Rpbmcuc2VhcmNoRmlsdGVyc1dyYXBwZXIpLnJlbW92ZUNsYXNzKFxuICAgICAgICAnaGlkZGVuLXNtLWRvd24nLFxuICAgICAgKTtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jb250ZW50V3JhcHBlcikuYWRkQ2xhc3MoJ2hpZGRlbi1zbS1kb3duJyk7XG4gICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuZm9vdGVyKS5hZGRDbGFzcygnaGlkZGVuLXNtLWRvd24nKTtcbiAgICB9LFxuICApO1xuICAkKFxuICAgIGAke3ByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5zZWFyY2hGaWx0ZXJDb250cm9sc30gJHtwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNsZWFyfWAsXG4gICkub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLnNlYXJjaEZpbHRlcnNXcmFwcGVyKS5hZGRDbGFzcyhcbiAgICAgICdoaWRkZW4tc20tZG93bicsXG4gICAgKTtcbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY29udGVudFdyYXBwZXIpLnJlbW92ZUNsYXNzKCdoaWRkZW4tc20tZG93bicpO1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5mb290ZXIpLnJlbW92ZUNsYXNzKCdoaWRkZW4tc20tZG93bicpO1xuICB9KTtcbiAgJChgJHtwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3Rpbmcuc2VhcmNoRmlsdGVyQ29udHJvbHN9IC5va2ApLm9uKFxuICAgICdjbGljaycsXG4gICAgKCkgPT4ge1xuICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3Rpbmcuc2VhcmNoRmlsdGVyc1dyYXBwZXIpLmFkZENsYXNzKFxuICAgICAgICAnaGlkZGVuLXNtLWRvd24nLFxuICAgICAgKTtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jb250ZW50V3JhcHBlcikucmVtb3ZlQ2xhc3MoJ2hpZGRlbi1zbS1kb3duJyk7XG4gICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuZm9vdGVyKS5yZW1vdmVDbGFzcygnaGlkZGVuLXNtLWRvd24nKTtcbiAgICB9LFxuICApO1xuXG4gIGNvbnN0IHBhcnNlU2VhcmNoVXJsID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldC5kYXRhc2V0LnNlYXJjaFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXZlbnQudGFyZ2V0LmRhdGFzZXQuc2VhcmNoVXJsO1xuICAgIH1cblxuICAgIGlmICgkKGV2ZW50LnRhcmdldCkucGFyZW50KClbMF0uZGF0YXNldC5zZWFyY2hVcmwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IHBhcnNlIHNlYXJjaCBVUkwnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJChldmVudC50YXJnZXQpLnBhcmVudCgpWzBdLmRhdGFzZXQuc2VhcmNoVXJsO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZVByb2R1Y3RMaXN0RE9NKGRhdGEpIHtcbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5zZWFyY2hGaWx0ZXJzKS5yZXBsYWNlV2l0aChcbiAgICAgIGRhdGEucmVuZGVyZWRfZmFjZXRzLFxuICAgICk7XG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3RpbmcuYWN0aXZlU2VhcmNoRmlsdGVycykucmVwbGFjZVdpdGgoXG4gICAgICBkYXRhLnJlbmRlcmVkX2FjdGl2ZV9maWx0ZXJzLFxuICAgICk7XG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3RpbmcubGlzdFRvcCkucmVwbGFjZVdpdGgoXG4gICAgICBkYXRhLnJlbmRlcmVkX3Byb2R1Y3RzX3RvcCxcbiAgICApO1xuXG4gICAgY29uc3QgcmVuZGVyZWRQcm9kdWN0cyA9ICQoZGF0YS5yZW5kZXJlZF9wcm9kdWN0cyk7XG4gICAgY29uc3QgcHJvZHVjdFNlbGVjdG9ycyA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLnByb2R1Y3QpO1xuXG4gICAgaWYgKHByb2R1Y3RTZWxlY3RvcnMubGVuZ3RoID4gMCkge1xuICAgICAgcHJvZHVjdFNlbGVjdG9ycy5yZW1vdmVDbGFzcygpLmFkZENsYXNzKHByb2R1Y3RTZWxlY3RvcnMuZmlyc3QoKS5hdHRyKCdjbGFzcycpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvZHVjdFNlbGVjdG9ycy5yZW1vdmVDbGFzcygpLmFkZENsYXNzKHJlbmRlcmVkUHJvZHVjdHMuZmlyc3QoKS5hdHRyKCdjbGFzcycpKTtcbiAgICB9XG5cbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubGlzdGluZy5saXN0KS5yZXBsYWNlV2l0aChyZW5kZXJlZFByb2R1Y3RzKTtcblxuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLmxpc3RCb3R0b20pLnJlcGxhY2VXaXRoKFxuICAgICAgZGF0YS5yZW5kZXJlZF9wcm9kdWN0c19ib3R0b20sXG4gICAgKTtcbiAgICBpZiAoZGF0YS5yZW5kZXJlZF9wcm9kdWN0c19oZWFkZXIpIHtcbiAgICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLmxpc3RIZWFkZXIpLnJlcGxhY2VXaXRoKFxuICAgICAgICBkYXRhLnJlbmRlcmVkX3Byb2R1Y3RzX2hlYWRlcixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvZHVjdE1pbml0YXR1cmUgPSBuZXcgUHJvZHVjdE1pbml0YXR1cmUoKTtcbiAgICBwcm9kdWN0TWluaXRhdHVyZS5pbml0KCk7XG4gIH1cblxuICAkKCdib2R5Jykub24oXG4gICAgJ2NoYW5nZScsXG4gICAgYCR7cHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLnNlYXJjaEZpbHRlcnN9IGlucHV0W2RhdGEtc2VhcmNoLXVybF1gLFxuICAgIChldmVudCkgPT4ge1xuICAgICAgcHJlc3Rhc2hvcC5lbWl0KCd1cGRhdGVGYWNldHMnLCBwYXJzZVNlYXJjaFVybChldmVudCkpO1xuICAgIH0sXG4gICk7XG5cbiAgJCgnYm9keScpLm9uKFxuICAgICdjbGljaycsXG4gICAgcHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5saXN0aW5nLnNlYXJjaEZpbHRlcnNDbGVhckFsbCxcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIHByZXN0YXNob3AuZW1pdCgndXBkYXRlRmFjZXRzJywgcGFyc2VTZWFyY2hVcmwoZXZlbnQpKTtcbiAgICB9LFxuICApO1xuXG4gICQoJ2JvZHknKS5vbignY2xpY2snLCBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3Rpbmcuc2VhcmNoTGluaywgKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBwcmVzdGFzaG9wLmVtaXQoXG4gICAgICAndXBkYXRlRmFjZXRzJyxcbiAgICAgICQoZXZlbnQudGFyZ2V0KVxuICAgICAgICAuY2xvc2VzdCgnYScpXG4gICAgICAgIC5nZXQoMCkuaHJlZixcbiAgICApO1xuICB9KTtcblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCAoZSkgPT4ge1xuICAgIGlmIChlLnN0YXRlICYmIGUuc3RhdGUuY3VycmVudF91cmwpIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gZS5zdGF0ZS5jdXJyZW50X3VybDtcbiAgICB9XG4gIH0pO1xuXG4gICQoJ2JvZHknKS5vbihcbiAgICAnY2hhbmdlJyxcbiAgICBgJHtwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmxpc3Rpbmcuc2VhcmNoRmlsdGVyc30gc2VsZWN0YCxcbiAgICAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGZvcm0gPSAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCgnZm9ybScpO1xuICAgICAgcHJlc3Rhc2hvcC5lbWl0KCd1cGRhdGVGYWNldHMnLCBgPyR7Zm9ybS5zZXJpYWxpemUoKX1gKTtcbiAgICB9LFxuICApO1xuXG4gIHByZXN0YXNob3Aub24oJ3VwZGF0ZVByb2R1Y3RMaXN0JywgKGRhdGEpID0+IHtcbiAgICB1cGRhdGVQcm9kdWN0TGlzdERPTShkYXRhKTtcbiAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG4gIH0pO1xufSk7XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmltcG9ydCAndmVsb2NpdHktYW5pbWF0ZSc7XG4vLyBpbXBvcnQgdXBkYXRlU291cmNlcyBmcm9tICd1cGRhdGUtc291cmNlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFByb2R1Y3RTZWxlY3Qge1xuICBpbml0KCkge1xuICAgIGNvbnN0IE1BWF9USFVNQlMgPSA1O1xuICAgIGNvbnN0ICRhcnJvd3MgPSAkKCcuanMtbW9kYWwtYXJyb3dzJyk7XG4gICAgY29uc3QgJHRodW1ibmFpbHMgPSAkKCcuanMtbW9kYWwtcHJvZHVjdC1pbWFnZXMnKTtcblxuICAgICQoJ2JvZHknKVxuICAgICAgLm9uKCdjbGljaycsICcuanMtbW9kYWwtdGh1bWInLCAoZXZlbnQpID0+IHtcbiAgICAgICAgLy8gU3dhcCBhY3RpdmUgY2xhc3NlcyBvbiB0aHVtYm5haWxcbiAgICAgICAgaWYgKCQoJy5qcy1tb2RhbC10aHVtYicpLmhhc0NsYXNzKCdzZWxlY3RlZCcpKSB7XG4gICAgICAgICAgJCgnLmpzLW1vZGFsLXRodW1iJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgJChldmVudC5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcblxuICAgICAgICAvLyBHZXQgZGF0YSBmcm9tIHRodW1ibmFpbCBhbmQgdXBkYXRlIGNvdmVyIHNyYywgYWx0IGFuZCB0aXRsZVxuICAgICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5tb2RhbFByb2R1Y3RDb3ZlcikuYXR0cignc3JjJywgJChldmVudC50YXJnZXQpLmRhdGEoJ2ltYWdlLWxhcmdlLXNyYycpKTtcbiAgICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3QubW9kYWxQcm9kdWN0Q292ZXIpLmF0dHIoJ3RpdGxlJywgJChldmVudC50YXJnZXQpLmF0dHIoJ3RpdGxlJykpO1xuICAgICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5tb2RhbFByb2R1Y3RDb3ZlcikuYXR0cignYWx0JywgJChldmVudC50YXJnZXQpLmF0dHIoJ2FsdCcpKTtcblxuICAgICAgICAvLyBHZXQgZGF0YSBmcm9tIHRodW1ibmFpbCBhbmQgdXBkYXRlIGNvdmVyIHNvdXJjZXNcbiAgICAgICAgLy8gdXBkYXRlU291cmNlcyhcbiAgICAgICAgLy8gICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5tb2RhbFByb2R1Y3RDb3ZlciksXG4gICAgICAgIC8vICAgJChldmVudC50YXJnZXQpLmRhdGEoJ2ltYWdlLWxhcmdlLXNvdXJjZXMnKSxcbiAgICAgICAgLy8gKTtcbiAgICAgIH0pXG4gICAgICAub24oJ2NsaWNrJywgJ2FzaWRlI3RodW1ibmFpbHMnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5pZCA9PT0gJ3RodW1ibmFpbHMnKSB7XG4gICAgICAgICAgJCgnI3Byb2R1Y3QtbW9kYWwnKS5tb2RhbCgnaGlkZScpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGlmICgkKCcuanMtbW9kYWwtcHJvZHVjdC1pbWFnZXMgbGknKS5sZW5ndGggPD0gTUFYX1RIVU1CUykge1xuICAgICAgJGFycm93cy5jc3MoJ29wYWNpdHknLCAnLjInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJGFycm93cy5vbignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCQoZXZlbnQudGFyZ2V0KS5oYXNDbGFzcygnYXJyb3ctdXAnKSAmJiAkdGh1bWJuYWlscy5wb3NpdGlvbigpLnRvcCA8IDApIHtcbiAgICAgICAgICB0aGlzLm1vdmUoJ3VwJyk7XG4gICAgICAgICAgJCgnLmpzLW1vZGFsLWFycm93LWRvd24nKS5jc3MoJ29wYWNpdHknLCAnMScpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICQoZXZlbnQudGFyZ2V0KS5oYXNDbGFzcygnYXJyb3ctZG93bicpXG4gICAgICAgICAgJiYgJHRodW1ibmFpbHMucG9zaXRpb24oKS50b3AgKyAkdGh1bWJuYWlscy5oZWlnaHQoKSA+ICQoJy5qcy1tb2RhbC1tYXNrJykuaGVpZ2h0KClcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5tb3ZlKCdkb3duJyk7XG4gICAgICAgICAgJCgnLmpzLW1vZGFsLWFycm93LXVwJykuY3NzKCdvcGFjaXR5JywgJzEnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbW92ZShkaXJlY3Rpb24pIHtcbiAgICBjb25zdCBUSFVNQl9NQVJHSU4gPSAxMDtcbiAgICBjb25zdCAkdGh1bWJuYWlscyA9ICQoJy5qcy1tb2RhbC1wcm9kdWN0LWltYWdlcycpO1xuICAgIGNvbnN0IHRodW1iSGVpZ2h0ID0gJCgnLmpzLW1vZGFsLXByb2R1Y3QtaW1hZ2VzIGxpIGltZycpLmhlaWdodCgpICsgVEhVTUJfTUFSR0lOO1xuICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9ICR0aHVtYm5haWxzLnBvc2l0aW9uKCkudG9wO1xuICAgICR0aHVtYm5haWxzLnZlbG9jaXR5KFxuICAgICAge1xuICAgICAgICB0cmFuc2xhdGVZOiBkaXJlY3Rpb24gPT09ICd1cCcgPyBjdXJyZW50UG9zaXRpb24gKyB0aHVtYkhlaWdodCA6IGN1cnJlbnRQb3NpdGlvbiAtIHRodW1iSGVpZ2h0LFxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKCR0aHVtYm5haWxzLnBvc2l0aW9uKCkudG9wID49IDApIHtcbiAgICAgICAgICAkKCcuanMtbW9kYWwtYXJyb3ctdXAnKS5jc3MoJ29wYWNpdHknLCAnLjInKTtcbiAgICAgICAgfSBlbHNlIGlmICgkdGh1bWJuYWlscy5wb3NpdGlvbigpLnRvcCArICR0aHVtYm5haWxzLmhlaWdodCgpIDw9ICQoJy5qcy1tb2RhbC1tYXNrJykuaGVpZ2h0KCkpIHtcbiAgICAgICAgICAkKCcuanMtbW9kYWwtYXJyb3ctZG93bicpLmNzcygnb3BhY2l0eScsICcuMicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjAgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBwcmVzdGFzaG9wIGZyb20gJ3ByZXN0YXNob3AnO1xuaW1wb3J0IFByb2R1Y3RTZWxlY3QgZnJvbSAnLi9jb21wb25lbnRzL3Byb2R1Y3Qtc2VsZWN0JztcbmltcG9ydCB1cGRhdGVTb3VyY2VzIGZyb20gJy4vY29tcG9uZW50cy91cGRhdGUtc291cmNlcyc7XG5cbiQoZG9jdW1lbnQpLnJlYWR5KCgpID0+IHtcbiAgZnVuY3Rpb24gY292ZXJJbWFnZSgpIHtcbiAgICBjb25zdCBwcm9kdWN0Q292ZXIgPSAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5jb3Zlcik7XG4gICAgY29uc3QgbW9kYWxQcm9kdWN0Q292ZXIgPSAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5tb2RhbFByb2R1Y3RDb3Zlcik7XG4gICAgbGV0IHRodW1iU2VsZWN0ZWQgPSAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5zZWxlY3RlZCk7XG5cbiAgICBjb25zdCBzd2lwZSA9IChzZWxlY3RlZFRodW1iLCB0aHVtYlBhcmVudCkgPT4ge1xuICAgICAgY29uc3QgbmV3U2VsZWN0ZWRUaHVtYiA9IHRodW1iUGFyZW50LmZpbmQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LnRodW1iKTtcblxuICAgICAgLy8gU3dhcCBhY3RpdmUgY2xhc3NlcyBvbiB0aHVtYm5haWxcbiAgICAgIHNlbGVjdGVkVGh1bWIucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7XG4gICAgICBuZXdTZWxlY3RlZFRodW1iLmFkZENsYXNzKCdzZWxlY3RlZCcpO1xuXG4gICAgICAvLyBVcGRhdGUgc291cmNlcyBvZiBib3RoIGNvdmVyIGFuZCBtb2RhbCBjb3ZlclxuICAgICAgbW9kYWxQcm9kdWN0Q292ZXIucHJvcCgnc3JjJywgbmV3U2VsZWN0ZWRUaHVtYi5kYXRhKCdpbWFnZS1sYXJnZS1zcmMnKSk7XG4gICAgICBwcm9kdWN0Q292ZXIucHJvcCgnc3JjJywgbmV3U2VsZWN0ZWRUaHVtYi5kYXRhKCdpbWFnZS1tZWRpdW0tc3JjJykpO1xuXG4gICAgICAvLyBHZXQgZGF0YSBmcm9tIHRodW1ibmFpbCBhbmQgdXBkYXRlIGNvdmVyIHNyYywgYWx0IGFuZCB0aXRsZVxuICAgICAgcHJvZHVjdENvdmVyLmF0dHIoJ3RpdGxlJywgbmV3U2VsZWN0ZWRUaHVtYi5hdHRyKCd0aXRsZScpKTtcbiAgICAgIG1vZGFsUHJvZHVjdENvdmVyLmF0dHIoJ3RpdGxlJywgbmV3U2VsZWN0ZWRUaHVtYi5hdHRyKCd0aXRsZScpKTtcbiAgICAgIHByb2R1Y3RDb3Zlci5hdHRyKCdhbHQnLCBuZXdTZWxlY3RlZFRodW1iLmF0dHIoJ2FsdCcpKTtcbiAgICAgIG1vZGFsUHJvZHVjdENvdmVyLmF0dHIoJ2FsdCcsIG5ld1NlbGVjdGVkVGh1bWIuYXR0cignYWx0JykpO1xuXG4gICAgICAvLyBHZXQgZGF0YSBmcm9tIHRodW1ibmFpbCBhbmQgdXBkYXRlIGNvdmVyIHNvdXJjZXNcbiAgICAgIHVwZGF0ZVNvdXJjZXMocHJvZHVjdENvdmVyLCBuZXdTZWxlY3RlZFRodW1iLmRhdGEoJ2ltYWdlLW1lZGl1bS1zb3VyY2VzJykpO1xuICAgICAgdXBkYXRlU291cmNlcyhtb2RhbFByb2R1Y3RDb3ZlciwgbmV3U2VsZWN0ZWRUaHVtYi5kYXRhKCdpbWFnZS1sYXJnZS1zb3VyY2VzJykpO1xuICAgIH07XG5cbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC50aHVtYikub24oJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICB0aHVtYlNlbGVjdGVkID0gJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLnByb2R1Y3Quc2VsZWN0ZWQpO1xuICAgICAgc3dpcGUodGh1bWJTZWxlY3RlZCwgJChldmVudC50YXJnZXQpLmNsb3Nlc3QocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LnRodW1iQ29udGFpbmVyKSk7XG4gICAgfSk7XG5cbiAgICBwcm9kdWN0Q292ZXIuc3dpcGUoe1xuICAgICAgc3dpcGU6IChldmVudCwgZGlyZWN0aW9uKSA9PiB7XG4gICAgICAgIHRodW1iU2VsZWN0ZWQgPSAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5zZWxlY3RlZCk7XG4gICAgICAgIGNvbnN0IHBhcmVudFRodW1iID0gdGh1bWJTZWxlY3RlZC5jbG9zZXN0KHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC50aHVtYkNvbnRhaW5lcik7XG5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIGlmIChwYXJlbnRUaHVtYi5wcmV2KCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3dpcGUodGh1bWJTZWxlY3RlZCwgcGFyZW50VGh1bWIucHJldigpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVudFRodW1iLm5leHQoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzd2lwZSh0aHVtYlNlbGVjdGVkLCBwYXJlbnRUaHVtYi5uZXh0KCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgIGlmIChwYXJlbnRUaHVtYi5uZXh0KCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc3dpcGUodGh1bWJTZWxlY3RlZCwgcGFyZW50VGh1bWIubmV4dCgpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhcmVudFRodW1iLnByZXYoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBzd2lwZSh0aHVtYlNlbGVjdGVkLCBwYXJlbnRUaHVtYi5wcmV2KCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGFsbG93UGFnZVNjcm9sbDogJ3ZlcnRpY2FsJyxcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGltYWdlU2Nyb2xsQm94KCkge1xuICAgIGlmICgkKCcjbWFpbiAuanMtcXYtcHJvZHVjdC1pbWFnZXMgbGknKS5sZW5ndGggPiAyKSB7XG4gICAgICAkKCcjbWFpbiAuanMtcXYtbWFzaycpLmFkZENsYXNzKCdzY3JvbGwnKTtcbiAgICAgICQoJy5zY3JvbGwtYm94LWFycm93cycpLmFkZENsYXNzKCdzY3JvbGwnKTtcbiAgICAgICQoJyNtYWluIC5qcy1xdi1tYXNrJykuc2Nyb2xsYm94KHtcbiAgICAgICAgZGlyZWN0aW9uOiAnaCcsXG4gICAgICAgIGRpc3RhbmNlOiAxMTMsXG4gICAgICAgIGF1dG9QbGF5OiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgJCgnLnNjcm9sbC1ib3gtYXJyb3dzIC5sZWZ0JykuY2xpY2soKCkgPT4ge1xuICAgICAgICAkKCcjbWFpbiAuanMtcXYtbWFzaycpLnRyaWdnZXIoJ2JhY2t3YXJkJyk7XG4gICAgICB9KTtcbiAgICAgICQoJy5zY3JvbGwtYm94LWFycm93cyAucmlnaHQnKS5jbGljaygoKSA9PiB7XG4gICAgICAgICQoJyNtYWluIC5qcy1xdi1tYXNrJykudHJpZ2dlcignZm9yd2FyZCcpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQoJyNtYWluIC5qcy1xdi1tYXNrJykucmVtb3ZlQ2xhc3MoJ3Njcm9sbCcpO1xuICAgICAgJCgnLnNjcm9sbC1ib3gtYXJyb3dzJykucmVtb3ZlQ2xhc3MoJ3Njcm9sbCcpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUlucHV0RmlsZSgpIHtcbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuZmlsZUlucHV0KS5vbignY2hhbmdlJywgKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpWzBdO1xuICAgICAgY29uc3QgZmlsZSA9ICh0YXJnZXQpID8gdGFyZ2V0LmZpbGVzWzBdIDogbnVsbDtcblxuICAgICAgaWYgKHRhcmdldCAmJiBmaWxlKSB7XG4gICAgICAgICQodGFyZ2V0KS5wcmV2KCkudGV4dChmaWxlLm5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUHJvZHVjdFNwaW4oKSB7XG4gICAgY29uc3QgJHF1YW50aXR5SW5wdXQgPSAkKHByZXN0YXNob3Auc2VsZWN0b3JzLnF1YW50aXR5V2FudGVkKTtcblxuICAgICRxdWFudGl0eUlucHV0LlRvdWNoU3Bpbih7XG4gICAgICB2ZXJ0aWNhbGJ1dHRvbnM6IHRydWUsXG4gICAgICB2ZXJ0aWNhbHVwY2xhc3M6ICdtYXRlcmlhbC1pY29ucyB0b3VjaHNwaW4tdXAnLFxuICAgICAgdmVydGljYWxkb3duY2xhc3M6ICdtYXRlcmlhbC1pY29ucyB0b3VjaHNwaW4tZG93bicsXG4gICAgICBidXR0b25kb3duX2NsYXNzOiAnYnRuIGJ0bi10b3VjaHNwaW4ganMtdG91Y2hzcGluJyxcbiAgICAgIGJ1dHRvbnVwX2NsYXNzOiAnYnRuIGJ0bi10b3VjaHNwaW4ganMtdG91Y2hzcGluJyxcbiAgICAgIG1pbjogcGFyc2VJbnQoJHF1YW50aXR5SW5wdXQuYXR0cignbWluJyksIDEwKSxcbiAgICAgIG1heDogMTAwMDAwMCxcbiAgICB9KTtcblxuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy50b3VjaHNwaW4pLm9mZigndG91Y2hzdGFydC50b3VjaHNwaW4nKTtcblxuICAgICRxdWFudGl0eUlucHV0Lm9uKCdmb2N1c291dCcsICgpID0+IHtcbiAgICAgIGlmICgkcXVhbnRpdHlJbnB1dC52YWwoKSA9PT0gJycgfHwgJHF1YW50aXR5SW5wdXQudmFsKCkgPCAkcXVhbnRpdHlJbnB1dC5hdHRyKCdtaW4nKSkge1xuICAgICAgICAkcXVhbnRpdHlJbnB1dC52YWwoJHF1YW50aXR5SW5wdXQuYXR0cignbWluJykpO1xuICAgICAgICAkcXVhbnRpdHlJbnB1dC50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgICQoJ2JvZHknKS5vbignY2hhbmdlIGtleXVwJywgcHJlc3Rhc2hvcC5zZWxlY3RvcnMucXVhbnRpdHlXYW50ZWQsIChlKSA9PiB7XG4gICAgICBpZiAoJHF1YW50aXR5SW5wdXQudmFsKCkgIT09ICcnKSB7XG4gICAgICAgICQoZS5jdXJyZW50VGFyZ2V0KS50cmlnZ2VyKCd0b3VjaHNwaW4uc3RvcHNwaW4nKTtcbiAgICAgICAgcHJlc3Rhc2hvcC5lbWl0KCd1cGRhdGVQcm9kdWN0Jywge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3VwZGF0ZWRQcm9kdWN0UXVhbnRpdHknLFxuICAgICAgICAgIGV2ZW50OiBlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZEpzUHJvZHVjdFRhYkFjdGl2ZVNlbGVjdG9yKCkge1xuICAgIGNvbnN0IG5hdiA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LnRhYnMpO1xuICAgIG5hdi5vbignc2hvdy5icy50YWInLCAoZSkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gJChlLnRhcmdldCk7XG4gICAgICB0YXJnZXQuYWRkQ2xhc3MocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmFjdGl2ZU5hdkNsYXNzKTtcbiAgICAgICQodGFyZ2V0LmF0dHIoJ2hyZWYnKSkuYWRkQ2xhc3MocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmFjdGl2ZVRhYkNsYXNzKTtcbiAgICB9KTtcbiAgICBuYXYub24oJ2hpZGUuYnMudGFiJywgKGUpID0+IHtcbiAgICAgIGNvbnN0IHRhcmdldCA9ICQoZS50YXJnZXQpO1xuICAgICAgdGFyZ2V0LnJlbW92ZUNsYXNzKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5hY3RpdmVOYXZDbGFzcyk7XG4gICAgICAkKHRhcmdldC5hdHRyKCdocmVmJykpLnJlbW92ZUNsYXNzKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5hY3RpdmVUYWJDbGFzcyk7XG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVQcm9kdWN0U3BpbigpO1xuICBjcmVhdGVJbnB1dEZpbGUoKTtcbiAgY292ZXJJbWFnZSgpO1xuICBpbWFnZVNjcm9sbEJveCgpO1xuICBhZGRKc1Byb2R1Y3RUYWJBY3RpdmVTZWxlY3RvcigpO1xuXG4gIHByZXN0YXNob3Aub24oJ3VwZGF0ZWRQcm9kdWN0JywgKGV2ZW50KSA9PiB7XG4gICAgY3JlYXRlSW5wdXRGaWxlKCk7XG4gICAgY292ZXJJbWFnZSgpO1xuICAgIGlmIChldmVudCAmJiBldmVudC5wcm9kdWN0X21pbmltYWxfcXVhbnRpdHkpIHtcbiAgICAgIGNvbnN0IG1pbmltYWxQcm9kdWN0UXVhbnRpdHkgPSBwYXJzZUludChldmVudC5wcm9kdWN0X21pbmltYWxfcXVhbnRpdHksIDEwKTtcbiAgICAgIGNvbnN0IHF1YW50aXR5SW5wdXRTZWxlY3RvciA9IHByZXN0YXNob3Auc2VsZWN0b3JzLnF1YW50aXR5V2FudGVkO1xuICAgICAgY29uc3QgcXVhbnRpdHlJbnB1dCA9ICQocXVhbnRpdHlJbnB1dFNlbGVjdG9yKTtcblxuICAgICAgLy8gQHNlZSBodHRwOi8vd3d3LnZpcnR1b3NvZnQuZXUvY29kZS9ib290c3RyYXAtdG91Y2hzcGluLyBhYm91dCBCb290c3RyYXAgVG91Y2hTcGluXG4gICAgICBxdWFudGl0eUlucHV0LnRyaWdnZXIoJ3RvdWNoc3Bpbi51cGRhdGVzZXR0aW5ncycsIHtcbiAgICAgICAgbWluOiBtaW5pbWFsUHJvZHVjdFF1YW50aXR5LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGltYWdlU2Nyb2xsQm94KCk7XG4gICAgJCgkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMucHJvZHVjdC5hY3RpdmVUYWJzKS5hdHRyKCdocmVmJykpLmFkZENsYXNzKCdhY3RpdmUnKS5yZW1vdmVDbGFzcygnZmFkZScpO1xuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmltYWdlc01vZGFsKS5yZXBsYWNlV2l0aChldmVudC5wcm9kdWN0X2ltYWdlc19tb2RhbCk7XG5cbiAgICBjb25zdCBwcm9kdWN0U2VsZWN0ID0gbmV3IFByb2R1Y3RTZWxlY3QoKTtcbiAgICBwcm9kdWN0U2VsZWN0LmluaXQoKTtcbiAgfSk7XG59KTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjAgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB0aW1lb3V0ID0gMzAwKSB7XG4gIGxldCB0aW1lcjtcblxuICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7IH0sIHRpbWVvdXQpO1xuICB9O1xufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBwcmVzdGFzaG9wIGZyb20gJ3ByZXN0YXNob3AnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJy4vY29tcG9uZW50cy9kZWJvdW5jZSc7XG5cbnByZXN0YXNob3AuY2FydCA9IHByZXN0YXNob3AuY2FydCB8fCB7fTtcblxucHJlc3Rhc2hvcC5jYXJ0LmFjdGl2ZV9pbnB1dHMgPSBudWxsO1xuXG5jb25zdCBzcGlubmVyU2VsZWN0b3IgPSAnaW5wdXRbbmFtZT1cInByb2R1Y3QtcXVhbnRpdHktc3BpblwiXSc7XG5sZXQgaGFzRXJyb3IgPSBmYWxzZTtcbmxldCBpc1VwZGF0ZU9wZXJhdGlvbiA9IGZhbHNlO1xubGV0IGVycm9yTXNnID0gJyc7XG5cbmNvbnN0IENoZWNrVXBkYXRlUXVhbnRpdHlPcGVyYXRpb25zID0ge1xuICBzd2l0Y2hFcnJvclN0YXQ6ICgpID0+IHtcbiAgICAvKipcbiAgICAgKiBpZiBlcnJvck1zZyBpcyBub3QgZW1wdHkgb3IgaWYgbm90aWZpY2F0aW9ucyBhcmUgc2hvd24sIHdlIGhhdmUgZXJyb3IgdG8gZGlzcGxheVxuICAgICAqIGlmIGhhc0Vycm9yIGlzIHRydWUsIHF1YW50aXR5IHdhcyBub3QgdXBkYXRlZCA6IHdlIGRvbid0IGRpc2FibGUgY2hlY2tvdXQgYnV0dG9uXG4gICAgICovXG4gICAgY29uc3QgJGNoZWNrb3V0QnRuID0gJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNoZWNrb3V0LmJ0bik7XG5cbiAgICBpZiAoJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLm5vdGlmaWNhdGlvbnMuZGFuZ2VyQWxlcnQpLmxlbmd0aCB8fCAoZXJyb3JNc2cgIT09ICcnICYmICFoYXNFcnJvcikpIHtcbiAgICAgICRjaGVja291dEJ0bi5hZGRDbGFzcygnZGlzYWJsZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3JNc2cgIT09ICcnKSB7XG4gICAgICBjb25zdCBzdHJFcnJvciA9IGBcbiAgICAgICAgPGFydGljbGUgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIiByb2xlPVwiYWxlcnRcIiBkYXRhLWFsZXJ0PVwiZGFuZ2VyXCI+XG4gICAgICAgICAgPHVsPlxuICAgICAgICAgICAgPGxpPiR7ZXJyb3JNc2d9PC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2FydGljbGU+XG4gICAgICBgO1xuICAgICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLm5vdGlmaWNhdGlvbnMuY29udGFpbmVyKS5odG1sKHN0ckVycm9yKTtcbiAgICAgIGVycm9yTXNnID0gJyc7XG4gICAgICBpc1VwZGF0ZU9wZXJhdGlvbiA9IGZhbHNlO1xuICAgICAgaWYgKGhhc0Vycm9yKSB7XG4gICAgICAgIC8vIGlmIGhhc0Vycm9yIGlzIHRydWUsIHF1YW50aXR5IHdhcyBub3QgdXBkYXRlZCA6IGFsbG93IGNoZWNrb3V0XG4gICAgICAgICRjaGVja291dEJ0bi5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCFoYXNFcnJvciAmJiBpc1VwZGF0ZU9wZXJhdGlvbikge1xuICAgICAgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgIGlzVXBkYXRlT3BlcmF0aW9uID0gZmFsc2U7XG4gICAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMubm90aWZpY2F0aW9ucy5jb250YWluZXIpLmh0bWwoJycpO1xuICAgICAgJGNoZWNrb3V0QnRuLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuICAgIH1cbiAgfSxcbiAgY2hlY2tVcGRhdGVPcGVyYXRpb246IChyZXNwKSA9PiB7XG4gICAgLyoqXG4gICAgICogcmVzcC5oYXNFcnJvciBjYW4gYmUgbm90IGRlZmluZWQgYnV0IHJlc3AuZXJyb3JzIG5vdCBlbXB0eTogcXVhbnRpdHkgaXMgdXBkYXRlZCBidXQgb3JkZXIgY2Fubm90IGJlIHBsYWNlZFxuICAgICAqIHdoZW4gcmVzcC5oYXNFcnJvcj10cnVlLCBxdWFudGl0eSBpcyBub3QgdXBkYXRlZFxuICAgICAqL1xuICAgIGNvbnN0IHtoYXNFcnJvcjogaGFzRXJyb3JPY2N1cnJlZCwgZXJyb3JzOiBlcnJvckRhdGF9ID0gcmVzcDtcbiAgICBoYXNFcnJvciA9IGhhc0Vycm9yT2NjdXJyZWQgPz8gZmFsc2U7XG4gICAgY29uc3QgZXJyb3JzID0gZXJyb3JEYXRhID8/ICcnO1xuXG4gICAgLy8gMS43LjIueCByZXR1cm5zIGVycm9ycyBhcyBzdHJpbmcsIDEuNy4zLnggcmV0dXJucyBhcnJheVxuICAgIGlmIChlcnJvcnMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgZXJyb3JNc2cgPSBlcnJvcnMuam9pbignICcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvck1zZyA9IGVycm9ycztcbiAgICB9XG5cbiAgICBpc1VwZGF0ZU9wZXJhdGlvbiA9IHRydWU7XG4gIH0sXG59O1xuXG4vKipcbiAqIEF0dGFjaCBCb290c3RyYXAgVG91Y2hTcGluIGV2ZW50IGhhbmRsZXJzXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVNwaW4oKSB7XG4gICQuZWFjaCgkKHNwaW5uZXJTZWxlY3RvciksIChpbmRleCwgc3Bpbm5lcikgPT4ge1xuICAgICQoc3Bpbm5lcikuVG91Y2hTcGluKHtcbiAgICAgIHZlcnRpY2FsYnV0dG9uczogdHJ1ZSxcbiAgICAgIHZlcnRpY2FsdXBjbGFzczogJ21hdGVyaWFsLWljb25zIHRvdWNoc3Bpbi11cCcsXG4gICAgICB2ZXJ0aWNhbGRvd25jbGFzczogJ21hdGVyaWFsLWljb25zIHRvdWNoc3Bpbi1kb3duJyxcbiAgICAgIGJ1dHRvbmRvd25fY2xhc3M6ICdidG4gYnRuLXRvdWNoc3BpbiBqcy10b3VjaHNwaW4ganMtaW5jcmVhc2UtcHJvZHVjdC1xdWFudGl0eScsXG4gICAgICBidXR0b251cF9jbGFzczogJ2J0biBidG4tdG91Y2hzcGluIGpzLXRvdWNoc3BpbiBqcy1kZWNyZWFzZS1wcm9kdWN0LXF1YW50aXR5JyxcbiAgICAgIG1pbjogcGFyc2VJbnQoJChzcGlubmVyKS5hdHRyKCdtaW4nKSwgMTApLFxuICAgICAgbWF4OiAxMDAwMDAwLFxuICAgIH0pO1xuICB9KTtcblxuICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMudG91Y2hzcGluKS5vZmYoJ3RvdWNoc3RhcnQudG91Y2hzcGluJyk7XG5cbiAgQ2hlY2tVcGRhdGVRdWFudGl0eU9wZXJhdGlvbnMuc3dpdGNoRXJyb3JTdGF0KCk7XG59XG5cbmNvbnN0IHByZXZlbnRDdXN0b21Nb2RhbE9wZW4gPSAoZXZlbnQpID0+IHtcbiAgaWYgKHdpbmRvdy5zaG91bGRQcmV2ZW50TW9kYWwpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4kKGRvY3VtZW50KS5yZWFkeSgoKSA9PiB7XG4gIGNvbnN0IHByb2R1Y3RMaW5lSW5DYXJ0U2VsZWN0b3IgPSBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQucHJvZHVjdExpbmVRdHk7XG4gIGNvbnN0IHByb21pc2VzID0gW107XG5cbiAgcHJlc3Rhc2hvcC5vbigndXBkYXRlQ2FydCcsICgpID0+IHtcbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2FydC5xdWlja3ZpZXcpLm1vZGFsKCdoaWRlJyk7XG4gIH0pO1xuXG4gIHByZXN0YXNob3Aub24oJ3VwZGF0ZWRDYXJ0JywgKCkgPT4ge1xuICAgIHdpbmRvdy5zaG91bGRQcmV2ZW50TW9kYWwgPSBmYWxzZTtcblxuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmN1c3RvbWl6YXRpb25Nb2RhbCkub24oJ3Nob3cuYnMubW9kYWwnLCAobW9kYWxFdmVudCkgPT4ge1xuICAgICAgcHJldmVudEN1c3RvbU1vZGFsT3Blbihtb2RhbEV2ZW50KTtcbiAgICB9KTtcblxuICAgIGNyZWF0ZVNwaW4oKTtcbiAgfSk7XG5cbiAgY3JlYXRlU3BpbigpO1xuXG4gIGNvbnN0ICRib2R5ID0gJCgnYm9keScpO1xuXG4gIGZ1bmN0aW9uIGlzVG91Y2hTcGluKG5hbWVzcGFjZSkge1xuICAgIHJldHVybiBuYW1lc3BhY2UgPT09ICdvbi5zdGFydHVwc3BpbicgfHwgbmFtZXNwYWNlID09PSAnb24uc3RhcnRkb3duc3Bpbic7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbmNyZWFzZVByb2R1Y3RRdWFudGl0eShuYW1lc3BhY2UpIHtcbiAgICByZXR1cm4gbmFtZXNwYWNlID09PSAnb24uc3RhcnR1cHNwaW4nO1xuICB9XG5cbiAgZnVuY3Rpb24gZmluZENhcnRMaW5lUHJvZHVjdFF1YW50aXR5SW5wdXQoJHRhcmdldCkge1xuICAgIGNvbnN0ICRpbnB1dCA9ICR0YXJnZXQucGFyZW50cyhwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQudG91Y2hzcGluKS5maW5kKHByb2R1Y3RMaW5lSW5DYXJ0U2VsZWN0b3IpO1xuXG4gICAgaWYgKCRpbnB1dC5pcygnOmZvY3VzJykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiAkaW5wdXQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW1lbGl6ZShzdWJqZWN0KSB7XG4gICAgY29uc3QgYWN0aW9uVHlwZVBhcnRzID0gc3ViamVjdC5zcGxpdCgnLScpO1xuICAgIGxldCBpO1xuICAgIGxldCBwYXJ0O1xuICAgIGxldCBjYW1lbGl6ZWRTdWJqZWN0ID0gJyc7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgYWN0aW9uVHlwZVBhcnRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBwYXJ0ID0gYWN0aW9uVHlwZVBhcnRzW2ldO1xuXG4gICAgICBpZiAoaSAhPT0gMCkge1xuICAgICAgICBwYXJ0ID0gcGFydC5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHBhcnQuc3Vic3RyaW5nKDEpO1xuICAgICAgfVxuXG4gICAgICBjYW1lbGl6ZWRTdWJqZWN0ICs9IHBhcnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbWVsaXplZFN1YmplY3Q7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUNhcnRBY3Rpb24oJHRhcmdldCwgbmFtZXNwYWNlKSB7XG4gICAgaWYgKCFpc1RvdWNoU3BpbihuYW1lc3BhY2UpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB1cmw6ICR0YXJnZXQuYXR0cignaHJlZicpLFxuICAgICAgICB0eXBlOiBjYW1lbGl6ZSgkdGFyZ2V0LmRhdGEoJ2xpbmstYWN0aW9uJykpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCAkaW5wdXQgPSBmaW5kQ2FydExpbmVQcm9kdWN0UXVhbnRpdHlJbnB1dCgkdGFyZ2V0KTtcblxuICAgIGlmICghJGlucHV0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IGNhcnRBY3Rpb24gPSB7fTtcblxuICAgIGlmIChzaG91bGRJbmNyZWFzZVByb2R1Y3RRdWFudGl0eShuYW1lc3BhY2UpKSB7XG4gICAgICBjYXJ0QWN0aW9uID0ge1xuICAgICAgICB1cmw6ICRpbnB1dC5kYXRhKCd1cC11cmwnKSxcbiAgICAgICAgdHlwZTogJ2luY3JlYXNlUHJvZHVjdFF1YW50aXR5JyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhcnRBY3Rpb24gPSB7XG4gICAgICAgIHVybDogJGlucHV0LmRhdGEoJ2Rvd24tdXJsJyksXG4gICAgICAgIHR5cGU6ICdkZWNyZWFzZVByb2R1Y3RRdWFudGl0eScsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBjYXJ0QWN0aW9uO1xuICB9XG5cbiAgY29uc3QgYWJvcnRQcmV2aW91c1JlcXVlc3RzID0gKCkgPT4ge1xuICAgIGxldCBwcm9taXNlO1xuICAgIHdoaWxlIChwcm9taXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBwcm9taXNlID0gcHJvbWlzZXMucG9wKCk7XG4gICAgICBwcm9taXNlLmFib3J0KCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGdldFRvdWNoU3BpbklucHV0ID0gKCRidXR0b24pID0+ICQoJGJ1dHRvbi5wYXJlbnRzKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2FydC50b3VjaHNwaW4pLmZpbmQoJ2lucHV0JykpO1xuXG4gICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5wcm9kdWN0LmN1c3RvbWl6YXRpb25Nb2RhbCkub24oJ3Nob3cuYnMubW9kYWwnLCAobW9kYWxFdmVudCkgPT4ge1xuICAgIHByZXZlbnRDdXN0b21Nb2RhbE9wZW4obW9kYWxFdmVudCk7XG4gIH0pO1xuXG4gIGNvbnN0IGhhbmRsZUNhcnRBY3Rpb24gPSAoZXZlbnQpID0+IHtcbiAgICBhYm9ydFByZXZpb3VzUmVxdWVzdHMoKTtcbiAgICB3aW5kb3cuc2hvdWxkUHJldmVudE1vZGFsID0gdHJ1ZTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgJHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgY29uc3Qge2RhdGFzZXR9ID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICBjb25zdCBjYXJ0QWN0aW9uID0gcGFyc2VDYXJ0QWN0aW9uKCR0YXJnZXQsIGV2ZW50Lm5hbWVzcGFjZSk7XG4gICAgY29uc3QgcmVxdWVzdERhdGEgPSB7XG4gICAgICBhamF4OiAnMScsXG4gICAgICBhY3Rpb246ICd1cGRhdGUnLFxuICAgIH07XG5cbiAgICBpZiAoIWNhcnRBY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAkLmFqYXgoe1xuICAgICAgdXJsOiBjYXJ0QWN0aW9uLnVybCxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgZGF0YTogcmVxdWVzdERhdGEsXG4gICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgYmVmb3JlU2VuZChqcVhIUikge1xuICAgICAgICBwcm9taXNlcy5wdXNoKGpxWEhSKTtcbiAgICAgIH0sXG4gICAgfSlcbiAgICAgIC50aGVuKChyZXNwKSA9PiB7XG4gICAgICAgIGNvbnN0ICRxdWFudGl0eUlucHV0ID0gZ2V0VG91Y2hTcGluSW5wdXQoJHRhcmdldCk7XG4gICAgICAgIENoZWNrVXBkYXRlUXVhbnRpdHlPcGVyYXRpb25zLmNoZWNrVXBkYXRlT3BlcmF0aW9uKHJlc3ApO1xuICAgICAgICAkcXVhbnRpdHlJbnB1dC52YWwocmVzcC5xdWFudGl0eSk7XG5cbiAgICAgICAgLy8gUmVmcmVzaCBjYXJ0IHByZXZpZXdcbiAgICAgICAgcHJlc3Rhc2hvcC5lbWl0KCd1cGRhdGVDYXJ0Jywge1xuICAgICAgICAgIHJlYXNvbjogZGF0YXNldCxcbiAgICAgICAgICByZXNwLFxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuZmFpbCgocmVzcCkgPT4ge1xuICAgICAgICBwcmVzdGFzaG9wLmVtaXQoJ2hhbmRsZUVycm9yJywge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3VwZGF0ZVByb2R1Y3RJbkNhcnQnLFxuICAgICAgICAgIHJlc3AsXG4gICAgICAgICAgY2FydEFjdGlvbjogY2FydEFjdGlvbi50eXBlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9O1xuXG4gICRib2R5Lm9uKCdjbGljaycsIHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2FydC5hY3Rpb25zLCBoYW5kbGVDYXJ0QWN0aW9uKTtcblxuICBmdW5jdGlvbiBzZW5kVXBkYXRlUXVhbnRpdHlJbkNhcnRSZXF1ZXN0KHVwZGF0ZVF1YW50aXR5SW5DYXJ0VXJsLCByZXF1ZXN0RGF0YSwgJHRhcmdldCkge1xuICAgIGFib3J0UHJldmlvdXNSZXF1ZXN0cygpO1xuICAgIHdpbmRvdy5zaG91bGRQcmV2ZW50TW9kYWwgPSB0cnVlO1xuXG4gICAgcmV0dXJuICQuYWpheCh7XG4gICAgICB1cmw6IHVwZGF0ZVF1YW50aXR5SW5DYXJ0VXJsLFxuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBkYXRhOiByZXF1ZXN0RGF0YSxcbiAgICAgIGRhdGFUeXBlOiAnanNvbicsXG4gICAgICBiZWZvcmVTZW5kKGpxWEhSKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2goanFYSFIpO1xuICAgICAgfSxcbiAgICB9KVxuICAgICAgLnRoZW4oKHJlc3ApID0+IHtcbiAgICAgICAgQ2hlY2tVcGRhdGVRdWFudGl0eU9wZXJhdGlvbnMuY2hlY2tVcGRhdGVPcGVyYXRpb24ocmVzcCk7XG5cbiAgICAgICAgJHRhcmdldC52YWwocmVzcC5xdWFudGl0eSk7XG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSAoJHRhcmdldCAmJiAkdGFyZ2V0LmRhdGFzZXQpID8gJHRhcmdldC5kYXRhc2V0IDogcmVzcDtcblxuICAgICAgICAvLyBSZWZyZXNoIGNhcnQgcHJldmlld1xuICAgICAgICBwcmVzdGFzaG9wLmVtaXQoJ3VwZGF0ZUNhcnQnLCB7XG4gICAgICAgICAgcmVhc29uOiBkYXRhc2V0LFxuICAgICAgICAgIHJlc3AsXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5mYWlsKChyZXNwKSA9PiB7XG4gICAgICAgIHByZXN0YXNob3AuZW1pdCgnaGFuZGxlRXJyb3InLCB7XG4gICAgICAgICAgZXZlbnRUeXBlOiAndXBkYXRlUHJvZHVjdFF1YW50aXR5SW5DYXJ0JyxcbiAgICAgICAgICByZXNwLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UXVhbnRpdHlDaGFuZ2VUeXBlKCRxdWFudGl0eSkge1xuICAgIHJldHVybiAkcXVhbnRpdHkgPiAwID8gJ3VwJyA6ICdkb3duJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFJlcXVlc3REYXRhKHF1YW50aXR5KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFqYXg6ICcxJyxcbiAgICAgIHF0eTogTWF0aC5hYnMocXVhbnRpdHkpLFxuICAgICAgYWN0aW9uOiAndXBkYXRlJyxcbiAgICAgIG9wOiBnZXRRdWFudGl0eUNoYW5nZVR5cGUocXVhbnRpdHkpLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQcm9kdWN0UXVhbnRpdHlJbkNhcnQoZXZlbnQpIHtcbiAgICBjb25zdCAkdGFyZ2V0ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICBjb25zdCB1cGRhdGVRdWFudGl0eUluQ2FydFVybCA9ICR0YXJnZXQuZGF0YSgndXBkYXRlLXVybCcpO1xuICAgIGNvbnN0IGJhc2VWYWx1ZSA9ICR0YXJnZXQuYXR0cigndmFsdWUnKTtcblxuICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhIHZhbGlkIHByb2R1Y3QgcXVhbnRpdHkgaW4gY2FydFxuICAgIGNvbnN0IHRhcmdldFZhbHVlID0gJHRhcmdldC52YWwoKTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAgIGlmICh0YXJnZXRWYWx1ZSAhPSBwYXJzZUludCh0YXJnZXRWYWx1ZSwgMTApIHx8IHRhcmdldFZhbHVlIDwgMCB8fCBpc05hTih0YXJnZXRWYWx1ZSkpIHtcbiAgICAgIHdpbmRvdy5zaG91bGRQcmV2ZW50TW9kYWwgPSBmYWxzZTtcbiAgICAgICR0YXJnZXQudmFsKGJhc2VWYWx1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8qIGVzbGludC1lbmFibGUgKi9cbiAgICAvLyBUaGVyZSBzaG91bGQgYmUgYSBuZXcgcHJvZHVjdCBxdWFudGl0eSBpbiBjYXJ0XG4gICAgY29uc3QgcXR5ID0gdGFyZ2V0VmFsdWUgLSBiYXNlVmFsdWU7XG5cbiAgICBpZiAocXR5ID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRhcmdldFZhbHVlID09PSAnMCcpIHtcbiAgICAgICR0YXJnZXQuY2xvc2VzdCgnLnByb2R1Y3QtbGluZS1hY3Rpb25zJykuZmluZCgnW2RhdGEtbGluay1hY3Rpb249XCJkZWxldGUtZnJvbS1jYXJ0XCJdJykuY2xpY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgJHRhcmdldC5hdHRyKCd2YWx1ZScsIHRhcmdldFZhbHVlKTtcbiAgICAgIHNlbmRVcGRhdGVRdWFudGl0eUluQ2FydFJlcXVlc3QodXBkYXRlUXVhbnRpdHlJbkNhcnRVcmwsIGdldFJlcXVlc3REYXRhKHF0eSksICR0YXJnZXQpO1xuICAgIH1cbiAgfVxuXG4gICRib2R5Lm9uKCd0b3VjaHNwaW4ub24uc3RvcHNwaW4nLCBzcGlubmVyU2VsZWN0b3IsIGRlYm91bmNlKHVwZGF0ZVByb2R1Y3RRdWFudGl0eUluQ2FydCkpO1xuXG4gICRib2R5Lm9uKCdmb2N1c291dCBrZXl1cCcsIHByb2R1Y3RMaW5lSW5DYXJ0U2VsZWN0b3IsIChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgaXNVcGRhdGVPcGVyYXRpb24gPSB0cnVlO1xuICAgICAgICB1cGRhdGVQcm9kdWN0UXVhbnRpdHlJbkNhcnQoZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCFpc1VwZGF0ZU9wZXJhdGlvbikge1xuICAgICAgdXBkYXRlUHJvZHVjdFF1YW50aXR5SW5DYXJ0KGV2ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xuXG4gIGNvbnN0ICR0aW1lb3V0RWZmZWN0ID0gNDAwO1xuXG4gICRib2R5Lm9uKCdoaWRkZW4uYnMuY29sbGFwc2UnLCBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQucHJvbW9Db2RlLCAoKSA9PiB7XG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQuZGlzcGxheVByb21vKS5zaG93KCR0aW1lb3V0RWZmZWN0KTtcbiAgfSk7XG5cbiAgJGJvZHkub24oJ2NsaWNrJywgcHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jYXJ0LnByb21vQ29kZUJ1dHRvbiwgKGV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jYXJ0LnByb21vQ29kZSkuY29sbGFwc2UoJ3RvZ2dsZScpO1xuICB9KTtcblxuICAkYm9keS5vbignY2xpY2snLCBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQuZGlzcGxheVByb21vLCAoZXZlbnQpID0+IHtcbiAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmhpZGUoJHRpbWVvdXRFZmZlY3QpO1xuICB9KTtcblxuICAkYm9keS5vbignY2xpY2snLCBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQuZGlzY291bnRDb2RlLCAoZXZlbnQpID0+IHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0ICRjb2RlID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICBjb25zdCAkZGlzY291bnRJbnB1dCA9ICQocHJlc3Rhc2hvcC50aGVtZVNlbGVjdG9ycy5jYXJ0LmRpc2NvdW50TmFtZSk7XG5cbiAgICAkZGlzY291bnRJbnB1dC52YWwoJGNvZGUudGV4dCgpKTtcbiAgICAvLyBTaG93IHByb21vIGNvZGUgZmllbGRcbiAgICAkKHByZXN0YXNob3AudGhlbWVTZWxlY3RvcnMuY2FydC5wcm9tb0NvZGUpLmNvbGxhcHNlKCdzaG93Jyk7XG4gICAgJChwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzLmNhcnQuZGlzcGxheVByb21vKS5oaWRlKCR0aW1lb3V0RWZmZWN0KTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59KTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSID0gdHlwZW9mIFJlZmxlY3QgPT09ICdvYmplY3QnID8gUmVmbGVjdCA6IG51bGxcbnZhciBSZWZsZWN0QXBwbHkgPSBSICYmIHR5cGVvZiBSLmFwcGx5ID09PSAnZnVuY3Rpb24nXG4gID8gUi5hcHBseVxuICA6IGZ1bmN0aW9uIFJlZmxlY3RBcHBseSh0YXJnZXQsIHJlY2VpdmVyLCBhcmdzKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHRhcmdldCwgcmVjZWl2ZXIsIGFyZ3MpO1xuICB9XG5cbnZhciBSZWZsZWN0T3duS2V5c1xuaWYgKFIgJiYgdHlwZW9mIFIub3duS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICBSZWZsZWN0T3duS2V5cyA9IFIub3duS2V5c1xufSBlbHNlIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldClcbiAgICAgIC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0YXJnZXQpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIFJlZmxlY3RPd25LZXlzID0gZnVuY3Rpb24gUmVmbGVjdE93bktleXModGFyZ2V0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRhcmdldCk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIFByb2Nlc3NFbWl0V2FybmluZyh3YXJuaW5nKSB7XG4gIGlmIChjb25zb2xlICYmIGNvbnNvbGUud2FybikgY29uc29sZS53YXJuKHdhcm5pbmcpO1xufVxuXG52YXIgTnVtYmVySXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgZnVuY3Rpb24gTnVtYmVySXNOYU4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICBFdmVudEVtaXR0ZXIuaW5pdC5jYWxsKHRoaXMpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5tb2R1bGUuZXhwb3J0cy5vbmNlID0gb25jZTtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHNDb3VudCA9IDA7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbnZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbmZ1bmN0aW9uIGNoZWNrTGlzdGVuZXIobGlzdGVuZXIpIHtcbiAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcgKyB0eXBlb2YgbGlzdGVuZXIpO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFdmVudEVtaXR0ZXIsICdkZWZhdWx0TWF4TGlzdGVuZXJzJywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkZWZhdWx0TWF4TGlzdGVuZXJzO1xuICB9LFxuICBzZXQ6IGZ1bmN0aW9uKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyB8fCBhcmcgPCAwIHx8IE51bWJlcklzTmFOKGFyZykpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyArIGFyZyArICcuJyk7XG4gICAgfVxuICAgIGRlZmF1bHRNYXhMaXN0ZW5lcnMgPSBhcmc7XG4gIH1cbn0pO1xuXG5FdmVudEVtaXR0ZXIuaW5pdCA9IGZ1bmN0aW9uKCkge1xuXG4gIGlmICh0aGlzLl9ldmVudHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5fZXZlbnRzID09PSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykge1xuICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICB9XG5cbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn07XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIHNldE1heExpc3RlbmVycyhuKSB7XG4gIGlmICh0eXBlb2YgbiAhPT0gJ251bWJlcicgfHwgbiA8IDAgfHwgTnVtYmVySXNOYU4obikpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcgKyBuICsgJy4nKTtcbiAgfVxuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIF9nZXRNYXhMaXN0ZW5lcnModGhhdCkge1xuICBpZiAodGhhdC5fbWF4TGlzdGVuZXJzID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICByZXR1cm4gdGhhdC5fbWF4TGlzdGVuZXJzO1xufVxuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmdldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uIGdldE1heExpc3RlbmVycygpIHtcbiAgcmV0dXJuIF9nZXRNYXhMaXN0ZW5lcnModGhpcyk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KHR5cGUpIHtcbiAgdmFyIGFyZ3MgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICB2YXIgZG9FcnJvciA9ICh0eXBlID09PSAnZXJyb3InKTtcblxuICB2YXIgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICBpZiAoZXZlbnRzICE9PSB1bmRlZmluZWQpXG4gICAgZG9FcnJvciA9IChkb0Vycm9yICYmIGV2ZW50cy5lcnJvciA9PT0gdW5kZWZpbmVkKTtcbiAgZWxzZSBpZiAoIWRvRXJyb3IpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKGRvRXJyb3IpIHtcbiAgICB2YXIgZXI7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID4gMClcbiAgICAgIGVyID0gYXJnc1swXTtcbiAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgLy8gTm90ZTogVGhlIGNvbW1lbnRzIG9uIHRoZSBgdGhyb3dgIGxpbmVzIGFyZSBpbnRlbnRpb25hbCwgdGhleSBzaG93XG4gICAgICAvLyB1cCBpbiBOb2RlJ3Mgb3V0cHV0IGlmIHRoaXMgcmVzdWx0cyBpbiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uLlxuICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgfVxuICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmhhbmRsZWQgZXJyb3IuJyArIChlciA/ICcgKCcgKyBlci5tZXNzYWdlICsgJyknIDogJycpKTtcbiAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgIHRocm93IGVycjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgfVxuXG4gIHZhciBoYW5kbGVyID0gZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChoYW5kbGVyID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFJlZmxlY3RBcHBseShoYW5kbGVyLCB0aGlzLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuID0gaGFuZGxlci5sZW5ndGg7XG4gICAgdmFyIGxpc3RlbmVycyA9IGFycmF5Q2xvbmUoaGFuZGxlciwgbGVuKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKVxuICAgICAgUmVmbGVjdEFwcGx5KGxpc3RlbmVyc1tpXSwgdGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmZ1bmN0aW9uIF9hZGRMaXN0ZW5lcih0YXJnZXQsIHR5cGUsIGxpc3RlbmVyLCBwcmVwZW5kKSB7XG4gIHZhciBtO1xuICB2YXIgZXZlbnRzO1xuICB2YXIgZXhpc3Rpbmc7XG5cbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG4gIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgIGV2ZW50cyA9IHRhcmdldC5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0YXJnZXQuX2V2ZW50c0NvdW50ID0gMDtcbiAgfSBlbHNlIHtcbiAgICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgICBpZiAoZXZlbnRzLm5ld0xpc3RlbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRhcmdldC5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA/IGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gICAgICAvLyBSZS1hc3NpZ24gYGV2ZW50c2AgYmVjYXVzZSBhIG5ld0xpc3RlbmVyIGhhbmRsZXIgY291bGQgaGF2ZSBjYXVzZWQgdGhlXG4gICAgICAvLyB0aGlzLl9ldmVudHMgdG8gYmUgYXNzaWduZWQgdG8gYSBuZXcgb2JqZWN0XG4gICAgICBldmVudHMgPSB0YXJnZXQuX2V2ZW50cztcbiAgICB9XG4gICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV07XG4gIH1cblxuICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIGV4aXN0aW5nID0gZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gICAgKyt0YXJnZXQuX2V2ZW50c0NvdW50O1xuICB9IGVsc2Uge1xuICAgIGlmICh0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgICAgZXhpc3RpbmcgPSBldmVudHNbdHlwZV0gPVxuICAgICAgICBwcmVwZW5kID8gW2xpc3RlbmVyLCBleGlzdGluZ10gOiBbZXhpc3RpbmcsIGxpc3RlbmVyXTtcbiAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB9IGVsc2UgaWYgKHByZXBlbmQpIHtcbiAgICAgIGV4aXN0aW5nLnVuc2hpZnQobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBleGlzdGluZy5wdXNoKGxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICAgIG0gPSBfZ2V0TWF4TGlzdGVuZXJzKHRhcmdldCk7XG4gICAgaWYgKG0gPiAwICYmIGV4aXN0aW5nLmxlbmd0aCA+IG0gJiYgIWV4aXN0aW5nLndhcm5lZCkge1xuICAgICAgZXhpc3Rpbmcud2FybmVkID0gdHJ1ZTtcbiAgICAgIC8vIE5vIGVycm9yIGNvZGUgZm9yIHRoaXMgc2luY2UgaXQgaXMgYSBXYXJuaW5nXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgIHZhciB3ID0gbmV3IEVycm9yKCdQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5sZW5ndGggKyAnICcgKyBTdHJpbmcodHlwZSkgKyAnIGxpc3RlbmVycyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY3JlYXNlIGxpbWl0Jyk7XG4gICAgICB3Lm5hbWUgPSAnTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nJztcbiAgICAgIHcuZW1pdHRlciA9IHRhcmdldDtcbiAgICAgIHcudHlwZSA9IHR5cGU7XG4gICAgICB3LmNvdW50ID0gZXhpc3RpbmcubGVuZ3RoO1xuICAgICAgUHJvY2Vzc0VtaXRXYXJuaW5nKHcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICByZXR1cm4gX2FkZExpc3RlbmVyKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBmYWxzZSk7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHByZXBlbmRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgcmV0dXJuIF9hZGRMaXN0ZW5lcih0aGlzLCB0eXBlLCBsaXN0ZW5lciwgdHJ1ZSk7XG4gICAgfTtcblxuZnVuY3Rpb24gb25jZVdyYXBwZXIoKSB7XG4gIGlmICghdGhpcy5maXJlZCkge1xuICAgIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSwgdGhpcy53cmFwRm4pO1xuICAgIHRoaXMuZmlyZWQgPSB0cnVlO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsIGFyZ3VtZW50cyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX29uY2VXcmFwKHRhcmdldCwgdHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIHN0YXRlID0geyBmaXJlZDogZmFsc2UsIHdyYXBGbjogdW5kZWZpbmVkLCB0YXJnZXQ6IHRhcmdldCwgdHlwZTogdHlwZSwgbGlzdGVuZXI6IGxpc3RlbmVyIH07XG4gIHZhciB3cmFwcGVkID0gb25jZVdyYXBwZXIuYmluZChzdGF0ZSk7XG4gIHdyYXBwZWQubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgc3RhdGUud3JhcEZuID0gd3JhcHBlZDtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UodHlwZSwgbGlzdGVuZXIpIHtcbiAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG4gIHRoaXMub24odHlwZSwgX29uY2VXcmFwKHRoaXMsIHR5cGUsIGxpc3RlbmVyKSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyID1cbiAgICBmdW5jdGlvbiBwcmVwZW5kT25jZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICBjaGVja0xpc3RlbmVyKGxpc3RlbmVyKTtcbiAgICAgIHRoaXMucHJlcGVuZExpc3RlbmVyKHR5cGUsIF9vbmNlV3JhcCh0aGlzLCB0eXBlLCBsaXN0ZW5lcikpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuLy8gRW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmIGFuZCBvbmx5IGlmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPVxuICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdCwgZXZlbnRzLCBwb3NpdGlvbiwgaSwgb3JpZ2luYWxMaXN0ZW5lcjtcblxuICAgICAgY2hlY2tMaXN0ZW5lcihsaXN0ZW5lcik7XG5cbiAgICAgIGV2ZW50cyA9IHRoaXMuX2V2ZW50cztcbiAgICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICAgIGxpc3QgPSBldmVudHNbdHlwZV07XG4gICAgICBpZiAobGlzdCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8IGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICgtLXRoaXMuX2V2ZW50c0NvdW50ID09PSAwKVxuICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGRlbGV0ZSBldmVudHNbdHlwZV07XG4gICAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0Lmxpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbGlzdCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwb3NpdGlvbiA9IC0xO1xuXG4gICAgICAgIGZvciAoaSA9IGxpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHwgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsTGlzdGVuZXIgPSBsaXN0W2ldLmxpc3RlbmVyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgICBpZiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgbGlzdC5zaGlmdCgpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzcGxpY2VPbmUobGlzdCwgcG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKVxuICAgICAgICAgIGV2ZW50c1t0eXBlXSA9IGxpc3RbMF07XG5cbiAgICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBvcmlnaW5hbExpc3RlbmVyIHx8IGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKHR5cGUpIHtcbiAgICAgIHZhciBsaXN0ZW5lcnMsIGV2ZW50cywgaTtcblxuICAgICAgZXZlbnRzID0gdGhpcy5fZXZlbnRzO1xuICAgICAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdGhpcztcblxuICAgICAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICAgICAgaWYgKGV2ZW50cy5yZW1vdmVMaXN0ZW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5fZXZlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnRzW3R5cGVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAoLS10aGlzLl9ldmVudHNDb3VudCA9PT0gMClcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t0eXBlXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50cyk7XG4gICAgICAgIHZhciBrZXk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgICAgICB0aGlzLl9ldmVudHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBsaXN0ZW5lcnMgPSBldmVudHNbdHlwZV07XG5cbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAobGlzdGVuZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gTElGTyBvcmRlclxuICAgICAgICBmb3IgKGkgPSBsaXN0ZW5lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuZnVuY3Rpb24gX2xpc3RlbmVycyh0YXJnZXQsIHR5cGUsIHVud3JhcCkge1xuICB2YXIgZXZlbnRzID0gdGFyZ2V0Ll9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyA9PT0gdW5kZWZpbmVkKVxuICAgIHJldHVybiBbXTtcblxuICB2YXIgZXZsaXN0ZW5lciA9IGV2ZW50c1t0eXBlXTtcbiAgaWYgKGV2bGlzdGVuZXIgPT09IHVuZGVmaW5lZClcbiAgICByZXR1cm4gW107XG5cbiAgaWYgKHR5cGVvZiBldmxpc3RlbmVyID09PSAnZnVuY3Rpb24nKVxuICAgIHJldHVybiB1bndyYXAgPyBbZXZsaXN0ZW5lci5saXN0ZW5lciB8fCBldmxpc3RlbmVyXSA6IFtldmxpc3RlbmVyXTtcblxuICByZXR1cm4gdW53cmFwID9cbiAgICB1bndyYXBMaXN0ZW5lcnMoZXZsaXN0ZW5lcikgOiBhcnJheUNsb25lKGV2bGlzdGVuZXIsIGV2bGlzdGVuZXIubGVuZ3RoKTtcbn1cblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnModHlwZSkge1xuICByZXR1cm4gX2xpc3RlbmVycyh0aGlzLCB0eXBlLCB0cnVlKTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmF3TGlzdGVuZXJzID0gZnVuY3Rpb24gcmF3TGlzdGVuZXJzKHR5cGUpIHtcbiAgcmV0dXJuIF9saXN0ZW5lcnModGhpcywgdHlwZSwgZmFsc2UpO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5saXN0ZW5lckNvdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbGlzdGVuZXJDb3VudC5jYWxsKGVtaXR0ZXIsIHR5cGUpO1xuICB9XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBsaXN0ZW5lckNvdW50O1xuZnVuY3Rpb24gbGlzdGVuZXJDb3VudCh0eXBlKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHM7XG5cbiAgaWYgKGV2ZW50cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSBldmVudHNbdHlwZV07XG5cbiAgICBpZiAodHlwZW9mIGV2bGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSBpZiAoZXZsaXN0ZW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHJldHVybiB0aGlzLl9ldmVudHNDb3VudCA+IDAgPyBSZWZsZWN0T3duS2V5cyh0aGlzLl9ldmVudHMpIDogW107XG59O1xuXG5mdW5jdGlvbiBhcnJheUNsb25lKGFyciwgbikge1xuICB2YXIgY29weSA9IG5ldyBBcnJheShuKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpXG4gICAgY29weVtpXSA9IGFycltpXTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmZ1bmN0aW9uIHNwbGljZU9uZShsaXN0LCBpbmRleCkge1xuICBmb3IgKDsgaW5kZXggKyAxIDwgbGlzdC5sZW5ndGg7IGluZGV4KyspXG4gICAgbGlzdFtpbmRleF0gPSBsaXN0W2luZGV4ICsgMV07XG4gIGxpc3QucG9wKCk7XG59XG5cbmZ1bmN0aW9uIHVud3JhcExpc3RlbmVycyhhcnIpIHtcbiAgdmFyIHJldCA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXQubGVuZ3RoOyArK2kpIHtcbiAgICByZXRbaV0gPSBhcnJbaV0ubGlzdGVuZXIgfHwgYXJyW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIG9uY2UoZW1pdHRlciwgbmFtZSkge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGVycm9yTGlzdGVuZXIoZXJyKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyKG5hbWUsIHJlc29sdmVyKTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc29sdmVyKCkge1xuICAgICAgaWYgKHR5cGVvZiBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JMaXN0ZW5lcik7XG4gICAgICB9XG4gICAgICByZXNvbHZlKFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgfTtcblxuICAgIGV2ZW50VGFyZ2V0QWdub3N0aWNBZGRMaXN0ZW5lcihlbWl0dGVyLCBuYW1lLCByZXNvbHZlciwgeyBvbmNlOiB0cnVlIH0pO1xuICAgIGlmIChuYW1lICE9PSAnZXJyb3InKSB7XG4gICAgICBhZGRFcnJvckhhbmRsZXJJZkV2ZW50RW1pdHRlcihlbWl0dGVyLCBlcnJvckxpc3RlbmVyLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gYWRkRXJyb3JIYW5kbGVySWZFdmVudEVtaXR0ZXIoZW1pdHRlciwgaGFuZGxlciwgZmxhZ3MpIHtcbiAgaWYgKHR5cGVvZiBlbWl0dGVyLm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZXZlbnRUYXJnZXRBZ25vc3RpY0FkZExpc3RlbmVyKGVtaXR0ZXIsICdlcnJvcicsIGhhbmRsZXIsIGZsYWdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBldmVudFRhcmdldEFnbm9zdGljQWRkTGlzdGVuZXIoZW1pdHRlciwgbmFtZSwgbGlzdGVuZXIsIGZsYWdzKSB7XG4gIGlmICh0eXBlb2YgZW1pdHRlci5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICBlbWl0dGVyLm9uY2UobmFtZSwgbGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0dGVyLm9uKG5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVtaXR0ZXIuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIEV2ZW50VGFyZ2V0IGRvZXMgbm90IGhhdmUgYGVycm9yYCBldmVudCBzZW1hbnRpY3MgbGlrZSBOb2RlXG4gICAgLy8gRXZlbnRFbWl0dGVycywgd2UgZG8gbm90IGxpc3RlbiBmb3IgYGVycm9yYCBldmVudHMgaGVyZS5cbiAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZnVuY3Rpb24gd3JhcExpc3RlbmVyKGFyZykge1xuICAgICAgLy8gSUUgZG9lcyBub3QgaGF2ZSBidWlsdGluIGB7IG9uY2U6IHRydWUgfWAgc3VwcG9ydCBzbyB3ZVxuICAgICAgLy8gaGF2ZSB0byBkbyBpdCBtYW51YWxseS5cbiAgICAgIGlmIChmbGFncy5vbmNlKSB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCB3cmFwTGlzdGVuZXIpO1xuICAgICAgfVxuICAgICAgbGlzdGVuZXIoYXJnKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJlbWl0dGVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEV2ZW50RW1pdHRlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIGVtaXR0ZXIpO1xuICB9XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERyb3BEb3duIHtcbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLmVsID0gZWw7XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuZWwub24oJ3Nob3cuYnMuZHJvcGRvd24nLCAoZSwgZWwpID0+IHtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICAkKGAjJHtlbH1gKS5maW5kKCcuZHJvcGRvd24tbWVudScpLmZpcnN0KCkuc3RvcCh0cnVlLCB0cnVlKVxuICAgICAgICAgIC5zbGlkZURvd24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoZS50YXJnZXQpLmZpbmQoJy5kcm9wZG93bi1tZW51JykuZmlyc3QoKS5zdG9wKHRydWUsIHRydWUpXG4gICAgICAgICAgLnNsaWRlRG93bigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5lbC5vbignaGlkZS5icy5kcm9wZG93bicsIChlLCBlbCkgPT4ge1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgICQoYCMke2VsfWApLmZpbmQoJy5kcm9wZG93bi1tZW51JykuZmlyc3QoKS5zdG9wKHRydWUsIHRydWUpXG4gICAgICAgICAgLnNsaWRlVXAoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQoZS50YXJnZXQpLmZpbmQoJy5kcm9wZG93bi1tZW51JykuZmlyc3QoKS5zdG9wKHRydWUsIHRydWUpXG4gICAgICAgICAgLnNsaWRlVXAoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZWwuZmluZCgnc2VsZWN0LmxpbmsnKS5lYWNoKChpZHgsIGVsKSA9PiB7XG4gICAgICAkKGVsKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSAkKHRoaXMpLnZhbCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjAgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqL1xuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9ybSB7XG4gIGluaXQoKSB7XG4gICAgdGhpcy5wYXJlbnRGb2N1cygpO1xuICAgIHRoaXMudG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KCk7XG4gIH1cblxuICBwYXJlbnRGb2N1cygpIHtcbiAgICAkKCcuanMtY2hpbGQtZm9jdXMnKS5vbignZm9jdXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5qcy1wYXJlbnQtZm9jdXMnKS5hZGRDbGFzcygnZm9jdXMnKTtcbiAgICB9KTtcbiAgICAkKCcuanMtY2hpbGQtZm9jdXMnKS5vbignZm9jdXNvdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5qcy1wYXJlbnQtZm9jdXMnKS5yZW1vdmVDbGFzcygnZm9jdXMnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZVBhc3N3b3JkVmlzaWJpbGl0eSgpIHtcbiAgICAkKCdidXR0b25bZGF0YS1hY3Rpb249XCJzaG93LXBhc3N3b3JkXCJdJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZWxtID0gJCh0aGlzKS5jbG9zZXN0KCcuaW5wdXQtZ3JvdXAnKS5jaGlsZHJlbignaW5wdXQuanMtdmlzaWJsZS1wYXNzd29yZCcpO1xuXG4gICAgICBpZiAoZWxtLmF0dHIoJ3R5cGUnKSA9PT0gJ3Bhc3N3b3JkJykge1xuICAgICAgICBlbG0uYXR0cigndHlwZScsICd0ZXh0Jyk7XG4gICAgICAgICQodGhpcykudGV4dCgkKHRoaXMpLmRhdGEoJ3RleHRIaWRlJykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxtLmF0dHIoJ3R5cGUnLCAncGFzc3dvcmQnKTtcbiAgICAgICAgJCh0aGlzKS50ZXh0KCQodGhpcykuZGF0YSgndGV4dFNob3cnKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8qIGdsb2JhbCB3aW5kb3csIGV4cG9ydHMsIGRlZmluZSAqL1xuXG4hZnVuY3Rpb24oKSB7XG4gICAgJ3VzZSBzdHJpY3QnXG5cbiAgICB2YXIgcmUgPSB7XG4gICAgICAgIG5vdF9zdHJpbmc6IC9bXnNdLyxcbiAgICAgICAgbm90X2Jvb2w6IC9bXnRdLyxcbiAgICAgICAgbm90X3R5cGU6IC9bXlRdLyxcbiAgICAgICAgbm90X3ByaW1pdGl2ZTogL1tedl0vLFxuICAgICAgICBudW1iZXI6IC9bZGllZmddLyxcbiAgICAgICAgbnVtZXJpY19hcmc6IC9bYmNkaWVmZ3V4WF0vLFxuICAgICAgICBqc29uOiAvW2pdLyxcbiAgICAgICAgbm90X2pzb246IC9bXmpdLyxcbiAgICAgICAgdGV4dDogL15bXlxceDI1XSsvLFxuICAgICAgICBtb2R1bG86IC9eXFx4MjV7Mn0vLFxuICAgICAgICBwbGFjZWhvbGRlcjogL15cXHgyNSg/OihbMS05XVxcZCopXFwkfFxcKChbXildKylcXCkpPyhcXCspPygwfCdbXiRdKT8oLSk/KFxcZCspPyg/OlxcLihcXGQrKSk/KFtiLWdpam9zdFR1dnhYXSkvLFxuICAgICAgICBrZXk6IC9eKFthLXpfXVthLXpfXFxkXSopL2ksXG4gICAgICAgIGtleV9hY2Nlc3M6IC9eXFwuKFthLXpfXVthLXpfXFxkXSopL2ksXG4gICAgICAgIGluZGV4X2FjY2VzczogL15cXFsoXFxkKylcXF0vLFxuICAgICAgICBzaWduOiAvXlsrLV0vXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3ByaW50ZihrZXkpIHtcbiAgICAgICAgLy8gYGFyZ3VtZW50c2AgaXMgbm90IGFuIGFycmF5LCBidXQgc2hvdWxkIGJlIGZpbmUgZm9yIHRoaXMgY2FsbFxuICAgICAgICByZXR1cm4gc3ByaW50Zl9mb3JtYXQoc3ByaW50Zl9wYXJzZShrZXkpLCBhcmd1bWVudHMpXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdnNwcmludGYoZm10LCBhcmd2KSB7XG4gICAgICAgIHJldHVybiBzcHJpbnRmLmFwcGx5KG51bGwsIFtmbXRdLmNvbmNhdChhcmd2IHx8IFtdKSlcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzcHJpbnRmX2Zvcm1hdChwYXJzZV90cmVlLCBhcmd2KSB7XG4gICAgICAgIHZhciBjdXJzb3IgPSAxLCB0cmVlX2xlbmd0aCA9IHBhcnNlX3RyZWUubGVuZ3RoLCBhcmcsIG91dHB1dCA9ICcnLCBpLCBrLCBwaCwgcGFkLCBwYWRfY2hhcmFjdGVyLCBwYWRfbGVuZ3RoLCBpc19wb3NpdGl2ZSwgc2lnblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdHJlZV9sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZV90cmVlW2ldID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBwYXJzZV90cmVlW2ldXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcGFyc2VfdHJlZVtpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBwaCA9IHBhcnNlX3RyZWVbaV0gLy8gY29udmVuaWVuY2UgcHVycG9zZXMgb25seVxuICAgICAgICAgICAgICAgIGlmIChwaC5rZXlzKSB7IC8vIGtleXdvcmQgYXJndW1lbnRcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndltjdXJzb3JdXG4gICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwaC5rZXlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihzcHJpbnRmKCdbc3ByaW50Zl0gQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSBcIiVzXCIgb2YgdW5kZWZpbmVkIHZhbHVlIFwiJXNcIicsIHBoLmtleXNba10sIHBoLmtleXNbay0xXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmdbcGgua2V5c1trXV1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwaC5wYXJhbV9ubykgeyAvLyBwb3NpdGlvbmFsIGFyZ3VtZW50IChleHBsaWNpdClcbiAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndltwaC5wYXJhbV9ub11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7IC8vIHBvc2l0aW9uYWwgYXJndW1lbnQgKGltcGxpY2l0KVxuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmd2W2N1cnNvcisrXVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5ub3RfdHlwZS50ZXN0KHBoLnR5cGUpICYmIHJlLm5vdF9wcmltaXRpdmUudGVzdChwaC50eXBlKSAmJiBhcmcgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcoKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZS5udW1lcmljX2FyZy50ZXN0KHBoLnR5cGUpICYmICh0eXBlb2YgYXJnICE9PSAnbnVtYmVyJyAmJiBpc05hTihhcmcpKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNwcmludGYoJ1tzcHJpbnRmXSBleHBlY3RpbmcgbnVtYmVyIGJ1dCBmb3VuZCAlVCcsIGFyZykpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlLm51bWJlci50ZXN0KHBoLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzX3Bvc2l0aXZlID0gYXJnID49IDBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBoLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKS50b1N0cmluZygyKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGFyZywgMTApKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGFyc2VJbnQoYXJnLCAxMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2onOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gSlNPTi5zdHJpbmdpZnkoYXJnLCBudWxsLCBwaC53aWR0aCA/IHBhcnNlSW50KHBoLndpZHRoKSA6IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBoLnByZWNpc2lvbiA/IHBhcnNlRmxvYXQoYXJnKS50b0V4cG9uZW50aWFsKHBoLnByZWNpc2lvbikgOiBwYXJzZUZsb2F0KGFyZykudG9FeHBvbmVudGlhbCgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IHBoLnByZWNpc2lvbiA/IHBhcnNlRmxvYXQoYXJnKS50b0ZpeGVkKHBoLnByZWNpc2lvbikgOiBwYXJzZUZsb2F0KGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2cnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gcGgucHJlY2lzaW9uID8gU3RyaW5nKE51bWJlcihhcmcudG9QcmVjaXNpb24ocGgucHJlY2lzaW9uKSkpIDogcGFyc2VGbG9hdChhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwYXJzZUludChhcmcsIDEwKSA+Pj4gMCkudG9TdHJpbmcoOClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gU3RyaW5nKGFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IFN0cmluZyghIWFyZylcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IChwaC5wcmVjaXNpb24gPyBhcmcuc3Vic3RyaW5nKDAsIHBoLnByZWNpc2lvbikgOiBhcmcpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdUJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpLnNsaWNlKDgsIC0xKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBwYXJzZUludChhcmcsIDEwKSA+Pj4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndic6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSBhcmcudmFsdWVPZigpXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGgucHJlY2lzaW9uID8gYXJnLnN1YnN0cmluZygwLCBwaC5wcmVjaXNpb24pIDogYXJnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGFyc2VJbnQoYXJnLCAxMCkgPj4+IDApLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgPSAocGFyc2VJbnQoYXJnLCAxMCkgPj4+IDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmUuanNvbi50ZXN0KHBoLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBhcmdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZS5udW1iZXIudGVzdChwaC50eXBlKSAmJiAoIWlzX3Bvc2l0aXZlIHx8IHBoLnNpZ24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gaXNfcG9zaXRpdmUgPyAnKycgOiAnLSdcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy50b1N0cmluZygpLnJlcGxhY2UocmUuc2lnbiwgJycpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduID0gJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYWRfY2hhcmFjdGVyID0gcGgucGFkX2NoYXIgPyBwaC5wYWRfY2hhciA9PT0gJzAnID8gJzAnIDogcGgucGFkX2NoYXIuY2hhckF0KDEpIDogJyAnXG4gICAgICAgICAgICAgICAgICAgIHBhZF9sZW5ndGggPSBwaC53aWR0aCAtIChzaWduICsgYXJnKS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgcGFkID0gcGgud2lkdGggPyAocGFkX2xlbmd0aCA+IDAgPyBwYWRfY2hhcmFjdGVyLnJlcGVhdChwYWRfbGVuZ3RoKSA6ICcnKSA6ICcnXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBwaC5hbGlnbiA/IHNpZ24gKyBhcmcgKyBwYWQgOiAocGFkX2NoYXJhY3RlciA9PT0gJzAnID8gc2lnbiArIHBhZCArIGFyZyA6IHBhZCArIHNpZ24gKyBhcmcpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXRwdXRcbiAgICB9XG5cbiAgICB2YXIgc3ByaW50Zl9jYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICAgIGZ1bmN0aW9uIHNwcmludGZfcGFyc2UoZm10KSB7XG4gICAgICAgIGlmIChzcHJpbnRmX2NhY2hlW2ZtdF0pIHtcbiAgICAgICAgICAgIHJldHVybiBzcHJpbnRmX2NhY2hlW2ZtdF1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfZm10ID0gZm10LCBtYXRjaCwgcGFyc2VfdHJlZSA9IFtdLCBhcmdfbmFtZXMgPSAwXG4gICAgICAgIHdoaWxlIChfZm10KSB7XG4gICAgICAgICAgICBpZiAoKG1hdGNoID0gcmUudGV4dC5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaChtYXRjaFswXSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKChtYXRjaCA9IHJlLm1vZHVsby5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcnNlX3RyZWUucHVzaCgnJScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICgobWF0Y2ggPSByZS5wbGFjZWhvbGRlci5leGVjKF9mbXQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMVxuICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGRfbGlzdCA9IFtdLCByZXBsYWNlbWVudF9maWVsZCA9IG1hdGNoWzJdLCBmaWVsZF9tYXRjaCA9IFtdXG4gICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGRfbWF0Y2ggPSByZS5rZXkuZXhlYyhyZXBsYWNlbWVudF9maWVsZCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHJlcGxhY2VtZW50X2ZpZWxkID0gcmVwbGFjZW1lbnRfZmllbGQuc3Vic3RyaW5nKGZpZWxkX21hdGNoWzBdLmxlbmd0aCkpICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZmllbGRfbWF0Y2ggPSByZS5rZXlfYWNjZXNzLmV4ZWMocmVwbGFjZW1lbnRfZmllbGQpKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9saXN0LnB1c2goZmllbGRfbWF0Y2hbMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChmaWVsZF9tYXRjaCA9IHJlLmluZGV4X2FjY2Vzcy5leGVjKHJlcGxhY2VtZW50X2ZpZWxkKSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbGlzdC5wdXNoKGZpZWxkX21hdGNoWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleScpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdbc3ByaW50Zl0gZmFpbGVkIHRvIHBhcnNlIG5hbWVkIGFyZ3VtZW50IGtleScpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hbMl0gPSBmaWVsZF9saXN0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBhcmdfbmFtZXMgfD0gMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYXJnX25hbWVzID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW3NwcmludGZdIG1peGluZyBwb3NpdGlvbmFsIGFuZCBuYW1lZCBwbGFjZWhvbGRlcnMgaXMgbm90ICh5ZXQpIHN1cHBvcnRlZCcpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGFyc2VfdHJlZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogbWF0Y2hbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV9ubzogICAgbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiAgICAgICAgbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduOiAgICAgICAgbWF0Y2hbM10sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRfY2hhcjogICAgbWF0Y2hbNF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogICAgICAgbWF0Y2hbNV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogICAgICAgbWF0Y2hbNl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb246ICAgbWF0Y2hbN10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAgICAgICAgbWF0Y2hbOF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignW3NwcmludGZdIHVuZXhwZWN0ZWQgcGxhY2Vob2xkZXInKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2ZtdCA9IF9mbXQuc3Vic3RyaW5nKG1hdGNoWzBdLmxlbmd0aClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3ByaW50Zl9jYWNoZVtmbXRdID0gcGFyc2VfdHJlZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGV4cG9ydCB0byBlaXRoZXIgYnJvd3NlciBvciBub2RlLmpzXG4gICAgICovXG4gICAgLyogZXNsaW50LWRpc2FibGUgcXVvdGUtcHJvcHMgKi9cbiAgICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGV4cG9ydHNbJ3NwcmludGYnXSA9IHNwcmludGZcbiAgICAgICAgZXhwb3J0c1sndnNwcmludGYnXSA9IHZzcHJpbnRmXG4gICAgfVxuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB3aW5kb3dbJ3NwcmludGYnXSA9IHNwcmludGZcbiAgICAgICAgd2luZG93Wyd2c3ByaW50ZiddID0gdnNwcmludGZcblxuICAgICAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmVbJ2FtZCddKSB7XG4gICAgICAgICAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgJ3NwcmludGYnOiBzcHJpbnRmLFxuICAgICAgICAgICAgICAgICAgICAndnNwcmludGYnOiB2c3ByaW50ZlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBxdW90ZS1wcm9wcyAqL1xufSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4iLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cblxuaW1wb3J0IHtzcHJpbnRmfSBmcm9tICdzcHJpbnRmLWpzJztcblxuY29uc3Qge3Bhc3N3b3JkUG9saWN5OiBQYXNzd29yZFBvbGljeU1hcH0gPSBwcmVzdGFzaG9wLnRoZW1lU2VsZWN0b3JzO1xuXG5jb25zdCBQQVNTV09SRF9QT0xJQ1lfRVJST1IgPSAnVGhlIHBhc3N3b3JkIHBvbGljeSBlbGVtZW50cyBhcmUgdW5kZWZpbmVkLic7XG5cbmNvbnN0IGdldFBhc3N3b3JkU3RyZW5ndGhGZWVkYmFjayA9IChcbiAgc3RyZW5ndGgsXG4pID0+IHtcbiAgc3dpdGNoIChzdHJlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yOiAnYmctZGFuZ2VyJyxcbiAgICAgIH07XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2xvcjogJ2JnLWRhbmdlcicsXG4gICAgICB9O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29sb3I6ICdiZy13YXJuaW5nJyxcbiAgICAgIH07XG5cbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2xvcjogJ2JnLXN1Y2Nlc3MnLFxuICAgICAgfTtcblxuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbG9yOiAnYmctc3VjY2VzcycsXG4gICAgICB9O1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXNzd29yZCBzdHJlbmd0aCBpbmRpY2F0b3IuJyk7XG4gIH1cbn07XG5cbmNvbnN0IHdhdGNoUGFzc3dvcmQgPSBhc3luYyAoXG4gIGVsZW1lbnRJbnB1dCxcbiAgZmVlZGJhY2tDb250YWluZXIsXG4gIGhpbnRzLFxuKSA9PiB7XG4gIGNvbnN0IHtwcmVzdGFzaG9wfSA9IHdpbmRvdztcbiAgY29uc3QgcGFzc3dvcmRWYWx1ZSA9IGVsZW1lbnRJbnB1dC52YWx1ZTtcbiAgY29uc3QgZWxlbWVudEljb24gPSBmZWVkYmFja0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLnJlcXVpcmVtZW50U2NvcmVJY29uKTtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJlc3Rhc2hvcC5jaGVja1Bhc3N3b3JkU2NvcmUocGFzc3dvcmRWYWx1ZSk7XG4gIGNvbnN0IGZlZWRiYWNrID0gZ2V0UGFzc3dvcmRTdHJlbmd0aEZlZWRiYWNrKHJlc3VsdC5zY29yZSk7XG4gIGNvbnN0IHBhc3N3b3JkTGVuZ3RoID0gcGFzc3dvcmRWYWx1ZS5sZW5ndGg7XG4gIGNvbnN0IHBvcG92ZXJDb250ZW50ID0gW107XG5cbiAgJChlbGVtZW50SW5wdXQpLnBvcG92ZXIoJ2Rpc3Bvc2UnKTtcblxuICBmZWVkYmFja0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gcGFzc3dvcmRWYWx1ZSA9PT0gJycgPyAnbm9uZScgOiAnYmxvY2snO1xuXG4gIGlmIChyZXN1bHQuZmVlZGJhY2sud2FybmluZyAhPT0gJycpIHtcbiAgICBpZiAocmVzdWx0LmZlZWRiYWNrLndhcm5pbmcgaW4gaGludHMpIHtcbiAgICAgIHBvcG92ZXJDb250ZW50LnB1c2goaGludHNbcmVzdWx0LmZlZWRiYWNrLndhcm5pbmddKTtcbiAgICB9XG4gIH1cblxuICByZXN1bHQuZmVlZGJhY2suc3VnZ2VzdGlvbnMuZm9yRWFjaCgoc3VnZ2VzdGlvbikgPT4ge1xuICAgIGlmIChzdWdnZXN0aW9uIGluIGhpbnRzKSB7XG4gICAgICBwb3BvdmVyQ29udGVudC5wdXNoKGhpbnRzW3N1Z2dlc3Rpb25dKTtcbiAgICB9XG4gIH0pO1xuXG4gICQoZWxlbWVudElucHV0KS5wb3BvdmVyKHtcbiAgICBodG1sOiB0cnVlLFxuICAgIHBsYWNlbWVudDogJ3RvcCcsXG4gICAgY29udGVudDogcG9wb3ZlckNvbnRlbnQuam9pbignPGJyLz4nKSxcbiAgfSkucG9wb3Zlcignc2hvdycpO1xuXG4gIGNvbnN0IHBhc3N3b3JkTGVuZ3RoVmFsaWQgPSBwYXNzd29yZExlbmd0aCA+PSBwYXJzZUludChlbGVtZW50SW5wdXQuZGF0YXNldC5taW5sZW5ndGgsIDEwKVxuICAgICYmIHBhc3N3b3JkTGVuZ3RoIDw9IHBhcnNlSW50KGVsZW1lbnRJbnB1dC5kYXRhc2V0Lm1heGxlbmd0aCwgMTApO1xuICBjb25zdCBwYXNzd29yZFNjb3JlVmFsaWQgPSBwYXJzZUludChlbGVtZW50SW5wdXQuZGF0YXNldC5taW5zY29yZSwgMTApIDw9IHJlc3VsdC5zY29yZTtcblxuICBmZWVkYmFja0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLnJlcXVpcmVtZW50TGVuZ3RoSWNvbikuY2xhc3NMaXN0LnRvZ2dsZShcbiAgICAndGV4dC1zdWNjZXNzJyxcbiAgICBwYXNzd29yZExlbmd0aFZhbGlkLFxuICApO1xuXG4gIGVsZW1lbnRJY29uLmNsYXNzTGlzdC50b2dnbGUoXG4gICAgJ3RleHQtc3VjY2VzcycsXG4gICAgcGFzc3dvcmRTY29yZVZhbGlkLFxuICApO1xuXG4gIC8vIENoYW5nZSBpbnB1dCBib3JkZXIgY29sb3IgZGVwZW5kaW5nIG9uIHRoZSB2YWxpZGl0eVxuICBlbGVtZW50SW5wdXRcbiAgICAuY2xhc3NMaXN0LnJlbW92ZSgnYm9yZGVyLXN1Y2Nlc3MnLCAnYm9yZGVyLWRhbmdlcicpO1xuICBlbGVtZW50SW5wdXRcbiAgICAuY2xhc3NMaXN0LmFkZChwYXNzd29yZFNjb3JlVmFsaWQgJiYgcGFzc3dvcmRMZW5ndGhWYWxpZCA/ICdib3JkZXItc3VjY2VzcycgOiAnYm9yZGVyLWRhbmdlcicpO1xuICBlbGVtZW50SW5wdXRcbiAgICAuY2xhc3NMaXN0LmFkZCgnZm9ybS1jb250cm9sJywgJ2JvcmRlcicpO1xuXG4gIGNvbnN0IHBlcmNlbnRhZ2UgPSAocmVzdWx0LnNjb3JlICogMjApICsgMjA7XG4gIGNvbnN0IHByb2dyZXNzQmFyID0gZmVlZGJhY2tDb250YWluZXIucXVlcnlTZWxlY3RvcihQYXNzd29yZFBvbGljeU1hcC5wcm9ncmVzc0Jhcik7XG5cbiAgLy8gaW5jcmVhc2UgYW5kIGRlY3JlYXNlIHByb2dyZXNzIGJhclxuICBpZiAocHJvZ3Jlc3NCYXIpIHtcbiAgICBwcm9ncmVzc0Jhci5zdHlsZS53aWR0aCA9IGAke3BlcmNlbnRhZ2V9JWA7XG4gICAgcHJvZ3Jlc3NCYXIuY2xhc3NMaXN0LnJlbW92ZSgnYmctc3VjY2VzcycsICdiZy1kYW5nZXInLCAnYmctd2FybmluZycpO1xuICAgIHByb2dyZXNzQmFyLmNsYXNzTGlzdC5hZGQoZmVlZGJhY2suY29sb3IpO1xuICB9XG59O1xuXG4vLyBOb3QgdGVzdGFibGUgYmVjYXVzZSBpdCBtYW5pcHVsYXRlcyBTVkcgZWxlbWVudHMsIHVuc3VwcG9ydGVkIGJ5IEpTRG9tXG5jb25zdCB1c2VQYXNzd29yZFBvbGljeSA9IChzZWxlY3RvcikgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgaW5wdXRDb2x1bW4gPSBlbGVtZW50Py5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLmlucHV0Q29sdW1uKTtcbiAgICBjb25zdCBlbGVtZW50SW5wdXQgPSBlbGVtZW50Py5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIGNvbnN0IHRlbXBsYXRlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnN0IGZlZWRiYWNrVGVtcGxhdGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLnRlbXBsYXRlKTtcbiAgICBsZXQgZmVlZGJhY2tDb250YWluZXI7XG5cbiAgICBpZiAoZmVlZGJhY2tUZW1wbGF0ZSAmJiBlbGVtZW50ICYmIGlucHV0Q29sdW1uICYmIGVsZW1lbnRJbnB1dCkge1xuICAgICAgdGVtcGxhdGVFbGVtZW50LmlubmVySFRNTCA9IGZlZWRiYWNrVGVtcGxhdGUuaW5uZXJIVE1MO1xuICAgICAgaW5wdXRDb2x1bW4uYXBwZW5kKHRlbXBsYXRlRWxlbWVudCk7XG4gICAgICBmZWVkYmFja0NvbnRhaW5lciA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcihQYXNzd29yZFBvbGljeU1hcC5jb250YWluZXIpO1xuXG4gICAgICBpZiAoZmVlZGJhY2tDb250YWluZXIpIHtcbiAgICAgICAgY29uc3QgaGludEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFBhc3N3b3JkUG9saWN5TWFwLmhpbnQpO1xuXG4gICAgICAgIGlmIChoaW50RWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGhpbnRzID0gSlNPTi5wYXJzZShoaW50RWxlbWVudC5pbm5lckhUTUwpO1xuXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgICBjb25zdCBwYXNzd29yZFJlcXVpcmVtZW50c0xlbmd0aCA9IGZlZWRiYWNrQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoUGFzc3dvcmRQb2xpY3lNYXAucmVxdWlyZW1lbnRMZW5ndGgpO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBtYXgtbGVuXG4gICAgICAgICAgY29uc3QgcGFzc3dvcmRSZXF1aXJlbWVudHNTY29yZSA9IGZlZWRiYWNrQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoUGFzc3dvcmRQb2xpY3lNYXAucmVxdWlyZW1lbnRTY29yZSk7XG4gICAgICAgICAgY29uc3QgcGFzc3dvcmRMZW5ndGhUZXh0ID0gcGFzc3dvcmRSZXF1aXJlbWVudHNMZW5ndGg/LnF1ZXJ5U2VsZWN0b3IoJ3NwYW4nKTtcbiAgICAgICAgICBjb25zdCBwYXNzd29yZFJlcXVpcmVtZW50c1RleHQgPSBwYXNzd29yZFJlcXVpcmVtZW50c1Njb3JlPy5xdWVyeVNlbGVjdG9yKCdzcGFuJyk7XG5cbiAgICAgICAgICBpZiAocGFzc3dvcmRMZW5ndGhUZXh0ICYmIHBhc3N3b3JkUmVxdWlyZW1lbnRzTGVuZ3RoICYmIHBhc3N3b3JkUmVxdWlyZW1lbnRzTGVuZ3RoLmRhdGFzZXQudHJhbnNsYXRpb24pIHtcbiAgICAgICAgICAgIHBhc3N3b3JkTGVuZ3RoVGV4dC5pbm5lclRleHQgPSBzcHJpbnRmKFxuICAgICAgICAgICAgICBwYXNzd29yZFJlcXVpcmVtZW50c0xlbmd0aC5kYXRhc2V0LnRyYW5zbGF0aW9uLFxuICAgICAgICAgICAgICBlbGVtZW50SW5wdXQuZGF0YXNldC5taW5sZW5ndGgsXG4gICAgICAgICAgICAgIGVsZW1lbnRJbnB1dC5kYXRhc2V0Lm1heGxlbmd0aCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHBhc3N3b3JkUmVxdWlyZW1lbnRzVGV4dCAmJiBwYXNzd29yZFJlcXVpcmVtZW50c1Njb3JlICYmIHBhc3N3b3JkUmVxdWlyZW1lbnRzU2NvcmUuZGF0YXNldC50cmFuc2xhdGlvbikge1xuICAgICAgICAgICAgcGFzc3dvcmRSZXF1aXJlbWVudHNUZXh0LmlubmVyVGV4dCA9IHNwcmludGYoXG4gICAgICAgICAgICAgIHBhc3N3b3JkUmVxdWlyZW1lbnRzU2NvcmUuZGF0YXNldC50cmFuc2xhdGlvbixcbiAgICAgICAgICAgICAgaGludHNbZWxlbWVudElucHV0LmRhdGFzZXQubWluc2NvcmVdLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAgIGVsZW1lbnRJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsICgpID0+IHdhdGNoUGFzc3dvcmQoZWxlbWVudElucHV0LCBmZWVkYmFja0NvbnRhaW5lciwgaGludHMpKTtcbiAgICAgICAgICBlbGVtZW50SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcbiAgICAgICAgICAgICQoZWxlbWVudElucHV0KS5wb3BvdmVyKCdkaXNwb3NlJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGVycm9yOiBuZXcgRXJyb3IoUEFTU1dPUkRfUE9MSUNZX0VSUk9SKSxcbiAgICB9O1xuICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHVzZVBhc3N3b3JkUG9saWN5O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgc2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIFByZXN0YVNob3AgaXMgYW4gSW50ZXJuYXRpb25hbCBSZWdpc3RlcmVkIFRyYWRlbWFyayAmIFByb3BlcnR5IG9mIFByZXN0YVNob3AgU0FcbiAqXG4gKiBOT1RJQ0UgT0YgTElDRU5TRVxuICpcbiAqIFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqIHRoYXQgaXMgYnVuZGxlZCB3aXRoIHRoaXMgcGFja2FnZSBpbiB0aGUgZmlsZSBMSUNFTlNFLm1kLlxuICogSXQgaXMgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIgYXQgdGhpcyBVUkw6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjBcbiAqIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGFuZCBhcmUgdW5hYmxlIHRvXG4gKiBvYnRhaW4gaXQgdGhyb3VnaCB0aGUgd29ybGQtd2lkZS13ZWIsIHBsZWFzZSBzZW5kIGFuIGVtYWlsXG4gKiB0byBsaWNlbnNlQHByZXN0YXNob3AuY29tIHNvIHdlIGNhbiBzZW5kIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuXG4gKlxuICogRElTQ0xBSU1FUlxuICpcbiAqIERvIG5vdCBlZGl0IG9yIGFkZCB0byB0aGlzIGZpbGUgaWYgeW91IHdpc2ggdG8gdXBncmFkZSBQcmVzdGFTaG9wIHRvIG5ld2VyXG4gKiB2ZXJzaW9ucyBpbiB0aGUgZnV0dXJlLiBJZiB5b3Ugd2lzaCB0byBjdXN0b21pemUgUHJlc3RhU2hvcCBmb3IgeW91clxuICogbmVlZHMgcGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZGV2ZG9jcy5wcmVzdGFzaG9wLmNvbS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQGF1dGhvciAgICBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnMgPGNvbnRhY3RAcHJlc3Rhc2hvcC5jb20+XG4gKiBAY29weXJpZ2h0IFNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBAbGljZW5zZSAgIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMCBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICovXG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHByZXN0YXNob3AgZnJvbSAncHJlc3Rhc2hvcCc7XG5pbXBvcnQgRHJvcERvd24gZnJvbSAnLi9kcm9wLWRvd24nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUb3BNZW51IGV4dGVuZHMgRHJvcERvd24ge1xuICBpbml0KCkge1xuICAgIGxldCBlbG10Q2xhc3M7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy5lbC5maW5kKCdsaScpLm9uKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCAoZSkgPT4ge1xuICAgICAgaWYgKHRoaXMuZWwucGFyZW50KCkuaGFzQ2xhc3MoJ21vYmlsZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRUYXJnZXRDbGFzcyA9ICQoZS5jdXJyZW50VGFyZ2V0KS5hdHRyKCdjbGFzcycpO1xuXG4gICAgICBpZiAoZWxtdENsYXNzICE9PSBjdXJyZW50VGFyZ2V0Q2xhc3MpIHtcbiAgICAgICAgY29uc3QgY2xhc3Nlc1NlbGVjdGVkID0gQXJyYXkucHJvdG90eXBlLnNsaWNlXG4gICAgICAgICAgLmNhbGwoZS5jdXJyZW50VGFyZ2V0LmNsYXNzTGlzdClcbiAgICAgICAgICAubWFwKChlbGVtKSA9PiAodHlwZW9mIGVsZW0gPT09ICdzdHJpbmcnID8gYC4ke2VsZW19YCA6IGZhbHNlKSk7XG5cbiAgICAgICAgZWxtdENsYXNzID0gY2xhc3Nlc1NlbGVjdGVkLmpvaW4oJycpO1xuXG4gICAgICAgIGlmIChlbG10Q2xhc3MgJiYgJChlLnRhcmdldCkuZGF0YSgnZGVwdGgnKSA9PT0gMCkge1xuICAgICAgICAgICQoYCR7ZWxtdENsYXNzfSAuanMtc3ViLW1lbnVgKS5jc3Moe1xuICAgICAgICAgICAgdG9wOiAkKGAke2VsbXRDbGFzc31gKS5oZWlnaHQoKSArICQoYCR7ZWxtdENsYXNzfWApLnBvc2l0aW9uKCkudG9wLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgJCgnI21lbnUtaWNvbicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICQoJyNtb2JpbGVfdG9wX21lbnVfd3JhcHBlcicpLnRvZ2dsZSgpO1xuICAgICAgc2VsZi50b2dnbGVNb2JpbGVNZW51KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmVsLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBpZiAodGhpcy5lbC5wYXJlbnQoKS5oYXNDbGFzcygnbW9iaWxlJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcblxuICAgIHByZXN0YXNob3Aub24oJ3Jlc3BvbnNpdmUgdXBkYXRlJywgKCkgPT4ge1xuICAgICAgJCgnLmpzLXN1Yi1tZW51JykucmVtb3ZlQXR0cignc3R5bGUnKTtcbiAgICAgIHNlbGYudG9nZ2xlTW9iaWxlTWVudSgpO1xuICAgIH0pO1xuICAgIHN1cGVyLmluaXQoKTtcbiAgfVxuXG4gIHRvZ2dsZU1vYmlsZU1lbnUoKSB7XG4gICAgJCgnI2hlYWRlcicpLnRvZ2dsZUNsYXNzKCdpcy1vcGVuJyk7XG4gICAgaWYgKCQoJyNtb2JpbGVfdG9wX21lbnVfd3JhcHBlcicpLmlzKCc6dmlzaWJsZScpKSB7XG4gICAgICAkKCcjbm90aWZpY2F0aW9ucywgI3dyYXBwZXIsICNmb290ZXInKS5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICQoJyNub3RpZmljYXRpb25zLCAjd3JhcHBlciwgI2Zvb3RlcicpLnNob3coKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IHNpbmNlIDIwMDcgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzXG4gKiBQcmVzdGFTaG9wIGlzIGFuIEludGVybmF0aW9uYWwgUmVnaXN0ZXJlZCBUcmFkZW1hcmsgJiBQcm9wZXJ0eSBvZiBQcmVzdGFTaG9wIFNBXG4gKlxuICogTk9USUNFIE9GIExJQ0VOU0VcbiAqXG4gKiBUaGlzIHNvdXJjZSBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKiB0aGF0IGlzIGJ1bmRsZWQgd2l0aCB0aGlzIHBhY2thZ2UgaW4gdGhlIGZpbGUgTElDRU5TRS5tZC5cbiAqIEl0IGlzIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoaXMgVVJMOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wXG4gKiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIGEgY29weSBvZiB0aGUgbGljZW5zZSBhbmQgYXJlIHVuYWJsZSB0b1xuICogb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbFxuICogdG8gbGljZW5zZUBwcmVzdGFzaG9wLmNvbSBzbyB3ZSBjYW4gc2VuZCB5b3UgYSBjb3B5IGltbWVkaWF0ZWx5LlxuICpcbiAqIERJU0NMQUlNRVJcbiAqXG4gKiBEbyBub3QgZWRpdCBvciBhZGQgdG8gdGhpcyBmaWxlIGlmIHlvdSB3aXNoIHRvIHVwZ3JhZGUgUHJlc3RhU2hvcCB0byBuZXdlclxuICogdmVyc2lvbnMgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IHdpc2ggdG8gY3VzdG9taXplIFByZXN0YVNob3AgZm9yIHlvdXJcbiAqIG5lZWRzIHBsZWFzZSByZWZlciB0byBodHRwczovL2RldmRvY3MucHJlc3Rhc2hvcC5jb20vIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICpcbiAqIEBhdXRob3IgICAgUHJlc3RhU2hvcCBTQSBhbmQgQ29udHJpYnV0b3JzIDxjb250YWN0QHByZXN0YXNob3AuY29tPlxuICogQGNvcHlyaWdodCBTaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgICBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0FGTC0zLjAgQWNhZGVtaWMgRnJlZSBMaWNlbnNlIDMuMCAoQUZMLTMuMClcbiAqL1xuaW1wb3J0IHByZXN0YXNob3AgZnJvbSAncHJlc3Rhc2hvcCc7XG5pbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuXG5wcmVzdGFzaG9wLmJsb2NrY2FydCA9IHByZXN0YXNob3AuYmxvY2tjYXJ0IHx8IHt9O1xuXG5wcmVzdGFzaG9wLmJsb2NrY2FydC5zaG93TW9kYWwgPSAoaHRtbCkgPT4ge1xuICBmdW5jdGlvbiBnZXRCbG9ja0NhcnRNb2RhbCgpIHtcbiAgICByZXR1cm4gJCgnI2Jsb2NrY2FydC1tb2RhbCcpO1xuICB9XG5cbiAgbGV0ICRibG9ja0NhcnRNb2RhbCA9IGdldEJsb2NrQ2FydE1vZGFsKCk7XG5cbiAgaWYgKCRibG9ja0NhcnRNb2RhbC5sZW5ndGgpIHtcbiAgICAkYmxvY2tDYXJ0TW9kYWwucmVtb3ZlKCk7XG4gIH1cblxuICAkKCdib2R5JykuYXBwZW5kKGh0bWwpO1xuXG4gICRibG9ja0NhcnRNb2RhbCA9IGdldEJsb2NrQ2FydE1vZGFsKCk7XG4gICRibG9ja0NhcnRNb2RhbC5tb2RhbCgnc2hvdycpLm9uKCdoaWRkZW4uYnMubW9kYWwnLCAoZXZlbnQpID0+IHtcbiAgICBwcmVzdGFzaG9wLmVtaXQoJ3VwZGF0ZVByb2R1Y3QnLCB7XG4gICAgICByZWFzb246IGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldCxcbiAgICAgIGV2ZW50LFxuICAgIH0pO1xuICB9KTtcbn07XG4iLCIvKipcbiAqIGpRdWVyeS5vZmZjYW52YXMgdjMuNC43IC0gRWFzeSB0byB1c2UgalF1ZXJ5IG9mZmNhbnZhcyBwbHVnaW4uXG4gKiBDb3B5cmlnaHQgMjAxNiBMYXJzIEdyYXVibmVyIC0gaHR0cDovL2xncmF1Ym5lci5naXRodWIuaW8vanF1ZXJ5LW9mZmNhbnZhcy9cbiAqIExpY2Vuc2U6IE1JVFxuICovXG4hZnVuY3Rpb24odCxlKXtcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlJiZcIm9iamVjdFwiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24odCxzKXtyZXR1cm4gdm9pZCAwPT09cyYmKHM9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz9yZXF1aXJlKFwianF1ZXJ5XCIpOnJlcXVpcmUoXCJqcXVlcnlcIikodCkpLGUocyksc306XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnkgXCJdLGUpOmUoalF1ZXJ5KX0odGhpcyxmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBlKHQsZSxzKXt2YXIgaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLG89YXJndW1lbnRzLGg9ZnVuY3Rpb24oKXtpPW51bGwsc3x8dC5hcHBseShuLG8pfSxhPXMmJiFpO2NsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoaCxlKSxhJiZ0LmFwcGx5KG4sbyl9fWZ1bmN0aW9uIHMoZSxzKXt2YXIgbixvLGg9dChlKS5kYXRhKCk7dGhpcy4kZWw9dChlKTtmb3IobiBpbiBoKWguaGFzT3duUHJvcGVydHkobikmJi9eb2ZmY2FudmFzW0EtWl0rLy50ZXN0KG4pJiYobz1uW2kubGVuZ3RoXS50b0xvd2VyQ2FzZSgpK24uc3Vic3RyKGkubGVuZ3RoKzEpLGhbb109aFtuXSk7dGhpcy5zZXR0aW5ncz10LmV4dGVuZCghMCx7fSx0LmZuW2ldLmRlZmF1bHRzLHMsaCksdGhpcy5uYW1lPWksdGhpcy4kZWwuZGF0YSh0aGlzLm5hbWUrXCIub3B0c1wiLHRoaXMuc2V0dGluZ3MpLHRoaXMuaW5pdCgpfXZhciBpPVwib2ZmY2FudmFzXCI7dC5leHRlbmQocy5wcm90b3R5cGUse3NldEhlaWdodHM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLiRvdXRlcldyYXBwZXIuaGVpZ2h0KCk7dGhpcy4kZWwuZGF0YSh0aGlzLm5hbWUrXCIub3B0c1wiKSYmKHRoaXMuJGVsZW1lbnQuY3NzKFwiaGVpZ2h0XCIsdCksdGhpcy5zZXR0aW5ncy5vdmVybGF5JiZ0aGlzLiRvdmVybGF5LmNzcyhcImhlaWdodFwiLHQpKX0sc2hvdzpmdW5jdGlvbigpe3ZhciBlPXt9O3RoaXMudmlzaWJsZXx8KHRoaXMuJGNvbnQuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5jbGFzc2VzLm9wZW4pLHRoaXMudmlzaWJsZT0hMCx0aGlzLiRlbC50cmlnZ2VyKFwic2hvdy5cIit0aGlzLm5hbWUpLHRoaXMuJGVsLnRyaWdnZXIoXCJ0b2dnbGUuXCIrdGhpcy5uYW1lLHRoaXMudmlzaWJsZSksdGhpcy5zZXRIZWlnaHRzKCksZVt0aGlzLnNldHRpbmdzLm9yaWdpbl09dGhpcy5lZmZlY3RzW3RoaXMuc2V0dGluZ3MuZWZmZWN0XS50byx0aGlzLmVmZmVjdHNbdGhpcy5zZXR0aW5ncy5lZmZlY3RdLiRlbC52ZWxvY2l0eShlLHQuZXh0ZW5kKHtjb21wbGV0ZTpmdW5jdGlvbigpe3RoaXMuJGVsLnRyaWdnZXIoXCJzaG93bi5cIit0aGlzLm5hbWUpLHRoaXMuc2V0dGluZ3Mub3ZlcmxheSYmdGhpcy4kb3ZlcmxheS5vbmUoXCJjbGljay5cIit0aGlzLm5hbWUsZnVuY3Rpb24oKXt0aGlzLmhpZGUoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcyl9LHRoaXMuYW5pbWF0aW9uT3B0aW9ucykpLHRoaXMuc2V0dGluZ3Mub3ZlcmxheSYmdGhpcy4kb3ZlcmxheS52ZWxvY2l0eSh7b3BhY2l0eToxfSx0LmV4dGVuZCh7ZGlzcGxheTpcImJsb2NrXCJ9LHRoaXMuYW5pbWF0aW9uT3B0aW9ucykpKX0saGlkZTpmdW5jdGlvbigpe3RoaXMudmlzaWJsZSYmKHRoaXMuJGNvbnQucmVtb3ZlQ2xhc3ModGhpcy5zZXR0aW5ncy5jbGFzc2VzLm9wZW4pLHRoaXMudmlzaWJsZT0hMSx0aGlzLiRlbC50cmlnZ2VyKFwiaGlkZS5cIit0aGlzLm5hbWUpLHRoaXMuJGVsLnRyaWdnZXIoXCJ0b2dnbGUuXCIrdGhpcy5uYW1lLHRoaXMudmlzaWJsZSksdGhpcy5lZmZlY3RzW3RoaXMuc2V0dGluZ3MuZWZmZWN0XS4kZWwudmVsb2NpdHkoXCJzdG9wXCIpLnZlbG9jaXR5KFwicmV2ZXJzZVwiLHQuZXh0ZW5kKHtjb21wbGV0ZTpmdW5jdGlvbigpe3RoaXMuJGVsLnRyaWdnZXIoXCJoaWRkZW4uXCIrdGhpcy5uYW1lKX0uYmluZCh0aGlzKX0sdGhpcy5hbmltYXRpb25PcHRpb25zKSksdGhpcy5zZXR0aW5ncy5vdmVybGF5JiZ0aGlzLiRvdmVybGF5LnZlbG9jaXR5KFwic3RvcFwiKS52ZWxvY2l0eShcInJldmVyc2VcIix0LmV4dGVuZCh7ZGlzcGxheTpcIm5vbmVcIn0sdGhpcy5hbmltYXRpb25PcHRpb25zKSkpfSx0b2dnbGU6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy52aXNpYmxlP3RoaXMuaGlkZTp0aGlzLnNob3cpLmNhbGwodGhpcyl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLiRlbC5kYXRhKHRoaXMubmFtZStcIi5vcHRzXCIpJiYodGhpcy4kaW5uZXJXcmFwcGVyLnVud3JhcCgpLHRoaXMuJGlubmVyV3JhcHBlci5jaGlsZHJlbigpLnVud3JhcCgpLHRoaXMuJGNvbnQucmVtb3ZlQ2xhc3ModGhpcy5zZXR0aW5ncy5jbGFzc2VzLmNvbnRhaW5lcikucmVtb3ZlQ2xhc3ModGhpcy5zZXR0aW5ncy5jbGFzc2VzLm9wZW4pLHRoaXMuc2V0dGluZ3Mub3ZlcmxheSYmdGhpcy4kb3ZlcmxheS5vZmYoXCJjbGljay5cIit0aGlzLm5hbWUpLnJlbW92ZSgpLHRoaXMuJGVsLnVud3JhcCgpLnJlbW92ZURhdGEodGhpcy5uYW1lK1wiLm9wdHNcIikucmVtb3ZlQXR0cihcInN0eWxlXCIpLHRoaXMuJHdpbi5vZmYoXCJyZXNpemUuXCIrdGhpcy5uYW1lKSl9LGluaXQ6ZnVuY3Rpb24oKXt2YXIgcz17fTt0aGlzLiR3aW49dCh3aW5kb3cpLHRoaXMuJGJvZHk9dChcImJvZHlcIiksdGhpcy52aXNpYmxlPSExLHRoaXMuJGNvbnQ9dCh0aGlzLnNldHRpbmdzLmNvbnRhaW5lciksdGhpcy4kY29udC5hZGRDbGFzcyh0aGlzLnNldHRpbmdzLmNsYXNzZXMuY29udGFpbmVyKS5jaGlsZHJlbihcIjpub3Qoc2NyaXB0KVwiKS53cmFwQWxsKHQoXCI8ZGl2Lz5cIikuYWRkQ2xhc3ModGhpcy5zZXR0aW5ncy5jbGFzc2VzLm91dGVyKSksdGhpcy4kb3V0ZXJXcmFwcGVyPXQoXCIuXCIrdGhpcy5zZXR0aW5ncy5jbGFzc2VzLm91dGVyKS53cmFwSW5uZXIodChcIjxkaXYvPlwiKS5hZGRDbGFzcyh0aGlzLnNldHRpbmdzLmNsYXNzZXMuaW5uZXIpKSx0aGlzLiRpbm5lcldyYXBwZXI9dChcIi5cIit0aGlzLnNldHRpbmdzLmNsYXNzZXMuaW5uZXIpLHRoaXMuc2V0dGluZ3Mub3ZlcmxheSYmKHRoaXMuJGlubmVyV3JhcHBlci5hcHBlbmQodChcIjxkaXYvPlwiKS5hZGRDbGFzcyh0aGlzLnNldHRpbmdzLmNsYXNzZXMub3ZlcmxheSkuY3NzKFwiYmFja2dyb3VuZC1jb2xvclwiLHRoaXMuc2V0dGluZ3Mub3ZlcmxheUNvbG9yKSksdGhpcy4kb3ZlcmxheT10KFwiLlwiK3RoaXMuc2V0dGluZ3MuY2xhc3Nlcy5vdmVybGF5KSksdGhpcy4kZWwud3JhcCh0KFwiPGRpdi8+XCIpLmFkZENsYXNzKHRoaXMuc2V0dGluZ3MuY2xhc3Nlcy5lbGVtZW50KSksdGhpcy4kZWxlbWVudD10aGlzLiRlbC5wYXJlbnQoKSxzW3RoaXMuc2V0dGluZ3Mub3JpZ2luXT1cIi1cIit0aGlzLnNldHRpbmdzLmNvdmVyYWdlLHMud2lkdGg9dGhpcy5zZXR0aW5ncy5jb3ZlcmFnZSx0aGlzLiRlbGVtZW50LmNzcyhzKSx0aGlzLmVmZmVjdHM9e3B1c2g6eyRlbDp0aGlzLiRpbm5lcldyYXBwZXIsZnJvbTowLHRvOnRoaXMuc2V0dGluZ3MuY292ZXJhZ2V9LFwic2xpZGUtaW4tb3ZlclwiOnskZWw6dGhpcy4kZWxlbWVudCxmcm9tOlwiLVwiK3RoaXMuc2V0dGluZ3MuY292ZXJhZ2UsdG86MH19LHRoaXMuYW5pbWF0aW9uT3B0aW9ucz17ZWFzaW5nOnRoaXMuc2V0dGluZ3MuZWFzaW5nLGR1cmF0aW9uOnRoaXMuc2V0dGluZ3MuZHVyYXRpb259LHRoaXMuJHdpbi5vbihcInJlc2l6ZS5cIit0aGlzLm5hbWUsZSh0aGlzLnNldEhlaWdodHMsMzAwKS5iaW5kKHRoaXMpKSx0aGlzLnNldEhlaWdodHMoKSx0aGlzLiRlbC50cmlnZ2VyKFwiaW5pdC5cIit0aGlzLm5hbWUpfX0pLHQuZm5baV09ZnVuY3Rpb24oZSl7dmFyIG4sbz1hcmd1bWVudHM7cmV0dXJuIHZvaWQgMD09PWV8fFwib2JqZWN0XCI9PXR5cGVvZiBlP3RoaXMuZWFjaChmdW5jdGlvbigpe3QuZGF0YSh0aGlzLFwicGx1Z2luX1wiK2kpfHx0LmRhdGEodGhpcyxcInBsdWdpbl9cIitpLG5ldyBzKHRoaXMsZSkpfSk6XCJzdHJpbmdcIj09dHlwZW9mIGUmJlwiX1wiIT09ZVswXSYmXCJpbml0XCIhPT1lJiYodGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGg9dC5kYXRhKHRoaXMsXCJwbHVnaW5fXCIraSk7aCBpbnN0YW5jZW9mIHMmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGhbZV0mJihuPWhbZV0uYXBwbHkoaCxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvLDEpKSksXCJkZXN0cm95XCI9PT1lJiZ0LmRhdGEodGhpcyxcInBsdWdpbl9cIitpLG51bGwpfSksdm9pZCAwIT09bj9uOnRoaXMpfSx0LmZuW2ldLmRlZmF1bHRzPXtjbGFzc2VzOntjb250YWluZXI6aSxlbGVtZW50OmkrXCItZWxlbWVudFwiLGlubmVyOmkrXCItaW5uZXJcIixvcGVuOmkrXCItb3BlblwiLG91dGVyOmkrXCItb3V0ZXJcIixvdmVybGF5OmkrXCItb3ZlcmxheVwifSxjb250YWluZXI6XCJib2R5XCIsY292ZXJhZ2U6XCIyMjBweFwiLG9yaWdpbjpcImxlZnRcIixkdXJhdGlvbjozMDAsZWFzaW5nOlwiZWFzZS1pbi1vdXRcIixlZmZlY3Q6XCJwdXNoXCIsb3ZlcmxheTohMSxvdmVybGF5Q29sb3I6XCJyZ2JhKDAsIDAsIDAsIDAuNylcIn19KTsiLCIvKipcbiAqIENvcHlyaWdodCBzaW5jZSAyMDA3IFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9yc1xuICogUHJlc3RhU2hvcCBpcyBhbiBJbnRlcm5hdGlvbmFsIFJlZ2lzdGVyZWQgVHJhZGVtYXJrICYgUHJvcGVydHkgb2YgUHJlc3RhU2hvcCBTQVxuICpcbiAqIE5PVElDRSBPRiBMSUNFTlNFXG4gKlxuICogVGhpcyBzb3VyY2UgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSBBY2FkZW1pYyBGcmVlIExpY2Vuc2UgMy4wIChBRkwtMy4wKVxuICogdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UubWQuXG4gKiBJdCBpcyBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiBhdCB0aGlzIFVSTDpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQUZMLTMuMFxuICogSWYgeW91IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUgdG9cbiAqIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3b3JsZC13aWRlLXdlYiwgcGxlYXNlIHNlbmQgYW4gZW1haWxcbiAqIHRvIGxpY2Vuc2VAcHJlc3Rhc2hvcC5jb20gc28gd2UgY2FuIHNlbmQgeW91IGEgY29weSBpbW1lZGlhdGVseS5cbiAqXG4gKiBESVNDTEFJTUVSXG4gKlxuICogRG8gbm90IGVkaXQgb3IgYWRkIHRvIHRoaXMgZmlsZSBpZiB5b3Ugd2lzaCB0byB1cGdyYWRlIFByZXN0YVNob3AgdG8gbmV3ZXJcbiAqIHZlcnNpb25zIGluIHRoZSBmdXR1cmUuIElmIHlvdSB3aXNoIHRvIGN1c3RvbWl6ZSBQcmVzdGFTaG9wIGZvciB5b3VyXG4gKiBuZWVkcyBwbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9kZXZkb2NzLnByZXN0YXNob3AuY29tLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAYXV0aG9yICAgIFByZXN0YVNob3AgU0EgYW5kIENvbnRyaWJ1dG9ycyA8Y29udGFjdEBwcmVzdGFzaG9wLmNvbT5cbiAqIEBjb3B5cmlnaHQgU2luY2UgMjAwNyBQcmVzdGFTaG9wIFNBIGFuZCBDb250cmlidXRvcnNcbiAqIEBsaWNlbnNlICAgaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9BRkwtMy4wIEFjYWRlbWljIEZyZWUgTGljZW5zZSAzLjAgKEFGTC0zLjApXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgXCJqcXVlcnktb2ZmY2FudmFzL2Rpc3QvanF1ZXJ5Lm9mZmNhbnZhcy5taW4uY3NzXCI7XG5pbXBvcnQgdG91Y2hzcGluIGZyb20gXCJib290c3RyYXAtdG91Y2hzcGluXCI7XG5pbXBvcnQgXCJqcXVlcnktdG91Y2hzd2lwZVwiO1xuaW1wb3J0IFwiLi9zZWxlY3RvcnNcIjtcblxuaW1wb3J0IFwiLi9yZXNwb25zaXZlXCI7XG5pbXBvcnQgXCIuL2NoZWNrb3V0XCI7XG5pbXBvcnQgXCIuL2N1c3RvbWVyXCI7XG5pbXBvcnQgXCIuL2xpc3RpbmdcIjtcbmltcG9ydCBcIi4vcHJvZHVjdFwiO1xuaW1wb3J0IFwiLi9jYXJ0XCI7XG5pbXBvcnQgXCIuL2ZhY2V0c1wiO1xuXG5pbXBvcnQgcHJlc3Rhc2hvcCBmcm9tIFwicHJlc3Rhc2hvcFwiO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tIFwiZXZlbnRzXCI7XG5pbXBvcnQgRHJvcERvd24gZnJvbSBcIi4vY29tcG9uZW50cy9kcm9wLWRvd25cIjtcbmltcG9ydCBGb3JtIGZyb20gXCIuL2NvbXBvbmVudHMvZm9ybVwiO1xuaW1wb3J0IHVzZVBhc3N3b3JkUG9saWN5IGZyb20gXCIuL2NvbXBvbmVudHMvdXNlUGFzc3dvcmRQb2xpY3lcIjtcbmltcG9ydCBQcm9kdWN0TWluaXRhdHVyZSBmcm9tIFwiLi9jb21wb25lbnRzL3Byb2R1Y3QtbWluaWF0dXJlXCI7XG5pbXBvcnQgUHJvZHVjdFNlbGVjdCBmcm9tIFwiLi9jb21wb25lbnRzL3Byb2R1Y3Qtc2VsZWN0XCI7XG5pbXBvcnQgVG9wTWVudSBmcm9tIFwiLi9jb21wb25lbnRzL3RvcC1tZW51XCI7XG5cbmltcG9ydCBcIi4vY29tcG9uZW50cy9ibG9jay1jYXJ0XCI7XG5pbXBvcnQgJCBmcm9tIFwianF1ZXJ5XCI7XG5pbXBvcnQgam8gZnJvbSBcImpxdWVyeS1vZmZjYW52YXNcIjtcbmpvKHdpbmRvdywgJCk7XG50b3VjaHNwaW4od2luZG93LCAkKTtcbi8qIGVzbGludC1lbmFibGUgKi9cblxuLy8gXCJpbmhlcml0XCIgRXZlbnRFbWl0dGVyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbmZvciAoY29uc3QgaSBpbiBFdmVudEVtaXR0ZXIucHJvdG90eXBlKSB7XG4gIHByZXN0YXNob3BbaV0gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlW2ldO1xufVxuXG4kKGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgZHJvcERvd25FbCA9ICQoXCIuanMtZHJvcGRvd25cIik7XG4gIGNvbnN0IGZvcm0gPSBuZXcgRm9ybSgpO1xuICBjb25zdCB0b3BNZW51RWwgPSAkKCcuanMtdG9wLW1lbnUgdWxbZGF0YS1kZXB0aD1cIjBcIl0nKTtcbiAgY29uc3QgZHJvcERvd24gPSBuZXcgRHJvcERvd24oZHJvcERvd25FbCk7XG4gIGNvbnN0IHRvcE1lbnUgPSBuZXcgVG9wTWVudSh0b3BNZW51RWwpO1xuICBjb25zdCBwcm9kdWN0TWluaXRhdHVyZSA9IG5ldyBQcm9kdWN0TWluaXRhdHVyZSgpO1xuICBjb25zdCBwcm9kdWN0U2VsZWN0ID0gbmV3IFByb2R1Y3RTZWxlY3QoKTtcbiAgZHJvcERvd24uaW5pdCgpO1xuICBmb3JtLmluaXQoKTtcbiAgdG9wTWVudS5pbml0KCk7XG4gIHByb2R1Y3RNaW5pdGF0dXJlLmluaXQoKTtcbiAgcHJvZHVjdFNlbGVjdC5pbml0KCk7XG4gIHVzZVBhc3N3b3JkUG9saWN5KFwiLmZpZWxkLXBhc3N3b3JkLXBvbGljeVwiKTtcblxuICAkKCcuY2Fyb3VzZWxbZGF0YS10b3VjaD1cInRydWVcIl0nKS5zd2lwZSh7XG4gICAgc3dpcGUoZXZlbnQsIGRpcmVjdGlvbikge1xuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gXCJsZWZ0XCIpIHtcbiAgICAgICAgJCh0aGlzKS5jYXJvdXNlbChcIm5leHRcIik7XG4gICAgICB9XG4gICAgICBpZiAoZGlyZWN0aW9uID09PSBcInJpZ2h0XCIpIHtcbiAgICAgICAgJCh0aGlzKS5jYXJvdXNlbChcInByZXZcIik7XG4gICAgICB9XG4gICAgfSxcbiAgICBhbGxvd1BhZ2VTY3JvbGw6IFwidmVydGljYWxcIixcbiAgfSk7XG5cbiAgJChcIiNwcm9kdWN0LWxpc3QtdG9wLWZpbHRlcnNcIikub2ZmY2FudmFzKHtcbiAgICBlZmZlY3Q6IFwic2xpZGUtaW4tb3ZlclwiLFxuICAgIG92ZXJsYXk6IHRydWUsXG4gICAgY2xhc3Nlczoge1xuICAgICAgZWxlbWVudDogXCJhYnNvbHV0ZSB0b3AtMCB6LTUwXCIsXG4gICAgfSxcbiAgfSk7XG5cbiAgJChcIiNzaG93LWZpbHRlcnNcIikub24oXCJjbGljay5vZmZjYW52YXNcIiwgZnVuY3Rpb24gKCkge1xuICAgICQoXCIjcHJvZHVjdC1saXN0LXRvcC1maWx0ZXJzXCIpLm9mZmNhbnZhcyhcInRvZ2dsZVwiKTtcbiAgfSk7XG5cbiAgJChcIiNwcm9kdWN0LWxpc3QtdG9wLWZpbHRlcnNcIikub24oXCJzaG93bi5vZmZjYW52YXNcIiwgZnVuY3Rpb24gKCkge1xuICAgICQoXCIjcHJvZHVjdC1saXN0LXRvcC1maWx0ZXJzXCIpLnNob3coKTtcbiAgfSk7XG5cbiAgJChcIiNwcm9kdWN0LWxpc3QtdG9wLWZpbHRlcnNcIikub24oXCJoaWRlLm9mZmNhbnZhc1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgJChcIiNwcm9kdWN0LWxpc3QtdG9wLWZpbHRlcnNcIikuaGlkZSgpO1xuICB9KTtcblxuICBmdW5jdGlvbiBUaEFjY29yZGlvbigpIHt9XG5cbiAgJC5leHRlbmQoVGhBY2NvcmRpb24ucHJvdG90eXBlLCB7XG4gICAgaW5pdCgpIHt9LFxuICB9KTtcblxuICAkLmZuW1widGhhY2NvcmRpb25cIl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNlbGVjdG9ycyA9IHtcbiAgICAgIHJvb3Q6IFwiLnRoLWFjY29yZGlvblwiLFxuICAgICAgaXRlbTogXCIudGgtYWNjb3JkaW9uLWl0ZW1cIixcbiAgICAgIHRyaWdnZXI6IFwiLnRoLWFjY29yZGlvbi1pdGVtLXRyaWdnZXJcIixcbiAgICAgIGNvbnRlbnQ6IFwiLnRoLWFjY29yZGlvbi1pdGVtLWNvbnRlbnRcIixcbiAgICB9O1xuICAgIGxldCBzZWxlY3Rpb24gPSBudWxsO1xuICAgIGxldCBpdGVtcyA9IHRoaXMuZmluZChzZWxlY3RvcnMuaXRlbSk7XG5cbiAgICBmdW5jdGlvbiBjb2xsYXBzZUFsbCgpIHtcbiAgICAgIGl0ZW1zLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAkKHRoaXMpLmZpbmQoc2VsZWN0b3JzLmNvbnRlbnQpLmhpZGUoNTAwKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9wZW4oKSB7XG4gICAgICBjb2xsYXBzZUFsbCgpO1xuICAgICAgJChzZWxlY3Rpb24pLmZpbmQoc2VsZWN0b3JzLmNvbnRlbnQpLnNob3coNTAwKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc09wZW4oaXRlbSkge1xuICAgICAgcmV0dXJuICQoaXRlbSkuZmluZChzZWxlY3RvcnMuY29udGVudCkuaXMoXCI6dmlzaWJsZVwiKTtcbiAgICB9XG5cbiAgICBjb2xsYXBzZUFsbCgpO1xuXG4gICAgaXRlbXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAkKHRoaXMpXG4gICAgICAgIC5maW5kKHNlbGVjdG9ycy50cmlnZ2VyKVxuICAgICAgICAub24oXCJjbGlja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHNlbGVjdGlvbiA9PT0gc2VsZikge1xuICAgICAgICAgICAgc2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZjtcbiAgICAgICAgICAgIGlmICghaXNPcGVuKHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgICAgb3BlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgJChcIi50aC1hY2NvcmRpb25cIikudGhhY2NvcmRpb24oKTtcbn0pO1xuIl0sIm5hbWVzIjpbIm9iaiIsImpRdWVyeSIsInJlcXVpcmUkJDAiLCIkIiwidmFsdWUiLCJwaGFzZSIsImRpcmVjdGlvbiIsImRpc3RhbmNlIiwicHJlc3Rhc2hvcCIsIndpbmRvdyIsImkiLCJlbGVtIiwib2Zmc2V0UGFyZW50IiwiZ2xvYmFsIiwiZG9jdW1lbnQiLCJ1bmRlZmluZWQiLCIkMiIsImVsZW1lbnQiLCJwcm9wZXJ0eSIsIm9wdHMiLCJjYWxsSW5kZXgiLCJkZWxheUNvbXBsZXRlIiwidmFsdWVEYXRhIiwiZW5kVmFsdWUiLCJlYXNpbmciLCJzdGFydFZhbHVlIiwidHdlZW5EZWx0YSIsIlJlZmxlY3RBcHBseSIsIlJlZmxlY3RPd25LZXlzIiwiTnVtYmVySXNOYU4iLCJldmVudHNNb2R1bGUiLCJldmVudHMiLCJvbmNlIiwic3ByaW50ZiIsInNlbGYiLCJ0IiwidGhpcyIsImUiLCJzIiwiRXZlbnRFbWl0dGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBRUEsYUFBUyxRQUFRLEtBQUs7QUFBRTtBQUEyQixhQUFPLFVBQVUsY0FBYyxPQUFPLFVBQVUsWUFBWSxPQUFPLE9BQU8sV0FBVyxTQUFVQSxNQUFLO0FBQUUsZUFBTyxPQUFPQTtBQUFBLFVBQVMsU0FBVUEsTUFBSztBQUFFLGVBQU9BLFFBQU8sY0FBYyxPQUFPLFVBQVVBLEtBQUksZ0JBQWdCLFVBQVVBLFNBQVEsT0FBTyxZQUFZLFdBQVcsT0FBT0E7QUFBQSxNQUFJLEdBQUksUUFBUSxHQUFHO0FBQUEsSUFBSTtBQVNoVixLQUFDLFNBQVUsU0FBUztBQUdYLFVBQW1ELFFBQVEsTUFBTSxNQUFPLFlBQVksT0FBTyxTQUFTO0FBQ3pHLGVBQWlCLFVBQUEsU0FBVSxNQUFNQyxTQUFRO0FBQ3ZDLGNBQUlBLFlBQVcsUUFBVztBQUN4QixnQkFBSSxPQUFPLFdBQVcsYUFBYTtBQUNqQyxjQUFBQSxVQUFTQztBQUFBQSxZQUNuQixPQUFlO0FBQ0wsY0FBQUQsVUFBU0MsSUFBa0IsSUFBSTtBQUFBLFlBQ2hDO0FBQUEsVUFDRjtBQUNELGtCQUFRRCxPQUFNO0FBQ2QsaUJBQU9BO0FBQUEsUUFDYjtBQUFBLE1BQ0EsT0FBUztBQUNMLGdCQUFRLE1BQU07QUFBQSxNQUNmO0FBQUEsSUFDRixHQUFFLFNBQVVFLElBQUc7QUFHZCxVQUFJLG9CQUFvQjtBQUN4QixNQUFBQSxHQUFFLEdBQUcsWUFBWSxTQUFVLFNBQVM7QUFDbEMsWUFBSSxXQUFXO0FBQUEsVUFDYixLQUFLO0FBQUE7QUFBQSxVQUVMLEtBQUs7QUFBQTtBQUFBLFVBRUwsU0FBUztBQUFBLFVBQ1QsZ0JBQWdCO0FBQUEsVUFDaEIsd0JBQXdCO0FBQUEsVUFD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QUFBO0FBQUEsY0FDdEI7QUFBQSxjQUFLO0FBQUE7QUFBQSxZQUNMO0FBQUEsWUFDRCxZQUFZO0FBQUEsY0FDWCxhQUFhO0FBQUEsY0FDYixnQkFBZ0I7QUFBQSxjQUNoQixjQUFjO0FBQUEsY0FDZCxRQUFRO0FBQUEsY0FDUixTQUFTO0FBQUEsY0FDVCxTQUFTO0FBQUEsY0FDVCxVQUFVO0FBQUEsY0FDVixTQUFTO0FBQUEsY0FDVCxrQkFBa0I7QUFBQSxjQUNsQixjQUFjO0FBQUEsY0FDZCxRQUFRO0FBQUEsY0FDUixTQUFTO0FBQUEsY0FDVCxhQUFhO0FBQUEsY0FDYixhQUFhO0FBQUEsY0FDYixjQUFjO0FBQUEsY0FDZCxhQUFhO0FBQUEsY0FDYixTQUFTO0FBQUEsY0FDVCxrQkFBa0I7QUFBQSxjQUNsQixZQUFZO0FBQUEsY0FDWixXQUFXO0FBQUEsY0FDWCxRQUFRO0FBQUEsY0FDUixZQUFZO0FBQUEsY0FDWixZQUFZO0FBQUEsY0FDWixpQkFBaUI7QUFBQSxjQUNqQixZQUFZO0FBQUEsY0FDWixZQUFZO0FBQUEsY0FDWixhQUFhO0FBQUEsY0FDYixhQUFhO0FBQUEsY0FDYixlQUFlO0FBQUEsY0FDZixrQkFBa0I7QUFBQSxjQUNsQixjQUFjO0FBQUEsY0FDZCxjQUFjO0FBQUEsY0FDZCxXQUFXO0FBQUEsY0FDWCxjQUFjO0FBQUEsY0FDZCxnQkFBZ0I7QUFBQSxjQUNoQixpQkFBaUI7QUFBQSxjQUNqQixpQkFBaUI7QUFBQSxjQUNqQixpQkFBaUI7QUFBQSxjQUNqQixjQUFjO0FBQUEsY0FDZCxZQUFZO0FBQUEsY0FDWixlQUFlO0FBQUEsY0FDZixXQUFXO0FBQUEsY0FDWCxXQUFXO0FBQUEsY0FDWCxjQUFjO0FBQUEsY0FDZCxhQUFhO0FBQUEsY0FDYixlQUFlO0FBQUEsY0FDZixlQUFlO0FBQUEsY0FDZixXQUFXO0FBQUEsY0FDWCxhQUFhO0FBQUEsY0FDYixjQUFjO0FBQUEsY0FDZCxRQUFRO0FBQUEsY0FDUixhQUFhO0FBQUEsY0FDYixRQUFRO0FBQUEsY0FDUixRQUFRO0FBQUEsY0FD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RyxLQUFLLFFBQVEsS0FBSyxTQUFTLE1BQU0sRUFBRSxJQUFJLFNBQVNBLElBQUUsRUFBRSxPQUFPLEVBQUMsV0FBUyxXQUFVO0FBQUMsZUFBSyxJQUFJLFFBQVEsV0FBUyxLQUFLLElBQUksR0FBRSxLQUFLLFNBQVMsV0FBUyxLQUFLLFNBQVMsSUFBSSxXQUFTLEtBQUssT0FBSyxXQUFVO0FBQUMsaUJBQUssS0FBSTtBQUFBLFVBQUUsR0FBRSxLQUFLLElBQUksQ0FBQztBQUFBLFFBQUMsR0FBRSxLQUFLLElBQUksRUFBQyxHQUFFLEtBQUssZ0JBQWdCLENBQUMsR0FBRSxLQUFLLFNBQVMsV0FBUyxLQUFLLFNBQVMsU0FBUyxFQUFDLFNBQVEsRUFBQyxHQUFFLEVBQUUsT0FBTyxFQUFDLFNBQVEsUUFBTyxHQUFFLEtBQUssZ0JBQWdCLENBQUM7QUFBQSxNQUFFLEdBQUUsTUFBSyxXQUFVO0FBQUMsYUFBSyxZQUFVLEtBQUssTUFBTSxZQUFZLEtBQUssU0FBUyxRQUFRLElBQUksR0FBRSxLQUFLLFVBQVEsT0FBRyxLQUFLLElBQUksUUFBUSxVQUFRLEtBQUssSUFBSSxHQUFFLEtBQUssSUFBSSxRQUFRLFlBQVUsS0FBSyxNQUFLLEtBQUssT0FBTyxHQUFFLEtBQUssUUFBUSxLQUFLLFNBQVMsTUFBTSxFQUFFLElBQUksU0FBUyxNQUFNLEVBQUUsU0FBUyxXQUFVLEVBQUUsT0FBTyxFQUFDLFdBQVMsV0FBVTtBQUFDLGVBQUssSUFBSSxRQUFRLFlBQVUsS0FBSyxJQUFJO0FBQUEsUUFBQyxHQUFFLEtBQUssSUFBSSxFQUFDLEdBQUUsS0FBSyxnQkFBZ0IsQ0FBQyxHQUFFLEtBQUssU0FBUyxXQUFTLEtBQUssU0FBUyxTQUFTLE1BQU0sRUFBRSxTQUFTLFdBQVUsRUFBRSxPQUFPLEVBQUMsU0FBUSxPQUFNLEdBQUUsS0FBSyxnQkFBZ0IsQ0FBQztBQUFBLE1BQUUsR0FBRSxRQUFPLFdBQVU7QUFBQyxnQkFBTyxLQUFLLFVBQVEsS0FBSyxPQUFLLEtBQUssTUFBTSxLQUFLLElBQUk7QUFBQSxNQUFDLEdBQUUsU0FBUSxXQUFVO0FBQUMsYUFBSyxJQUFJLEtBQUssS0FBSyxPQUFLLE9BQU8sTUFBSSxLQUFLLGNBQWMsVUFBUyxLQUFLLGNBQWMsU0FBVSxFQUFDLE9BQVEsR0FBQyxLQUFLLE1BQU0sWUFBWSxLQUFLLFNBQVMsUUFBUSxTQUFTLEVBQUUsWUFBWSxLQUFLLFNBQVMsUUFBUSxJQUFJLEdBQUUsS0FBSyxTQUFTLFdBQVMsS0FBSyxTQUFTLElBQUksV0FBUyxLQUFLLElBQUksRUFBRSxVQUFTLEtBQUssSUFBSSxPQUFRLEVBQUMsV0FBVyxLQUFLLE9BQUssT0FBTyxFQUFFLFdBQVcsT0FBTyxHQUFFLEtBQUssS0FBSyxJQUFJLFlBQVUsS0FBSyxJQUFJO0FBQUEsTUFBRSxHQUFFLE1BQUssV0FBVTtBQUFDLFlBQUlDLEtBQUUsQ0FBRTtBQUFDLGFBQUssT0FBSyxFQUFFLE1BQU0sR0FBRSxLQUFLLFFBQU0sRUFBRSxNQUFNLEdBQUUsS0FBSyxVQUFRLE9BQUcsS0FBSyxRQUFNLEVBQUUsS0FBSyxTQUFTLFNBQVMsR0FBRSxLQUFLLE1BQU0sU0FBUyxLQUFLLFNBQVMsUUFBUSxTQUFTLEVBQUUsU0FBUyxjQUFjLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEtBQUssU0FBUyxRQUFRLEtBQUssQ0FBQyxHQUFFLEtBQUssZ0JBQWMsRUFBRSxNQUFJLEtBQUssU0FBUyxRQUFRLEtBQUssRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsS0FBSyxTQUFTLFFBQVEsS0FBSyxDQUFDLEdBQUUsS0FBSyxnQkFBYyxFQUFFLE1BQUksS0FBSyxTQUFTLFFBQVEsS0FBSyxHQUFFLEtBQUssU0FBUyxZQUFVLEtBQUssY0FBYyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsS0FBSyxTQUFTLFFBQVEsT0FBTyxFQUFFLElBQUksb0JBQW1CLEtBQUssU0FBUyxZQUFZLENBQUMsR0FBRSxLQUFLLFdBQVMsRUFBRSxNQUFJLEtBQUssU0FBUyxRQUFRLE9BQU8sSUFBRyxLQUFLLElBQUksS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEtBQUssU0FBUyxRQUFRLE9BQU8sQ0FBQyxHQUFFLEtBQUssV0FBUyxLQUFLLElBQUksT0FBUSxHQUFDQSxHQUFFLEtBQUssU0FBUyxNQUFNLElBQUUsTUFBSSxLQUFLLFNBQVMsVUFBU0EsR0FBRSxRQUFNLEtBQUssU0FBUyxVQUFTLEtBQUssU0FBUyxJQUFJQSxFQUFDLEdBQUUsS0FBSyxVQUFRLEVBQUMsTUFBSyxFQUFDLEtBQUksS0FBSyxlQUFjLE1BQUssR0FBRSxJQUFHLEtBQUssU0FBUyxTQUFRLEdBQUUsaUJBQWdCLEVBQUMsS0FBSSxLQUFLLFVBQVMsTUFBSyxNQUFJLEtBQUssU0FBUyxVQUFTLElBQUcsRUFBQyxFQUFDLEdBQUUsS0FBSyxtQkFBaUIsRUFBQyxRQUFPLEtBQUssU0FBUyxRQUFPLFVBQVMsS0FBSyxTQUFTLFNBQVEsR0FBRSxLQUFLLEtBQUssR0FBRyxZQUFVLEtBQUssTUFBSyxFQUFFLEtBQUssWUFBVyxHQUFHLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRSxLQUFLLGNBQWEsS0FBSyxJQUFJLFFBQVEsVUFBUSxLQUFLLElBQUk7QUFBQSxNQUFDLEVBQUMsQ0FBQyxHQUFFLEVBQUUsR0FBRyxDQUFDLElBQUUsU0FBU0QsSUFBRTtBQUFDLFlBQUksR0FBRSxJQUFFO0FBQVUsZUFBTyxXQUFTQSxNQUFHLFlBQVUsT0FBT0EsS0FBRSxLQUFLLEtBQUssV0FBVTtBQUFDLFlBQUUsS0FBSyxNQUFLLFlBQVUsQ0FBQyxLQUFHLEVBQUUsS0FBSyxNQUFLLFlBQVUsR0FBRSxJQUFJLEVBQUUsTUFBS0EsRUFBQyxDQUFDO0FBQUEsUUFBQyxDQUFDLElBQUUsWUFBVSxPQUFPQSxNQUFHLFFBQU1BLEdBQUUsQ0FBQyxLQUFHLFdBQVNBLE9BQUksS0FBSyxLQUFLLFdBQVU7QUFBQyxjQUFJLElBQUUsRUFBRSxLQUFLLE1BQUssWUFBVSxDQUFDO0FBQUUsdUJBQWEsS0FBRyxjQUFZLE9BQU8sRUFBRUEsRUFBQyxNQUFJLElBQUUsRUFBRUEsRUFBQyxFQUFFLE1BQU0s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 diff --git a/templates/catalog/_partials/facets.tpl b/templates/catalog/_partials/facets.tpl index 337d1a0..8d9f240 100644 --- a/templates/catalog/_partials/facets.tpl +++ b/templates/catalog/_partials/facets.tpl @@ -24,6 +24,7 @@ *} {if $facets|count}
+ {* + *}
{foreach from=$facets item="facet"} {if !$facet.displayed} diff --git a/templates/catalog/_partials/products-top.tpl b/templates/catalog/_partials/products-top.tpl index 2b03edc..a4a0caa 100644 --- a/templates/catalog/_partials/products-top.tpl +++ b/templates/catalog/_partials/products-top.tpl @@ -34,10 +34,15 @@ Filter
+ +
+ {block name='sort_by'} + {include file='catalog/_partials/sort-orders.tpl' sort_orders=$listing.sort_orders} + {/block} +
-