@vonage/ml-transformers 1.2.1 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/docs/assets/highlight.css +11 -4
- package/dist/docs/assets/main.js +2 -2
- package/dist/docs/assets/search.js +1 -1
- package/dist/docs/assets/style.css +3 -2
- package/dist/docs/classes/MediapipeHelper.html +1 -0
- package/dist/docs/enums/BlurRadius.html +4 -4
- package/dist/docs/index.html +4 -3
- package/dist/docs/interfaces/FaceDetectionOptions.html +3 -0
- package/dist/docs/interfaces/FaceDetectionResults.html +3 -0
- package/dist/docs/interfaces/FaceMeshOptions.html +3 -0
- package/dist/docs/interfaces/FaceMeshResults.html +3 -0
- package/dist/docs/interfaces/HandsOptions.html +3 -0
- package/dist/docs/interfaces/HandsResults.html +3 -0
- package/dist/docs/interfaces/HolisticOptions.html +3 -0
- package/dist/docs/interfaces/HolisticResults.html +3 -0
- package/dist/docs/interfaces/ObjectronOptions.html +3 -0
- package/dist/docs/interfaces/ObjectronResults.html +3 -0
- package/dist/docs/interfaces/PoseOptions.html +3 -0
- package/dist/docs/interfaces/PoseResults.html +3 -0
- package/dist/docs/interfaces/SelfieSegmentationOptions.html +3 -0
- package/dist/docs/interfaces/SelfieSegmentationResults.html +3 -0
- package/dist/docs/modules.html +76 -12
- package/dist/ml-transformers.es.js +473 -88
- package/dist/ml-transformers.umd.js +4 -4
- package/dist/types/main.d.ts +28 -12
- package/dist/types/src/transformers/BackgroundTransformer.d.ts +19 -17
- package/dist/types/src/transformers/BlurPostProcess.d.ts +1 -0
- package/dist/types/src/transformers/MediapipeHelper.d.ts +12 -0
- package/dist/types/src/transformers/PostProcessInterface.d.ts +1 -0
- package/dist/types/src/transformers/SilueteBlurPostProcess.d.ts +1 -0
- package/dist/types/src/transformers/VideoPostProcess.d.ts +8 -5
- package/dist/types/src/transformers/VirtualPostProcess.d.ts +5 -5
- package/dist/types/src/types.d.ts +71 -17
- package/dist/types/src/vonage/VonageAssetsLoaderHelper.d.ts +5 -0
- package/dist/types/src/vonage/VonageMediaProcessorThread.d.ts +3 -2
- package/dist/types/src/vonage/VonageMediaProcessorWorker.d.ts +16 -5
- package/package.json +12 -4
- package/dist/models/selfie_segmentation_landscape.tflite +0 -0
- package/dist/tflite-simd.wasm +0 -0
- package/dist/types/src/transformers/VonageTFLite.d.ts +0 -28
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(
|
|
2
|
-
`),function(n){if(e=n.indexOf(":"),c=ml.trim(n.substr(0,e)).toLowerCase(),b=ml.trim(n.substr(e+1)),c){if(d[c]&&kd.indexOf(c)>=0)return;c==="set-cookie"?d[c]=(d[c]?d[c]:[]).concat([b]):d[c]=d[c]?d[c]+", "+b:b}}),d},vl=a,zd=vl.isStandardBrowserEnv()?function(){var l=/(msie|trident)/i.test(navigator.userAgent),d=document.createElement("a"),c;function b(e){var t=e;return l&&(d.setAttribute("href",t),t=d.href),d.setAttribute("href",t),{href:d.href,protocol:d.protocol?d.protocol.replace(/:$/,""):"",host:d.host,search:d.search?d.search.replace(/^\?/,""):"",hash:d.hash?d.hash.replace(/^#/,""):"",hostname:d.hostname,port:d.port,pathname:d.pathname.charAt(0)==="/"?d.pathname:"/"+d.pathname}}return c=b(window.location.href),function(t){var n=vl.isString(t)?b(t):t;return n.protocol===c.protocol&&n.host===c.host}}():function(){return function(){return!0}}();function ul(Z){this.message=Z}ul.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},ul.prototype.__CANCEL__=!0;var P=ul,M=a,Cd=fd,xd=Sd,Ud=Nl,Bd=gd,Td=Fd,wd=zd,ol=Ll,Qd=E,Pd=P,gl=function(l){return new Promise(function(c,b){var e=l.data,t=l.headers,n=l.responseType,m;function s(){l.cancelToken&&l.cancelToken.unsubscribe(m),l.signal&&l.signal.removeEventListener("abort",m)}M.isFormData(e)&&delete t["Content-Type"];var i=new XMLHttpRequest;if(l.auth){var u=l.auth.username||"",p=l.auth.password?unescape(encodeURIComponent(l.auth.password)):"";t.Authorization="Basic "+btoa(u+":"+p)}var X=Bd(l.baseURL,l.url);i.open(l.method.toUpperCase(),Ud(X,l.params,l.paramsSerializer),!0),i.timeout=l.timeout;function bd(){if(!!i){var G="getAllResponseHeaders"in i?Td(i.getAllResponseHeaders()):null,k=!n||n==="text"||n==="json"?i.responseText:i.response,J={data:k,status:i.status,statusText:i.statusText,headers:G,config:l,request:i};Cd(function(Rl){c(Rl),s()},function(Rl){b(Rl),s()},J),i=null}}if("onloadend"in i?i.onloadend=bd:i.onreadystatechange=function(){!i||i.readyState!==4||i.status===0&&!(i.responseURL&&i.responseURL.indexOf("file:")===0)||setTimeout(bd)},i.onabort=function(){!i||(b(ol("Request aborted",l,"ECONNABORTED",i)),i=null)},i.onerror=function(){b(ol("Network Error",l,null,i)),i=null},i.ontimeout=function(){var k=l.timeout?"timeout of "+l.timeout+"ms exceeded":"timeout exceeded",J=l.transitional||Qd.transitional;l.timeoutErrorMessage&&(k=l.timeoutErrorMessage),b(ol(k,l,J.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",i)),i=null},M.isStandardBrowserEnv()){var td=(l.withCredentials||wd(X))&&l.xsrfCookieName?xd.read(l.xsrfCookieName):void 0;td&&(t[l.xsrfHeaderName]=td)}"setRequestHeader"in i&&M.forEach(t,function(k,J){typeof e=="undefined"&&J.toLowerCase()==="content-type"?delete t[J]:i.setRequestHeader(J,k)}),M.isUndefined(l.withCredentials)||(i.withCredentials=!!l.withCredentials),n&&n!=="json"&&(i.responseType=l.responseType),typeof l.onDownloadProgress=="function"&&i.addEventListener("progress",l.onDownloadProgress),typeof l.onUploadProgress=="function"&&i.upload&&i.upload.addEventListener("progress",l.onUploadProgress),(l.cancelToken||l.signal)&&(m=function(G){!i||(b(!G||G&&G.type?new Pd("canceled"):G),i.abort(),i=null)},l.cancelToken&&l.cancelToken.subscribe(m),l.signal&&(l.signal.aborted?m():l.signal.addEventListener("abort",m))),e||(e=null),i.send(e)})},o=a,kl=Jd,Md=Hl,jd={"Content-Type":"application/x-www-form-urlencoded"};function Fl(Z,l){!o.isUndefined(Z)&&o.isUndefined(Z["Content-Type"])&&(Z["Content-Type"]=l)}function Ed(){var Z;return(typeof XMLHttpRequest!="undefined"||typeof process!="undefined"&&Object.prototype.toString.call(process)==="[object process]")&&(Z=gl),Z}function Od(Z,l,d){if(o.isString(Z))try{return(l||JSON.parse)(Z),o.trim(Z)}catch(c){if(c.name!=="SyntaxError")throw c}return(d||JSON.stringify)(Z)}var j={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:Ed(),transformRequest:[function(l,d){return kl(d,"Accept"),kl(d,"Content-Type"),o.isFormData(l)||o.isArrayBuffer(l)||o.isBuffer(l)||o.isStream(l)||o.isFile(l)||o.isBlob(l)?l:o.isArrayBufferView(l)?l.buffer:o.isURLSearchParams(l)?(Fl(d,"application/x-www-form-urlencoded;charset=utf-8"),l.toString()):o.isObject(l)||d&&d["Content-Type"]==="application/json"?(Fl(d,"application/json"),Od(l)):l}],transformResponse:[function(l){var d=this.transitional||j.transitional,c=d&&d.silentJSONParsing,b=d&&d.forcedJSONParsing,e=!c&&this.responseType==="json";if(e||b&&o.isString(l)&&l.length)try{return JSON.parse(l)}catch(t){if(e)throw t.name==="SyntaxError"?Md(t,this,"E_JSON_PARSE"):t}return l}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(l){return l>=200&&l<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};o.forEach(["delete","get","head"],function(l){j.headers[l]={}}),o.forEach(["post","put","patch"],function(l){j.headers[l]=o.merge(jd)});var E=j,Dd=a,Ad=E,$d=function(l,d,c){var b=this||Ad;return Dd.forEach(c,function(t){l=t.call(b,l,d)}),l},zl=function(l){return!!(l&&l.__CANCEL__)},Cl=a,sl=$d,qd=zl,_d=E,lc=P;function al(Z){if(Z.cancelToken&&Z.cancelToken.throwIfRequested(),Z.signal&&Z.signal.aborted)throw new lc("canceled")}var dc=function(l){al(l),l.headers=l.headers||{},l.data=sl.call(l,l.data,l.headers,l.transformRequest),l.headers=Cl.merge(l.headers.common||{},l.headers[l.method]||{},l.headers),Cl.forEach(["delete","get","head","post","put","patch","common"],function(b){delete l.headers[b]});var d=l.adapter||_d.adapter;return d(l).then(function(b){return al(l),b.data=sl.call(l,b.data,b.headers,l.transformResponse),b},function(b){return qd(b)||(al(l),b&&b.response&&(b.response.data=sl.call(l,b.response.data,b.response.headers,l.transformResponse))),Promise.reject(b)})},h=a,xl=function(l,d){d=d||{};var c={};function b(i,u){return h.isPlainObject(i)&&h.isPlainObject(u)?h.merge(i,u):h.isPlainObject(u)?h.merge({},u):h.isArray(u)?u.slice():u}function e(i){if(h.isUndefined(d[i])){if(!h.isUndefined(l[i]))return b(void 0,l[i])}else return b(l[i],d[i])}function t(i){if(!h.isUndefined(d[i]))return b(void 0,d[i])}function n(i){if(h.isUndefined(d[i])){if(!h.isUndefined(l[i]))return b(void 0,l[i])}else return b(void 0,d[i])}function m(i){if(i in d)return b(l[i],d[i]);if(i in l)return b(void 0,l[i])}var s={url:t,method:t,data:t,baseURL:n,transformRequest:n,transformResponse:n,paramsSerializer:n,timeout:n,timeoutMessage:n,withCredentials:n,adapter:n,responseType:n,xsrfCookieName:n,xsrfHeaderName:n,onUploadProgress:n,onDownloadProgress:n,decompress:n,maxContentLength:n,maxBodyLength:n,transport:n,httpAgent:n,httpsAgent:n,cancelToken:n,socketPath:n,responseEncoding:n,validateStatus:m};return h.forEach(Object.keys(l).concat(Object.keys(d)),function(u){var p=s[u]||e,X=p(u);h.isUndefined(X)&&p!==m||(c[u]=X)}),c},Ul={version:"0.25.0"},cc=Ul.version,Xl={};["object","boolean","number","function","string","symbol"].forEach(function(Z,l){Xl[Z]=function(c){return typeof c===Z||"a"+(l<1?"n ":" ")+Z}});var Bl={};Xl.transitional=function(l,d,c){function b(e,t){return"[Axios v"+cc+"] Transitional option '"+e+"'"+t+(c?". "+c:"")}return function(e,t,n){if(l===!1)throw new Error(b(t," has been removed"+(d?" in "+d:"")));return d&&!Bl[t]&&(Bl[t]=!0,console.warn(b(t," has been deprecated since v"+d+" and will be removed in the near future"))),l?l(e,t,n):!0}};function Zc(Z,l,d){if(typeof Z!="object")throw new TypeError("options must be an object");for(var c=Object.keys(Z),b=c.length;b-- >0;){var e=c[b],t=l[e];if(t){var n=Z[e],m=n===void 0||t(n,e,Z);if(m!==!0)throw new TypeError("option "+e+" must be "+m);continue}if(d!==!0)throw Error("Unknown option "+e)}}var bc={assertOptions:Zc,validators:Xl},Tl=a,tc=Nl,wl=Rd,Ql=dc,O=xl,Pl=bc,K=Pl.validators;function z(Z){this.defaults=Z,this.interceptors={request:new wl,response:new wl}}z.prototype.request=function(l,d){if(typeof l=="string"?(d=d||{},d.url=l):d=l||{},!d.url)throw new Error("Provided config url is not valid");d=O(this.defaults,d),d.method?d.method=d.method.toLowerCase():this.defaults.method?d.method=this.defaults.method.toLowerCase():d.method="get";var c=d.transitional;c!==void 0&&Pl.assertOptions(c,{silentJSONParsing:K.transitional(K.boolean),forcedJSONParsing:K.transitional(K.boolean),clarifyTimeoutError:K.transitional(K.boolean)},!1);var b=[],e=!0;this.interceptors.request.forEach(function(X){typeof X.runWhen=="function"&&X.runWhen(d)===!1||(e=e&&X.synchronous,b.unshift(X.fulfilled,X.rejected))});var t=[];this.interceptors.response.forEach(function(X){t.push(X.fulfilled,X.rejected)});var n;if(!e){var m=[Ql,void 0];for(Array.prototype.unshift.apply(m,b),m=m.concat(t),n=Promise.resolve(d);m.length;)n=n.then(m.shift(),m.shift());return n}for(var s=d;b.length;){var i=b.shift(),u=b.shift();try{s=i(s)}catch(p){u(p);break}}try{n=Ql(s)}catch(p){return Promise.reject(p)}for(;t.length;)n=n.then(t.shift(),t.shift());return n},z.prototype.getUri=function(l){if(!l.url)throw new Error("Provided config url is not valid");return l=O(this.defaults,l),tc(l.url,l.params,l.paramsSerializer).replace(/^\?/,"")},Tl.forEach(["delete","get","head","options"],function(l){z.prototype[l]=function(d,c){return this.request(O(c||{},{method:l,url:d,data:(c||{}).data}))}}),Tl.forEach(["post","put","patch"],function(l){z.prototype[l]=function(d,c,b){return this.request(O(b||{},{method:l,url:d,data:c}))}});var ec=z,nc=P;function f(Z){if(typeof Z!="function")throw new TypeError("executor must be a function.");var l;this.promise=new Promise(function(b){l=b});var d=this;this.promise.then(function(c){if(!!d._listeners){var b,e=d._listeners.length;for(b=0;b<e;b++)d._listeners[b](c);d._listeners=null}}),this.promise.then=function(c){var b,e=new Promise(function(t){d.subscribe(t),b=t}).then(c);return e.cancel=function(){d.unsubscribe(b)},e},Z(function(b){d.reason||(d.reason=new nc(b),l(d.reason))})}f.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},f.prototype.subscribe=function(l){if(this.reason){l(this.reason);return}this._listeners?this._listeners.push(l):this._listeners=[l]},f.prototype.unsubscribe=function(l){if(!!this._listeners){var d=this._listeners.indexOf(l);d!==-1&&this._listeners.splice(d,1)}},f.source=function(){var l,d=new f(function(b){l=b});return{token:d,cancel:l}};var ic=f,mc=function(l){return function(c){return l.apply(null,c)}},uc=a,oc=function(l){return uc.isObject(l)&&l.isAxiosError===!0},Ml=a,sc=Jl,D=ec,ac=xl,Xc=E;function jl(Z){var l=new D(Z),d=sc(D.prototype.request,l);return Ml.extend(d,D.prototype,l),Ml.extend(d,l),d.create=function(b){return jl(ac(Z,b))},d}var W=jl(Xc);W.Axios=D,W.Cancel=P,W.CancelToken=ic,W.isCancel=zl,W.VERSION=Ul.version,W.all=function(l){return Promise.all(l)},W.spread=mc,W.isAxiosError=oc,Yl.exports=W,Yl.exports.default=W;let hc;function rc(){return hc}for(var Gc=[],hl=0;hl<256;++hl)Gc.push((hl+256).toString(16).substr(1));const y=new WeakMap,A=new WeakMap,C=new WeakMap,rl=Symbol("anyProducer"),El=Promise.resolve(),$=Symbol("listenerAdded"),q=Symbol("listenerRemoved");let Gl=!1;function S(Z){if(typeof Z!="string"&&typeof Z!="symbol")throw new TypeError("eventName must be a string or a symbol")}function _(Z){if(typeof Z!="function")throw new TypeError("listener must be a function")}function N(Z,l){const d=A.get(Z);return d.has(l)||d.set(l,new Set),d.get(l)}function x(Z,l){const d=typeof l=="string"||typeof l=="symbol"?l:rl,c=C.get(Z);return c.has(d)||c.set(d,new Set),c.get(d)}function Wc(Z,l,d){const c=C.get(Z);if(c.has(l))for(const b of c.get(l))b.enqueue(d);if(c.has(rl)){const b=Promise.all([l,d]);for(const e of c.get(rl))e.enqueue(b)}}function Ol(Z,l){l=Array.isArray(l)?l:[l];let d=!1,c=()=>{},b=[];const e={enqueue(t){b.push(t),c()},finish(){d=!0,c()}};for(const t of l)x(Z,t).add(e);return{async next(){return b?b.length===0?d?(b=void 0,this.next()):(await new Promise(t=>{c=t}),this.next()):{done:!1,value:await b.shift()}:{done:!0}},async return(t){b=void 0;for(const n of l)x(Z,n).delete(e);return c(),arguments.length>0?{done:!0,value:await t}:{done:!0}},[Symbol.asyncIterator](){return this}}}function Dl(Z){if(Z===void 0)return Al;if(!Array.isArray(Z))throw new TypeError("`methodNames` must be an array of strings");for(const l of Z)if(!Al.includes(l))throw typeof l!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${l} is not Emittery method`);return Z}const Wl=Z=>Z===$||Z===q;class H{static mixin(l,d){return d=Dl(d),c=>{if(typeof c!="function")throw new TypeError("`target` must be function");for(const t of d)if(c.prototype[t]!==void 0)throw new Error(`The property \`${t}\` already exists on \`target\``);function b(){return Object.defineProperty(this,l,{enumerable:!1,value:new H}),this[l]}Object.defineProperty(c.prototype,l,{enumerable:!1,get:b});const e=t=>function(...n){return this[l][t](...n)};for(const t of d)Object.defineProperty(c.prototype,t,{enumerable:!1,value:e(t)});return c}}static get isDebugEnabled(){if(typeof process!="object")return Gl;const{env:l}=process||{env:{}};return l.DEBUG==="emittery"||l.DEBUG==="*"||Gl}static set isDebugEnabled(l){Gl=l}constructor(l={}){y.set(this,new Set),A.set(this,new Map),C.set(this,new Map),this.debug=l.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(d,c,b,e)=>{e=JSON.stringify(e),typeof b=="symbol"&&(b=b.toString());const t=new Date,n=`${t.getHours()}:${t.getMinutes()}:${t.getSeconds()}.${t.getMilliseconds()}`;console.log(`[${n}][emittery:${d}][${c}] Event Name: ${b}
|
|
3
|
-
data: ${e}`)})}logIfDebugEnabled(l,d,c){(H.isDebugEnabled||this.debug.enabled)&&this.debug.logger(l,this.debug.name,d,c)}on(l,d){_(d),l=Array.isArray(l)?l:[l];for(const c of l)S(c),N(this,c).add(d),this.logIfDebugEnabled("subscribe",c,void 0),Wl(c)||this.emit($,{eventName:c,listener:d});return this.off.bind(this,l,d)}off(l,d){_(d),l=Array.isArray(l)?l:[l];for(const c of l)S(c),N(this,c).delete(d),this.logIfDebugEnabled("unsubscribe",c,void 0),Wl(c)||this.emit(q,{eventName:c,listener:d})}once(l){return new Promise(d=>{const c=this.on(l,b=>{c(),d(b)})})}events(l){l=Array.isArray(l)?l:[l];for(const d of l)S(d);return Ol(this,l)}async emit(l,d){S(l),this.logIfDebugEnabled("emit",l,d),Wc(this,l,d);const c=N(this,l),b=y.get(this),e=[...c],t=Wl(l)?[]:[...b];await El,await Promise.all([...e.map(async n=>{if(c.has(n))return n(d)}),...t.map(async n=>{if(b.has(n))return n(l,d)})])}async emitSerial(l,d){S(l),this.logIfDebugEnabled("emitSerial",l,d);const c=N(this,l),b=y.get(this),e=[...c],t=[...b];await El;for(const n of e)c.has(n)&&await n(d);for(const n of t)b.has(n)&&await n(l,d)}onAny(l){return _(l),this.logIfDebugEnabled("subscribeAny",void 0,void 0),y.get(this).add(l),this.emit($,{listener:l}),this.offAny.bind(this,l)}anyEvent(){return Ol(this)}offAny(l){_(l),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(q,{listener:l}),y.get(this).delete(l)}clearListeners(l){l=Array.isArray(l)?l:[l];for(const d of l)if(this.logIfDebugEnabled("clear",d,void 0),typeof d=="string"||typeof d=="symbol"){N(this,d).clear();const c=x(this,d);for(const b of c)b.finish();c.clear()}else{y.get(this).clear();for(const c of A.get(this).values())c.clear();for(const c of C.get(this).values()){for(const b of c)b.finish();c.clear()}}}listenerCount(l){l=Array.isArray(l)?l:[l];let d=0;for(const c of l){if(typeof c=="string"){d+=y.get(this).size+N(this,c).size+x(this,c).size+x(this).size;continue}typeof c!="undefined"&&S(c),d+=y.get(this).size;for(const b of A.get(this).values())d+=b.size;for(const b of C.get(this).values())d+=b.size}return d}bindMethods(l,d){if(typeof l!="object"||l===null)throw new TypeError("`target` must be an object");d=Dl(d);for(const c of d){if(l[c]!==void 0)throw new Error(`The property \`${c}\` already exists on \`target\``);Object.defineProperty(l,c,{enumerable:!1,value:this[c].bind(this)})}}}const Al=Object.getOwnPropertyNames(H.prototype).filter(Z=>Z!=="constructor");Object.defineProperty(H,"listenerAdded",{value:$,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(H,"listenerRemoved",{value:q,writable:!1,enumerable:!0,configurable:!1});var $l;(function(Z){Z.FPS_DROP="fps_drop"})($l||($l={}));class pc{constructor(){this.processor_=null,this.generator_=null}init(l){return new Promise((d,c)=>{try{this.processor_=new MediaStreamTrackProcessor(l)}catch(b){console.log(`[InsertableStreamHelper] MediaStreamTrackProcessor failed: ${b}`),c(b)}try{l.kind==="audio"?this.generator_=new MediaStreamTrackGenerator({kind:"audio"}):l.kind==="video"?this.generator_=new MediaStreamTrackGenerator({kind:"video"}):c("kind not supported")}catch(b){console.log(`[InsertableStreamHelper] MediaStreamTrackGenerator failed: ${b}`),c(b)}d()})}getReadable(){return this.processor_.readable}getWriteable(){return this.generator_.writable}getProccesorTrack(){return this.generator_}}class Vc{constructor(l){this.insertableStreamHelper_=new pc,this.mediaProcessor_=l}setTrack(l){return new Promise((d,c)=>{this.insertableStreamHelper_.init(l).then(()=>{this.mediaProcessor_.transform(this.insertableStreamHelper_.getReadable(),this.insertableStreamHelper_.getWriteable()).then(()=>{d(this.insertableStreamHelper_.getProccesorTrack())}).catch(b=>{c(b)})}).catch(b=>{c(b)})})}destroy(){return new Promise((l,d)=>{this.mediaProcessor_?this.mediaProcessor_.destroy().then(()=>{l()}).catch(c=>{d(c)}):d("no processor")})}}const ql="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NsYXNzICR7fSQudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSwkLmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIifTt2YXIgUGU9e2V4cG9ydHM6e319LFhlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBzPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxvPTA7bzxzLmxlbmd0aDtvKyspc1tvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodCxzKX19LFV0PVhlLEI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBPZShyKXtyZXR1cm4gQXJyYXkuaXNBcnJheShyKX1mdW5jdGlvbiBTZShyKXtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQifWZ1bmN0aW9uIEJ0KHIpe3JldHVybiByIT09bnVsbCYmIVNlKHIpJiZyLmNvbnN0cnVjdG9yIT09bnVsbCYmIVNlKHIuY29uc3RydWN0b3IpJiZ0eXBlb2Ygci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcj09ImZ1bmN0aW9uIiYmci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihyKX1mdW5jdGlvbiBLZShyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn1mdW5jdGlvbiBOdChyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRm9ybURhdGFdIn1mdW5jdGlvbiBIdChyKXt2YXIgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KHIpOmU9ciYmci5idWZmZXImJktlKHIuYnVmZmVyKSxlfWZ1bmN0aW9uICR0KHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyJ9ZnVuY3Rpb24gV3Qocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIn1mdW5jdGlvbiBZZShyKXtyZXR1cm4gciE9PW51bGwmJnR5cGVvZiByPT0ib2JqZWN0In1mdW5jdGlvbiBuZShyKXtpZihCLmNhbGwocikhPT0iW29iamVjdCBPYmplY3RdIilyZXR1cm4hMTt2YXIgZT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7cmV0dXJuIGU9PT1udWxsfHxlPT09T2JqZWN0LnByb3RvdHlwZX1mdW5jdGlvbiBqdChyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIHF0KHIpe3JldHVybiBCLmNhbGwocik9PT0iW29iamVjdCBGaWxlXSJ9ZnVuY3Rpb24gVnQocil7cmV0dXJuIEIuY2FsbChyKT09PSJbb2JqZWN0IEJsb2JdIn1mdW5jdGlvbiBaZShyKXtyZXR1cm4gQi5jYWxsKHIpPT09IltvYmplY3QgRnVuY3Rpb25dIn1mdW5jdGlvbiB6dChyKXtyZXR1cm4gWWUocikmJlplKHIucGlwZSl9ZnVuY3Rpb24gSnQocil7cmV0dXJuIEIuY2FsbChyKT09PSJbb2JqZWN0IFVSTFNlYXJjaFBhcmFtc10ifWZ1bmN0aW9uIEd0KHIpe3JldHVybiByLnRyaW0/ci50cmltKCk6ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9ZnVuY3Rpb24gUXQoKXtyZXR1cm4gdHlwZW9mIG5hdmlnYXRvciE9InVuZGVmaW5lZCImJihuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5hdGl2ZVNjcmlwdCJ8fG5hdmlnYXRvci5wcm9kdWN0PT09Ik5TIik/ITE6dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJnR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCJ9ZnVuY3Rpb24gTWUocixlKXtpZighKHI9PT1udWxsfHx0eXBlb2Ygcj09InVuZGVmaW5lZCIpKWlmKHR5cGVvZiByIT0ib2JqZWN0IiYmKHI9W3JdKSxPZShyKSlmb3IodmFyIHQ9MCxuPXIubGVuZ3RoO3Q8bjt0KyspZS5jYWxsKG51bGwsclt0XSx0LHIpO2Vsc2UgZm9yKHZhciBzIGluIHIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIscykmJmUuY2FsbChudWxsLHJbc10scyxyKX1mdW5jdGlvbiBBZSgpe3ZhciByPXt9O2Z1bmN0aW9uIGUocyxvKXtuZShyW29dKSYmbmUocyk/cltvXT1BZShyW29dLHMpOm5lKHMpP3Jbb109QWUoe30scyk6T2Uocyk/cltvXT1zLnNsaWNlKCk6cltvXT1zfWZvcih2YXIgdD0wLG49YXJndW1lbnRzLmxlbmd0aDt0PG47dCsrKU1lKGFyZ3VtZW50c1t0XSxlKTtyZXR1cm4gcn1mdW5jdGlvbiBYdChyLGUsdCl7cmV0dXJuIE1lKGUsZnVuY3Rpb24ocyxvKXt0JiZ0eXBlb2Ygcz09ImZ1bmN0aW9uIj9yW29dPVV0KHMsdCk6cltvXT1zfSkscn1mdW5jdGlvbiBLdChyKXtyZXR1cm4gci5jaGFyQ29kZUF0KDApPT09NjUyNzkmJihyPXIuc2xpY2UoMSkpLHJ9dmFyIFA9e2lzQXJyYXk6T2UsaXNBcnJheUJ1ZmZlcjpLZSxpc0J1ZmZlcjpCdCxpc0Zvcm1EYXRhOk50LGlzQXJyYXlCdWZmZXJWaWV3Okh0LGlzU3RyaW5nOiR0LGlzTnVtYmVyOld0LGlzT2JqZWN0OlllLGlzUGxhaW5PYmplY3Q6bmUsaXNVbmRlZmluZWQ6U2UsaXNEYXRlOmp0LGlzRmlsZTpxdCxpc0Jsb2I6VnQsaXNGdW5jdGlvbjpaZSxpc1N0cmVhbTp6dCxpc1VSTFNlYXJjaFBhcmFtczpKdCxpc1N0YW5kYXJkQnJvd3NlckVudjpRdCxmb3JFYWNoOk1lLG1lcmdlOkFlLGV4dGVuZDpYdCx0cmltOkd0LHN0cmlwQk9NOkt0fSxxPVA7ZnVuY3Rpb24gZXQocil7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChyKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyIHR0PWZ1bmN0aW9uKGUsdCxuKXtpZighdClyZXR1cm4gZTt2YXIgcztpZihuKXM9bih0KTtlbHNlIGlmKHEuaXNVUkxTZWFyY2hQYXJhbXModCkpcz10LnRvU3RyaW5nKCk7ZWxzZXt2YXIgbz1bXTtxLmZvckVhY2godCxmdW5jdGlvbihjLF8pe2M9PT1udWxsfHx0eXBlb2YgYz09InVuZGVmaW5lZCJ8fChxLmlzQXJyYXkoYyk/Xz1fKyJbXSI6Yz1bY10scS5mb3JFYWNoKGMsZnVuY3Rpb24oZCl7cS5pc0RhdGUoZCk/ZD1kLnRvSVNPU3RyaW5nKCk6cS5pc09iamVjdChkKSYmKGQ9SlNPTi5zdHJpbmdpZnkoZCkpLG8ucHVzaChldChfKSsiPSIrZXQoZCkpfSkpfSkscz1vLmpvaW4oIiYiKX1pZihzKXt2YXIgYT1lLmluZGV4T2YoIiMiKTthIT09LTEmJihlPWUuc2xpY2UoMCxhKSksZSs9KGUuaW5kZXhPZigiPyIpPT09LTE/Ij8iOiImIikrc31yZXR1cm4gZX0sWXQ9UDtmdW5jdGlvbiBzZSgpe3RoaXMuaGFuZGxlcnM9W119c2UucHJvdG90eXBlLnVzZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czpuP24uc3luY2hyb25vdXM6ITEscnVuV2hlbjpuP24ucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0sc2UucHJvdG90eXBlLmVqZWN0PWZ1bmN0aW9uKGUpe3RoaXMuaGFuZGxlcnNbZV0mJih0aGlzLmhhbmRsZXJzW2VdPW51bGwpfSxzZS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXtZdC5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24obil7biE9PW51bGwmJmUobil9KX07dmFyIFp0PXNlLGVyPVAsdHI9ZnVuY3Rpb24oZSx0KXtlci5mb3JFYWNoKGUsZnVuY3Rpb24ocyxvKXtvIT09dCYmby50b1VwcGVyQ2FzZSgpPT09dC50b1VwcGVyQ2FzZSgpJiYoZVt0XT1zLGRlbGV0ZSBlW29dKX0pfSxydD1mdW5jdGlvbihlLHQsbixzLG8pe3JldHVybiBlLmNvbmZpZz10LG4mJihlLmNvZGU9biksZS5yZXF1ZXN0PXMsZS5yZXNwb25zZT1vLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX0sZX0scnI9cnQsbnQ9ZnVuY3Rpb24oZSx0LG4scyxvKXt2YXIgYT1uZXcgRXJyb3IoZSk7cmV0dXJuIHJyKGEsdCxuLHMsbyl9LG5yPW50LHNyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz1uLmNvbmZpZy52YWxpZGF0ZVN0YXR1czshbi5zdGF0dXN8fCFzfHxzKG4uc3RhdHVzKT9lKG4pOnQobnIoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIituLnN0YXR1cyxuLmNvbmZpZyxudWxsLG4ucmVxdWVzdCxuKSl9LGllPVAsaXI9aWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3JldHVybnt3cml0ZTpmdW5jdGlvbih0LG4scyxvLGEsdSl7dmFyIGM9W107Yy5wdXNoKHQrIj0iK2VuY29kZVVSSUNvbXBvbmVudChuKSksaWUuaXNOdW1iZXIocykmJmMucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKHMpLnRvR01UU3RyaW5nKCkpLGllLmlzU3RyaW5nKG8pJiZjLnB1c2goInBhdGg9IitvKSxpZS5pc1N0cmluZyhhKSYmYy5wdXNoKCJkb21haW49IithKSx1PT09ITAmJmMucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWMuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbih0KXt2YXIgbj1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrdCsiKT0oW147XSopIikpO3JldHVybiBuP2RlY29kZVVSSUNvbXBvbmVudChuWzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy53cml0ZSh0LCIiLERhdGUubm93KCktODY0ZTUpfX19KCk6ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24oKXt9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scmVtb3ZlOmZ1bmN0aW9uKCl7fX19KCksb3I9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChlKX0sYXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sdXI9b3IsZnI9YXIsbHI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmIXVyKHQpP2ZyKGUsdCk6dH0sSWU9UCxjcj1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLGhyPWZ1bmN0aW9uKGUpe3ZhciB0PXt9LG4scyxvO3JldHVybiBlJiZJZS5mb3JFYWNoKGUuc3BsaXQoYApgKSxmdW5jdGlvbih1KXtpZihvPXUuaW5kZXhPZigiOiIpLG49SWUudHJpbSh1LnN1YnN0cigwLG8pKS50b0xvd2VyQ2FzZSgpLHM9SWUudHJpbSh1LnN1YnN0cihvKzEpKSxuKXtpZih0W25dJiZjci5pbmRleE9mKG4pPj0wKXJldHVybjtuPT09InNldC1jb29raWUiP3Rbbl09KHRbbl0/dFtuXTpbXSkuY29uY2F0KFtzXSk6dFtuXT10W25dP3Rbbl0rIiwgIitzOnN9fSksdH0sc3Q9UCxkcj1zdC5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxuO2Z1bmN0aW9uIHMobyl7dmFyIGE9bztyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixhKSxhPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGEpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gbj1zKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihhKXt2YXIgdT1zdC5pc1N0cmluZyhhKT9zKGEpOmE7cmV0dXJuIHUucHJvdG9jb2w9PT1uLnByb3RvY29sJiZ1Lmhvc3Q9PT1uLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpO2Z1bmN0aW9uIHhlKHIpe3RoaXMubWVzc2FnZT1yfXhlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSx4ZS5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgb2U9eGUsYWU9UCxwcj1zcixtcj1pcixncj10dCxfcj1scix5cj1ocix2cj1kcixGZT1udCx3cj1mZSxicj1vZSxpdD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obixzKXt2YXIgbz1lLmRhdGEsYT1lLmhlYWRlcnMsdT1lLnJlc3BvbnNlVHlwZSxjO2Z1bmN0aW9uIF8oKXtlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKGMpLGUuc2lnbmFsJiZlLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsYyl9YWUuaXNGb3JtRGF0YShvKSYmZGVsZXRlIGFbIkNvbnRlbnQtVHlwZSJdO3ZhciBmPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihlLmF1dGgpe3ZhciBkPWUuYXV0aC51c2VybmFtZXx8IiIsdj1lLmF1dGgucGFzc3dvcmQ/dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUuYXV0aC5wYXNzd29yZCkpOiIiO2EuQXV0aG9yaXphdGlvbj0iQmFzaWMgIitidG9hKGQrIjoiK3YpfXZhciB3PV9yKGUuYmFzZVVSTCxlLnVybCk7Zi5vcGVuKGUubWV0aG9kLnRvVXBwZXJDYXNlKCksZ3IodyxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxmLnRpbWVvdXQ9ZS50aW1lb3V0O2Z1bmN0aW9uIE0oKXtpZighIWYpe3ZhciBDPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gZj95cihmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLE89IXV8fHU9PT0idGV4dCJ8fHU9PT0ianNvbiI/Zi5yZXNwb25zZVRleHQ6Zi5yZXNwb25zZSxJPXtkYXRhOk8sc3RhdHVzOmYuc3RhdHVzLHN0YXR1c1RleHQ6Zi5zdGF0dXNUZXh0LGhlYWRlcnM6Qyxjb25maWc6ZSxyZXF1ZXN0OmZ9O3ByKGZ1bmN0aW9uKFgpe24oWCksXygpfSxmdW5jdGlvbihYKXtzKFgpLF8oKX0sSSksZj1udWxsfX1pZigib25sb2FkZW5kImluIGY/Zi5vbmxvYWRlbmQ9TTpmLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHxmLnJlYWR5U3RhdGUhPT00fHxmLnN0YXR1cz09PTAmJiEoZi5yZXNwb25zZVVSTCYmZi5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpPT09MCl8fHNldFRpbWVvdXQoTSl9LGYub25hYm9ydD1mdW5jdGlvbigpeyFmfHwocyhGZSgiUmVxdWVzdCBhYm9ydGVkIixlLCJFQ09OTkFCT1JURUQiLGYpKSxmPW51bGwpfSxmLm9uZXJyb3I9ZnVuY3Rpb24oKXtzKEZlKCJOZXR3b3JrIEVycm9yIixlLG51bGwsZikpLGY9bnVsbH0sZi5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgTz1lLnRpbWVvdXQ/InRpbWVvdXQgb2YgIitlLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIsST1lLnRyYW5zaXRpb25hbHx8d3IudHJhbnNpdGlvbmFsO2UudGltZW91dEVycm9yTWVzc2FnZSYmKE89ZS50aW1lb3V0RXJyb3JNZXNzYWdlKSxzKEZlKE8sZSxJLmNsYXJpZnlUaW1lb3V0RXJyb3I/IkVUSU1FRE9VVCI6IkVDT05OQUJPUlRFRCIsZikpLGY9bnVsbH0sYWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSl7dmFyIEE9KGUud2l0aENyZWRlbnRpYWxzfHx2cih3KSkmJmUueHNyZkNvb2tpZU5hbWU/bXIucmVhZChlLnhzcmZDb29raWVOYW1lKTp2b2lkIDA7QSYmKGFbZS54c3JmSGVhZGVyTmFtZV09QSl9InNldFJlcXVlc3RIZWFkZXIiaW4gZiYmYWUuZm9yRWFjaChhLGZ1bmN0aW9uKE8sSSl7dHlwZW9mIG89PSJ1bmRlZmluZWQiJiZJLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIj9kZWxldGUgYVtJXTpmLnNldFJlcXVlc3RIZWFkZXIoSSxPKX0pLGFlLmlzVW5kZWZpbmVkKGUud2l0aENyZWRlbnRpYWxzKXx8KGYud2l0aENyZWRlbnRpYWxzPSEhZS53aXRoQ3JlZGVudGlhbHMpLHUmJnUhPT0ianNvbiImJihmLnJlc3BvbnNlVHlwZT1lLnJlc3BvbnNlVHlwZSksdHlwZW9mIGUub25Eb3dubG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZmLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uRG93bmxvYWRQcm9ncmVzcyksdHlwZW9mIGUub25VcGxvYWRQcm9ncmVzcz09ImZ1bmN0aW9uIiYmZi51cGxvYWQmJmYudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uVXBsb2FkUHJvZ3Jlc3MpLChlLmNhbmNlbFRva2VufHxlLnNpZ25hbCkmJihjPWZ1bmN0aW9uKEMpeyFmfHwocyghQ3x8QyYmQy50eXBlP25ldyBicigiY2FuY2VsZWQiKTpDKSxmLmFib3J0KCksZj1udWxsKX0sZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUoYyksZS5zaWduYWwmJihlLnNpZ25hbC5hYm9ydGVkP2MoKTplLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsYykpKSxvfHwobz1udWxsKSxmLnNlbmQobyl9KX0sYj1QLG90PXRyLEVyPXJ0LFRyPXsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn07ZnVuY3Rpb24gYXQocixlKXshYi5pc1VuZGVmaW5lZChyKSYmYi5pc1VuZGVmaW5lZChyWyJDb250ZW50LVR5cGUiXSkmJihyWyJDb250ZW50LVR5cGUiXT1lKX1mdW5jdGlvbiBDcigpe3ZhciByO3JldHVybih0eXBlb2YgWE1MSHR0cFJlcXVlc3QhPSJ1bmRlZmluZWQifHx0eXBlb2YgcHJvY2VzcyE9InVuZGVmaW5lZCImJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwcm9jZXNzKT09PSJbb2JqZWN0IHByb2Nlc3NdIikmJihyPWl0KSxyfWZ1bmN0aW9uIFJyKHIsZSx0KXtpZihiLmlzU3RyaW5nKHIpKXRyeXtyZXR1cm4oZXx8SlNPTi5wYXJzZSkociksYi50cmltKHIpfWNhdGNoKG4pe2lmKG4ubmFtZSE9PSJTeW50YXhFcnJvciIpdGhyb3cgbn1yZXR1cm4odHx8SlNPTi5zdHJpbmdpZnkpKHIpfXZhciB1ZT17dHJhbnNpdGlvbmFsOntzaWxlbnRKU09OUGFyc2luZzohMCxmb3JjZWRKU09OUGFyc2luZzohMCxjbGFyaWZ5VGltZW91dEVycm9yOiExfSxhZGFwdGVyOkNyKCksdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oZSx0KXtyZXR1cm4gb3QodCwiQWNjZXB0Iiksb3QodCwiQ29udGVudC1UeXBlIiksYi5pc0Zvcm1EYXRhKGUpfHxiLmlzQXJyYXlCdWZmZXIoZSl8fGIuaXNCdWZmZXIoZSl8fGIuaXNTdHJlYW0oZSl8fGIuaXNGaWxlKGUpfHxiLmlzQmxvYihlKT9lOmIuaXNBcnJheUJ1ZmZlclZpZXcoZSk/ZS5idWZmZXI6Yi5pc1VSTFNlYXJjaFBhcmFtcyhlKT8oYXQodCwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiKSxlLnRvU3RyaW5nKCkpOmIuaXNPYmplY3QoZSl8fHQmJnRbIkNvbnRlbnQtVHlwZSJdPT09ImFwcGxpY2F0aW9uL2pzb24iPyhhdCh0LCJhcHBsaWNhdGlvbi9qc29uIiksUnIoZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy50cmFuc2l0aW9uYWx8fHVlLnRyYW5zaXRpb25hbCxuPXQmJnQuc2lsZW50SlNPTlBhcnNpbmcscz10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG89IW4mJnRoaXMucmVzcG9uc2VUeXBlPT09Impzb24iO2lmKG98fHMmJmIuaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChhKXtpZihvKXRocm93IGEubmFtZT09PSJTeW50YXhFcnJvciI/RXIoYSx0aGlzLCJFX0pTT05fUEFSU0UiKTphfXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX19O2IuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSxmdW5jdGlvbihlKXt1ZS5oZWFkZXJzW2VdPXt9fSksYi5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7dWUuaGVhZGVyc1tlXT1iLm1lcmdlKFRyKX0pO3ZhciBmZT11ZSxQcj1QLE9yPWZlLFNyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz10aGlzfHxPcjtyZXR1cm4gUHIuZm9yRWFjaChuLGZ1bmN0aW9uKGEpe2U9YS5jYWxsKHMsZSx0KX0pLGV9LHV0PWZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJmUuX19DQU5DRUxfXyl9LGZ0PVAsTGU9U3IsTXI9dXQsQXI9ZmUsSXI9b2U7ZnVuY3Rpb24ga2Uocil7aWYoci5jYW5jZWxUb2tlbiYmci5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksci5zaWduYWwmJnIuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IElyKCJjYW5jZWxlZCIpfXZhciB4cj1mdW5jdGlvbihlKXtrZShlKSxlLmhlYWRlcnM9ZS5oZWFkZXJzfHx7fSxlLmRhdGE9TGUuY2FsbChlLGUuZGF0YSxlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXF1ZXN0KSxlLmhlYWRlcnM9ZnQubWVyZ2UoZS5oZWFkZXJzLmNvbW1vbnx8e30sZS5oZWFkZXJzW2UubWV0aG9kXXx8e30sZS5oZWFkZXJzKSxmdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLGZ1bmN0aW9uKHMpe2RlbGV0ZSBlLmhlYWRlcnNbc119KTt2YXIgdD1lLmFkYXB0ZXJ8fEFyLmFkYXB0ZXI7cmV0dXJuIHQoZSkudGhlbihmdW5jdGlvbihzKXtyZXR1cm4ga2UoZSkscy5kYXRhPUxlLmNhbGwoZSxzLmRhdGEscy5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpLHN9LGZ1bmN0aW9uKHMpe3JldHVybiBNcihzKXx8KGtlKGUpLHMmJnMucmVzcG9uc2UmJihzLnJlc3BvbnNlLmRhdGE9TGUuY2FsbChlLHMucmVzcG9uc2UuZGF0YSxzLnJlc3BvbnNlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdChzKX0pfSxTPVAsbHQ9ZnVuY3Rpb24oZSx0KXt0PXR8fHt9O3ZhciBuPXt9O2Z1bmN0aW9uIHMoZixkKXtyZXR1cm4gUy5pc1BsYWluT2JqZWN0KGYpJiZTLmlzUGxhaW5PYmplY3QoZCk/Uy5tZXJnZShmLGQpOlMuaXNQbGFpbk9iamVjdChkKT9TLm1lcmdlKHt9LGQpOlMuaXNBcnJheShkKT9kLnNsaWNlKCk6ZH1mdW5jdGlvbiBvKGYpe2lmKFMuaXNVbmRlZmluZWQodFtmXSkpe2lmKCFTLmlzVW5kZWZpbmVkKGVbZl0pKXJldHVybiBzKHZvaWQgMCxlW2ZdKX1lbHNlIHJldHVybiBzKGVbZl0sdFtmXSl9ZnVuY3Rpb24gYShmKXtpZighUy5pc1VuZGVmaW5lZCh0W2ZdKSlyZXR1cm4gcyh2b2lkIDAsdFtmXSl9ZnVuY3Rpb24gdShmKXtpZihTLmlzVW5kZWZpbmVkKHRbZl0pKXtpZighUy5pc1VuZGVmaW5lZChlW2ZdKSlyZXR1cm4gcyh2b2lkIDAsZVtmXSl9ZWxzZSByZXR1cm4gcyh2b2lkIDAsdFtmXSl9ZnVuY3Rpb24gYyhmKXtpZihmIGluIHQpcmV0dXJuIHMoZVtmXSx0W2ZdKTtpZihmIGluIGUpcmV0dXJuIHModm9pZCAwLGVbZl0pfXZhciBfPXt1cmw6YSxtZXRob2Q6YSxkYXRhOmEsYmFzZVVSTDp1LHRyYW5zZm9ybVJlcXVlc3Q6dSx0cmFuc2Zvcm1SZXNwb25zZTp1LHBhcmFtc1NlcmlhbGl6ZXI6dSx0aW1lb3V0OnUsdGltZW91dE1lc3NhZ2U6dSx3aXRoQ3JlZGVudGlhbHM6dSxhZGFwdGVyOnUscmVzcG9uc2VUeXBlOnUseHNyZkNvb2tpZU5hbWU6dSx4c3JmSGVhZGVyTmFtZTp1LG9uVXBsb2FkUHJvZ3Jlc3M6dSxvbkRvd25sb2FkUHJvZ3Jlc3M6dSxkZWNvbXByZXNzOnUsbWF4Q29udGVudExlbmd0aDp1LG1heEJvZHlMZW5ndGg6dSx0cmFuc3BvcnQ6dSxodHRwQWdlbnQ6dSxodHRwc0FnZW50OnUsY2FuY2VsVG9rZW46dSxzb2NrZXRQYXRoOnUscmVzcG9uc2VFbmNvZGluZzp1LHZhbGlkYXRlU3RhdHVzOmN9O3JldHVybiBTLmZvckVhY2goT2JqZWN0LmtleXMoZSkuY29uY2F0KE9iamVjdC5rZXlzKHQpKSxmdW5jdGlvbihkKXt2YXIgdj1fW2RdfHxvLHc9dihkKTtTLmlzVW5kZWZpbmVkKHcpJiZ2IT09Y3x8KG5bZF09dyl9KSxufSxjdD17dmVyc2lvbjoiMC4yNS4wIn0sRnI9Y3QudmVyc2lvbixEZT17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goZnVuY3Rpb24ocixlKXtEZVtyXT1mdW5jdGlvbihuKXtyZXR1cm4gdHlwZW9mIG49PT1yfHwiYSIrKGU8MT8ibiAiOiIgIikrcn19KTt2YXIgaHQ9e307RGUudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiBzKG8sYSl7cmV0dXJuIltBeGlvcyB2IitGcisiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK28rIiciK2ErKG4/Ii4gIituOiIiKX1yZXR1cm4gZnVuY3Rpb24obyxhLHUpe2lmKGU9PT0hMSl0aHJvdyBuZXcgRXJyb3IocyhhLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKHQ/IiBpbiAiK3Q6IiIpKSk7cmV0dXJuIHQmJiFodFthXSYmKGh0W2FdPSEwLGNvbnNvbGUud2FybihzKGEsIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksZT9lKG8sYSx1KTohMH19O2Z1bmN0aW9uIExyKHIsZSx0KXtpZih0eXBlb2YgciE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2Zvcih2YXIgbj1PYmplY3Qua2V5cyhyKSxzPW4ubGVuZ3RoO3MtLSA+MDspe3ZhciBvPW5bc10sYT1lW29dO2lmKGEpe3ZhciB1PXJbb10sYz11PT09dm9pZCAwfHxhKHUsbyxyKTtpZihjIT09ITApdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uICIrbysiIG11c3QgYmUgIitjKTtjb250aW51ZX1pZih0IT09ITApdGhyb3cgRXJyb3IoIlVua25vd24gb3B0aW9uICIrbyl9fXZhciBrcj17YXNzZXJ0T3B0aW9uczpMcix2YWxpZGF0b3JzOkRlfSxkdD1QLERyPXR0LHB0PVp0LG10PXhyLGxlPWx0LGd0PWtyLFY9Z3QudmFsaWRhdG9ycztmdW5jdGlvbiBLKHIpe3RoaXMuZGVmYXVsdHM9cix0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgcHQscmVzcG9uc2U6bmV3IHB0fX1LLnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIGU9PSJzdHJpbmciPyh0PXR8fHt9LHQudXJsPWUpOnQ9ZXx8e30sIXQudXJsKXRocm93IG5ldyBFcnJvcigiUHJvdmlkZWQgY29uZmlnIHVybCBpcyBub3QgdmFsaWQiKTt0PWxlKHRoaXMuZGVmYXVsdHMsdCksdC5tZXRob2Q/dC5tZXRob2Q9dC5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD90Lm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnQubWV0aG9kPSJnZXQiO3ZhciBuPXQudHJhbnNpdGlvbmFsO24hPT12b2lkIDAmJmd0LmFzc2VydE9wdGlvbnMobix7c2lsZW50SlNPTlBhcnNpbmc6Vi50cmFuc2l0aW9uYWwoVi5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpWLnRyYW5zaXRpb25hbChWLmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6Vi50cmFuc2l0aW9uYWwoVi5ib29sZWFuKX0sITEpO3ZhciBzPVtdLG89ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKHcpe3R5cGVvZiB3LnJ1bldoZW49PSJmdW5jdGlvbiImJncucnVuV2hlbih0KT09PSExfHwobz1vJiZ3LnN5bmNocm9ub3VzLHMudW5zaGlmdCh3LmZ1bGZpbGxlZCx3LnJlamVjdGVkKSl9KTt2YXIgYT1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKHcpe2EucHVzaCh3LmZ1bGZpbGxlZCx3LnJlamVjdGVkKX0pO3ZhciB1O2lmKCFvKXt2YXIgYz1bbXQsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkoYyxzKSxjPWMuY29uY2F0KGEpLHU9UHJvbWlzZS5yZXNvbHZlKHQpO2MubGVuZ3RoOyl1PXUudGhlbihjLnNoaWZ0KCksYy5zaGlmdCgpKTtyZXR1cm4gdX1mb3IodmFyIF89dDtzLmxlbmd0aDspe3ZhciBmPXMuc2hpZnQoKSxkPXMuc2hpZnQoKTt0cnl7Xz1mKF8pfWNhdGNoKHYpe2Qodik7YnJlYWt9fXRyeXt1PW10KF8pfWNhdGNoKHYpe3JldHVybiBQcm9taXNlLnJlamVjdCh2KX1mb3IoO2EubGVuZ3RoOyl1PXUudGhlbihhLnNoaWZ0KCksYS5zaGlmdCgpKTtyZXR1cm4gdX0sSy5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe2lmKCFlLnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7cmV0dXJuIGU9bGUodGhpcy5kZWZhdWx0cyxlKSxEcihlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxkdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSxmdW5jdGlvbihlKXtLLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLnJlcXVlc3QobGUobnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KG58fHt9KS5kYXRhfSkpfX0pLGR0LmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtLLnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LG4scyl7cmV0dXJuIHRoaXMucmVxdWVzdChsZShzfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpufSkpfX0pO3ZhciBVcj1LLEJyPW9lO2Z1bmN0aW9uIHoocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciBlO3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihzKXtlPXN9KTt2YXIgdD10aGlzO3RoaXMucHJvbWlzZS50aGVuKGZ1bmN0aW9uKG4pe2lmKCEhdC5fbGlzdGVuZXJzKXt2YXIgcyxvPXQuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKHM9MDtzPG87cysrKXQuX2xpc3RlbmVyc1tzXShuKTt0Ll9saXN0ZW5lcnM9bnVsbH19KSx0aGlzLnByb21pc2UudGhlbj1mdW5jdGlvbihuKXt2YXIgcyxvPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEpe3Quc3Vic2NyaWJlKGEpLHM9YX0pLnRoZW4obik7cmV0dXJuIG8uY2FuY2VsPWZ1bmN0aW9uKCl7dC51bnN1YnNjcmliZShzKX0sb30scihmdW5jdGlvbihzKXt0LnJlYXNvbnx8KHQucmVhc29uPW5ldyBCcihzKSxlKHQucmVhc29uKSl9KX16LnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LHoucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZih0aGlzLnJlYXNvbil7ZSh0aGlzLnJlYXNvbik7cmV0dXJufXRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfSx6LnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZighIXRoaXMuX2xpc3RlbmVycyl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7dCE9PS0xJiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSx6LnNvdXJjZT1mdW5jdGlvbigpe3ZhciBlLHQ9bmV3IHooZnVuY3Rpb24ocyl7ZT1zfSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fTt2YXIgTnI9eixIcj1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkobnVsbCxuKX19LCRyPVAsV3I9ZnVuY3Rpb24oZSl7cmV0dXJuICRyLmlzT2JqZWN0KGUpJiZlLmlzQXhpb3NFcnJvcj09PSEwfSxfdD1QLGpyPVhlLGNlPVVyLHFyPWx0LFZyPWZlO2Z1bmN0aW9uIHl0KHIpe3ZhciBlPW5ldyBjZShyKSx0PWpyKGNlLnByb3RvdHlwZS5yZXF1ZXN0LGUpO3JldHVybiBfdC5leHRlbmQodCxjZS5wcm90b3R5cGUsZSksX3QuZXh0ZW5kKHQsZSksdC5jcmVhdGU9ZnVuY3Rpb24ocyl7cmV0dXJuIHl0KHFyKHIscykpfSx0fXZhciBMPXl0KFZyKTtMLkF4aW9zPWNlLEwuQ2FuY2VsPW9lLEwuQ2FuY2VsVG9rZW49TnIsTC5pc0NhbmNlbD11dCxMLlZFUlNJT049Y3QudmVyc2lvbixMLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9LEwuc3ByZWFkPUhyLEwuaXNBeGlvc0Vycm9yPVdyLFBlLmV4cG9ydHM9TCxQZS5leHBvcnRzLmRlZmF1bHQ9TDt2YXIgenI9UGUuZXhwb3J0cztjbGFzcyBwe2lzRW1wdHkoKXtyZXR1cm4hdGhpcy5pc1ByZXNlbnQoKX1zdGF0aWMgb2YoZSl7aWYoZSE9bnVsbClyZXR1cm4gbmV3IHZ0KGUpO3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG51bGwgb3IgdW5kZWZpbmVkLiIpfXN0YXRpYyBvZk5vbk51bGwoZSl7cmV0dXJuIHAub2YoZSl9c3RhdGljIG9mTnVsbGFibGUoZSl7cmV0dXJuIGUhPW51bGw/bmV3IHZ0KGUpOm5ldyB3dH1zdGF0aWMgZW1wdHkoKXtyZXR1cm4gbmV3IHd0fXN0YXRpYyBmcm9tKGUpe3N3aXRjaChlLmtpbmQpe2Nhc2UicHJlc2VudCI6cmV0dXJuIHAub2YoZS52YWx1ZSk7Y2FzZSJlbXB0eSI6cmV0dXJuIHAuZW1wdHkoKTtkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBwYXNzZWQgdmFsdWUgd2FzIG5vdCBhbiBPcHRpb24gdHlwZS4iKX19fWNsYXNzIHZ0IGV4dGVuZHMgcHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3RoaXMucGF5bG9hZD1lfWlzUHJlc2VudCgpe3JldHVybiEwfWdldCgpe3JldHVybiB0aGlzLnBheWxvYWR9aWZQcmVzZW50KGUpe2UodGhpcy5wYXlsb2FkKX1pZlByZXNlbnRPckVsc2UoZSx0KXtlKHRoaXMucGF5bG9hZCl9ZmlsdGVyKGUpe3JldHVybiBlKHRoaXMucGF5bG9hZCk/dGhpczpwLmVtcHR5KCl9bWFwKGUpe2NvbnN0IHQ9ZSh0aGlzLnBheWxvYWQpO3JldHVybiBwLm9mTnVsbGFibGUodCl9ZmxhdE1hcChlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpfW9yKGUpe3JldHVybiB0aGlzfW9yRWxzZShlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZUdldChlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yRWxzZVRocm93KGUpe3JldHVybiB0aGlzLnBheWxvYWR9b3JOdWxsKCl7cmV0dXJuIHRoaXMucGF5bG9hZH1vclVuZGVmaW5lZCgpe3JldHVybiB0aGlzLnBheWxvYWR9dG9PcHRpb24oKXtyZXR1cm57a2luZDoicHJlc2VudCIsdmFsdWU6dGhpcy5wYXlsb2FkfX1tYXRjaGVzKGUpe3JldHVybiBlLnByZXNlbnQodGhpcy5wYXlsb2FkKX10b0pTT04oZSl7cmV0dXJuIHRoaXMucGF5bG9hZH19Y2xhc3Mgd3QgZXh0ZW5kcyBwe2lzUHJlc2VudCgpe3JldHVybiExfWNvbnN0cnVjdG9yKCl7c3VwZXIoKX1nZXQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgb3B0aW9uYWwgaXMgbm90IHByZXNlbnQuIil9aWZQcmVzZW50KGUpe31pZlByZXNlbnRPckVsc2UoZSx0KXt0KCl9ZmlsdGVyKGUpe3JldHVybiB0aGlzfW1hcChlKXtyZXR1cm4gcC5lbXB0eSgpfWZsYXRNYXAoZSl7cmV0dXJuIHAuZW1wdHkoKX1vcihlKXtyZXR1cm4gZSgpfW9yRWxzZShlKXtyZXR1cm4gZX1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMub3JFbHNlKGUoKSl9b3JFbHNlVGhyb3coZSl7dGhyb3cgZSgpfW9yTnVsbCgpe3JldHVybiBudWxsfW9yVW5kZWZpbmVkKCl7fXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6ImVtcHR5In19bWF0Y2hlcyhlKXtyZXR1cm4gZS5lbXB0eSgpfXRvSlNPTihlKXtyZXR1cm4gbnVsbH19Y29uc3QgSnI9IjEuMS4zIjtsZXQgYnQ7ZnVuY3Rpb24gR3Iocil7YnQ9cn1mdW5jdGlvbiBRcigpe3JldHVybiBidH1jbGFzcyBre2NvbnN0cnVjdG9yKCl7Y29uc3QgZT1RcigpO3RoaXMuX3JlcG9ydD17YWN0aW9uOnAuZW1wdHkoKSxhcHBsaWNhdGlvbklkOnAub2ZOdWxsYWJsZShlIT09dm9pZCAwJiZlIT1udWxsP2UuYXBwSWQ6bnVsbCksdGltZXN0YW1wOkRhdGUubm93KCksZnBzOnAuZW1wdHkoKSxmcmFtZXNUcmFuc2Zvcm1lZDpwLmVtcHR5KCksZ3VpZDpwLmVtcHR5KCksaGlnaGVzdEZyYW1lVHJhbnNmb3JtQ3B1OnAuZW1wdHkoKSxtZXNzYWdlOnAuZW1wdHkoKSxzb3VyY2U6cC5vZk51bGxhYmxlKGUhPT12b2lkIDAmJmUhPW51bGw/ZS5zb3VyY2VUeXBlOm51bGwpLHRyYW5zZm9ybWVkRnBzOnAuZW1wdHkoKSx0cmFuc2Zvcm1lclR5cGU6cC5lbXB0eSgpLHZhcmlhdGlvbjpwLmVtcHR5KCksdmlkZW9IZWlnaHQ6cC5lbXB0eSgpLHZpZGVvV2lkdGg6cC5lbXB0eSgpLHZlcnNpb246SnIsZXJyb3I6cC5lbXB0eSgpfX1hY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5hY3Rpb249cC5vZk51bGxhYmxlKGUpLHRoaXN9ZnJhbWVzVHJhbnNmb3JtZWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcmFtZXNUcmFuc2Zvcm1lZD1wLm9mTnVsbGFibGUoZSksdGhpc31mcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcHM9cC5vZk51bGxhYmxlKGUpLHRoaXN9Z3VpZChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lmd1aWQ9cC5vZk51bGxhYmxlKGUpLHRoaXN9bWVzc2FnZShlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lm1lc3NhZ2U9cC5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZWRGcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lZEZwcz1wLm9mTnVsbGFibGUoZSksdGhpc310cmFuc2Zvcm1lclR5cGUoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lclR5cGU9cC5vZk51bGxhYmxlKGUpLHRoaXN9dmFyaWF0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmFyaWF0aW9uPXAub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvSGVpZ2h0KGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmlkZW9IZWlnaHQ9cC5vZk51bGxhYmxlKGUpLHRoaXN9dmlkZW9XaWR0aChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvV2lkdGg9cC5vZk51bGxhYmxlKGUpLHRoaXN9ZXJyb3IoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5lcnJvcj1wLm9mTnVsbGFibGUoZSksdGhpc31idWlsZCgpe3JldHVybiB0aGlzLl9yZXBvcnR9fWNvbnN0IFhyPXI9PkpTT04uc3RyaW5naWZ5KHIsKGUsdCk9PntpZih0IT09bnVsbClyZXR1cm4gdH0pO2NsYXNzIER7c3RhdGljIHJlcG9ydChlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQsbik9PntpZihlLmFwcGxpY2F0aW9uSWQuaXNFbXB0eSgpfHxlLnNvdXJjZS5pc0VtcHR5KCkpe3QoInN1Y2Nlc3MiKTtyZXR1cm59bGV0IHM9enIuY3JlYXRlKCksbz17dGltZW91dDoxZTQsdGltZW91dEVycm9yTWVzc2FnZToiUmVxdWVzdCB0aW1lb3V0IixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9fTtjb25zdCBhPSJodHRwczovL2hsZy50b2tib3guY29tL3Byb2QvbG9nZ2luZy92Y3Bfd2VicnRjIjtzLnBvc3QoYSxYcihlKSxvKS50aGVuKHU9Pntjb25zb2xlLmxvZyh1KSx0KCJzdWNjZXNzIil9KS5jYXRjaCh1PT57Y29uc29sZS5sb2codSksbih1KX0pfSl9fXZhciBoZSxLcj1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gWXIoKXtpZighaGUmJihoZT10eXBlb2YgY3J5cHRvIT0idW5kZWZpbmVkIiYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fHR5cGVvZiBtc0NyeXB0byE9InVuZGVmaW5lZCImJnR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiImJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSwhaGUpKXRocm93IG5ldyBFcnJvcigiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWQiKTtyZXR1cm4gaGUoS3IpfXZhciBacj0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7ZnVuY3Rpb24gZW4ocil7cmV0dXJuIHR5cGVvZiByPT0ic3RyaW5nIiYmWnIudGVzdChyKX1mb3IodmFyIEU9W10sVWU9MDtVZTwyNTY7KytVZSlFLnB1c2goKFVlKzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gdG4ocil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjAsdD0oRVtyW2UrMF1dK0VbcltlKzFdXStFW3JbZSsyXV0rRVtyW2UrM11dKyItIitFW3JbZSs0XV0rRVtyW2UrNV1dKyItIitFW3JbZSs2XV0rRVtyW2UrN11dKyItIitFW3JbZSs4XV0rRVtyW2UrOV1dKyItIitFW3JbZSsxMF1dK0VbcltlKzExXV0rRVtyW2UrMTJdXStFW3JbZSsxM11dK0VbcltlKzE0XV0rRVtyW2UrMTVdXSkudG9Mb3dlckNhc2UoKTtpZighZW4odCkpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBFdChyLGUsdCl7cj1yfHx7fTt2YXIgbj1yLnJhbmRvbXx8KHIucm5nfHxZcikoKTtpZihuWzZdPW5bNl0mMTV8NjQsbls4XT1uWzhdJjYzfDEyOCxlKXt0PXR8fDA7Zm9yKHZhciBzPTA7czwxNjsrK3MpZVt0K3NdPW5bc107cmV0dXJuIGV9cmV0dXJuIHRuKG4pfWNvbnN0IE49bmV3IFdlYWtNYXAsZGU9bmV3IFdlYWtNYXAsWT1uZXcgV2Vha01hcCxCZT1TeW1ib2woImFueVByb2R1Y2VyIiksVHQ9UHJvbWlzZS5yZXNvbHZlKCkscGU9U3ltYm9sKCJsaXN0ZW5lckFkZGVkIiksbWU9U3ltYm9sKCJsaXN0ZW5lclJlbW92ZWQiKTtsZXQgTmU9ITE7ZnVuY3Rpb24gSihyKXtpZih0eXBlb2YgciE9InN0cmluZyImJnR5cGVvZiByIT0ic3ltYm9sIil0aHJvdyBuZXcgVHlwZUVycm9yKCJldmVudE5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBhIHN5bWJvbCIpfWZ1bmN0aW9uIGdlKHIpe2lmKHR5cGVvZiByIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIEcocixlKXtjb25zdCB0PWRlLmdldChyKTtyZXR1cm4gdC5oYXMoZSl8fHQuc2V0KGUsbmV3IFNldCksdC5nZXQoZSl9ZnVuY3Rpb24gWihyLGUpe2NvbnN0IHQ9dHlwZW9mIGU9PSJzdHJpbmcifHx0eXBlb2YgZT09InN5bWJvbCI/ZTpCZSxuPVkuZ2V0KHIpO3JldHVybiBuLmhhcyh0KXx8bi5zZXQodCxuZXcgU2V0KSxuLmdldCh0KX1mdW5jdGlvbiBybihyLGUsdCl7Y29uc3Qgbj1ZLmdldChyKTtpZihuLmhhcyhlKSlmb3IoY29uc3QgcyBvZiBuLmdldChlKSlzLmVucXVldWUodCk7aWYobi5oYXMoQmUpKXtjb25zdCBzPVByb21pc2UuYWxsKFtlLHRdKTtmb3IoY29uc3QgbyBvZiBuLmdldChCZSkpby5lbnF1ZXVlKHMpfX1mdW5jdGlvbiBDdChyLGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgdD0hMSxuPSgpPT57fSxzPVtdO2NvbnN0IG89e2VucXVldWUoYSl7cy5wdXNoKGEpLG4oKX0sZmluaXNoKCl7dD0hMCxuKCl9fTtmb3IoY29uc3QgYSBvZiBlKVoocixhKS5hZGQobyk7cmV0dXJue2FzeW5jIG5leHQoKXtyZXR1cm4gcz9zLmxlbmd0aD09PTA/dD8ocz12b2lkIDAsdGhpcy5uZXh0KCkpOihhd2FpdCBuZXcgUHJvbWlzZShhPT57bj1hfSksdGhpcy5uZXh0KCkpOntkb25lOiExLHZhbHVlOmF3YWl0IHMuc2hpZnQoKX06e2RvbmU6ITB9fSxhc3luYyByZXR1cm4oYSl7cz12b2lkIDA7Zm9yKGNvbnN0IHUgb2YgZSlaKHIsdSkuZGVsZXRlKG8pO3JldHVybiBuKCksYXJndW1lbnRzLmxlbmd0aD4wP3tkb25lOiEwLHZhbHVlOmF3YWl0IGF9Ontkb25lOiEwfX0sW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpe3JldHVybiB0aGlzfX19ZnVuY3Rpb24gUnQocil7aWYocj09PXZvaWQgMClyZXR1cm4gUHQ7aWYoIUFycmF5LmlzQXJyYXkocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiYG1ldGhvZE5hbWVzYCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MiKTtmb3IoY29uc3QgZSBvZiByKWlmKCFQdC5pbmNsdWRlcyhlKSl0aHJvdyB0eXBlb2YgZSE9InN0cmluZyI/bmV3IFR5cGVFcnJvcigiYG1ldGhvZE5hbWVzYCBlbGVtZW50IG11c3QgYmUgYSBzdHJpbmciKTpuZXcgRXJyb3IoYCR7ZX0gaXMgbm90IEVtaXR0ZXJ5IG1ldGhvZGApO3JldHVybiByfWNvbnN0IEhlPXI9PnI9PT1wZXx8cj09PW1lO2NsYXNzIFd7c3RhdGljIG1peGluKGUsdCl7cmV0dXJuIHQ9UnQodCksbj0+e2lmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgZnVuY3Rpb24iKTtmb3IoY29uc3QgYSBvZiB0KWlmKG4ucHJvdG90eXBlW2FdIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHthfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtmdW5jdGlvbiBzKCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2VudW1lcmFibGU6ITEsdmFsdWU6bmV3IFd9KSx0aGlzW2VdfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxlLHtlbnVtZXJhYmxlOiExLGdldDpzfSk7Y29uc3Qgbz1hPT5mdW5jdGlvbiguLi51KXtyZXR1cm4gdGhpc1tlXVthXSguLi51KX07Zm9yKGNvbnN0IGEgb2YgdClPYmplY3QuZGVmaW5lUHJvcGVydHkobi5wcm90b3R5cGUsYSx7ZW51bWVyYWJsZTohMSx2YWx1ZTpvKGEpfSk7cmV0dXJuIG59fXN0YXRpYyBnZXQgaXNEZWJ1Z0VuYWJsZWQoKXtpZih0eXBlb2YgcHJvY2VzcyE9Im9iamVjdCIpcmV0dXJuIE5lO2NvbnN0e2VudjplfT1wcm9jZXNzfHx7ZW52Ont9fTtyZXR1cm4gZS5ERUJVRz09PSJlbWl0dGVyeSJ8fGUuREVCVUc9PT0iKiJ8fE5lfXN0YXRpYyBzZXQgaXNEZWJ1Z0VuYWJsZWQoZSl7TmU9ZX1jb25zdHJ1Y3RvcihlPXt9KXtOLnNldCh0aGlzLG5ldyBTZXQpLGRlLnNldCh0aGlzLG5ldyBNYXApLFkuc2V0KHRoaXMsbmV3IE1hcCksdGhpcy5kZWJ1Zz1lLmRlYnVnfHx7fSx0aGlzLmRlYnVnLmVuYWJsZWQ9PT12b2lkIDAmJih0aGlzLmRlYnVnLmVuYWJsZWQ9ITEpLHRoaXMuZGVidWcubG9nZ2VyfHwodGhpcy5kZWJ1Zy5sb2dnZXI9KHQsbixzLG8pPT57bz1KU09OLnN0cmluZ2lmeShvKSx0eXBlb2Ygcz09InN5bWJvbCImJihzPXMudG9TdHJpbmcoKSk7Y29uc3QgYT1uZXcgRGF0ZSx1PWAke2EuZ2V0SG91cnMoKX06JHthLmdldE1pbnV0ZXMoKX06JHthLmdldFNlY29uZHMoKX0uJHthLmdldE1pbGxpc2Vjb25kcygpfWA7Y29uc29sZS5sb2coYFske3V9XVtlbWl0dGVyeToke3R9XVske259XSBFdmVudCBOYW1lOiAke3N9CglkYXRhOiAke299YCl9KX1sb2dJZkRlYnVnRW5hYmxlZChlLHQsbil7KFcuaXNEZWJ1Z0VuYWJsZWR8fHRoaXMuZGVidWcuZW5hYmxlZCkmJnRoaXMuZGVidWcubG9nZ2VyKGUsdGhpcy5kZWJ1Zy5uYW1lLHQsbil9b24oZSx0KXtnZSh0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IG4gb2YgZSlKKG4pLEcodGhpcyxuKS5hZGQodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlIixuLHZvaWQgMCksSGUobil8fHRoaXMuZW1pdChwZSx7ZXZlbnROYW1lOm4sbGlzdGVuZXI6dH0pO3JldHVybiB0aGlzLm9mZi5iaW5kKHRoaXMsZSx0KX1vZmYoZSx0KXtnZSh0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IG4gb2YgZSlKKG4pLEcodGhpcyxuKS5kZWxldGUodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgidW5zdWJzY3JpYmUiLG4sdm9pZCAwKSxIZShuKXx8dGhpcy5lbWl0KG1lLHtldmVudE5hbWU6bixsaXN0ZW5lcjp0fSl9b25jZShlKXtyZXR1cm4gbmV3IFByb21pc2UodD0+e2NvbnN0IG49dGhpcy5vbihlLHM9PntuKCksdChzKX0pfSl9ZXZlbnRzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKUoodCk7cmV0dXJuIEN0KHRoaXMsZSl9YXN5bmMgZW1pdChlLHQpe0ooZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdCIsZSx0KSxybih0aGlzLGUsdCk7Y29uc3Qgbj1HKHRoaXMsZSkscz1OLmdldCh0aGlzKSxvPVsuLi5uXSxhPUhlKGUpP1tdOlsuLi5zXTthd2FpdCBUdCxhd2FpdCBQcm9taXNlLmFsbChbLi4uby5tYXAoYXN5bmMgdT0+e2lmKG4uaGFzKHUpKXJldHVybiB1KHQpfSksLi4uYS5tYXAoYXN5bmMgdT0+e2lmKHMuaGFzKHUpKXJldHVybiB1KGUsdCl9KV0pfWFzeW5jIGVtaXRTZXJpYWwoZSx0KXtKKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXRTZXJpYWwiLGUsdCk7Y29uc3Qgbj1HKHRoaXMsZSkscz1OLmdldCh0aGlzKSxvPVsuLi5uXSxhPVsuLi5zXTthd2FpdCBUdDtmb3IoY29uc3QgdSBvZiBvKW4uaGFzKHUpJiZhd2FpdCB1KHQpO2Zvcihjb25zdCB1IG9mIGEpcy5oYXModSkmJmF3YWl0IHUoZSx0KX1vbkFueShlKXtyZXR1cm4gZ2UoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlQW55Iix2b2lkIDAsdm9pZCAwKSxOLmdldCh0aGlzKS5hZGQoZSksdGhpcy5lbWl0KHBlLHtsaXN0ZW5lcjplfSksdGhpcy5vZmZBbnkuYmluZCh0aGlzLGUpfWFueUV2ZW50KCl7cmV0dXJuIEN0KHRoaXMpfW9mZkFueShlKXtnZShlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJ1bnN1YnNjcmliZUFueSIsdm9pZCAwLHZvaWQgMCksdGhpcy5lbWl0KG1lLHtsaXN0ZW5lcjplfSksTi5nZXQodGhpcykuZGVsZXRlKGUpfWNsZWFyTGlzdGVuZXJzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKWlmKHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImNsZWFyIix0LHZvaWQgMCksdHlwZW9mIHQ9PSJzdHJpbmcifHx0eXBlb2YgdD09InN5bWJvbCIpe0codGhpcyx0KS5jbGVhcigpO2NvbnN0IG49Wih0aGlzLHQpO2Zvcihjb25zdCBzIG9mIG4pcy5maW5pc2goKTtuLmNsZWFyKCl9ZWxzZXtOLmdldCh0aGlzKS5jbGVhcigpO2Zvcihjb25zdCBuIG9mIGRlLmdldCh0aGlzKS52YWx1ZXMoKSluLmNsZWFyKCk7Zm9yKGNvbnN0IG4gb2YgWS5nZXQodGhpcykudmFsdWVzKCkpe2Zvcihjb25zdCBzIG9mIG4pcy5maW5pc2goKTtuLmNsZWFyKCl9fX1saXN0ZW5lckNvdW50KGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtsZXQgdD0wO2Zvcihjb25zdCBuIG9mIGUpe2lmKHR5cGVvZiBuPT0ic3RyaW5nIil7dCs9Ti5nZXQodGhpcykuc2l6ZStHKHRoaXMsbikuc2l6ZStaKHRoaXMsbikuc2l6ZStaKHRoaXMpLnNpemU7Y29udGludWV9dHlwZW9mIG4hPSJ1bmRlZmluZWQiJiZKKG4pLHQrPU4uZ2V0KHRoaXMpLnNpemU7Zm9yKGNvbnN0IHMgb2YgZGUuZ2V0KHRoaXMpLnZhbHVlcygpKXQrPXMuc2l6ZTtmb3IoY29uc3QgcyBvZiBZLmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1zLnNpemV9cmV0dXJuIHR9YmluZE1ldGhvZHMoZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgYW4gb2JqZWN0Iik7dD1SdCh0KTtmb3IoY29uc3QgbiBvZiB0KXtpZihlW25dIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtufVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHtlbnVtZXJhYmxlOiExLHZhbHVlOnRoaXNbbl0uYmluZCh0aGlzKX0pfX19Y29uc3QgUHQ9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoVy5wcm90b3R5cGUpLmZpbHRlcihyPT5yIT09ImNvbnN0cnVjdG9yIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KFcsImxpc3RlbmVyQWRkZWQiLHt2YWx1ZTpwZSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXLCJsaXN0ZW5lclJlbW92ZWQiLHt2YWx1ZTptZSx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pO3ZhciAkZT1XO2Z1bmN0aW9uIG5uKHIpe3JldHVybiB0eXBlb2Ygcj09Im9iamVjdCImJnIhPT1udWxsJiYibWVzc2FnZSJpbiByJiZ0eXBlb2Ygci5tZXNzYWdlPT0ic3RyaW5nIn1mdW5jdGlvbiBzbihyKXtpZihubihyKSlyZXR1cm4gcjt0cnl7cmV0dXJuIG5ldyBFcnJvcihKU09OLnN0cmluZ2lmeShyKSl9Y2F0Y2h7cmV0dXJuIG5ldyBFcnJvcihTdHJpbmcocikpfX1mdW5jdGlvbiBXZShyKXtyZXR1cm4gc24ocikubWVzc2FnZX12YXIgamU7KGZ1bmN0aW9uKHIpe3IuRlBTX0RST1A9ImZwc19kcm9wIn0pKGplfHwoamU9e30pKTtjb25zdCBvbj01MDAsYW49Ljg7Y2xhc3MgdW4gZXh0ZW5kcyAkZXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKCk7dGhpcy5pbmRleF89dCx0aGlzLnV1aWRfPUV0KCksdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89MCx0aGlzLnRyYW5zZm9ybWVyXz1lLHRoaXMuc2hvdWxkU3RvcF89ITEsdGhpcy5pc0ZsYXNoZWRfPSExLHRoaXMuZnJhbWVzRnJvbVNvdXJjZV89MCx0aGlzLmZwc189MCx0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89MCx0aGlzLnZpZGVvSGVpZ2h0Xz0wLHRoaXMudmlkZW9XaWR0aF89MCx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz0tMSx0aGlzLnRyYW5zZm9ybWVyVHlwZV89IkN1c3RvbSIsImdldFRyYW5zZm9ybWVyVHlwZSJpbiBlJiYodGhpcy50cmFuc2Zvcm1lclR5cGVfPWUuZ2V0VHJhbnNmb3JtZXJUeXBlKCkpO2NvbnN0IG49bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiQ3JlYXRlIikuYnVpbGQoKTtELnJlcG9ydChuKX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lfWFzeW5jIHN0YXJ0KGUpe2lmKHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQ9PSJmdW5jdGlvbiIpdHJ5e2F3YWl0IHRoaXMudHJhbnNmb3JtZXJfLnN0YXJ0KGUpfWNhdGNoKHQpe2NvbnN0IG49bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoJC5lcnJvcnMudHJhbnNmb3JtZXJfc3RhcnQpLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihXZSh0KSkuYnVpbGQoKTtELnJlcG9ydChuKTtjb25zdCBzPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjp0LGZ1bmN0aW9uOiJzdGFydCJ9O3RoaXMuZW1pdCgiZXJyb3IiLHMpfX1hc3luYyB0cmFuc2Zvcm0oZSx0KXt2YXIgbixzLG8sYTtpZih0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89PT0wJiYodGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPURhdGUubm93KCkpLHRoaXMudmlkZW9IZWlnaHRfPShuPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheUhlaWdodCkhPW51bGw/bjowLHRoaXMudmlkZW9XaWR0aF89KHM9ZT09bnVsbD92b2lkIDA6ZS5kaXNwbGF5V2lkdGgpIT1udWxsP3M6MCwrK3RoaXMuZnJhbWVzRnJvbVNvdXJjZV8sdGhpcy50cmFuc2Zvcm1lcl8paWYodGhpcy5zaG91bGRTdG9wXyllLmNsb3NlKCksdGhpcy5mbHVzaCh0KSx0LnRlcm1pbmF0ZSgpO2Vsc2UgdHJ5e2F3YWl0KChhPShvPXRoaXMudHJhbnNmb3JtZXJfKS50cmFuc2Zvcm0pPT1udWxsP3ZvaWQgMDphLmNhbGwobyxlLHQpKSwrK3RoaXMuZnJhbWVzVHJhbnNmb3JtZWRfLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPT09b24mJnRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpfWNhdGNoKHUpe2NvbnN0IGM9bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoJC5lcnJvcnMudHJhbnNmb3JtZXJfdHJhbnNmb3JtKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoV2UodSkpLmJ1aWxkKCk7RC5yZXBvcnQoYyk7Y29uc3QgXz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6dSxmdW5jdGlvbjoidHJhbnNmb3JtIn07dGhpcy5lbWl0KCJlcnJvciIsXyl9fWFzeW5jIGZsdXNoKGUpe2lmKHRoaXMudHJhbnNmb3JtZXJfJiZ0eXBlb2YgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2g9PSJmdW5jdGlvbiImJiF0aGlzLmlzRmxhc2hlZF8pe3RoaXMuaXNGbGFzaGVkXz0hMDt0cnl7YXdhaXQgdGhpcy50cmFuc2Zvcm1lcl8uZmx1c2goZSl9Y2F0Y2gobil7Y29uc3Qgcz1uZXcgaygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZSgkLmVycm9ycy50cmFuc2Zvcm1lcl9mbHVzaCkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKFdlKG4pKS5idWlsZCgpO0QucmVwb3J0KHMpO2NvbnN0IG89e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOm4sZnVuY3Rpb246ImZsdXNoIn07dGhpcy5lbWl0KCJlcnJvciIsbyl9fXRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydCgpO2NvbnN0IHQ9bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5ndWlkKHRoaXMudXVpZF8pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRGVsZXRlIikuYnVpbGQoKTtELnJlcG9ydCh0KX1zdG9wKCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gU3RvcCBzdHJlYW0uIiksdGhpcy5zaG91bGRTdG9wXz0hMH1tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCl7bGV0IGU9KERhdGUubm93KCktdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfKS8xZTMsdD10aGlzLmZyYW1lc0Zyb21Tb3VyY2VfL2Usbj10aGlzLmZyYW1lc1RyYW5zZm9ybWVkXy9lO2lmKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfIT0tMSYmdGhpcy50cmFja0V4cGVjdGVkUmF0ZV8qYW4+dCl7Y29uc3Qgbz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sd2FybmluZ1R5cGU6amUuRlBTX0RST1AsZHJvcEluZm86e3JlcXVlc3RlZDp0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyxjdXJyZW50OnR9fTt0aGlzLmVtaXQoIndhcm4iLG8pfWNvbnN0IHM9bmV3IGsoKS5hY3Rpb24oIk1lZGlhVHJhbnNmb3JtZXIiKS5mcHModCkudHJhbnNmb3JtZWRGcHMobikuZnJhbWVzVHJhbnNmb3JtZWQodGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8pLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmlkZW9IZWlnaHQodGhpcy52aWRlb0hlaWdodF8pLnZpZGVvV2lkdGgodGhpcy52aWRlb1dpZHRoXykudmFyaWF0aW9uKCJRb1MiKS5idWlsZCgpO0QucmVwb3J0KHMpLHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz0wLHRoaXMuZnJhbWVzRnJvbVNvdXJjZV89MCx0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXz0wfX1jbGFzcyBmbiBleHRlbmRzICRle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCk7dGhpcy50cmFuc2Zvcm1lcnNfPVtdLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgbj1uZXcgdW4oZVt0XSx0KTtuLm9uKCJlcnJvciIscz0+e3RoaXMuZW1pdCgiZXJyb3IiLHMpfSksbi5vbigid2FybiIscz0+e3RoaXMuZW1pdCgid2FybiIscyl9KSx0aGlzLnRyYW5zZm9ybWVyc18ucHVzaChuKX19c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZTtmb3IobGV0IHQgb2YgdGhpcy50cmFuc2Zvcm1lcnNfKXQuc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pfWFzeW5jIHN0YXJ0KGUsdCl7aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIE5vIHRyYW5zZm9ybWVycy4iKTtyZXR1cm59dHJ5e2xldCBuPWU7Zm9yKGxldCBzIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllPWUucGlwZVRocm91Z2gobmV3IFRyYW5zZm9ybVN0cmVhbShzKSk7ZS5waXBlVG8odCkudGhlbihhc3luYygpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2V0dXAuIiksYXdhaXQgdC5hYm9ydCgpLGF3YWl0IG4uY2FuY2VsKCl9KS5jYXRjaChhc3luYyBzPT57ZS5jYW5jZWwoKS50aGVuKCgpPT57Y29uc29sZS5sb2coIltQaXBlbGluZV0gU2h1dHRpbmcgZG93biBzdHJlYW1zIGFmdGVyIGFib3J0LiIpfSkuY2F0Y2gobz0+e2NvbnNvbGUuZXJyb3IoIltQaXBlbGluZV0gRXJyb3IgZnJvbSBzdHJlYW0gdHJhbnNmb3JtOiIsbyl9KSxhd2FpdCB0LmFib3J0KHMpLGF3YWl0IG4uY2FuY2VsKHMpfSl9Y2F0Y2h7dGhpcy5kZXN0cm95KCk7cmV0dXJufWNvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFBpcGVsaW5lIHN0YXJ0ZWQuIil9YXN5bmMgZGVzdHJveSgpe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIERlc3Ryb3lpbmcgUGlwZWxpbmUuIik7Zm9yKGxldCBlIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllLnN0b3AoKX19Y2xhc3MgbG4gZXh0ZW5kcyAkZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCk7dGhpcy51dWlkXz1FdCgpLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xO2NvbnN0IGU9bmV3IGsoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7RC5yZXBvcnQoZSl9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZSx0aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pfXRyYW5zZm9ybShlLHQpe3JldHVybiB0aGlzLnJlYWRhYmxlXz1lLHRoaXMud3JpdGFibGVfPXQsdGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpfXRyYW5zZm9ybUludGVybmFsKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnN0IG49bmV3IGsoKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKCQuZXJyb3JzLnRyYW5zZm9ybWVyX25vbmUpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO0QucmVwb3J0KG4pLHQoIltNZWRpYVByb2Nlc3Nvcl0gTmVlZCB0byBzZXQgdHJhbnNmb3JtZXJzLiIpfXRoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCksdGhpcy5waXBlbGluZV89bmV3IGZuKHRoaXMudHJhbnNmb3JtZXJzXyksdGhpcy5waXBlbGluZV8ub24oIndhcm4iLG49Pnt0aGlzLmVtaXQoIndhcm4iLG4pfSksdGhpcy5waXBlbGluZV8ub24oImVycm9yIixuPT57dGhpcy5lbWl0KCJlcnJvciIsbil9KSx0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyE9LTEmJnRoaXMucGlwZWxpbmVfLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfKSx0aGlzLnBpcGVsaW5lXy5zdGFydCh0aGlzLnJlYWRhYmxlXyx0aGlzLndyaXRhYmxlXykudGhlbigoKT0+e2UoKX0pLmNhdGNoKG49Pnt0KG4pfSl9KX1zZXRUcmFuc2Zvcm1lcnMoZSl7Y29uc3QgdD1uZXcgaygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLm1lc3NhZ2UoJC51cGRhdGVzLnRyYW5zZm9ybWVyX25ldykudmFyaWF0aW9uKCJVcGRhdGUiKS5idWlsZCgpO3JldHVybiBELnJlcG9ydCh0KSx0aGlzLnRyYW5zZm9ybWVyc189ZSx0aGlzLnJlYWRhYmxlXyYmdGhpcy53cml0YWJsZV8/dGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpOlByb21pc2UucmVzb2x2ZSgpfWRlc3Ryb3koKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e3RoaXMucGlwZWxpbmVfJiZ0aGlzLnBpcGVsaW5lXy5kZXN0cm95KCk7Y29uc3QgdD1uZXcgaygpLmFjdGlvbigiTWVkaWFQcm9jZXNzb3IiKS5ndWlkKHRoaXMudXVpZF8pLnZhcmlhdGlvbigiRGVsZXRlIikuYnVpbGQoKTtELnJlcG9ydCh0KSxlKCl9KX19dmFyIF9lOyhmdW5jdGlvbihyKXtyLkxvdz0iTG93IixyLkhpZ2g9IkhpZ2gifSkoX2V8fChfZT17fSkpO2NsYXNzIE90e2NvbnN0cnVjdG9yKGUpe3RoaXMuYmx1ckZpbHRlcl89ZT09PV9lLkhpZ2g/ImJsdXIoMTVweCkiOiJibHVyKDVweCkifXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2UuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKG4pe2NvbnNvbGUubG9nKCJbQmx1clBvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLG4pfX19Y2xhc3MgY257Y29uc3RydWN0b3IoZSl7aWYodGhpcy5pbWFnZUNhbnZhc189bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLHRoaXMuaW1hZ2VDdHhfPXRoaXMuaW1hZ2VDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsd2lsbFJlYWRGcmVxdWVudGx5OiEwLGRlc3luY2hyb25pemVkOiEwfSksIXRoaXMuaW1hZ2VDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTt0aGlzLmltYWdlQmxvYl89dm9pZCAwLGZldGNoKGUpLnRoZW4odD0+e3QuYmxvYigpLnRoZW4obj0+e3RoaXMuaW1hZ2VCbG9iXz1ufSkuY2F0Y2gobj0+e2NvbnNvbGUuZXJyb3IoImJsb2IgZXJyb3IiLG4pfSl9KS5jYXRjaCh0PT57Y29uc29sZS5lcnJvcigiZmV0Y2ggZXJyb3IiLHQpfSl9cnVuUG9zdFByb2Nlc3NpbmcoZSx0KXt0cnl7aWYodHlwZW9mIHRoaXMuaW1hZ2VCbG9iXyE9InVuZGVmaW5lZCImJih0aGlzLmltYWdlQ2FudmFzXy53aWR0aCE9dC53aWR0aHx8dGhpcy5pbWFnZUNhbnZhc18uaGVpZ2h0IT10LmhlaWdodCkpe3RoaXMuaW1hZ2VDYW52YXNfLndpZHRoPXQud2lkdGgsdGhpcy5pbWFnZUNhbnZhc18uaGVpZ2h0PXQuaGVpZ2h0O2NvbnN0IG49ImhpZ2giLHM9e3Jlc2l6ZVdpZHRoOnQud2lkdGgscmVzaXplSGVpZ2h0OnQuaGVpZ2h0LHJlc2l6ZVF1YWxpdHk6bn0sbz1jcmVhdGVJbWFnZUJpdG1hcCh0aGlzLmltYWdlQmxvYl8scykudGhlbihhPT57dGhpcy5pbWFnZUN0eF8uZHJhd0ltYWdlKGEsMCwwKX0pLmNhdGNoKGE9Pntjb25zb2xlLmVycm9yKCJlcnJvciBjcmVhdGVJbWFnZUJpdG1hcCIsYSl9KX1lLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsZS5kcmF3SW1hZ2UodGhpcy5pbWFnZUNhbnZhc18sMCwwLHRoaXMuaW1hZ2VDYW52YXNfLndpZHRoLHRoaXMuaW1hZ2VDYW52YXNfLmhlaWdodCl9Y2F0Y2gobil7Y29uc29sZS5sb2coIltWaXJ0dWFsUG9zdFByb2Nlc3NdIEZhaWxlZCB0byBkcmF3IGNhbnZhcyIsbil9fX1jbGFzcyBobntjb25zdHJ1Y3RvcihlPTEvMCl7dGhpcy5jYXBhY2l0eT1lLHRoaXMuc3RvcmFnZT1bXX1lbnF1ZXVlKGUpe2lmKHRoaXMuc2l6ZSgpPT09dGhpcy5jYXBhY2l0eSl0aHJvdyBFcnJvcigiUXVldWUgaGFzIHJlYWNoZWQgbWF4IGNhcGFjaXR5LCB5b3UgY2Fubm90IGFkZCBtb3JlIGl0ZW1zIik7dGhpcy5zdG9yYWdlLnB1c2goZSl9ZGVxdWV1ZSgpe3JldHVybiB0aGlzLnN0b3JhZ2Uuc2hpZnQoKX1zaXplKCl7cmV0dXJuIHRoaXMuc3RvcmFnZS5sZW5ndGh9fWNsYXNzIGRue2NvbnN0cnVjdG9yKGUpe2NvbnNvbGUubG9nKCJbVmlkZW9Qb3N0UHJvY2Vzc10gQ3RvciIpLHRoaXMucXVldWVfPW5ldyBobixlJiYodGhpcy5mcmFtZVJlYWRlcl89ZS5nZXRSZWFkZXIoKSx0aGlzLmZyYW1lUmVhZGVyXy5yZWFkKCkudGhlbih0aGlzLnByb2Nlc3NGcmFtZS5iaW5kKHRoaXMpKS5jYXRjaCh0PT5jb25zb2xlLmVycm9yKHQpKSl9cHJvY2Vzc0ZyYW1lKGUpe2UuZG9uZXx8KHRoaXMucXVldWVfLmVucXVldWUoZS52YWx1ZSksdGhpcy5mcmFtZVJlYWRlcl8ucmVhZCgpLnRoZW4odGhpcy5wcm9jZXNzRnJhbWUuYmluZCh0aGlzKSkuY2F0Y2godD0+Y29uc29sZS5lcnJvcih0KSkpfXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2lmKGUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIix0aGlzLnF1ZXVlXy5zaXplKCk+MCl7Y29uc3Qgbj10aGlzLnF1ZXVlXy5kZXF1ZXVlKCk7ZS5kcmF3SW1hZ2UobiwwLDAsdC53aWR0aCx0LmhlaWdodCksbi5jbG9zZSgpfWVsc2UgZS5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCl9Y2F0Y2gobil7Y29uc29sZS5sb2coIltWaWRlb1Bvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLG4pfX19ZnVuY3Rpb24gcG4oKXtyZXR1cm4ic2VsZmllX3NlZ21lbnRhdGlvbl9sYW5kc2NhcGUifXZhciB5ZT1mdW5jdGlvbigpe3ZhciByPXR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCImJmRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/ZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM6dm9pZCAwO3JldHVybiBmdW5jdGlvbihlKXtlPWV8fHt9O3ZhciB0PXR5cGVvZiBlIT0idW5kZWZpbmVkIj9lOnt9LG4sczt0LnJlYWR5PW5ldyBQcm9taXNlKGZ1bmN0aW9uKGksbCl7bj1pLHM9bH0pO3ZhciBvPXt9LGE7Zm9yKGEgaW4gdCl0Lmhhc093blByb3BlcnR5KGEpJiYob1thXT10W2FdKTt2YXIgdT0iLi90aGlzLnByb2dyYW0iLGM9ZnVuY3Rpb24oaSxsKXt0aHJvdyBsfSxfPSEwLGY9IiI7ZnVuY3Rpb24gZChpKXtyZXR1cm4gdC5sb2NhdGVGaWxlP3QubG9jYXRlRmlsZShpLGYpOmYraX12YXIgdjt0eXBlb2YgZG9jdW1lbnQhPSJ1bmRlZmluZWQiJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYoZj1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksciYmKGY9ciksZi5pbmRleE9mKCJibG9iOiIpIT09MD9mPWYuc3Vic3RyKDAsZi5yZXBsYWNlKC9bPyNdLiovLCIiKS5sYXN0SW5kZXhPZigiLyIpKzEpOmY9IiI7dmFyIHc9dC5wcmludHx8Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSxNPXQucHJpbnRFcnJ8fGNvbnNvbGUud2Fybi5iaW5kKGNvbnNvbGUpO2ZvcihhIGluIG8pby5oYXNPd25Qcm9wZXJ0eShhKSYmKHRbYV09b1thXSk7bz1udWxsLHQuYXJndW1lbnRzLHQudGhpc1Byb2dyYW0mJih1PXQudGhpc1Byb2dyYW0pLHQucXVpdCYmKGM9dC5xdWl0KTt2YXIgQTt0Lndhc21CaW5hcnkmJihBPXQud2FzbUJpbmFyeSk7dmFyIEM9dC5ub0V4aXRSdW50aW1lfHwhMDt0eXBlb2YgV2ViQXNzZW1ibHkhPSJvYmplY3QiJiZIKCJubyBuYXRpdmUgd2FzbSBzdXBwb3J0IGRldGVjdGVkIik7dmFyIE8sST0hMSx2ZT10eXBlb2YgVGV4dERlY29kZXIhPSJ1bmRlZmluZWQiP25ldyBUZXh0RGVjb2RlcigidXRmOCIpOnZvaWQgMDtmdW5jdGlvbiBYKGksbCxoKXtmb3IodmFyIG09bCtoLHk9bDtpW3ldJiYhKHk+PW0pOykrK3k7aWYoeS1sPjE2JiZpLnN1YmFycmF5JiZ2ZSlyZXR1cm4gdmUuZGVjb2RlKGkuc3ViYXJyYXkobCx5KSk7Zm9yKHZhciBUPSIiO2w8eTspe3ZhciBnPWlbbCsrXTtpZighKGcmMTI4KSl7VCs9U3RyaW5nLmZyb21DaGFyQ29kZShnKTtjb250aW51ZX12YXIgUj1pW2wrK10mNjM7aWYoKGcmMjI0KT09MTkyKXtUKz1TdHJpbmcuZnJvbUNoYXJDb2RlKChnJjMxKTw8NnxSKTtjb250aW51ZX12YXIgVT1pW2wrK10mNjM7aWYoKGcmMjQwKT09MjI0P2c9KGcmMTUpPDwxMnxSPDw2fFU6Zz0oZyY3KTw8MTh8Ujw8MTJ8VTw8NnxpW2wrK10mNjMsZzw2NTUzNilUKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGcpO2Vsc2V7dmFyIER0PWctNjU1MzY7VCs9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxEdD4+MTAsNTYzMjB8RHQmMTAyMyl9fXJldHVybiBUfWZ1bmN0aW9uIHdlKGksbCl7cmV0dXJuIGk/WChlZSxpLGwpOiIifWZ1bmN0aW9uIHduKGksbCxoKXtmb3IodmFyIG09MDttPGkubGVuZ3RoOysrbSliZVtsKys+PjBdPWkuY2hhckNvZGVBdChtKTtofHwoYmVbbD4+MF09MCl9ZnVuY3Rpb24gYm4oaSxsKXtyZXR1cm4gaSVsPjAmJihpKz1sLWklbCksaX12YXIgU3QsYmUsZWUseDtmdW5jdGlvbiBNdChpKXtTdD1pLHQuSEVBUDg9YmU9bmV3IEludDhBcnJheShpKSx0LkhFQVAxNj1uZXcgSW50MTZBcnJheShpKSx0LkhFQVAzMj14PW5ldyBJbnQzMkFycmF5KGkpLHQuSEVBUFU4PWVlPW5ldyBVaW50OEFycmF5KGkpLHQuSEVBUFUxNj1uZXcgVWludDE2QXJyYXkoaSksdC5IRUFQVTMyPW5ldyBVaW50MzJBcnJheShpKSx0LkhFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShpKSx0LkhFQVBGNjQ9bmV3IEZsb2F0NjRBcnJheShpKX10LklOSVRJQUxfTUVNT1JZO3ZhciB6ZSxBdD1bXSxJdD1bXSx4dD1bXSxFbj0wO2Z1bmN0aW9uIFRuKCl7cmV0dXJuIEN8fEVuPjB9ZnVuY3Rpb24gQ24oKXtpZih0LnByZVJ1bilmb3IodHlwZW9mIHQucHJlUnVuPT0iZnVuY3Rpb24iJiYodC5wcmVSdW49W3QucHJlUnVuXSk7dC5wcmVSdW4ubGVuZ3RoOylPbih0LnByZVJ1bi5zaGlmdCgpKTtKZShBdCl9ZnVuY3Rpb24gUm4oKXtKZShJdCl9ZnVuY3Rpb24gUG4oKXtpZih0LnBvc3RSdW4pZm9yKHR5cGVvZiB0LnBvc3RSdW49PSJmdW5jdGlvbiImJih0LnBvc3RSdW49W3QucG9zdFJ1bl0pO3QucG9zdFJ1bi5sZW5ndGg7KU1uKHQucG9zdFJ1bi5zaGlmdCgpKTtKZSh4dCl9ZnVuY3Rpb24gT24oaSl7QXQudW5zaGlmdChpKX1mdW5jdGlvbiBTbihpKXtJdC51bnNoaWZ0KGkpfWZ1bmN0aW9uIE1uKGkpe3h0LnVuc2hpZnQoaSl9dmFyIGo9MCx0ZT1udWxsO2Z1bmN0aW9uIEFuKGkpe2orKyx0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMmJnQubW9uaXRvclJ1bkRlcGVuZGVuY2llcyhqKX1mdW5jdGlvbiBJbihpKXtpZihqLS0sdC5tb25pdG9yUnVuRGVwZW5kZW5jaWVzJiZ0Lm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoaiksaj09MCYmdGUpe3ZhciBsPXRlO3RlPW51bGwsbCgpfX10LnByZWxvYWRlZEltYWdlcz17fSx0LnByZWxvYWRlZEF1ZGlvcz17fTtmdW5jdGlvbiBIKGkpe3Qub25BYm9ydCYmdC5vbkFib3J0KGkpLGk9IkFib3J0ZWQoIitpKyIpIixNKGkpLEk9ITAsaSs9Ii4gQnVpbGQgd2l0aCAtcyBBU1NFUlRJT05TPTEgZm9yIG1vcmUgaW5mby4iO3ZhciBsPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3IoaSk7dGhyb3cgcyhsKSxsfXZhciB4bj0iZGF0YTphcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCI7ZnVuY3Rpb24gRnQoaSl7cmV0dXJuIGkuc3RhcnRzV2l0aCh4bil9dmFyIEY7Rj0idGZsaXRlLXNpbWQud2FzbSIsRnQoRil8fChGPWQoRikpO2Z1bmN0aW9uIEx0KGkpe3RyeXtpZihpPT1GJiZBKXJldHVybiBuZXcgVWludDhBcnJheShBKTtpZighdil0aHJvdyJib3RoIGFzeW5jIGFuZCBzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZCJ9Y2F0Y2gobCl7SChsKX19ZnVuY3Rpb24gRm4oKXtyZXR1cm4hQSYmXyYmdHlwZW9mIGZldGNoPT0iZnVuY3Rpb24iP2ZldGNoKEYse2NyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiJ9KS50aGVuKGZ1bmN0aW9uKGkpe2lmKCFpLm9rKXRocm93ImZhaWxlZCB0byBsb2FkIHdhc20gYmluYXJ5IGZpbGUgYXQgJyIrRisiJyI7cmV0dXJuIGkuYXJyYXlCdWZmZXIoKX0pLmNhdGNoKGZ1bmN0aW9uKCl7cmV0dXJuIEx0KEYpfSk6UHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBMdChGKX0pfWZ1bmN0aW9uIExuKCl7dmFyIGk9e2E6dHN9O2Z1bmN0aW9uIGwoZyxSKXt2YXIgVT1nLmV4cG9ydHM7dC5hc209VSxPPXQuYXNtLnEsTXQoTy5idWZmZXIpLHplPXQuYXNtLkQsU24odC5hc20uciksSW4oKX1BbigpO2Z1bmN0aW9uIGgoZyl7bChnLmluc3RhbmNlKX1mdW5jdGlvbiBtKGcpe3JldHVybiBGbigpLnRoZW4oZnVuY3Rpb24oUil7cmV0dXJuIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKFIsaSl9KS50aGVuKGZ1bmN0aW9uKFIpe3JldHVybiBSfSkudGhlbihnLGZ1bmN0aW9uKFIpe00oImZhaWxlZCB0byBhc3luY2hyb25vdXNseSBwcmVwYXJlIHdhc206ICIrUiksSChSKX0pfWZ1bmN0aW9uIHkoKXtyZXR1cm4hQSYmdHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nPT0iZnVuY3Rpb24iJiYhRnQoRikmJnR5cGVvZiBmZXRjaD09ImZ1bmN0aW9uIj9mZXRjaChGLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSkudGhlbihmdW5jdGlvbihnKXt2YXIgUj1XZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyhnLGkpO3JldHVybiBSLnRoZW4oaCxmdW5jdGlvbihVKXtyZXR1cm4gTSgid2FzbSBzdHJlYW1pbmcgY29tcGlsZSBmYWlsZWQ6ICIrVSksTSgiZmFsbGluZyBiYWNrIHRvIEFycmF5QnVmZmVyIGluc3RhbnRpYXRpb24iKSxtKGgpfSl9KTptKGgpfWlmKHQuaW5zdGFudGlhdGVXYXNtKXRyeXt2YXIgVD10Lmluc3RhbnRpYXRlV2FzbShpLGwpO3JldHVybiBUfWNhdGNoKGcpe3JldHVybiBNKCJNb2R1bGUuaW5zdGFudGlhdGVXYXNtIGNhbGxiYWNrIGZhaWxlZCB3aXRoIGVycm9yOiAiK2cpLCExfXJldHVybiB5KCkuY2F0Y2gocykse319ZnVuY3Rpb24gSmUoaSl7Zm9yKDtpLmxlbmd0aD4wOyl7dmFyIGw9aS5zaGlmdCgpO2lmKHR5cGVvZiBsPT0iZnVuY3Rpb24iKXtsKHQpO2NvbnRpbnVlfXZhciBoPWwuZnVuYzt0eXBlb2YgaD09Im51bWJlciI/bC5hcmc9PT12b2lkIDA/emUuZ2V0KGgpKCk6emUuZ2V0KGgpKGwuYXJnKTpoKGwuYXJnPT09dm9pZCAwP251bGw6bC5hcmcpfX1mdW5jdGlvbiBrbihpLGwsaCxtKXtIKCJBc3NlcnRpb24gZmFpbGVkOiAiK3dlKGkpKyIsIGF0OiAiK1tsP3dlKGwpOiJ1bmtub3duIGZpbGVuYW1lIixoLG0/d2UobSk6InVua25vd24gZnVuY3Rpb24iXSl9ZnVuY3Rpb24gRG4oaSxsKXtIKCJUbyB1c2UgZGxvcGVuLCB5b3UgbmVlZCB0byB1c2UgRW1zY3JpcHRlbidzIGxpbmtpbmcgc3VwcG9ydCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmciKX1mdW5jdGlvbiBVbihpLGwpe0goIlRvIHVzZSBkbG9wZW4sIHlvdSBuZWVkIHRvIHVzZSBFbXNjcmlwdGVuJ3MgbGlua2luZyBzdXBwb3J0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2Vtc2NyaXB0ZW4tY29yZS9lbXNjcmlwdGVuL3dpa2kvTGlua2luZyIpfWZ1bmN0aW9uIEJuKCl7SCgiIil9dmFyIEVlO0VlPWZ1bmN0aW9uKCl7cmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpfTt2YXIgTm49ITA7ZnVuY3Rpb24gSG4oaSl7cmV0dXJuIHhba3QoKT4+Ml09aSxpfWZ1bmN0aW9uICRuKGksbCl7dmFyIGg7aWYoaT09PTApaD1EYXRlLm5vdygpO2Vsc2UgaWYoKGk9PT0xfHxpPT09NCkmJk5uKWg9RWUoKTtlbHNlIHJldHVybiBIbigyOCksLTE7cmV0dXJuIHhbbD4+Ml09aC8xZTN8MCx4W2wrND4+Ml09aCUxZTMqMWUzKjFlM3wwLDB9ZnVuY3Rpb24gV24oKXtyZXR1cm4gMjE0NzQ4MzY0OH1mdW5jdGlvbiBqbihpLGwsaCl7ZWUuY29weVdpdGhpbihpLGwsbCtoKX1mdW5jdGlvbiBxbihpKXt0cnl7cmV0dXJuIE8uZ3JvdyhpLVN0LmJ5dGVMZW5ndGgrNjU1MzU+Pj4xNiksTXQoTy5idWZmZXIpLDF9Y2F0Y2h7fX1mdW5jdGlvbiBWbihpKXt2YXIgbD1lZS5sZW5ndGg7aT1pPj4+MDt2YXIgaD0yMTQ3NDgzNjQ4O2lmKGk+aClyZXR1cm4hMTtmb3IodmFyIG09MTttPD00O20qPTIpe3ZhciB5PWwqKDErLjIvbSk7eT1NYXRoLm1pbih5LGkrMTAwNjYzMjk2KTt2YXIgVD1NYXRoLm1pbihoLGJuKE1hdGgubWF4KGkseSksNjU1MzYpKSxnPXFuKFQpO2lmKGcpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gem4oaSl7Zm9yKHZhciBsPUVlKCk7RWUoKS1sPGk7KTt9dmFyIEdlPXt9O2Z1bmN0aW9uIEpuKCl7cmV0dXJuIHV8fCIuL3RoaXMucHJvZ3JhbSJ9ZnVuY3Rpb24gcmUoKXtpZighcmUuc3RyaW5ncyl7dmFyIGk9KHR5cGVvZiBuYXZpZ2F0b3I9PSJvYmplY3QiJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzJiZuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdfHwiQyIpLnJlcGxhY2UoIi0iLCJfIikrIi5VVEYtOCIsbD17VVNFUjoid2ViX3VzZXIiLExPR05BTUU6IndlYl91c2VyIixQQVRIOiIvIixQV0Q6Ii8iLEhPTUU6Ii9ob21lL3dlYl91c2VyIixMQU5HOmksXzpKbigpfTtmb3IodmFyIGggaW4gR2UpR2VbaF09PT12b2lkIDA/ZGVsZXRlIGxbaF06bFtoXT1HZVtoXTt2YXIgbT1bXTtmb3IodmFyIGggaW4gbCltLnB1c2goaCsiPSIrbFtoXSk7cmUuc3RyaW5ncz1tfXJldHVybiByZS5zdHJpbmdzfXZhciBUZT17bWFwcGluZ3M6e30sYnVmZmVyczpbbnVsbCxbXSxbXV0scHJpbnRDaGFyOmZ1bmN0aW9uKGksbCl7dmFyIGg9VGUuYnVmZmVyc1tpXTtsPT09MHx8bD09PTEwPygoaT09PTE/dzpNKShYKGgsMCkpLGgubGVuZ3RoPTApOmgucHVzaChsKX0sdmFyYXJnczp2b2lkIDAsZ2V0OmZ1bmN0aW9uKCl7VGUudmFyYXJncys9NDt2YXIgaT14W1RlLnZhcmFyZ3MtND4+Ml07cmV0dXJuIGl9LGdldFN0cjpmdW5jdGlvbihpKXt2YXIgbD13ZShpKTtyZXR1cm4gbH0sZ2V0NjQ6ZnVuY3Rpb24oaSxsKXtyZXR1cm4gaX19O2Z1bmN0aW9uIEduKGksbCl7dmFyIGg9MDtyZXR1cm4gcmUoKS5mb3JFYWNoKGZ1bmN0aW9uKG0seSl7dmFyIFQ9bCtoO3hbaSt5KjQ+PjJdPVQsd24obSxUKSxoKz1tLmxlbmd0aCsxfSksMH1mdW5jdGlvbiBRbihpLGwpe3ZhciBoPXJlKCk7eFtpPj4yXT1oLmxlbmd0aDt2YXIgbT0wO3JldHVybiBoLmZvckVhY2goZnVuY3Rpb24oeSl7bSs9eS5sZW5ndGgrMX0pLHhbbD4+Ml09bSwwfWZ1bmN0aW9uIFhuKGkpe25zKGkpfWZ1bmN0aW9uIEtuKGkpe3JldHVybiAwfWZ1bmN0aW9uIFluKGksbCxoLG0seSl7fWZ1bmN0aW9uIFpuKGksbCxoLG0pe2Zvcih2YXIgeT0wLFQ9MDtUPGg7VCsrKXtmb3IodmFyIGc9eFtsK1QqOD4+Ml0sUj14W2wrKFQqOCs0KT4+Ml0sVT0wO1U8UjtVKyspVGUucHJpbnRDaGFyKGksZWVbZytVXSk7eSs9Un1yZXR1cm4geFttPj4yXT15LDB9ZnVuY3Rpb24gZXMoKXtpZih0eXBlb2YgY3J5cHRvPT0ib2JqZWN0IiYmdHlwZW9mIGNyeXB0by5nZXRSYW5kb21WYWx1ZXM9PSJmdW5jdGlvbiIpe3ZhciBpPW5ldyBVaW50OEFycmF5KDEpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGkpLGlbMF19fWVsc2UgcmV0dXJuIGZ1bmN0aW9uKCl7SCgicmFuZG9tRGV2aWNlIil9fWZ1bmN0aW9uIENlKGksbCl7Q2UucmFuZG9tRGV2aWNlfHwoQ2UucmFuZG9tRGV2aWNlPWVzKCkpO2Zvcih2YXIgaD0wO2g8bDtoKyspYmVbaStoPj4wXT1DZS5yYW5kb21EZXZpY2UoKTtyZXR1cm4gMH12YXIgdHM9e2E6a24sZTpEbixkOlVuLGI6Qm4sbjokbixoOlduLGw6am4sbTpWbixwOnpuLGY6R24sZzpRbixqOlhuLGk6S24sazpZbixjOlpuLG86Q2V9O0xuKCksdC5fX193YXNtX2NhbGxfY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm4odC5fX193YXNtX2NhbGxfY3RvcnM9dC5hc20ucikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRNb2RlbEJ1ZmZlck1lbW9yeU9mZnNldD10LmFzbS5zKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldElucHV0TWVtb3J5T2Zmc2V0PWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0TWVtb3J5T2Zmc2V0PXQuYXNtLnQpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0SW5wdXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0SW5wdXRIZWlnaHQ9dC5hc20udSkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2dldElucHV0V2lkdGg9dC5hc20udikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRJbnB1dENoYW5uZWxDb3VudD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRJbnB1dENoYW5uZWxDb3VudD10LmFzbS53KS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX2dldE91dHB1dE1lbW9yeU9mZnNldD1mdW5jdGlvbigpe3JldHVybih0Ll9nZXRPdXRwdXRNZW1vcnlPZmZzZXQ9dC5hc20ueCkuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0SGVpZ2h0PXQuYXNtLnkpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fZ2V0T3V0cHV0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0V2lkdGg9dC5hc20ueikuYXBwbHkobnVsbCxhcmd1bWVudHMpfSx0Ll9nZXRPdXRwdXRDaGFubmVsQ291bnQ9ZnVuY3Rpb24oKXtyZXR1cm4odC5fZ2V0T3V0cHV0Q2hhbm5lbENvdW50PXQuYXNtLkEpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sdC5fbG9hZE1vZGVsPWZ1bmN0aW9uKCl7cmV0dXJuKHQuX2xvYWRNb2RlbD10LmFzbS5CKS5hcHBseShudWxsLGFyZ3VtZW50cyl9LHQuX3J1bkluZmVyZW5jZT1mdW5jdGlvbigpe3JldHVybih0Ll9ydW5JbmZlcmVuY2U9dC5hc20uQykuYXBwbHkobnVsbCxhcmd1bWVudHMpfTt2YXIga3Q9dC5fX19lcnJub19sb2NhdGlvbj1mdW5jdGlvbigpe3JldHVybihrdD10Ll9fX2Vycm5vX2xvY2F0aW9uPXQuYXNtLkUpLmFwcGx5KG51bGwsYXJndW1lbnRzKX0sUmU7ZnVuY3Rpb24gcnMoaSl7dGhpcy5uYW1lPSJFeGl0U3RhdHVzIix0aGlzLm1lc3NhZ2U9IlByb2dyYW0gdGVybWluYXRlZCB3aXRoIGV4aXQoIitpKyIpIix0aGlzLnN0YXR1cz1pfXRlPWZ1bmN0aW9uIGkoKXtSZXx8UWUoKSxSZXx8KHRlPWkpfTtmdW5jdGlvbiBRZShpKXtpZihqPjB8fChDbigpLGo+MCkpcmV0dXJuO2Z1bmN0aW9uIGwoKXtSZXx8KFJlPSEwLHQuY2FsbGVkUnVuPSEwLCFJJiYoUm4oKSxuKHQpLHQub25SdW50aW1lSW5pdGlhbGl6ZWQmJnQub25SdW50aW1lSW5pdGlhbGl6ZWQoKSxQbigpKSl9dC5zZXRTdGF0dXM/KHQuc2V0U3RhdHVzKCJSdW5uaW5nLi4uIiksc2V0VGltZW91dChmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnNldFN0YXR1cygiIil9LDEpLGwoKX0sMSkpOmwoKX10LnJ1bj1RZTtmdW5jdGlvbiBucyhpLGwpe3NzKGkpfWZ1bmN0aW9uIHNzKGkpe1RuKCl8fCh0Lm9uRXhpdCYmdC5vbkV4aXQoaSksST0hMCksYyhpLG5ldyBycyhpKSl9aWYodC5wcmVJbml0KWZvcih0eXBlb2YgdC5wcmVJbml0PT0iZnVuY3Rpb24iJiYodC5wcmVJbml0PVt0LnByZUluaXRdKTt0LnByZUluaXQubGVuZ3RoPjA7KXQucHJlSW5pdC5wb3AoKSgpO3JldHVybiBRZSgpLGUucmVhZHl9fSgpO3R5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmdHlwZW9mIG1vZHVsZT09Im9iamVjdCI/bW9kdWxlLmV4cG9ydHM9eWU6dHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZnVuY3Rpb24oKXtyZXR1cm4geWV9KTp0eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJihleHBvcnRzLmNyZWF0ZVZvbmFnZVRGTGl0ZVNpbWRNb2R1bGU9eWUpO2NsYXNzIG1ue2NvbnN0cnVjdG9yKCl7dGhpcy5pc1NJTURTdXBwb3J0ZWRfPSExLHRoaXMuaXNUaHJlYWRzU3VwcG9ydGVkXz0hMSx0aGlzLmlucHV0V2lkdGhfPTAsdGhpcy5pbnB1dEhlaWdodF89MCx0aGlzLmlucHV0Q2hhbm5lbENvdW50Xz0wLHRoaXMuaW5wdXRNZW1vcnlPZmZzZXRfPTAsdGhpcy5vdXRwdXRXaWR0aF89MCx0aGlzLm91dHB1dEhlaWdodF89MCx0aGlzLm91dHB1dENoYW5uZWxDb3VudF89MCx0aGlzLm91dHB1dE1lbW9yeU9mZnNldF89MH19YXN5bmMgZnVuY3Rpb24gZ24ocixlKXtsZXQgdD1uZXcgbW47dmFyIG49bmV3IFByb21pc2UoZnVuY3Rpb24ocyxvKXthc3luYyBmdW5jdGlvbiBhKCl7cmV0dXJuIHllKHtsb2NhdGVGaWxlOmZ1bmN0aW9uKF8pe3JldHVybiByK199fSl9YXN5bmMgZnVuY3Rpb24gdShjKXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoXyxmKT0+e2NvbnN0IGQ9YztpZih0eXBlb2YgZD09InVuZGVmaW5lZCIpcmV0dXJuIGYoIlRGTGl0ZSBiYWNrZW5kIHVuYXZhaWxhYmxlOiB3YXNtU2ltZCIpO2NvbnN0IHY9cG4oKTtjb25zb2xlLmxvZygiTG9hZGluZyB0ZmxpdGUgbW9kZWw6Iix2KTtsZXQgdz1lK2Ake3Z9LnRmbGl0ZWA7Y29uc29sZS5sb2coIlRGTGl0ZSBtb2RlbFVybDogIit3KTt0cnl7Y29uc3QgQT1hd2FpdChhd2FpdCBmZXRjaCh3KSkuYXJyYXlCdWZmZXIoKTtjb25zb2xlLmxvZygiTW9kZWwgYnVmZmVyIHNpemU6IixBLmJ5dGVMZW5ndGgpO2NvbnN0IEM9ZC5fZ2V0TW9kZWxCdWZmZXJNZW1vcnlPZmZzZXQoKTtjb25zb2xlLmxvZygiTW9kZWwgYnVmZmVyIG1lbW9yeSBvZmZzZXQ6IixDKSxjb25zb2xlLmxvZygiTG9hZGluZyBtb2RlbCBidWZmZXIuLi4iKSxkLkhFQVBVOC5zZXQobmV3IFVpbnQ4QXJyYXkoQSksQyk7Y29uc3QgTz1kLl9sb2FkTW9kZWwoQS5ieXRlTGVuZ3RoKTtpZihjb25zb2xlLmxvZygiTG9hZCBtb2RlbCByZXN1bHQ6IixPKSxPIT09MCl7ZigiQ2Fubm90IGxvYWQgbW9kZWwiKTtyZXR1cm59dC5pbnB1dFdpZHRoXz1kLl9nZXRJbnB1dFdpZHRoKCksdC5pbnB1dEhlaWdodF89ZC5fZ2V0SW5wdXRIZWlnaHQoKSx0LmlucHV0Q2hhbm5lbENvdW50Xz1kLl9nZXRJbnB1dENoYW5uZWxDb3VudCgpLHQuaW5wdXRNZW1vcnlPZmZzZXRfPWQuX2dldElucHV0TWVtb3J5T2Zmc2V0KCksY29uc29sZS5sb2coIklucHV0IG1lbW9yeSBvZmZzZXQ6Iix0LmlucHV0TWVtb3J5T2Zmc2V0XyksY29uc29sZS5sb2coIklucHV0IGhlaWdodDoiLHQuaW5wdXRIZWlnaHRfKSxjb25zb2xlLmxvZygiSW5wdXQgd2lkdGg6Iix0LmlucHV0V2lkdGhfKSxjb25zb2xlLmxvZygiSW5wdXQgY2hhbm5lbHM6Iix0LmlucHV0Q2hhbm5lbENvdW50XyksdC5vdXRwdXRNZW1vcnlPZmZzZXRfPWQuX2dldE91dHB1dE1lbW9yeU9mZnNldCgpLHQub3V0cHV0V2lkdGhfPWQuX2dldE91dHB1dFdpZHRoKCksdC5vdXRwdXRIZWlnaHRfPWQuX2dldE91dHB1dEhlaWdodCgpLHQub3V0cHV0Q2hhbm5lbENvdW50Xz1kLl9nZXRPdXRwdXRDaGFubmVsQ291bnQoKSxjb25zb2xlLmxvZygiT3V0cHV0IG1lbW9yeSBvZmZzZXQ6Iix0Lm91dHB1dE1lbW9yeU9mZnNldF8pLGNvbnNvbGUubG9nKCJPdXRwdXQgaGVpZ2h0OiIsdC5vdXRwdXRIZWlnaHRfKSxjb25zb2xlLmxvZygiT3V0cHV0IHdpZHRoOiIsdC5vdXRwdXRXaWR0aF8pLGNvbnNvbGUubG9nKCJPdXRwdXQgY2hhbm5lbHM6Iix0Lm91dHB1dENoYW5uZWxDb3VudF8pLHQuc2VsZWN0ZWRURkxpdGVfPWR9Y2F0Y2goTSl7ZihNKTtyZXR1cm59XygpfSl9YSgpLnRoZW4oYz0+e2lmKGM9PT1udWxsKXRocm93IGNvbnNvbGUuZXJyb3IoImxvYWRURkxpdGUgbnVsbCIpLCJsb2FkVEZMaXRlIG51bGwiO3UoYykudGhlbihfPT57cyh0KX0pLmNhdGNoKF89Pntjb25zb2xlLmVycm9yKCJsb2FkVEZMaXRlTW9kZWwgZXJyb3IiKSxvKCJsb2FkVEZMaXRlTW9kZWwgZXJyb3IiKX0pfSkuY2F0Y2goYz0+e2NvbnNvbGUuZXJyb3IoImxvYWRURkxpdGUgZXJyb3I6IixjKSxvKCJsb2FkVEZMaXRlIGVycm9yOiIrYyl9KX0pO3JldHVybiBufWNsYXNzIF9ue2NvbnN0cnVjdG9yKGUpe3RoaXMuYmx1ckZpbHRlcl89ZT09PV9lLkhpZ2g/ImJsdXIoMTVweCkiOiJibHVyKDVweCkifXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2UuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtaW4iLGUuZmlsdGVyPXRoaXMuYmx1ckZpbHRlcl8sZS5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksZS5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImRlc3RpbmF0aW9uLW92ZXIiLGUuZmlsdGVyPSJibHVyKDBweCkiLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKG4pe2NvbnNvbGUubG9nKCJbQmx1clBvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLG4pfX19Y29uc3QgUT1jbGFzc3tjb25zdHJ1Y3RvcihyKXtpZih0aGlzLmNvbmZpZ189cix0aGlzLmZyYW1lQ291bnRlcl89MCx0aGlzLmxhc3RQcm9jZXNzZWRUaW1lc3RhbXBfPTAsdGhpcy5yZXN1bHRDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLnJlc3VsdEN0eF89dGhpcy5yZXN1bHRDYW52YXNfLmdldENvbnRleHQoIjJkIix7YWxwaGE6ITEsZGVzeW5jaHJvbml6ZWQ6ITB9KSwhdGhpcy5yZXN1bHRDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTtpZih0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfPW5ldyBPZmZzY3JlZW5DYW52YXMoMSwxKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfPXRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uZ2V0Q29udGV4dCgiMmQiLHthbHBoYTohMSxkZXN5bmNocm9uaXplZDohMH0pLCF0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKTtpZih0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc189bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ3R4Xz10aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18uZ2V0Q29udGV4dCgiMmQiLHthbHBoYTohMSxkZXN5bmNocm9uaXplZDohMH0pLCF0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUN0eF8pdGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gY3JlYXRlIE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCIpO3RoaXMuc2VnbWVudGF0aW9uUGl4ZWxDb3VudF89MCx0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xz0wLHRoaXMub3V0cHV0TWVtb3J5T2Zmc2V0Xz0wLHIudHJhbnNmb3JtZXJUeXBlPT09IlZpcnR1YWxCYWNrZ3JvdW5kIj8odGhpcy50aW1lckdhcF89US5WSVJUVUFMX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgY24oci5iYWNrZ3JvdW5kQXNzZXRVcmkpKTpyLnRyYW5zZm9ybWVyVHlwZT09PSJCYWNrZ3JvdW5kQmx1ciI/KHRoaXMudGltZXJHYXBfPVEuQkxVUl9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQsdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV89bmV3IE90KHIucmFkaXVzKSk6ci50cmFuc2Zvcm1lclR5cGU9PT0iVmlkZW9CYWNrZ3JvdW5kIj90aGlzLnRpbWVyR2FwXz1RLkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05EOnIudHJhbnNmb3JtZXJUeXBlPT09IlNpbHVldGVCbHVyIj8odGhpcy50aW1lckdhcF89US5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgX24oci5yYWRpdXMpKToodGhpcy50aW1lckdhcF89US5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgT3QpfWluaXQoKXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMocixlKT0+e2F3YWl0IGduKHRoaXMuY29uZmlnXy53YXNtQXNzZXRVcmlQYXRoLHRoaXMuY29uZmlnXy50ZmxpdGVBc3NldFVyaVBhdGgpLnRoZW4odD0+e3QmJih0aGlzLnZvYW5nZVRGTGl0ZUluZm9fPXQsdGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXy53aWR0aD10aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uaGVpZ2h0PXRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfLHRoaXMuc2VnbWVudGF0aW9uUGl4ZWxDb3VudF89dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyp0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0Xyx0aGlzLnNlZ21lbnRhdGlvbk1hc2tfPW5ldyBJbWFnZURhdGEodGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dFdpZHRoXyx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0SGVpZ2h0XyksdGhpcy5pbnB1dE1lbW9yeU9mZnNldF89dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dE1lbW9yeU9mZnNldF8vNCx0aGlzLm91dHB1dE1lbW9yeU9mZnNldF89dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5vdXRwdXRNZW1vcnlPZmZzZXRfLzQscigpKX0pLmNhdGNoKHQ9Pntjb25zb2xlLmxvZygiZXJyb3IgdXNlVEZMaXRlOiIsdCksZSh0KX0pfSl9YXN5bmMgc3RhcnQoKXtpZih0eXBlb2YgdGhpcy52b2FuZ2VURkxpdGVJbmZvXz09InVuZGVmaW5lZCIpdGhyb3cidHJhbnNmb3JtZXIgbm90IGluaXQifWFzeW5jIHRyYW5zZm9ybShyLGUpeyh0aGlzLnJlc3VsdENhbnZhc18ud2lkdGghPXIuZGlzcGxheVdpZHRofHx0aGlzLnJlc3VsdENhbnZhc18uaGVpZ2h0IT1yLmRpc3BsYXlIZWlnaHQpJiYodGhpcy5yZXN1bHRDYW52YXNfLndpZHRoPXIuZGlzcGxheVdpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQ9ci5kaXNwbGF5SGVpZ2h0KSwodGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLndpZHRoIT1yLmRpc3BsYXlXaWR0aHx8dGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmhlaWdodCE9ci5kaXNwbGF5SGVpZ2h0KSYmKHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy53aWR0aD1yLmRpc3BsYXlXaWR0aCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18uaGVpZ2h0PXIuZGlzcGxheUhlaWdodCk7Y29uc3QgdD1yLnRpbWVzdGFtcDtjcmVhdGVJbWFnZUJpdG1hcChyKS50aGVuKG49PntyLmNsb3NlKCksdGhpcy5wcm9jZXNzRnJhbWUoZSxuLHQpfSkuY2F0Y2gobj0+e2NvbnNvbGUuZXJyb3IoImNyZWF0ZUltYWdlQml0bWFwIixuKSxlLmVucXVldWUocil9KX1wcm9jZXNzRnJhbWUocixlLHQpe3QtdGhpcy5sYXN0UHJvY2Vzc2VkVGltZXN0YW1wXz49dGhpcy50aW1lckdhcF8mJih0aGlzLmxhc3RQcm9jZXNzZWRUaW1lc3RhbXBfPXQsdGhpcy5wcm9jZXNzU291cmNlKGUpKSx0aGlzLnJlc3VsdEN0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJjb3B5Iix0aGlzLnJlc3VsdEN0eF8uZHJhd0ltYWdlKHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXywwLDAsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0ZyYW1lQ2FudmFzXy5oZWlnaHQpLHRoaXMucmVzdWx0Q3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249InNvdXJjZS1hdG9wIix0aGlzLnJlc3VsdEN0eF8uZmlsdGVyPSJub25lIix0aGlzLnJlc3VsdEN0eF8uZHJhd0ltYWdlKGUsMCwwLGUud2lkdGgsZS5oZWlnaHQpLHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfJiZ0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXy5ydW5Qb3N0UHJvY2Vzc2luZyh0aGlzLnJlc3VsdEN0eF8sZSksci5lbnF1ZXVlKG5ldyBWaWRlb0ZyYW1lKHRoaXMucmVzdWx0Q2FudmFzXyx7dGltZXN0YW1wOnQsYWxwaGE6ImRpc2NhcmQifSkpLHRoaXMuZnJhbWVDb3VudGVyXysrfXByb2Nlc3NTb3VyY2Uocil7dGhpcy5zZWdtZW50YXRpb25NYXNrQ3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImNvcHkiLHRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uZHJhd0ltYWdlKHIsMCwwLHIud2lkdGgsci5oZWlnaHQsMCwwLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRXaWR0aF8sdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5pbnB1dEhlaWdodF8pO2xldCBlPXRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfKTtmb3IobGV0IHQ9MDt0PHRoaXMuc2VnbWVudGF0aW9uUGl4ZWxDb3VudF87dCsrKXRoaXMudm9hbmdlVEZMaXRlSW5mb18uc2VsZWN0ZWRURkxpdGVfLkhFQVBGMzJbdGhpcy5pbnB1dE1lbW9yeU9mZnNldF8rdCozXT1lLmRhdGFbdCo0XS8yNTUsdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uSEVBUEYzMlt0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xyt0KjMrMV09ZS5kYXRhW3QqNCsxXS8yNTUsdGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uSEVBUEYzMlt0aGlzLmlucHV0TWVtb3J5T2Zmc2V0Xyt0KjMrMl09ZS5kYXRhW3QqNCsyXS8yNTU7dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uX3J1bkluZmVyZW5jZSgpO2ZvcihsZXQgdD0wO3Q8dGhpcy5zZWdtZW50YXRpb25QaXhlbENvdW50Xzt0Kyspe2NvbnN0IG49dGhpcy52b2FuZ2VURkxpdGVJbmZvXy5zZWxlY3RlZFRGTGl0ZV8uSEVBUEYzMlt0aGlzLm91dHB1dE1lbW9yeU9mZnNldF8rdF07dGhpcy5zZWdtZW50YXRpb25NYXNrXy5kYXRhW3QqNCszXT0yNTUqbn10aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLnB1dEltYWdlRGF0YSh0aGlzLnNlZ21lbnRhdGlvbk1hc2tfLDAsMCksdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDdHhfLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iY29weSIsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDdHhfLmRyYXdJbWFnZSh0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLDAsMCx0aGlzLnZvYW5nZVRGTGl0ZUluZm9fLmlucHV0V2lkdGhfLHRoaXMudm9hbmdlVEZMaXRlSW5mb18uaW5wdXRIZWlnaHRfLDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tGcmFtZUNhbnZhc18ud2lkdGgsdGhpcy5zZWdtZW50YXRpb25NYXNrRnJhbWVDYW52YXNfLmhlaWdodCl9Zmx1c2goKXt9Z2V0VHJhbnNmb3JtZXJUeXBlKCl7cmV0dXJuIkJhY2tncm91bmRUcmFuc2Zvcm1lciJ9c2V0VmlkZW9CR1JlYWRhYmxlKHIpe3RoaXMuY29uZmlnXy50cmFuc2Zvcm1lclR5cGU9PT0iVmlkZW9CYWNrZ3JvdW5kIiYmKHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBkbihyKSl9fTtsZXQgcWU9UTtxZS5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORD0yZTUscWUuVklSVFVBTF9QUk9DRVNTX0dBUF9NSUNST19TRUNPTkQ9MTVlNDtmdW5jdGlvbiB5bihyKXtyZXR1cm4gdHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbCYmIm1lc3NhZ2UiaW4gciYmdHlwZW9mIHIubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gdm4ocil7aWYoeW4ocikpcmV0dXJuIHI7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHIpKX19ZnVuY3Rpb24gVmUocil7cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkIj8iIjp2bihyKS5tZXNzYWdlfWlmKHR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iKXtsZXQgcj1mdW5jdGlvbigpe3R5cGVvZiBlPT0idW5kZWZpbmVkIiYmKGU9bmV3IGxuLGUub24oImVycm9yIix0PT57Y29uc3Qgbj17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfZXJyb3JfZXZlbnQiLG1lc3NhZ2U6dH07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobikpfSksZS5vbigid2FybiIsdD0+e2NvbnN0IG49e2NhbGxiYWNrVHlwZToibWVkaWFfcHJvY2Vzc29yX3dhcm5fZXZlbnQiLG1lc3NhZ2U6dH07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobikpfSkpfSxlO29ubWVzc2FnZT1hc3luYyB0PT57Y29uc3R7b3BlcmF0aW9uOm59PXQuZGF0YTtpZihjb25zb2xlLmxvZygib3BlcmF0aW9uPSIsbiksbj09PSJ0cmFuc2Zvcm0iKXtjb25zdHtyZWFkYWJsZTpzLHdyaXRhYmxlOm8sY29uZmlnOmEsdmlkZW9CR1JlYWRhYmxlOnUsbWV0YURhdGE6Y309dC5kYXRhO3R5cGVvZiBjPT0ic3RyaW5nIiYmR3IoSlNPTi5wYXJzZShjKSkscigpO2xldCBfPVtdO2NvbnN0IGY9bmV3IHFlKEpTT04ucGFyc2UoYSkpO2Yuc2V0VmlkZW9CR1JlYWRhYmxlKHUpLGYuaW5pdCgpLnRoZW4oKCk9PntfLnB1c2goZiksZS5zZXRUcmFuc2Zvcm1lcnMoXykudGhlbigoKT0+e2UudHJhbnNmb3JtKHMsbykudGhlbigoKT0+e2NvbnN0IGQ9e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZToidHJhbnNmb3JtIn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZCkpfSkuY2F0Y2goZD0+e2NvbnN0IHY9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6VmUoZCl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHYpKX0pfSl9KS5jYXRjaChkPT57Y29uc3Qgdj17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpWZShkKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkodikpfSl9ZWxzZSBuPT09ImRlc3Ryb3kiP2UuZGVzdHJveSgpLnRoZW4oKCk9Pntjb25zdCBzPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6ImRlc3Ryb3kifTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShzKSl9KS5jYXRjaChzPT57Y29uc3Qgbz17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpWZShzKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobykpfSk6bj09PSJzZXRUcmFja0V4cGVjdGVkUmF0ZSImJmUuc2V0VHJhY2tFeHBlY3RlZFJhdGUodC5kYXRhLnJhdGUpfX19KSgpOwo=",_l=typeof window!="undefined"&&window.Blob&&new Blob([atob(ql)],{type:"text/javascript;charset=utf-8"});function yc(){const Z=_l&&(window.URL||window.webkitURL).createObjectURL(_l);try{return Z?new Worker(Z):new Worker("data:application/javascript;base64,"+ql,{type:"module"})}finally{Z&&(window.URL||window.webkitURL).revokeObjectURL(Z)}}const R=new WeakMap,ll=new WeakMap,U=new WeakMap,pl=Symbol("anyProducer"),ld=Promise.resolve(),dl=Symbol("listenerAdded"),cl=Symbol("listenerRemoved");let Vl=!1;function L(Z){if(typeof Z!="string"&&typeof Z!="symbol")throw new TypeError("eventName must be a string or a symbol")}function Zl(Z){if(typeof Z!="function")throw new TypeError("listener must be a function")}function v(Z,l){const d=ll.get(Z);return d.has(l)||d.set(l,new Set),d.get(l)}function B(Z,l){const d=typeof l=="string"||typeof l=="symbol"?l:pl,c=U.get(Z);return c.has(d)||c.set(d,new Set),c.get(d)}function Rc(Z,l,d){const c=U.get(Z);if(c.has(l))for(const b of c.get(l))b.enqueue(d);if(c.has(pl)){const b=Promise.all([l,d]);for(const e of c.get(pl))e.enqueue(b)}}function dd(Z,l){l=Array.isArray(l)?l:[l];let d=!1,c=()=>{},b=[];const e={enqueue(t){b.push(t),c()},finish(){d=!0,c()}};for(const t of l)B(Z,t).add(e);return{async next(){return b?b.length===0?d?(b=void 0,this.next()):(await new Promise(t=>{c=t}),this.next()):{done:!1,value:await b.shift()}:{done:!0}},async return(t){b=void 0;for(const n of l)B(Z,n).delete(e);return c(),arguments.length>0?{done:!0,value:await t}:{done:!0}},[Symbol.asyncIterator](){return this}}}function cd(Z){if(Z===void 0)return Zd;if(!Array.isArray(Z))throw new TypeError("`methodNames` must be an array of strings");for(const l of Z)if(!Zd.includes(l))throw typeof l!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${l} is not Emittery method`);return Z}const yl=Z=>Z===dl||Z===cl;class Y{static mixin(l,d){return d=cd(d),c=>{if(typeof c!="function")throw new TypeError("`target` must be function");for(const t of d)if(c.prototype[t]!==void 0)throw new Error(`The property \`${t}\` already exists on \`target\``);function b(){return Object.defineProperty(this,l,{enumerable:!1,value:new Y}),this[l]}Object.defineProperty(c.prototype,l,{enumerable:!1,get:b});const e=t=>function(...n){return this[l][t](...n)};for(const t of d)Object.defineProperty(c.prototype,t,{enumerable:!1,value:e(t)});return c}}static get isDebugEnabled(){if(typeof process!="object")return Vl;const{env:l}=process||{env:{}};return l.DEBUG==="emittery"||l.DEBUG==="*"||Vl}static set isDebugEnabled(l){Vl=l}constructor(l={}){R.set(this,new Set),ll.set(this,new Map),U.set(this,new Map),this.debug=l.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(d,c,b,e)=>{e=JSON.stringify(e),typeof b=="symbol"&&(b=b.toString());const t=new Date,n=`${t.getHours()}:${t.getMinutes()}:${t.getSeconds()}.${t.getMilliseconds()}`;console.log(`[${n}][emittery:${d}][${c}] Event Name: ${b}
|
|
4
|
-
data: ${e}`)})}logIfDebugEnabled(l,d,c){(Y.isDebugEnabled||this.debug.enabled)&&this.debug.logger(l,this.debug.name,d,c)}on(l,d){Zl(d),l=Array.isArray(l)?l:[l];for(const c of l)L(c),v(this,c).add(d),this.logIfDebugEnabled("subscribe",c,void 0),yl(c)||this.emit(dl,{eventName:c,listener:d});return this.off.bind(this,l,d)}off(l,d){Zl(d),l=Array.isArray(l)?l:[l];for(const c of l)L(c),v(this,c).delete(d),this.logIfDebugEnabled("unsubscribe",c,void 0),yl(c)||this.emit(cl,{eventName:c,listener:d})}once(l){return new Promise(d=>{const c=this.on(l,b=>{c(),d(b)})})}events(l){l=Array.isArray(l)?l:[l];for(const d of l)L(d);return dd(this,l)}async emit(l,d){L(l),this.logIfDebugEnabled("emit",l,d),Rc(this,l,d);const c=v(this,l),b=R.get(this),e=[...c],t=yl(l)?[]:[...b];await ld,await Promise.all([...e.map(async n=>{if(c.has(n))return n(d)}),...t.map(async n=>{if(b.has(n))return n(l,d)})])}async emitSerial(l,d){L(l),this.logIfDebugEnabled("emitSerial",l,d);const c=v(this,l),b=R.get(this),e=[...c],t=[...b];await ld;for(const n of e)c.has(n)&&await n(d);for(const n of t)b.has(n)&&await n(l,d)}onAny(l){return Zl(l),this.logIfDebugEnabled("subscribeAny",void 0,void 0),R.get(this).add(l),this.emit(dl,{listener:l}),this.offAny.bind(this,l)}anyEvent(){return dd(this)}offAny(l){Zl(l),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(cl,{listener:l}),R.get(this).delete(l)}clearListeners(l){l=Array.isArray(l)?l:[l];for(const d of l)if(this.logIfDebugEnabled("clear",d,void 0),typeof d=="string"||typeof d=="symbol"){v(this,d).clear();const c=B(this,d);for(const b of c)b.finish();c.clear()}else{R.get(this).clear();for(const c of ll.get(this).values())c.clear();for(const c of U.get(this).values()){for(const b of c)b.finish();c.clear()}}}listenerCount(l){l=Array.isArray(l)?l:[l];let d=0;for(const c of l){if(typeof c=="string"){d+=R.get(this).size+v(this,c).size+B(this,c).size+B(this).size;continue}typeof c!="undefined"&&L(c),d+=R.get(this).size;for(const b of ll.get(this).values())d+=b.size;for(const b of U.get(this).values())d+=b.size}return d}bindMethods(l,d){if(typeof l!="object"||l===null)throw new TypeError("`target` must be an object");d=cd(d);for(const c of d){if(l[c]!==void 0)throw new Error(`The property \`${c}\` already exists on \`target\``);Object.defineProperty(l,c,{enumerable:!1,value:this[c].bind(this)})}}}const Zd=Object.getOwnPropertyNames(Y.prototype).filter(Z=>Z!=="constructor");Object.defineProperty(Y,"listenerAdded",{value:dl,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(Y,"listenerRemoved",{value:cl,writable:!1,enumerable:!0,configurable:!1});var Yc=Y;class Jc extends Yc{constructor(l){super();this.config_=l,this.worker_=new yc,this.trackExpectedRate_=-1,this.workerInited_=!1,this.onMessage_=new Promise((d,c)=>{this.worker_.addEventListener("message",b=>{let e=JSON.parse(b.data);e.callbackType==="success"?d():e.callbackType==="error"?c(e.message):e.callbackType==="media_processor_error_event"?this.emit("error",e.message):e.callbackType==="media_processor_warn_event"&&this.emit("warn",e.message)})})}transform(l,d){return new Promise(async(c,b)=>{let e=JSON.stringify(rc());if(typeof e!="string"&&(e=JSON.stringify({})),this.config_.transformerType==="VideoBackground"){const t=document.createElement("video");t.src=this.config_.backgroundAssetUri,t.muted=!0;try{await t.play()}catch(i){b(i);return}const n=t.captureStream().getVideoTracks()[0],s=new MediaStreamTrackProcessor(n).readable;this.worker_.postMessage({operation:"transform",readable:l,writable:d,config:JSON.stringify(this.config_),videoBGReadable:s,metaData:e},[l,d,s])}else this.worker_.postMessage({operation:"transform",readable:l,writable:d,config:JSON.stringify(this.config_),metaData:e},[l,d]);this.onMessage_.then(()=>{console.log("Worker inited"),this.workerInited_=!0,this.trackExpectedRate_!=-1&&this.postTrackExpectedRate(),c()}).catch(t=>{console.log("Worker inited error"),b(t)})})}destroy(){return new Promise(async(l,d)=>{this.worker_.postMessage({operation:"destroy"}),this.onMessage_.then(()=>{console.log("Worker destroyed"),l()}).catch(c=>{console.log("Worker destroy error"),d(c)})})}setTrackExpectedRate(l){this.trackExpectedRate_=l,this.postTrackExpectedRate()}postTrackExpectedRate(){this.workerInited_&&this.worker_.postMessage({operation:"setTrackExpectedRate",rate:this.trackExpectedRate_})}}r.BlurRadius=void 0,function(Z){Z.Low="Low",Z.High="High"}(r.BlurRadius||(r.BlurRadius={}));const Ic=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]));function Kc(){return new Promise(async(Z,l)=>{try{await F()}catch(d){l(d);return}Ic().then(d=>{if(d===!1){l("Your browser does not support WebAssembly features.");return}Z()}).catch(d=>{l(d)})})}let g,bl=-1;function fc(){return g}function Sc(Z){bl=Z,typeof g!="undefined"&&g.setTrackExpectedRate(bl)}function Nc(Z){return new Promise(async(l,d)=>{g=new Jc(Z),bl!=-1&&g.setTrackExpectedRate(bl);const c=new Vc(g);l(c)})}r.createVonageMediaProcessorConnector=Nc,r.getVonageEventEmitter=fc,r.isSupported=Kc,r.setTrackExpectedRate=Sc,Object.defineProperties(r,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
1
|
+
(function(m,K){typeof exports=="object"&&typeof module!="undefined"?K(exports,require("@mediapipe/face_detection"),require("@mediapipe/face_mesh"),require("@mediapipe/hands"),require("@mediapipe/holistic"),require("@mediapipe/objectron"),require("@mediapipe/selfie_segmentation"),require("@mediapipe/pose")):typeof define=="function"&&define.amd?define(["exports","@mediapipe/face_detection","@mediapipe/face_mesh","@mediapipe/hands","@mediapipe/holistic","@mediapipe/objectron","@mediapipe/selfie_segmentation","@mediapipe/pose"],K):(m=typeof globalThis!="undefined"?globalThis:m||self,K(m["ml-transformers"]={},m.face_detection,m.face_mesh,m.hands,m.holistic,m.objectron,m.selfie_segmentation,m.pose))})(this,function(m,K,Ye,Ie,Ke,Se,He,Le){"use strict";function Xl(){return new Promise((c,e)=>{typeof MediaStreamTrackProcessor=="undefined"||typeof MediaStreamTrackGenerator=="undefined"?e("Your browser does not support the MediaStreamTrack API for Insertable Streams of Media."):c()})}var Ne={exports:{}},ze=function(e,l){return function(){for(var i=new Array(arguments.length),d=0;d<i.length;d++)i[d]=arguments[d];return e.apply(l,i)}},yl=ze,V=Object.prototype.toString;function de(c){return Array.isArray(c)}function se(c){return typeof c=="undefined"}function Gl(c){return c!==null&&!se(c)&&c.constructor!==null&&!se(c.constructor)&&typeof c.constructor.isBuffer=="function"&&c.constructor.isBuffer(c)}function Fe(c){return V.call(c)==="[object ArrayBuffer]"}function Wl(c){return V.call(c)==="[object FormData]"}function Vl(c){var e;return typeof ArrayBuffer!="undefined"&&ArrayBuffer.isView?e=ArrayBuffer.isView(c):e=c&&c.buffer&&Fe(c.buffer),e}function Rl(c){return typeof c=="string"}function fl(c){return typeof c=="number"}function ge(c){return c!==null&&typeof c=="object"}function w(c){if(V.call(c)!=="[object Object]")return!1;var e=Object.getPrototypeOf(c);return e===null||e===Object.prototype}function Jl(c){return V.call(c)==="[object Date]"}function Yl(c){return V.call(c)==="[object File]"}function Il(c){return V.call(c)==="[object Blob]"}function ve(c){return V.call(c)==="[object Function]"}function Kl(c){return ge(c)&&ve(c.pipe)}function Sl(c){return V.call(c)==="[object URLSearchParams]"}function Hl(c){return c.trim?c.trim():c.replace(/^\s+|\s+$/g,"")}function Ll(){return typeof navigator!="undefined"&&(navigator.product==="ReactNative"||navigator.product==="NativeScript"||navigator.product==="NS")?!1:typeof window!="undefined"&&typeof document!="undefined"}function ae(c,e){if(!(c===null||typeof c=="undefined"))if(typeof c!="object"&&(c=[c]),de(c))for(var l=0,t=c.length;l<t;l++)e.call(null,c[l],l,c);else for(var i in c)Object.prototype.hasOwnProperty.call(c,i)&&e.call(null,c[i],i,c)}function oe(){var c={};function e(i,d){w(c[d])&&w(i)?c[d]=oe(c[d],i):w(i)?c[d]=oe({},i):de(i)?c[d]=i.slice():c[d]=i}for(var l=0,t=arguments.length;l<t;l++)ae(arguments[l],e);return c}function Nl(c,e,l){return ae(e,function(i,d){l&&typeof i=="function"?c[d]=yl(i,l):c[d]=i}),c}function zl(c){return c.charCodeAt(0)===65279&&(c=c.slice(1)),c}var b={isArray:de,isArrayBuffer:Fe,isBuffer:Gl,isFormData:Wl,isArrayBufferView:Vl,isString:Rl,isNumber:fl,isObject:ge,isPlainObject:w,isUndefined:se,isDate:Jl,isFile:Yl,isBlob:Il,isFunction:ve,isStream:Kl,isURLSearchParams:Sl,isStandardBrowserEnv:Ll,forEach:ae,merge:oe,extend:Nl,trim:Hl,stripBOM:zl},S=b;function Ue(c){return encodeURIComponent(c).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var ke=function(e,l,t){if(!l)return e;var i;if(t)i=t(l);else if(S.isURLSearchParams(l))i=l.toString();else{var d=[];S.forEach(l,function(o,h){o===null||typeof o=="undefined"||(S.isArray(o)?h=h+"[]":o=[o],S.forEach(o,function(Z){S.isDate(Z)?Z=Z.toISOString():S.isObject(Z)&&(Z=JSON.stringify(Z)),d.push(Ue(h)+"="+Ue(Z))}))}),i=d.join("&")}if(i){var n=e.indexOf("#");n!==-1&&(e=e.slice(0,n)),e+=(e.indexOf("?")===-1?"?":"&")+i}return e},Fl=b;function P(){this.handlers=[]}P.prototype.use=function(e,l,t){return this.handlers.push({fulfilled:e,rejected:l,synchronous:t?t.synchronous:!1,runWhen:t?t.runWhen:null}),this.handlers.length-1},P.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},P.prototype.forEach=function(e){Fl.forEach(this.handlers,function(t){t!==null&&e(t)})};var gl=P,vl=b,Ul=function(e,l){vl.forEach(e,function(i,d){d!==l&&d.toUpperCase()===l.toUpperCase()&&(e[l]=i,delete e[d])})},xe=function(e,l,t,i,d){return e.config=l,t&&(e.code=t),e.request=i,e.response=d,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}},e},kl=xe,Ce=function(e,l,t,i,d){var n=new Error(e);return kl(n,l,t,i,d)},xl=Ce,Cl=function(e,l,t){var i=t.config.validateStatus;!t.status||!i||i(t.status)?e(t):l(xl("Request failed with status code "+t.status,t.config,null,t.request,t))},Q=b,Tl=Q.isStandardBrowserEnv()?function(){return{write:function(l,t,i,d,n,s){var o=[];o.push(l+"="+encodeURIComponent(t)),Q.isNumber(i)&&o.push("expires="+new Date(i).toGMTString()),Q.isString(d)&&o.push("path="+d),Q.isString(n)&&o.push("domain="+n),s===!0&&o.push("secure"),document.cookie=o.join("; ")},read:function(l){var t=document.cookie.match(new RegExp("(^|;\\s*)("+l+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(l){this.write(l,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}(),Bl=function(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)},wl=function(e,l){return l?e.replace(/\/+$/,"")+"/"+l.replace(/^\/+/,""):e},Pl=Bl,Ql=wl,Ml=function(e,l){return e&&!Pl(l)?Ql(e,l):l},Ze=b,jl=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],El=function(e){var l={},t,i,d;return e&&Ze.forEach(e.split(`
|
|
2
|
+
`),function(s){if(d=s.indexOf(":"),t=Ze.trim(s.substr(0,d)).toLowerCase(),i=Ze.trim(s.substr(d+1)),t){if(l[t]&&jl.indexOf(t)>=0)return;t==="set-cookie"?l[t]=(l[t]?l[t]:[]).concat([i]):l[t]=l[t]?l[t]+", "+i:i}}),l},Te=b,Ol=Te.isStandardBrowserEnv()?function(){var e=/(msie|trident)/i.test(navigator.userAgent),l=document.createElement("a"),t;function i(d){var n=d;return e&&(l.setAttribute("href",n),n=l.href),l.setAttribute("href",n),{href:l.href,protocol:l.protocol?l.protocol.replace(/:$/,""):"",host:l.host,search:l.search?l.search.replace(/^\?/,""):"",hash:l.hash?l.hash.replace(/^#/,""):"",hostname:l.hostname,port:l.port,pathname:l.pathname.charAt(0)==="/"?l.pathname:"/"+l.pathname}}return t=i(window.location.href),function(n){var s=Te.isString(n)?i(n):n;return s.protocol===t.protocol&&s.host===t.host}}():function(){return function(){return!0}}();function me(c){this.message=c}me.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},me.prototype.__CANCEL__=!0;var M=me,j=b,Dl=Cl,Al=Tl,_l=ke,$l=Ml,ql=El,et=Ol,re=Ce,lt=O,tt=M,Be=function(e){return new Promise(function(t,i){var d=e.data,n=e.headers,s=e.responseType,o;function h(){e.cancelToken&&e.cancelToken.unsubscribe(o),e.signal&&e.signal.removeEventListener("abort",o)}j.isFormData(d)&&delete n["Content-Type"];var a=new XMLHttpRequest;if(e.auth){var Z=e.auth.username||"",G=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";n.Authorization="Basic "+btoa(Z+":"+G)}var u=$l(e.baseURL,e.url);a.open(e.method.toUpperCase(),_l(u,e.params,e.paramsSerializer),!0),a.timeout=e.timeout;function pl(){if(!!a){var X="getAllResponseHeaders"in a?ql(a.getAllResponseHeaders()):null,U=!s||s==="text"||s==="json"?a.responseText:a.response,I={data:U,status:a.status,statusText:a.statusText,headers:X,config:e,request:a};Dl(function(Je){t(Je),h()},function(Je){i(Je),h()},I),a=null}}if("onloadend"in a?a.onloadend=pl:a.onreadystatechange=function(){!a||a.readyState!==4||a.status===0&&!(a.responseURL&&a.responseURL.indexOf("file:")===0)||setTimeout(pl)},a.onabort=function(){!a||(i(re("Request aborted",e,"ECONNABORTED",a)),a=null)},a.onerror=function(){i(re("Network Error",e,null,a)),a=null},a.ontimeout=function(){var U=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",I=e.transitional||lt.transitional;e.timeoutErrorMessage&&(U=e.timeoutErrorMessage),i(re(U,e,I.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",a)),a=null},j.isStandardBrowserEnv()){var hl=(e.withCredentials||et(u))&&e.xsrfCookieName?Al.read(e.xsrfCookieName):void 0;hl&&(n[e.xsrfHeaderName]=hl)}"setRequestHeader"in a&&j.forEach(n,function(U,I){typeof d=="undefined"&&I.toLowerCase()==="content-type"?delete n[I]:a.setRequestHeader(I,U)}),j.isUndefined(e.withCredentials)||(a.withCredentials=!!e.withCredentials),s&&s!=="json"&&(a.responseType=e.responseType),typeof e.onDownloadProgress=="function"&&a.addEventListener("progress",e.onDownloadProgress),typeof e.onUploadProgress=="function"&&a.upload&&a.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(o=function(X){!a||(i(!X||X&&X.type?new tt("canceled"):X),a.abort(),a=null)},e.cancelToken&&e.cancelToken.subscribe(o),e.signal&&(e.signal.aborted?o():e.signal.addEventListener("abort",o))),d||(d=null),a.send(d)})},r=b,we=Ul,ct=xe,it={"Content-Type":"application/x-www-form-urlencoded"};function Pe(c,e){!r.isUndefined(c)&&r.isUndefined(c["Content-Type"])&&(c["Content-Type"]=e)}function nt(){var c;return(typeof XMLHttpRequest!="undefined"||typeof process!="undefined"&&Object.prototype.toString.call(process)==="[object process]")&&(c=Be),c}function dt(c,e,l){if(r.isString(c))try{return(e||JSON.parse)(c),r.trim(c)}catch(t){if(t.name!=="SyntaxError")throw t}return(l||JSON.stringify)(c)}var E={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:nt(),transformRequest:[function(e,l){return we(l,"Accept"),we(l,"Content-Type"),r.isFormData(e)||r.isArrayBuffer(e)||r.isBuffer(e)||r.isStream(e)||r.isFile(e)||r.isBlob(e)?e:r.isArrayBufferView(e)?e.buffer:r.isURLSearchParams(e)?(Pe(l,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):r.isObject(e)||l&&l["Content-Type"]==="application/json"?(Pe(l,"application/json"),dt(e)):e}],transformResponse:[function(e){var l=this.transitional||E.transitional,t=l&&l.silentJSONParsing,i=l&&l.forcedJSONParsing,d=!t&&this.responseType==="json";if(d||i&&r.isString(e)&&e.length)try{return JSON.parse(e)}catch(n){if(d)throw n.name==="SyntaxError"?ct(n,this,"E_JSON_PARSE"):n}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};r.forEach(["delete","get","head"],function(e){E.headers[e]={}}),r.forEach(["post","put","patch"],function(e){E.headers[e]=r.merge(it)});var O=E,st=b,at=O,ot=function(e,l,t){var i=this||at;return st.forEach(t,function(n){e=n.call(i,e,l)}),e},Qe=function(e){return!!(e&&e.__CANCEL__)},Me=b,be=ot,Zt=Qe,mt=O,rt=M;function ue(c){if(c.cancelToken&&c.cancelToken.throwIfRequested(),c.signal&&c.signal.aborted)throw new rt("canceled")}var bt=function(e){ue(e),e.headers=e.headers||{},e.data=be.call(e,e.data,e.headers,e.transformRequest),e.headers=Me.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),Me.forEach(["delete","get","head","post","put","patch","common"],function(i){delete e.headers[i]});var l=e.adapter||mt.adapter;return l(e).then(function(i){return ue(e),i.data=be.call(e,i.data,i.headers,e.transformResponse),i},function(i){return Zt(i)||(ue(e),i&&i.response&&(i.response.data=be.call(e,i.response.data,i.response.headers,e.transformResponse))),Promise.reject(i)})},p=b,je=function(e,l){l=l||{};var t={};function i(a,Z){return p.isPlainObject(a)&&p.isPlainObject(Z)?p.merge(a,Z):p.isPlainObject(Z)?p.merge({},Z):p.isArray(Z)?Z.slice():Z}function d(a){if(p.isUndefined(l[a])){if(!p.isUndefined(e[a]))return i(void 0,e[a])}else return i(e[a],l[a])}function n(a){if(!p.isUndefined(l[a]))return i(void 0,l[a])}function s(a){if(p.isUndefined(l[a])){if(!p.isUndefined(e[a]))return i(void 0,e[a])}else return i(void 0,l[a])}function o(a){if(a in l)return i(e[a],l[a]);if(a in e)return i(void 0,e[a])}var h={url:n,method:n,data:n,baseURL:s,transformRequest:s,transformResponse:s,paramsSerializer:s,timeout:s,timeoutMessage:s,withCredentials:s,adapter:s,responseType:s,xsrfCookieName:s,xsrfHeaderName:s,onUploadProgress:s,onDownloadProgress:s,decompress:s,maxContentLength:s,maxBodyLength:s,transport:s,httpAgent:s,httpsAgent:s,cancelToken:s,socketPath:s,responseEncoding:s,validateStatus:o};return p.forEach(Object.keys(e).concat(Object.keys(l)),function(Z){var G=h[Z]||d,u=G(Z);p.isUndefined(u)&&G!==o||(t[Z]=u)}),t},Ee={version:"0.25.0"},ut=Ee.version,pe={};["object","boolean","number","function","string","symbol"].forEach(function(c,e){pe[c]=function(t){return typeof t===c||"a"+(e<1?"n ":" ")+c}});var Oe={};pe.transitional=function(e,l,t){function i(d,n){return"[Axios v"+ut+"] Transitional option '"+d+"'"+n+(t?". "+t:"")}return function(d,n,s){if(e===!1)throw new Error(i(n," has been removed"+(l?" in "+l:"")));return l&&!Oe[n]&&(Oe[n]=!0,console.warn(i(n," has been deprecated since v"+l+" and will be removed in the near future"))),e?e(d,n,s):!0}};function pt(c,e,l){if(typeof c!="object")throw new TypeError("options must be an object");for(var t=Object.keys(c),i=t.length;i-- >0;){var d=t[i],n=e[d];if(n){var s=c[d],o=s===void 0||n(s,d,c);if(o!==!0)throw new TypeError("option "+d+" must be "+o);continue}if(l!==!0)throw Error("Unknown option "+d)}}var ht={assertOptions:pt,validators:pe},De=b,Xt=ke,Ae=gl,_e=bt,D=je,$e=ht,H=$e.validators;function k(c){this.defaults=c,this.interceptors={request:new Ae,response:new Ae}}k.prototype.request=function(e,l){if(typeof e=="string"?(l=l||{},l.url=e):l=e||{},!l.url)throw new Error("Provided config url is not valid");l=D(this.defaults,l),l.method?l.method=l.method.toLowerCase():this.defaults.method?l.method=this.defaults.method.toLowerCase():l.method="get";var t=l.transitional;t!==void 0&&$e.assertOptions(t,{silentJSONParsing:H.transitional(H.boolean),forcedJSONParsing:H.transitional(H.boolean),clarifyTimeoutError:H.transitional(H.boolean)},!1);var i=[],d=!0;this.interceptors.request.forEach(function(u){typeof u.runWhen=="function"&&u.runWhen(l)===!1||(d=d&&u.synchronous,i.unshift(u.fulfilled,u.rejected))});var n=[];this.interceptors.response.forEach(function(u){n.push(u.fulfilled,u.rejected)});var s;if(!d){var o=[_e,void 0];for(Array.prototype.unshift.apply(o,i),o=o.concat(n),s=Promise.resolve(l);o.length;)s=s.then(o.shift(),o.shift());return s}for(var h=l;i.length;){var a=i.shift(),Z=i.shift();try{h=a(h)}catch(G){Z(G);break}}try{s=_e(h)}catch(G){return Promise.reject(G)}for(;n.length;)s=s.then(n.shift(),n.shift());return s},k.prototype.getUri=function(e){if(!e.url)throw new Error("Provided config url is not valid");return e=D(this.defaults,e),Xt(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},De.forEach(["delete","get","head","options"],function(e){k.prototype[e]=function(l,t){return this.request(D(t||{},{method:e,url:l,data:(t||{}).data}))}}),De.forEach(["post","put","patch"],function(e){k.prototype[e]=function(l,t,i){return this.request(D(i||{},{method:e,url:l,data:t}))}});var yt=k,Gt=M;function L(c){if(typeof c!="function")throw new TypeError("executor must be a function.");var e;this.promise=new Promise(function(i){e=i});var l=this;this.promise.then(function(t){if(!!l._listeners){var i,d=l._listeners.length;for(i=0;i<d;i++)l._listeners[i](t);l._listeners=null}}),this.promise.then=function(t){var i,d=new Promise(function(n){l.subscribe(n),i=n}).then(t);return d.cancel=function(){l.unsubscribe(i)},d},c(function(i){l.reason||(l.reason=new Gt(i),e(l.reason))})}L.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},L.prototype.subscribe=function(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]},L.prototype.unsubscribe=function(e){if(!!this._listeners){var l=this._listeners.indexOf(e);l!==-1&&this._listeners.splice(l,1)}},L.source=function(){var e,l=new L(function(i){e=i});return{token:l,cancel:e}};var Wt=L,Vt=function(e){return function(t){return e.apply(null,t)}},Rt=b,ft=function(e){return Rt.isObject(e)&&e.isAxiosError===!0},qe=b,Jt=ze,A=yt,Yt=je,It=O;function el(c){var e=new A(c),l=Jt(A.prototype.request,e);return qe.extend(l,A.prototype,e),qe.extend(l,e),l.create=function(i){return el(Yt(c,i))},l}var y=el(It);y.Axios=A,y.Cancel=M,y.CancelToken=Wt,y.isCancel=Qe,y.VERSION=Ee.version,y.all=function(e){return Promise.all(e)},y.spread=Vt,y.isAxiosError=ft,Ne.exports=y,Ne.exports.default=y;function Kt(){return globalThis._vonageMediaProcessorMetadata}for(var St=[],he=0;he<256;++he)St.push((he+256).toString(16).substr(1));const R=new WeakMap,_=new WeakMap,x=new WeakMap,Xe=Symbol("anyProducer"),ll=Promise.resolve(),$=Symbol("listenerAdded"),q=Symbol("listenerRemoved");let ye=!1;function N(c){if(typeof c!="string"&&typeof c!="symbol")throw new TypeError("eventName must be a string or a symbol")}function ee(c){if(typeof c!="function")throw new TypeError("listener must be a function")}function z(c,e){const l=_.get(c);return l.has(e)||l.set(e,new Set),l.get(e)}function C(c,e){const l=typeof e=="string"||typeof e=="symbol"?e:Xe,t=x.get(c);return t.has(l)||t.set(l,new Set),t.get(l)}function Ht(c,e,l){const t=x.get(c);if(t.has(e))for(const i of t.get(e))i.enqueue(l);if(t.has(Xe)){const i=Promise.all([e,l]);for(const d of t.get(Xe))d.enqueue(i)}}function tl(c,e){e=Array.isArray(e)?e:[e];let l=!1,t=()=>{},i=[];const d={enqueue(n){i.push(n),t()},finish(){l=!0,t()}};for(const n of e)C(c,n).add(d);return{async next(){return i?i.length===0?l?(i=void 0,this.next()):(await new Promise(n=>{t=n}),this.next()):{done:!1,value:await i.shift()}:{done:!0}},async return(n){i=void 0;for(const s of e)C(c,s).delete(d);return t(),arguments.length>0?{done:!0,value:await n}:{done:!0}},[Symbol.asyncIterator](){return this}}}function cl(c){if(c===void 0)return il;if(!Array.isArray(c))throw new TypeError("`methodNames` must be an array of strings");for(const e of c)if(!il.includes(e))throw typeof e!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${e} is not Emittery method`);return c}const Ge=c=>c===$||c===q;class F{static mixin(e,l){return l=cl(l),t=>{if(typeof t!="function")throw new TypeError("`target` must be function");for(const n of l)if(t.prototype[n]!==void 0)throw new Error(`The property \`${n}\` already exists on \`target\``);function i(){return Object.defineProperty(this,e,{enumerable:!1,value:new F}),this[e]}Object.defineProperty(t.prototype,e,{enumerable:!1,get:i});const d=n=>function(...s){return this[e][n](...s)};for(const n of l)Object.defineProperty(t.prototype,n,{enumerable:!1,value:d(n)});return t}}static get isDebugEnabled(){if(typeof process!="object")return ye;const{env:e}=process||{env:{}};return e.DEBUG==="emittery"||e.DEBUG==="*"||ye}static set isDebugEnabled(e){ye=e}constructor(e={}){R.set(this,new Set),_.set(this,new Map),x.set(this,new Map),this.debug=e.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(l,t,i,d)=>{d=JSON.stringify(d),typeof i=="symbol"&&(i=i.toString());const n=new Date,s=`${n.getHours()}:${n.getMinutes()}:${n.getSeconds()}.${n.getMilliseconds()}`;console.log(`[${s}][emittery:${l}][${t}] Event Name: ${i}
|
|
3
|
+
data: ${d}`)})}logIfDebugEnabled(e,l,t){(F.isDebugEnabled||this.debug.enabled)&&this.debug.logger(e,this.debug.name,l,t)}on(e,l){ee(l),e=Array.isArray(e)?e:[e];for(const t of e)N(t),z(this,t).add(l),this.logIfDebugEnabled("subscribe",t,void 0),Ge(t)||this.emit($,{eventName:t,listener:l});return this.off.bind(this,e,l)}off(e,l){ee(l),e=Array.isArray(e)?e:[e];for(const t of e)N(t),z(this,t).delete(l),this.logIfDebugEnabled("unsubscribe",t,void 0),Ge(t)||this.emit(q,{eventName:t,listener:l})}once(e){return new Promise(l=>{const t=this.on(e,i=>{t(),l(i)})})}events(e){e=Array.isArray(e)?e:[e];for(const l of e)N(l);return tl(this,e)}async emit(e,l){N(e),this.logIfDebugEnabled("emit",e,l),Ht(this,e,l);const t=z(this,e),i=R.get(this),d=[...t],n=Ge(e)?[]:[...i];await ll,await Promise.all([...d.map(async s=>{if(t.has(s))return s(l)}),...n.map(async s=>{if(i.has(s))return s(e,l)})])}async emitSerial(e,l){N(e),this.logIfDebugEnabled("emitSerial",e,l);const t=z(this,e),i=R.get(this),d=[...t],n=[...i];await ll;for(const s of d)t.has(s)&&await s(l);for(const s of n)i.has(s)&&await s(e,l)}onAny(e){return ee(e),this.logIfDebugEnabled("subscribeAny",void 0,void 0),R.get(this).add(e),this.emit($,{listener:e}),this.offAny.bind(this,e)}anyEvent(){return tl(this)}offAny(e){ee(e),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(q,{listener:e}),R.get(this).delete(e)}clearListeners(e){e=Array.isArray(e)?e:[e];for(const l of e)if(this.logIfDebugEnabled("clear",l,void 0),typeof l=="string"||typeof l=="symbol"){z(this,l).clear();const t=C(this,l);for(const i of t)i.finish();t.clear()}else{R.get(this).clear();for(const t of _.get(this).values())t.clear();for(const t of x.get(this).values()){for(const i of t)i.finish();t.clear()}}}listenerCount(e){e=Array.isArray(e)?e:[e];let l=0;for(const t of e){if(typeof t=="string"){l+=R.get(this).size+z(this,t).size+C(this,t).size+C(this).size;continue}typeof t!="undefined"&&N(t),l+=R.get(this).size;for(const i of _.get(this).values())l+=i.size;for(const i of x.get(this).values())l+=i.size}return l}bindMethods(e,l){if(typeof e!="object"||e===null)throw new TypeError("`target` must be an object");l=cl(l);for(const t of l){if(e[t]!==void 0)throw new Error(`The property \`${t}\` already exists on \`target\``);Object.defineProperty(e,t,{enumerable:!1,value:this[t].bind(this)})}}}const il=Object.getOwnPropertyNames(F.prototype).filter(c=>c!=="constructor");Object.defineProperty(F,"listenerAdded",{value:$,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(F,"listenerRemoved",{value:q,writable:!1,enumerable:!0,configurable:!1});var nl;(function(c){c.FPS_DROP="fps_drop"})(nl||(nl={}));class Lt{constructor(){this.processor_=null,this.generator_=null}init(e){return new Promise((l,t)=>{try{this.processor_=new MediaStreamTrackProcessor(e)}catch(i){console.log(`[InsertableStreamHelper] MediaStreamTrackProcessor failed: ${i}`),t(i)}try{e.kind==="audio"?this.generator_=new MediaStreamTrackGenerator({kind:"audio"}):e.kind==="video"?this.generator_=new MediaStreamTrackGenerator({kind:"video"}):t("kind not supported")}catch(i){console.log(`[InsertableStreamHelper] MediaStreamTrackGenerator failed: ${i}`),t(i)}l()})}getReadable(){return this.processor_.readable}getWriteable(){return this.generator_.writable}getProccesorTrack(){return this.generator_}}class Nt{constructor(e){this.insertableStreamHelper_=new Lt,this.mediaProcessor_=e}setTrack(e){return new Promise((l,t)=>{this.insertableStreamHelper_.init(e).then(()=>{this.mediaProcessor_.transform(this.insertableStreamHelper_.getReadable(),this.insertableStreamHelper_.getWriteable()).then(()=>{l(this.insertableStreamHelper_.getProccesorTrack())}).catch(i=>{t(i)})}).catch(i=>{t(i)})})}destroy(){return new Promise((e,l)=>{this.mediaProcessor_?this.mediaProcessor_.destroy().then(()=>{e()}).catch(t=>{l(t)}):l("no processor")})}}const dl="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2NsYXNzIFB7fVAudXBkYXRlcz17dHJhbnNmb3JtZXJfbmV3OiJOZXcgdHJhbnNmb3JtZXIiLHRyYW5zZm9ybWVyX251bGw6Ik51bGwgdHJhbnNmb3JtZXIifSxQLmVycm9ycz17dHJhbnNmb3JtZXJfbm9uZToiTm8gdHJhbnNmb3JtZXJzIHByb3ZpZGVkIix0cmFuc2Zvcm1lcl9zdGFydDoiQ2Fubm90IHN0YXJ0IHRyYW5zZm9ybWVyIix0cmFuc2Zvcm1lcl90cmFuc2Zvcm06IkNhbm5vdCB0cmFuc2Zvcm0gZnJhbWUiLHRyYW5zZm9ybWVyX2ZsdXNoOiJDYW5ub3QgZmx1c2ggdHJhbnNmb3JtZXIiLHJlYWRhYmxlX251bGw6IlJlYWRhYmxlIGlzIG51bGwiLHdyaXRhYmxlX251bGw6IldyaXRhYmxlIGlzIG51bGwifTt2YXIgZWU9e2V4cG9ydHM6e319LEVlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBuPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxvPTA7bzxuLmxlbmd0aDtvKyspbltvXT1hcmd1bWVudHNbb107cmV0dXJuIGUuYXBwbHkodCxuKX19LHJ0PUVlLFI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiB0ZShyKXtyZXR1cm4gQXJyYXkuaXNBcnJheShyKX1mdW5jdGlvbiByZShyKXtyZXR1cm4gdHlwZW9mIHI9PSJ1bmRlZmluZWQifWZ1bmN0aW9uIHN0KHIpe3JldHVybiByIT09bnVsbCYmIXJlKHIpJiZyLmNvbnN0cnVjdG9yIT09bnVsbCYmIXJlKHIuY29uc3RydWN0b3IpJiZ0eXBlb2Ygci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcj09ImZ1bmN0aW9uIiYmci5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihyKX1mdW5jdGlvbiBUZShyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgQXJyYXlCdWZmZXJdIn1mdW5jdGlvbiBudChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgRm9ybURhdGFdIn1mdW5jdGlvbiBpdChyKXt2YXIgZTtyZXR1cm4gdHlwZW9mIEFycmF5QnVmZmVyIT0idW5kZWZpbmVkIiYmQXJyYXlCdWZmZXIuaXNWaWV3P2U9QXJyYXlCdWZmZXIuaXNWaWV3KHIpOmU9ciYmci5idWZmZXImJlRlKHIuYnVmZmVyKSxlfWZ1bmN0aW9uIG90KHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyJ9ZnVuY3Rpb24gYXQocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIn1mdW5jdGlvbiBQZShyKXtyZXR1cm4gciE9PW51bGwmJnR5cGVvZiByPT0ib2JqZWN0In1mdW5jdGlvbiBEKHIpe2lmKFIuY2FsbChyKSE9PSJbb2JqZWN0IE9iamVjdF0iKXJldHVybiExO3ZhciBlPU9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtyZXR1cm4gZT09PW51bGx8fGU9PT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIHV0KHIpe3JldHVybiBSLmNhbGwocik9PT0iW29iamVjdCBEYXRlXSJ9ZnVuY3Rpb24gbHQocil7cmV0dXJuIFIuY2FsbChyKT09PSJbb2JqZWN0IEZpbGVdIn1mdW5jdGlvbiBjdChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgQmxvYl0ifWZ1bmN0aW9uIFJlKHIpe3JldHVybiBSLmNhbGwocik9PT0iW29iamVjdCBGdW5jdGlvbl0ifWZ1bmN0aW9uIGZ0KHIpe3JldHVybiBQZShyKSYmUmUoci5waXBlKX1mdW5jdGlvbiBodChyKXtyZXR1cm4gUi5jYWxsKHIpPT09IltvYmplY3QgVVJMU2VhcmNoUGFyYW1zXSJ9ZnVuY3Rpb24gZHQocil7cmV0dXJuIHIudHJpbT9yLnRyaW0oKTpyLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX1mdW5jdGlvbiBwdCgpe3JldHVybiB0eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmKG5hdmlnYXRvci5wcm9kdWN0PT09IlJlYWN0TmF0aXZlInx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTmF0aXZlU2NyaXB0Inx8bmF2aWdhdG9yLnByb2R1Y3Q9PT0iTlMiKT8hMTp0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmdHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIn1mdW5jdGlvbiBzZShyLGUpe2lmKCEocj09PW51bGx8fHR5cGVvZiByPT0idW5kZWZpbmVkIikpaWYodHlwZW9mIHIhPSJvYmplY3QiJiYocj1bcl0pLHRlKHIpKWZvcih2YXIgdD0wLHM9ci5sZW5ndGg7dDxzO3QrKyllLmNhbGwobnVsbCxyW3RdLHQscik7ZWxzZSBmb3IodmFyIG4gaW4gcilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocixuKSYmZS5jYWxsKG51bGwscltuXSxuLHIpfWZ1bmN0aW9uIG5lKCl7dmFyIHI9e307ZnVuY3Rpb24gZShuLG8pe0QocltvXSkmJkQobik/cltvXT1uZShyW29dLG4pOkQobik/cltvXT1uZSh7fSxuKTp0ZShuKT9yW29dPW4uc2xpY2UoKTpyW29dPW59Zm9yKHZhciB0PTAscz1hcmd1bWVudHMubGVuZ3RoO3Q8czt0Kyspc2UoYXJndW1lbnRzW3RdLGUpO3JldHVybiByfWZ1bmN0aW9uIG10KHIsZSx0KXtyZXR1cm4gc2UoZSxmdW5jdGlvbihuLG8pe3QmJnR5cGVvZiBuPT0iZnVuY3Rpb24iP3Jbb109cnQobix0KTpyW29dPW59KSxyfWZ1bmN0aW9uIGd0KHIpe3JldHVybiByLmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKHI9ci5zbGljZSgxKSkscn12YXIgcD17aXNBcnJheTp0ZSxpc0FycmF5QnVmZmVyOlRlLGlzQnVmZmVyOnN0LGlzRm9ybURhdGE6bnQsaXNBcnJheUJ1ZmZlclZpZXc6aXQsaXNTdHJpbmc6b3QsaXNOdW1iZXI6YXQsaXNPYmplY3Q6UGUsaXNQbGFpbk9iamVjdDpELGlzVW5kZWZpbmVkOnJlLGlzRGF0ZTp1dCxpc0ZpbGU6bHQsaXNCbG9iOmN0LGlzRnVuY3Rpb246UmUsaXNTdHJlYW06ZnQsaXNVUkxTZWFyY2hQYXJhbXM6aHQsaXNTdGFuZGFyZEJyb3dzZXJFbnY6cHQsZm9yRWFjaDpzZSxtZXJnZTpuZSxleHRlbmQ6bXQsdHJpbTpkdCxzdHJpcEJPTTpndH0sST1wO2Z1bmN0aW9uIFNlKHIpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQocikucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjAvZywiKyIpLnJlcGxhY2UoLyU1Qi9naSwiWyIpLnJlcGxhY2UoLyU1RC9naSwiXSIpfXZhciBDZT1mdW5jdGlvbihlLHQscyl7aWYoIXQpcmV0dXJuIGU7dmFyIG47aWYocyluPXModCk7ZWxzZSBpZihJLmlzVVJMU2VhcmNoUGFyYW1zKHQpKW49dC50b1N0cmluZygpO2Vsc2V7dmFyIG89W107SS5mb3JFYWNoKHQsZnVuY3Rpb24obCxtKXtsPT09bnVsbHx8dHlwZW9mIGw9PSJ1bmRlZmluZWQifHwoSS5pc0FycmF5KGwpP209bSsiW10iOmw9W2xdLEkuZm9yRWFjaChsLGZ1bmN0aW9uKGYpe0kuaXNEYXRlKGYpP2Y9Zi50b0lTT1N0cmluZygpOkkuaXNPYmplY3QoZikmJihmPUpTT04uc3RyaW5naWZ5KGYpKSxvLnB1c2goU2UobSkrIj0iK1NlKGYpKX0pKX0pLG49by5qb2luKCImIil9aWYobil7dmFyIGk9ZS5pbmRleE9mKCIjIik7aSE9PS0xJiYoZT1lLnNsaWNlKDAsaSkpLGUrPShlLmluZGV4T2YoIj8iKT09PS0xPyI/IjoiJiIpK259cmV0dXJuIGV9LHl0PXA7ZnVuY3Rpb24gcSgpe3RoaXMuaGFuZGxlcnM9W119cS5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUsdCxzKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0LHN5bmNocm9ub3VzOnM/cy5zeW5jaHJvbm91czohMSxydW5XaGVuOnM/cy5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfSxxLnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0scS5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXt5dC5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsZnVuY3Rpb24ocyl7cyE9PW51bGwmJmUocyl9KX07dmFyIF90PXEsYnQ9cCx3dD1mdW5jdGlvbihlLHQpe2J0LmZvckVhY2goZSxmdW5jdGlvbihuLG8pe28hPT10JiZvLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPW4sZGVsZXRlIGVbb10pfSl9LE9lPWZ1bmN0aW9uKGUsdCxzLG4sbyl7cmV0dXJuIGUuY29uZmlnPXQscyYmKGUuY29kZT1zKSxlLnJlcXVlc3Q9bixlLnJlc3BvbnNlPW8sZS5pc0F4aW9zRXJyb3I9ITAsZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6dGhpcy5jb25maWcsY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMucmVzcG9uc2UmJnRoaXMucmVzcG9uc2Uuc3RhdHVzP3RoaXMucmVzcG9uc2Uuc3RhdHVzOm51bGx9fSxlfSx2dD1PZSxJZT1mdW5jdGlvbihlLHQscyxuLG8pe3ZhciBpPW5ldyBFcnJvcihlKTtyZXR1cm4gdnQoaSx0LHMsbixvKX0sRXQ9SWUsVHQ9ZnVuY3Rpb24oZSx0LHMpe3ZhciBuPXMuY29uZmlnLnZhbGlkYXRlU3RhdHVzOyFzLnN0YXR1c3x8IW58fG4ocy5zdGF0dXMpP2Uocyk6dChFdCgiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK3Muc3RhdHVzLHMuY29uZmlnLG51bGwscy5yZXF1ZXN0LHMpKX0sSD1wLFB0PUguaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3JldHVybnt3cml0ZTpmdW5jdGlvbih0LHMsbixvLGksYSl7dmFyIGw9W107bC5wdXNoKHQrIj0iK2VuY29kZVVSSUNvbXBvbmVudChzKSksSC5pc051bWJlcihuKSYmbC5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUobikudG9HTVRTdHJpbmcoKSksSC5pc1N0cmluZyhvKSYmbC5wdXNoKCJwYXRoPSIrbyksSC5pc1N0cmluZyhpKSYmbC5wdXNoKCJkb21haW49IitpKSxhPT09ITAmJmwucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPWwuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbih0KXt2YXIgcz1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrdCsiKT0oW147XSopIikpO3JldHVybiBzP2RlY29kZVVSSUNvbXBvbmVudChzWzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy53cml0ZSh0LCIiLERhdGUubm93KCktODY0ZTUpfX19KCk6ZnVuY3Rpb24oKXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24oKXt9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scmVtb3ZlOmZ1bmN0aW9uKCl7fX19KCksUnQ9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChlKX0sU3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sQ3Q9UnQsT3Q9U3QsSXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmIUN0KHQpP090KGUsdCk6dH0saWU9cCx4dD1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLE10PWZ1bmN0aW9uKGUpe3ZhciB0PXt9LHMsbixvO3JldHVybiBlJiZpZS5mb3JFYWNoKGUuc3BsaXQoYApgKSxmdW5jdGlvbihhKXtpZihvPWEuaW5kZXhPZigiOiIpLHM9aWUudHJpbShhLnN1YnN0cigwLG8pKS50b0xvd2VyQ2FzZSgpLG49aWUudHJpbShhLnN1YnN0cihvKzEpKSxzKXtpZih0W3NdJiZ4dC5pbmRleE9mKHMpPj0wKXJldHVybjtzPT09InNldC1jb29raWUiP3Rbc109KHRbc10/dFtzXTpbXSkuY29uY2F0KFtuXSk6dFtzXT10W3NdP3Rbc10rIiwgIituOm59fSksdH0seGU9cCxBdD14ZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGU9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSx0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSxzO2Z1bmN0aW9uIG4obyl7dmFyIGk9bztyZXR1cm4gZSYmKHQuc2V0QXR0cmlidXRlKCJocmVmIixpKSxpPXQuaHJlZiksdC5zZXRBdHRyaWJ1dGUoImhyZWYiLGkpLHtocmVmOnQuaHJlZixwcm90b2NvbDp0LnByb3RvY29sP3QucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnQuaG9zdCxzZWFyY2g6dC5zZWFyY2g/dC5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDp0Lmhhc2g/dC5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6dC5ob3N0bmFtZSxwb3J0OnQucG9ydCxwYXRobmFtZTp0LnBhdGhuYW1lLmNoYXJBdCgwKT09PSIvIj90LnBhdGhuYW1lOiIvIit0LnBhdGhuYW1lfX1yZXR1cm4gcz1uKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbihpKXt2YXIgYT14ZS5pc1N0cmluZyhpKT9uKGkpOmk7cmV0dXJuIGEucHJvdG9jb2w9PT1zLnByb3RvY29sJiZhLmhvc3Q9PT1zLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuITB9fSgpO2Z1bmN0aW9uIG9lKHIpe3RoaXMubWVzc2FnZT1yfW9lLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSxvZS5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgaj1vZSxKPXAsa3Q9VHQsTnQ9UHQsVXQ9Q2UsQnQ9SXQsJHQ9TXQsTHQ9QXQsYWU9SWUsRnQ9VyxEdD1qLE1lPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihzLG4pe3ZhciBvPWUuZGF0YSxpPWUuaGVhZGVycyxhPWUucmVzcG9uc2VUeXBlLGw7ZnVuY3Rpb24gbSgpe2UuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUobCksZS5zaWduYWwmJmUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixsKX1KLmlzRm9ybURhdGEobykmJmRlbGV0ZSBpWyJDb250ZW50LVR5cGUiXTt2YXIgdT1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoZS5hdXRoKXt2YXIgZj1lLmF1dGgudXNlcm5hbWV8fCIiLFQ9ZS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlLmF1dGgucGFzc3dvcmQpKToiIjtpLkF1dGhvcml6YXRpb249IkJhc2ljICIrYnRvYShmKyI6IitUKX12YXIgZz1CdChlLmJhc2VVUkwsZS51cmwpO3Uub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLFV0KGcsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKSwhMCksdS50aW1lb3V0PWUudGltZW91dDtmdW5jdGlvbiBldCgpe2lmKCEhdSl7dmFyIHY9ImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiB1PyR0KHUuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOm51bGwsQj0hYXx8YT09PSJ0ZXh0Inx8YT09PSJqc29uIj91LnJlc3BvbnNlVGV4dDp1LnJlc3BvbnNlLE89e2RhdGE6QixzdGF0dXM6dS5zdGF0dXMsc3RhdHVzVGV4dDp1LnN0YXR1c1RleHQsaGVhZGVyczp2LGNvbmZpZzplLHJlcXVlc3Q6dX07a3QoZnVuY3Rpb24odmUpe3ModmUpLG0oKX0sZnVuY3Rpb24odmUpe24odmUpLG0oKX0sTyksdT1udWxsfX1pZigib25sb2FkZW5kImluIHU/dS5vbmxvYWRlbmQ9ZXQ6dS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshdXx8dS5yZWFkeVN0YXRlIT09NHx8dS5zdGF0dXM9PT0wJiYhKHUucmVzcG9uc2VVUkwmJnUucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKT09PTApfHxzZXRUaW1lb3V0KGV0KX0sdS5vbmFib3J0PWZ1bmN0aW9uKCl7IXV8fChuKGFlKCJSZXF1ZXN0IGFib3J0ZWQiLGUsIkVDT05OQUJPUlRFRCIsdSkpLHU9bnVsbCl9LHUub25lcnJvcj1mdW5jdGlvbigpe24oYWUoIk5ldHdvcmsgRXJyb3IiLGUsbnVsbCx1KSksdT1udWxsfSx1Lm9udGltZW91dD1mdW5jdGlvbigpe3ZhciBCPWUudGltZW91dD8idGltZW91dCBvZiAiK2UudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixPPWUudHJhbnNpdGlvbmFsfHxGdC50cmFuc2l0aW9uYWw7ZS50aW1lb3V0RXJyb3JNZXNzYWdlJiYoQj1lLnRpbWVvdXRFcnJvck1lc3NhZ2UpLG4oYWUoQixlLE8uY2xhcmlmeVRpbWVvdXRFcnJvcj8iRVRJTUVET1VUIjoiRUNPTk5BQk9SVEVEIix1KSksdT1udWxsfSxKLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpe3ZhciB0dD0oZS53aXRoQ3JlZGVudGlhbHN8fEx0KGcpKSYmZS54c3JmQ29va2llTmFtZT9OdC5yZWFkKGUueHNyZkNvb2tpZU5hbWUpOnZvaWQgMDt0dCYmKGlbZS54c3JmSGVhZGVyTmFtZV09dHQpfSJzZXRSZXF1ZXN0SGVhZGVyImluIHUmJkouZm9yRWFjaChpLGZ1bmN0aW9uKEIsTyl7dHlwZW9mIG89PSJ1bmRlZmluZWQiJiZPLnRvTG93ZXJDYXNlKCk9PT0iY29udGVudC10eXBlIj9kZWxldGUgaVtPXTp1LnNldFJlcXVlc3RIZWFkZXIoTyxCKX0pLEouaXNVbmRlZmluZWQoZS53aXRoQ3JlZGVudGlhbHMpfHwodS53aXRoQ3JlZGVudGlhbHM9ISFlLndpdGhDcmVkZW50aWFscyksYSYmYSE9PSJqc29uIiYmKHUucmVzcG9uc2VUeXBlPWUucmVzcG9uc2VUeXBlKSx0eXBlb2YgZS5vbkRvd25sb2FkUHJvZ3Jlc3M9PSJmdW5jdGlvbiImJnUuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25Eb3dubG9hZFByb2dyZXNzKSx0eXBlb2YgZS5vblVwbG9hZFByb2dyZXNzPT0iZnVuY3Rpb24iJiZ1LnVwbG9hZCYmdS51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25VcGxvYWRQcm9ncmVzcyksKGUuY2FuY2VsVG9rZW58fGUuc2lnbmFsKSYmKGw9ZnVuY3Rpb24odil7IXV8fChuKCF2fHx2JiZ2LnR5cGU/bmV3IER0KCJjYW5jZWxlZCIpOnYpLHUuYWJvcnQoKSx1PW51bGwpfSxlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnN1YnNjcmliZShsKSxlLnNpZ25hbCYmKGUuc2lnbmFsLmFib3J0ZWQ/bCgpOmUuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixsKSkpLG98fChvPW51bGwpLHUuc2VuZChvKX0pfSxoPXAsQWU9d3QscXQ9T2UsSHQ9eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifTtmdW5jdGlvbiBrZShyLGUpeyFoLmlzVW5kZWZpbmVkKHIpJiZoLmlzVW5kZWZpbmVkKHJbIkNvbnRlbnQtVHlwZSJdKSYmKHJbIkNvbnRlbnQtVHlwZSJdPWUpfWZ1bmN0aW9uIGp0KCl7dmFyIHI7cmV0dXJuKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCE9InVuZGVmaW5lZCJ8fHR5cGVvZiBwcm9jZXNzIT0idW5kZWZpbmVkIiYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHByb2Nlc3MpPT09IltvYmplY3QgcHJvY2Vzc10iKSYmKHI9TWUpLHJ9ZnVuY3Rpb24gSnQocixlLHQpe2lmKGguaXNTdHJpbmcocikpdHJ5e3JldHVybihlfHxKU09OLnBhcnNlKShyKSxoLnRyaW0ocil9Y2F0Y2gocyl7aWYocy5uYW1lIT09IlN5bnRheEVycm9yIil0aHJvdyBzfXJldHVybih0fHxKU09OLnN0cmluZ2lmeSkocil9dmFyIFY9e3RyYW5zaXRpb25hbDp7c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMX0sYWRhcHRlcjpqdCgpLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7cmV0dXJuIEFlKHQsIkFjY2VwdCIpLEFlKHQsIkNvbnRlbnQtVHlwZSIpLGguaXNGb3JtRGF0YShlKXx8aC5pc0FycmF5QnVmZmVyKGUpfHxoLmlzQnVmZmVyKGUpfHxoLmlzU3RyZWFtKGUpfHxoLmlzRmlsZShlKXx8aC5pc0Jsb2IoZSk/ZTpoLmlzQXJyYXlCdWZmZXJWaWV3KGUpP2UuYnVmZmVyOmguaXNVUkxTZWFyY2hQYXJhbXMoZSk/KGtlKHQsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiksZS50b1N0cmluZygpKTpoLmlzT2JqZWN0KGUpfHx0JiZ0WyJDb250ZW50LVR5cGUiXT09PSJhcHBsaWNhdGlvbi9qc29uIj8oa2UodCwiYXBwbGljYXRpb24vanNvbiIpLEp0KGUpKTplfV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKGUpe3ZhciB0PXRoaXMudHJhbnNpdGlvbmFsfHxWLnRyYW5zaXRpb25hbCxzPXQmJnQuc2lsZW50SlNPTlBhcnNpbmcsbj10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLG89IXMmJnRoaXMucmVzcG9uc2VUeXBlPT09Impzb24iO2lmKG98fG4mJmguaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChpKXtpZihvKXRocm93IGkubmFtZT09PSJTeW50YXhFcnJvciI/cXQoaSx0aGlzLCJFX0pTT05fUEFSU0UiKTppfXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX19O2guZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSxmdW5jdGlvbihlKXtWLmhlYWRlcnNbZV09e319KSxoLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSxmdW5jdGlvbihlKXtWLmhlYWRlcnNbZV09aC5tZXJnZShIdCl9KTt2YXIgVz1WLFZ0PXAsV3Q9VyxHdD1mdW5jdGlvbihlLHQscyl7dmFyIG49dGhpc3x8V3Q7cmV0dXJuIFZ0LmZvckVhY2gocyxmdW5jdGlvbihpKXtlPWkuY2FsbChuLGUsdCl9KSxlfSxOZT1mdW5jdGlvbihlKXtyZXR1cm4hIShlJiZlLl9fQ0FOQ0VMX18pfSxVZT1wLHVlPUd0LHp0PU5lLFF0PVcsWHQ9ajtmdW5jdGlvbiBsZShyKXtpZihyLmNhbmNlbFRva2VuJiZyLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKSxyLnNpZ25hbCYmci5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgWHQoImNhbmNlbGVkIil9dmFyIEt0PWZ1bmN0aW9uKGUpe2xlKGUpLGUuaGVhZGVycz1lLmhlYWRlcnN8fHt9LGUuZGF0YT11ZS5jYWxsKGUsZS5kYXRhLGUuaGVhZGVycyxlLnRyYW5zZm9ybVJlcXVlc3QpLGUuaGVhZGVycz1VZS5tZXJnZShlLmhlYWRlcnMuY29tbW9ufHx7fSxlLmhlYWRlcnNbZS5tZXRob2RdfHx7fSxlLmhlYWRlcnMpLFVlLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwiY29tbW9uIl0sZnVuY3Rpb24obil7ZGVsZXRlIGUuaGVhZGVyc1tuXX0pO3ZhciB0PWUuYWRhcHRlcnx8UXQuYWRhcHRlcjtyZXR1cm4gdChlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiBsZShlKSxuLmRhdGE9dWUuY2FsbChlLG4uZGF0YSxuLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSksbn0sZnVuY3Rpb24obil7cmV0dXJuIHp0KG4pfHwobGUoZSksbiYmbi5yZXNwb25zZSYmKG4ucmVzcG9uc2UuZGF0YT11ZS5jYWxsKGUsbi5yZXNwb25zZS5kYXRhLG4ucmVzcG9uc2UuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSkpLFByb21pc2UucmVqZWN0KG4pfSl9LHk9cCxCZT1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIHM9e307ZnVuY3Rpb24gbih1LGYpe3JldHVybiB5LmlzUGxhaW5PYmplY3QodSkmJnkuaXNQbGFpbk9iamVjdChmKT95Lm1lcmdlKHUsZik6eS5pc1BsYWluT2JqZWN0KGYpP3kubWVyZ2Uoe30sZik6eS5pc0FycmF5KGYpP2Yuc2xpY2UoKTpmfWZ1bmN0aW9uIG8odSl7aWYoeS5pc1VuZGVmaW5lZCh0W3VdKSl7aWYoIXkuaXNVbmRlZmluZWQoZVt1XSkpcmV0dXJuIG4odm9pZCAwLGVbdV0pfWVsc2UgcmV0dXJuIG4oZVt1XSx0W3VdKX1mdW5jdGlvbiBpKHUpe2lmKCF5LmlzVW5kZWZpbmVkKHRbdV0pKXJldHVybiBuKHZvaWQgMCx0W3VdKX1mdW5jdGlvbiBhKHUpe2lmKHkuaXNVbmRlZmluZWQodFt1XSkpe2lmKCF5LmlzVW5kZWZpbmVkKGVbdV0pKXJldHVybiBuKHZvaWQgMCxlW3VdKX1lbHNlIHJldHVybiBuKHZvaWQgMCx0W3VdKX1mdW5jdGlvbiBsKHUpe2lmKHUgaW4gdClyZXR1cm4gbihlW3VdLHRbdV0pO2lmKHUgaW4gZSlyZXR1cm4gbih2b2lkIDAsZVt1XSl9dmFyIG09e3VybDppLG1ldGhvZDppLGRhdGE6aSxiYXNlVVJMOmEsdHJhbnNmb3JtUmVxdWVzdDphLHRyYW5zZm9ybVJlc3BvbnNlOmEscGFyYW1zU2VyaWFsaXplcjphLHRpbWVvdXQ6YSx0aW1lb3V0TWVzc2FnZTphLHdpdGhDcmVkZW50aWFsczphLGFkYXB0ZXI6YSxyZXNwb25zZVR5cGU6YSx4c3JmQ29va2llTmFtZTphLHhzcmZIZWFkZXJOYW1lOmEsb25VcGxvYWRQcm9ncmVzczphLG9uRG93bmxvYWRQcm9ncmVzczphLGRlY29tcHJlc3M6YSxtYXhDb250ZW50TGVuZ3RoOmEsbWF4Qm9keUxlbmd0aDphLHRyYW5zcG9ydDphLGh0dHBBZ2VudDphLGh0dHBzQWdlbnQ6YSxjYW5jZWxUb2tlbjphLHNvY2tldFBhdGg6YSxyZXNwb25zZUVuY29kaW5nOmEsdmFsaWRhdGVTdGF0dXM6bH07cmV0dXJuIHkuZm9yRWFjaChPYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0LmtleXModCkpLGZ1bmN0aW9uKGYpe3ZhciBUPW1bZl18fG8sZz1UKGYpO3kuaXNVbmRlZmluZWQoZykmJlQhPT1sfHwoc1tmXT1nKX0pLHN9LCRlPXt2ZXJzaW9uOiIwLjI1LjAifSxZdD0kZS52ZXJzaW9uLGNlPXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaChmdW5jdGlvbihyLGUpe2NlW3JdPWZ1bmN0aW9uKHMpe3JldHVybiB0eXBlb2Ygcz09PXJ8fCJhIisoZTwxPyJuICI6IiAiKStyfX0pO3ZhciBMZT17fTtjZS50cmFuc2l0aW9uYWw9ZnVuY3Rpb24oZSx0LHMpe2Z1bmN0aW9uIG4obyxpKXtyZXR1cm4iW0F4aW9zIHYiK1l0KyJdIFRyYW5zaXRpb25hbCBvcHRpb24gJyIrbysiJyIraSsocz8iLiAiK3M6IiIpfXJldHVybiBmdW5jdGlvbihvLGksYSl7aWYoZT09PSExKXRocm93IG5ldyBFcnJvcihuKGksIiBoYXMgYmVlbiByZW1vdmVkIisodD8iIGluICIrdDoiIikpKTtyZXR1cm4gdCYmIUxlW2ldJiYoTGVbaV09ITAsY29uc29sZS53YXJuKG4oaSwiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdiIrdCsiIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlIikpKSxlP2UobyxpLGEpOiEwfX07ZnVuY3Rpb24gWnQocixlLHQpe2lmKHR5cGVvZiByIT0ib2JqZWN0Iil0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Zm9yKHZhciBzPU9iamVjdC5rZXlzKHIpLG49cy5sZW5ndGg7bi0tID4wOyl7dmFyIG89c1tuXSxpPWVbb107aWYoaSl7dmFyIGE9cltvXSxsPWE9PT12b2lkIDB8fGkoYSxvLHIpO2lmKGwhPT0hMCl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb24gIitvKyIgbXVzdCBiZSAiK2wpO2NvbnRpbnVlfWlmKHQhPT0hMCl0aHJvdyBFcnJvcigiVW5rbm93biBvcHRpb24gIitvKX19dmFyIGVyPXthc3NlcnRPcHRpb25zOlp0LHZhbGlkYXRvcnM6Y2V9LEZlPXAsdHI9Q2UsRGU9X3QscWU9S3QsRz1CZSxIZT1lcix4PUhlLnZhbGlkYXRvcnM7ZnVuY3Rpb24gJChyKXt0aGlzLmRlZmF1bHRzPXIsdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IERlLHJlc3BvbnNlOm5ldyBEZX19JC5wcm90b3R5cGUucmVxdWVzdD1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIj8odD10fHx7fSx0LnVybD1lKTp0PWV8fHt9LCF0LnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7dD1HKHRoaXMuZGVmYXVsdHMsdCksdC5tZXRob2Q/dC5tZXRob2Q9dC5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD90Lm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnQubWV0aG9kPSJnZXQiO3ZhciBzPXQudHJhbnNpdGlvbmFsO3MhPT12b2lkIDAmJkhlLmFzc2VydE9wdGlvbnMocyx7c2lsZW50SlNPTlBhcnNpbmc6eC50cmFuc2l0aW9uYWwoeC5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzp4LnRyYW5zaXRpb25hbCh4LmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6eC50cmFuc2l0aW9uYWwoeC5ib29sZWFuKX0sITEpO3ZhciBuPVtdLG89ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uKGcpe3R5cGVvZiBnLnJ1bldoZW49PSJmdW5jdGlvbiImJmcucnVuV2hlbih0KT09PSExfHwobz1vJiZnLnN5bmNocm9ub3VzLG4udW5zaGlmdChnLmZ1bGZpbGxlZCxnLnJlamVjdGVkKSl9KTt2YXIgaT1bXTt0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKGZ1bmN0aW9uKGcpe2kucHVzaChnLmZ1bGZpbGxlZCxnLnJlamVjdGVkKX0pO3ZhciBhO2lmKCFvKXt2YXIgbD1bcWUsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkobCxuKSxsPWwuY29uY2F0KGkpLGE9UHJvbWlzZS5yZXNvbHZlKHQpO2wubGVuZ3RoOylhPWEudGhlbihsLnNoaWZ0KCksbC5zaGlmdCgpKTtyZXR1cm4gYX1mb3IodmFyIG09dDtuLmxlbmd0aDspe3ZhciB1PW4uc2hpZnQoKSxmPW4uc2hpZnQoKTt0cnl7bT11KG0pfWNhdGNoKFQpe2YoVCk7YnJlYWt9fXRyeXthPXFlKG0pfWNhdGNoKFQpe3JldHVybiBQcm9taXNlLnJlamVjdChUKX1mb3IoO2kubGVuZ3RoOylhPWEudGhlbihpLnNoaWZ0KCksaS5zaGlmdCgpKTtyZXR1cm4gYX0sJC5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe2lmKCFlLnVybCl0aHJvdyBuZXcgRXJyb3IoIlByb3ZpZGVkIGNvbmZpZyB1cmwgaXMgbm90IHZhbGlkIik7cmV0dXJuIGU9Ryh0aGlzLmRlZmF1bHRzLGUpLHRyKGUudXJsLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcikucmVwbGFjZSgvXlw/LywiIil9LEZlLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLGZ1bmN0aW9uKGUpeyQucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscyl7cmV0dXJuIHRoaXMucmVxdWVzdChHKHN8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihzfHx7fSkuZGF0YX0pKX19KSxGZS5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sZnVuY3Rpb24oZSl7JC5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxzLG4pe3JldHVybiB0aGlzLnJlcXVlc3QoRyhufHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpzfSkpfX0pO3ZhciBycj0kLHNyPWo7ZnVuY3Rpb24gTShyKXtpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7dmFyIGU7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4pe2U9bn0pO3ZhciB0PXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oZnVuY3Rpb24ocyl7aWYoISF0Ll9saXN0ZW5lcnMpe3ZhciBuLG89dC5fbGlzdGVuZXJzLmxlbmd0aDtmb3Iobj0wO248bztuKyspdC5fbGlzdGVuZXJzW25dKHMpO3QuX2xpc3RlbmVycz1udWxsfX0pLHRoaXMucHJvbWlzZS50aGVuPWZ1bmN0aW9uKHMpe3ZhciBuLG89bmV3IFByb21pc2UoZnVuY3Rpb24oaSl7dC5zdWJzY3JpYmUoaSksbj1pfSkudGhlbihzKTtyZXR1cm4gby5jYW5jZWw9ZnVuY3Rpb24oKXt0LnVuc3Vic2NyaWJlKG4pfSxvfSxyKGZ1bmN0aW9uKG4pe3QucmVhc29ufHwodC5yZWFzb249bmV3IHNyKG4pLGUodC5yZWFzb24pKX0pfU0ucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn0sTS5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKHRoaXMucmVhc29uKXtlKHRoaXMucmVhc29uKTtyZXR1cm59dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19LE0ucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKCEhdGhpcy5fbGlzdGVuZXJzKXt2YXIgdD10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihlKTt0IT09LTEmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UodCwxKX19LE0uc291cmNlPWZ1bmN0aW9uKCl7dmFyIGUsdD1uZXcgTShmdW5jdGlvbihuKXtlPW59KTtyZXR1cm57dG9rZW46dCxjYW5jZWw6ZX19O3ZhciBucj1NLGlyPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihzKXtyZXR1cm4gZS5hcHBseShudWxsLHMpfX0sb3I9cCxhcj1mdW5jdGlvbihlKXtyZXR1cm4gb3IuaXNPYmplY3QoZSkmJmUuaXNBeGlvc0Vycm9yPT09ITB9LGplPXAsdXI9RWUsej1ycixscj1CZSxjcj1XO2Z1bmN0aW9uIEplKHIpe3ZhciBlPW5ldyB6KHIpLHQ9dXIoei5wcm90b3R5cGUucmVxdWVzdCxlKTtyZXR1cm4gamUuZXh0ZW5kKHQsei5wcm90b3R5cGUsZSksamUuZXh0ZW5kKHQsZSksdC5jcmVhdGU9ZnVuY3Rpb24obil7cmV0dXJuIEplKGxyKHIsbikpfSx0fXZhciBFPUplKGNyKTtFLkF4aW9zPXosRS5DYW5jZWw9aixFLkNhbmNlbFRva2VuPW5yLEUuaXNDYW5jZWw9TmUsRS5WRVJTSU9OPSRlLnZlcnNpb24sRS5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSxFLnNwcmVhZD1pcixFLmlzQXhpb3NFcnJvcj1hcixlZS5leHBvcnRzPUUsZWUuZXhwb3J0cy5kZWZhdWx0PUU7dmFyIGZyPWVlLmV4cG9ydHM7Y2xhc3MgY3tpc0VtcHR5KCl7cmV0dXJuIXRoaXMuaXNQcmVzZW50KCl9c3RhdGljIG9mKGUpe2lmKGUhPW51bGwpcmV0dXJuIG5ldyBWZShlKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFzc2VkIHZhbHVlIHdhcyBudWxsIG9yIHVuZGVmaW5lZC4iKX1zdGF0aWMgb2ZOb25OdWxsKGUpe3JldHVybiBjLm9mKGUpfXN0YXRpYyBvZk51bGxhYmxlKGUpe3JldHVybiBlIT1udWxsP25ldyBWZShlKTpuZXcgV2V9c3RhdGljIGVtcHR5KCl7cmV0dXJuIG5ldyBXZX1zdGF0aWMgZnJvbShlKXtzd2l0Y2goZS5raW5kKXtjYXNlInByZXNlbnQiOnJldHVybiBjLm9mKGUudmFsdWUpO2Nhc2UiZW1wdHkiOnJldHVybiBjLmVtcHR5KCk7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgcGFzc2VkIHZhbHVlIHdhcyBub3QgYW4gT3B0aW9uIHR5cGUuIil9fX1jbGFzcyBWZSBleHRlbmRzIGN7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnBheWxvYWQ9ZX1pc1ByZXNlbnQoKXtyZXR1cm4hMH1nZXQoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfWlmUHJlc2VudChlKXtlKHRoaXMucGF5bG9hZCl9aWZQcmVzZW50T3JFbHNlKGUsdCl7ZSh0aGlzLnBheWxvYWQpfWZpbHRlcihlKXtyZXR1cm4gZSh0aGlzLnBheWxvYWQpP3RoaXM6Yy5lbXB0eSgpfW1hcChlKXtjb25zdCB0PWUodGhpcy5wYXlsb2FkKTtyZXR1cm4gYy5vZk51bGxhYmxlKHQpfWZsYXRNYXAoZSl7cmV0dXJuIGUodGhpcy5wYXlsb2FkKX1vcihlKXtyZXR1cm4gdGhpc31vckVsc2UoZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vckVsc2VHZXQoZSl7cmV0dXJuIHRoaXMucGF5bG9hZH1vckVsc2VUaHJvdyhlKXtyZXR1cm4gdGhpcy5wYXlsb2FkfW9yTnVsbCgpe3JldHVybiB0aGlzLnBheWxvYWR9b3JVbmRlZmluZWQoKXtyZXR1cm4gdGhpcy5wYXlsb2FkfXRvT3B0aW9uKCl7cmV0dXJue2tpbmQ6InByZXNlbnQiLHZhbHVlOnRoaXMucGF5bG9hZH19bWF0Y2hlcyhlKXtyZXR1cm4gZS5wcmVzZW50KHRoaXMucGF5bG9hZCl9dG9KU09OKGUpe3JldHVybiB0aGlzLnBheWxvYWR9fWNsYXNzIFdlIGV4dGVuZHMgY3tpc1ByZXNlbnQoKXtyZXR1cm4hMX1jb25zdHJ1Y3Rvcigpe3N1cGVyKCl9Z2V0KCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIG9wdGlvbmFsIGlzIG5vdCBwcmVzZW50LiIpfWlmUHJlc2VudChlKXt9aWZQcmVzZW50T3JFbHNlKGUsdCl7dCgpfWZpbHRlcihlKXtyZXR1cm4gdGhpc31tYXAoZSl7cmV0dXJuIGMuZW1wdHkoKX1mbGF0TWFwKGUpe3JldHVybiBjLmVtcHR5KCl9b3IoZSl7cmV0dXJuIGUoKX1vckVsc2UoZSl7cmV0dXJuIGV9b3JFbHNlR2V0KGUpe3JldHVybiB0aGlzLm9yRWxzZShlKCkpfW9yRWxzZVRocm93KGUpe3Rocm93IGUoKX1vck51bGwoKXtyZXR1cm4gbnVsbH1vclVuZGVmaW5lZCgpe310b09wdGlvbigpe3JldHVybntraW5kOiJlbXB0eSJ9fW1hdGNoZXMoZSl7cmV0dXJuIGUuZW1wdHkoKX10b0pTT04oZSl7cmV0dXJuIG51bGx9fWNvbnN0IGhyPSIxLjIuNyI7ZnVuY3Rpb24gZHIocil7Z2xvYmFsVGhpcy5fdm9uYWdlTWVkaWFQcm9jZXNzb3JNZXRhZGF0YT1yfWZ1bmN0aW9uIHByKCl7cmV0dXJuIGdsb2JhbFRoaXMuX3ZvbmFnZU1lZGlhUHJvY2Vzc29yTWV0YWRhdGF9Y2xhc3MgX3tjb25zdHJ1Y3Rvcigpe2NvbnN0IGU9cHIoKTt0aGlzLl9yZXBvcnQ9e2FjdGlvbjpjLmVtcHR5KCksYXBwbGljYXRpb25JZDpjLm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLmFwcElkOm51bGwpLHRpbWVzdGFtcDpEYXRlLm5vdygpLGZwczpjLmVtcHR5KCksZnJhbWVzVHJhbnNmb3JtZWQ6Yy5lbXB0eSgpLGd1aWQ6Yy5lbXB0eSgpLGhpZ2hlc3RGcmFtZVRyYW5zZm9ybUNwdTpjLmVtcHR5KCksbWVzc2FnZTpjLmVtcHR5KCksc291cmNlOmMub2ZOdWxsYWJsZShlIT09dm9pZCAwJiZlIT1udWxsP2Uuc291cmNlVHlwZTpudWxsKSx0cmFuc2Zvcm1lZEZwczpjLmVtcHR5KCksdHJhbnNmb3JtZXJUeXBlOmMuZW1wdHkoKSx2YXJpYXRpb246Yy5lbXB0eSgpLHZpZGVvSGVpZ2h0OmMuZW1wdHkoKSx2aWRlb1dpZHRoOmMuZW1wdHkoKSx2ZXJzaW9uOmhyLGVycm9yOmMuZW1wdHkoKSxwcm94eVVybDpjLm9mTnVsbGFibGUoZSE9PXZvaWQgMCYmZSE9bnVsbD9lLnByb3h5VXJsOm51bGwpfX1hY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5hY3Rpb249Yy5vZk51bGxhYmxlKGUpLHRoaXN9ZnJhbWVzVHJhbnNmb3JtZWQoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcmFtZXNUcmFuc2Zvcm1lZD1jLm9mTnVsbGFibGUoZSksdGhpc31mcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5mcHM9Yy5vZk51bGxhYmxlKGUpLHRoaXN9Z3VpZChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lmd1aWQ9Yy5vZk51bGxhYmxlKGUpLHRoaXN9bWVzc2FnZShlKXtyZXR1cm4gdGhpcy5fcmVwb3J0Lm1lc3NhZ2U9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dHJhbnNmb3JtZWRGcHMoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lZEZwcz1jLm9mTnVsbGFibGUoZSksdGhpc310cmFuc2Zvcm1lclR5cGUoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC50cmFuc2Zvcm1lclR5cGU9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dmFyaWF0aW9uKGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmFyaWF0aW9uPWMub2ZOdWxsYWJsZShlKSx0aGlzfXZpZGVvSGVpZ2h0KGUpe3JldHVybiB0aGlzLl9yZXBvcnQudmlkZW9IZWlnaHQ9Yy5vZk51bGxhYmxlKGUpLHRoaXN9dmlkZW9XaWR0aChlKXtyZXR1cm4gdGhpcy5fcmVwb3J0LnZpZGVvV2lkdGg9Yy5vZk51bGxhYmxlKGUpLHRoaXN9ZXJyb3IoZSl7cmV0dXJuIHRoaXMuX3JlcG9ydC5lcnJvcj1jLm9mTnVsbGFibGUoZSksdGhpc31idWlsZCgpe3JldHVybiB0aGlzLl9yZXBvcnR9fWNvbnN0IG1yPXI9PkpTT04uc3RyaW5naWZ5KHIsKGUsdCk9PntpZih0IT09bnVsbClyZXR1cm4gdH0pO2NsYXNzIGJ7c3RhdGljIHJlcG9ydChlKXtyZXR1cm4gbmV3IFByb21pc2UoKHQscyk9PntpZihlLmFwcGxpY2F0aW9uSWQuaXNFbXB0eSgpfHxlLnNvdXJjZS5pc0VtcHR5KCkpe3QoInN1Y2Nlc3MiKTtyZXR1cm59bGV0IG49ZnIuY3JlYXRlKCksbz17dGltZW91dDoxZTQsdGltZW91dEVycm9yTWVzc2FnZToiUmVxdWVzdCB0aW1lb3V0IixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiJ9fSxpPSJobGcudG9rYm94LmNvbS9wcm9kL2xvZ2dpbmcvdmNwX3dlYnJ0YyI7aWYoZS5wcm94eVVybC5pc0VtcHR5KCkpaT0iaHR0cHM6Ly8iK2k7ZWxzZXtsZXQgYTtlLnByb3h5VXJsLmdldCgpLnNsaWNlKGUucHJveHlVcmwuZ2V0KCkubGVuZ3RoLTEpIT09Ii8iP2E9ZS5wcm94eVVybC5nZXQoKSsiLyI6YT1lLnByb3h5VXJsLmdldCgpLGk9YStpfW4ucG9zdChpLG1yKGUpLG8pLnRoZW4oYT0+e2NvbnNvbGUubG9nKGEpLHQoInN1Y2Nlc3MiKX0pLmNhdGNoKGE9Pntjb25zb2xlLmxvZyhhKSxzKGEpfSl9KX19dmFyIFEsZ3I9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIHlyKCl7aWYoIVEmJihRPXR5cGVvZiBjcnlwdG8hPSJ1bmRlZmluZWQiJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKXx8dHlwZW9mIG1zQ3J5cHRvIT0idW5kZWZpbmVkIiYmdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcz09ImZ1bmN0aW9uIiYmbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQobXNDcnlwdG8pLCFRKSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIFEoZ3IpfXZhciBfcj0vXig/OlswLTlhLWZdezh9LVswLTlhLWZdezR9LVsxLTVdWzAtOWEtZl17M30tWzg5YWJdWzAtOWEtZl17M30tWzAtOWEtZl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7ZnVuY3Rpb24gYnIocil7cmV0dXJuIHR5cGVvZiByPT0ic3RyaW5nIiYmX3IudGVzdChyKX1mb3IodmFyIGQ9W10sZmU9MDtmZTwyNTY7KytmZSlkLnB1c2goKGZlKzI1NikudG9TdHJpbmcoMTYpLnN1YnN0cigxKSk7ZnVuY3Rpb24gd3Iocil7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOjAsdD0oZFtyW2UrMF1dK2RbcltlKzFdXStkW3JbZSsyXV0rZFtyW2UrM11dKyItIitkW3JbZSs0XV0rZFtyW2UrNV1dKyItIitkW3JbZSs2XV0rZFtyW2UrN11dKyItIitkW3JbZSs4XV0rZFtyW2UrOV1dKyItIitkW3JbZSsxMF1dK2RbcltlKzExXV0rZFtyW2UrMTJdXStkW3JbZSsxM11dK2RbcltlKzE0XV0rZFtyW2UrMTVdXSkudG9Mb3dlckNhc2UoKTtpZighYnIodCkpdGhyb3cgVHlwZUVycm9yKCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBHZShyLGUsdCl7cj1yfHx7fTt2YXIgcz1yLnJhbmRvbXx8KHIucm5nfHx5cikoKTtpZihzWzZdPXNbNl0mMTV8NjQsc1s4XT1zWzhdJjYzfDEyOCxlKXt0PXR8fDA7Zm9yKHZhciBuPTA7bjwxNjsrK24pZVt0K25dPXNbbl07cmV0dXJuIGV9cmV0dXJuIHdyKHMpfWNvbnN0IFM9bmV3IFdlYWtNYXAsWD1uZXcgV2Vha01hcCxMPW5ldyBXZWFrTWFwLGhlPVN5bWJvbCgiYW55UHJvZHVjZXIiKSx6ZT1Qcm9taXNlLnJlc29sdmUoKSxLPVN5bWJvbCgibGlzdGVuZXJBZGRlZCIpLFk9U3ltYm9sKCJsaXN0ZW5lclJlbW92ZWQiKTtsZXQgZGU9ITE7ZnVuY3Rpb24gQShyKXtpZih0eXBlb2YgciE9InN0cmluZyImJnR5cGVvZiByIT0ic3ltYm9sIil0aHJvdyBuZXcgVHlwZUVycm9yKCJldmVudE5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBhIHN5bWJvbCIpfWZ1bmN0aW9uIFoocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gayhyLGUpe2NvbnN0IHQ9WC5nZXQocik7cmV0dXJuIHQuaGFzKGUpfHx0LnNldChlLG5ldyBTZXQpLHQuZ2V0KGUpfWZ1bmN0aW9uIEYocixlKXtjb25zdCB0PXR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJzeW1ib2wiP2U6aGUscz1MLmdldChyKTtyZXR1cm4gcy5oYXModCl8fHMuc2V0KHQsbmV3IFNldCkscy5nZXQodCl9ZnVuY3Rpb24gdnIocixlLHQpe2NvbnN0IHM9TC5nZXQocik7aWYocy5oYXMoZSkpZm9yKGNvbnN0IG4gb2Ygcy5nZXQoZSkpbi5lbnF1ZXVlKHQpO2lmKHMuaGFzKGhlKSl7Y29uc3Qgbj1Qcm9taXNlLmFsbChbZSx0XSk7Zm9yKGNvbnN0IG8gb2Ygcy5nZXQoaGUpKW8uZW5xdWV1ZShuKX19ZnVuY3Rpb24gUWUocixlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9ITEscz0oKT0+e30sbj1bXTtjb25zdCBvPXtlbnF1ZXVlKGkpe24ucHVzaChpKSxzKCl9LGZpbmlzaCgpe3Q9ITAscygpfX07Zm9yKGNvbnN0IGkgb2YgZSlGKHIsaSkuYWRkKG8pO3JldHVybnthc3luYyBuZXh0KCl7cmV0dXJuIG4/bi5sZW5ndGg9PT0wP3Q/KG49dm9pZCAwLHRoaXMubmV4dCgpKTooYXdhaXQgbmV3IFByb21pc2UoaT0+e3M9aX0pLHRoaXMubmV4dCgpKTp7ZG9uZTohMSx2YWx1ZTphd2FpdCBuLnNoaWZ0KCl9Ontkb25lOiEwfX0sYXN5bmMgcmV0dXJuKGkpe249dm9pZCAwO2Zvcihjb25zdCBhIG9mIGUpRihyLGEpLmRlbGV0ZShvKTtyZXR1cm4gcygpLGFyZ3VtZW50cy5sZW5ndGg+MD97ZG9uZTohMCx2YWx1ZTphd2FpdCBpfTp7ZG9uZTohMH19LFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtyZXR1cm4gdGhpc319fWZ1bmN0aW9uIFhlKHIpe2lmKHI9PT12b2lkIDApcmV0dXJuIEtlO2lmKCFBcnJheS5pc0FycmF5KHIpKXRocm93IG5ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzIik7Zm9yKGNvbnN0IGUgb2YgcilpZighS2UuaW5jbHVkZXMoZSkpdGhyb3cgdHlwZW9mIGUhPSJzdHJpbmciP25ldyBUeXBlRXJyb3IoImBtZXRob2ROYW1lc2AgZWxlbWVudCBtdXN0IGJlIGEgc3RyaW5nIik6bmV3IEVycm9yKGAke2V9IGlzIG5vdCBFbWl0dGVyeSBtZXRob2RgKTtyZXR1cm4gcn1jb25zdCBwZT1yPT5yPT09S3x8cj09PVk7Y2xhc3MgQ3tzdGF0aWMgbWl4aW4oZSx0KXtyZXR1cm4gdD1YZSh0KSxzPT57aWYodHlwZW9mIHMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiYHRhcmdldGAgbXVzdCBiZSBmdW5jdGlvbiIpO2Zvcihjb25zdCBpIG9mIHQpaWYocy5wcm90b3R5cGVbaV0hPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvcGVydHkgXGAke2l9XGAgYWxyZWFkeSBleGlzdHMgb24gXGB0YXJnZXRcYGApO2Z1bmN0aW9uIG4oKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZSx7ZW51bWVyYWJsZTohMSx2YWx1ZTpuZXcgQ30pLHRoaXNbZV19T2JqZWN0LmRlZmluZVByb3BlcnR5KHMucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITEsZ2V0Om59KTtjb25zdCBvPWk9PmZ1bmN0aW9uKC4uLmEpe3JldHVybiB0aGlzW2VdW2ldKC4uLmEpfTtmb3IoY29uc3QgaSBvZiB0KU9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLnByb3RvdHlwZSxpLHtlbnVtZXJhYmxlOiExLHZhbHVlOm8oaSl9KTtyZXR1cm4gc319c3RhdGljIGdldCBpc0RlYnVnRW5hYmxlZCgpe2lmKHR5cGVvZiBwcm9jZXNzIT0ib2JqZWN0IilyZXR1cm4gZGU7Y29uc3R7ZW52OmV9PXByb2Nlc3N8fHtlbnY6e319O3JldHVybiBlLkRFQlVHPT09ImVtaXR0ZXJ5Inx8ZS5ERUJVRz09PSIqInx8ZGV9c3RhdGljIHNldCBpc0RlYnVnRW5hYmxlZChlKXtkZT1lfWNvbnN0cnVjdG9yKGU9e30pe1Muc2V0KHRoaXMsbmV3IFNldCksWC5zZXQodGhpcyxuZXcgTWFwKSxMLnNldCh0aGlzLG5ldyBNYXApLHRoaXMuZGVidWc9ZS5kZWJ1Z3x8e30sdGhpcy5kZWJ1Zy5lbmFibGVkPT09dm9pZCAwJiYodGhpcy5kZWJ1Zy5lbmFibGVkPSExKSx0aGlzLmRlYnVnLmxvZ2dlcnx8KHRoaXMuZGVidWcubG9nZ2VyPSh0LHMsbixvKT0+e289SlNPTi5zdHJpbmdpZnkobyksdHlwZW9mIG49PSJzeW1ib2wiJiYobj1uLnRvU3RyaW5nKCkpO2NvbnN0IGk9bmV3IERhdGUsYT1gJHtpLmdldEhvdXJzKCl9OiR7aS5nZXRNaW51dGVzKCl9OiR7aS5nZXRTZWNvbmRzKCl9LiR7aS5nZXRNaWxsaXNlY29uZHMoKX1gO2NvbnNvbGUubG9nKGBbJHthfV1bZW1pdHRlcnk6JHt0fV1bJHtzfV0gRXZlbnQgTmFtZTogJHtufQoJZGF0YTogJHtvfWApfSl9bG9nSWZEZWJ1Z0VuYWJsZWQoZSx0LHMpeyhDLmlzRGVidWdFbmFibGVkfHx0aGlzLmRlYnVnLmVuYWJsZWQpJiZ0aGlzLmRlYnVnLmxvZ2dlcihlLHRoaXMuZGVidWcubmFtZSx0LHMpfW9uKGUsdCl7Wih0KSxlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07Zm9yKGNvbnN0IHMgb2YgZSlBKHMpLGsodGhpcyxzKS5hZGQodCksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgic3Vic2NyaWJlIixzLHZvaWQgMCkscGUocyl8fHRoaXMuZW1pdChLLHtldmVudE5hbWU6cyxsaXN0ZW5lcjp0fSk7cmV0dXJuIHRoaXMub2ZmLmJpbmQodGhpcyxlLHQpfW9mZihlLHQpe1oodCksZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCBzIG9mIGUpQShzKSxrKHRoaXMscykuZGVsZXRlKHQpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoInVuc3Vic2NyaWJlIixzLHZvaWQgMCkscGUocyl8fHRoaXMuZW1pdChZLHtldmVudE5hbWU6cyxsaXN0ZW5lcjp0fSl9b25jZShlKXtyZXR1cm4gbmV3IFByb21pc2UodD0+e2NvbnN0IHM9dGhpcy5vbihlLG49PntzKCksdChuKX0pfSl9ZXZlbnRzKGUpe2U9QXJyYXkuaXNBcnJheShlKT9lOltlXTtmb3IoY29uc3QgdCBvZiBlKUEodCk7cmV0dXJuIFFlKHRoaXMsZSl9YXN5bmMgZW1pdChlLHQpe0EoZSksdGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiZW1pdCIsZSx0KSx2cih0aGlzLGUsdCk7Y29uc3Qgcz1rKHRoaXMsZSksbj1TLmdldCh0aGlzKSxvPVsuLi5zXSxpPXBlKGUpP1tdOlsuLi5uXTthd2FpdCB6ZSxhd2FpdCBQcm9taXNlLmFsbChbLi4uby5tYXAoYXN5bmMgYT0+e2lmKHMuaGFzKGEpKXJldHVybiBhKHQpfSksLi4uaS5tYXAoYXN5bmMgYT0+e2lmKG4uaGFzKGEpKXJldHVybiBhKGUsdCl9KV0pfWFzeW5jIGVtaXRTZXJpYWwoZSx0KXtBKGUpLHRoaXMubG9nSWZEZWJ1Z0VuYWJsZWQoImVtaXRTZXJpYWwiLGUsdCk7Y29uc3Qgcz1rKHRoaXMsZSksbj1TLmdldCh0aGlzKSxvPVsuLi5zXSxpPVsuLi5uXTthd2FpdCB6ZTtmb3IoY29uc3QgYSBvZiBvKXMuaGFzKGEpJiZhd2FpdCBhKHQpO2Zvcihjb25zdCBhIG9mIGkpbi5oYXMoYSkmJmF3YWl0IGEoZSx0KX1vbkFueShlKXtyZXR1cm4gWihlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJzdWJzY3JpYmVBbnkiLHZvaWQgMCx2b2lkIDApLFMuZ2V0KHRoaXMpLmFkZChlKSx0aGlzLmVtaXQoSyx7bGlzdGVuZXI6ZX0pLHRoaXMub2ZmQW55LmJpbmQodGhpcyxlKX1hbnlFdmVudCgpe3JldHVybiBRZSh0aGlzKX1vZmZBbnkoZSl7WihlKSx0aGlzLmxvZ0lmRGVidWdFbmFibGVkKCJ1bnN1YnNjcmliZUFueSIsdm9pZCAwLHZvaWQgMCksdGhpcy5lbWl0KFkse2xpc3RlbmVyOmV9KSxTLmdldCh0aGlzKS5kZWxldGUoZSl9Y2xlYXJMaXN0ZW5lcnMoZSl7ZT1BcnJheS5pc0FycmF5KGUpP2U6W2VdO2Zvcihjb25zdCB0IG9mIGUpaWYodGhpcy5sb2dJZkRlYnVnRW5hYmxlZCgiY2xlYXIiLHQsdm9pZCAwKSx0eXBlb2YgdD09InN0cmluZyJ8fHR5cGVvZiB0PT0ic3ltYm9sIil7ayh0aGlzLHQpLmNsZWFyKCk7Y29uc3Qgcz1GKHRoaXMsdCk7Zm9yKGNvbnN0IG4gb2YgcyluLmZpbmlzaCgpO3MuY2xlYXIoKX1lbHNle1MuZ2V0KHRoaXMpLmNsZWFyKCk7Zm9yKGNvbnN0IHMgb2YgWC5nZXQodGhpcykudmFsdWVzKCkpcy5jbGVhcigpO2Zvcihjb25zdCBzIG9mIEwuZ2V0KHRoaXMpLnZhbHVlcygpKXtmb3IoY29uc3QgbiBvZiBzKW4uZmluaXNoKCk7cy5jbGVhcigpfX19bGlzdGVuZXJDb3VudChlKXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV07bGV0IHQ9MDtmb3IoY29uc3QgcyBvZiBlKXtpZih0eXBlb2Ygcz09InN0cmluZyIpe3QrPVMuZ2V0KHRoaXMpLnNpemUrayh0aGlzLHMpLnNpemUrRih0aGlzLHMpLnNpemUrRih0aGlzKS5zaXplO2NvbnRpbnVlfXR5cGVvZiBzIT0idW5kZWZpbmVkIiYmQShzKSx0Kz1TLmdldCh0aGlzKS5zaXplO2Zvcihjb25zdCBuIG9mIFguZ2V0KHRoaXMpLnZhbHVlcygpKXQrPW4uc2l6ZTtmb3IoY29uc3QgbiBvZiBMLmdldCh0aGlzKS52YWx1ZXMoKSl0Kz1uLnNpemV9cmV0dXJuIHR9YmluZE1ldGhvZHMoZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoImB0YXJnZXRgIG11c3QgYmUgYW4gb2JqZWN0Iik7dD1YZSh0KTtmb3IoY29uc3QgcyBvZiB0KXtpZihlW3NdIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgVGhlIHByb3BlcnR5IFxgJHtzfVxgIGFscmVhZHkgZXhpc3RzIG9uIFxgdGFyZ2V0XGBgKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxzLHtlbnVtZXJhYmxlOiExLHZhbHVlOnRoaXNbc10uYmluZCh0aGlzKX0pfX19Y29uc3QgS2U9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoQy5wcm90b3R5cGUpLmZpbHRlcihyPT5yIT09ImNvbnN0cnVjdG9yIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImxpc3RlbmVyQWRkZWQiLHt2YWx1ZTpLLHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsImxpc3RlbmVyUmVtb3ZlZCIse3ZhbHVlOlksd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITF9KTt2YXIgbWU9QztmdW5jdGlvbiBFcihyKXtyZXR1cm4gdHlwZW9mIHI9PSJvYmplY3QiJiZyIT09bnVsbCYmIm1lc3NhZ2UiaW4gciYmdHlwZW9mIHIubWVzc2FnZT09InN0cmluZyJ9ZnVuY3Rpb24gVHIocil7aWYoRXIocikpcmV0dXJuIHI7dHJ5e3JldHVybiBuZXcgRXJyb3IoSlNPTi5zdHJpbmdpZnkocikpfWNhdGNoe3JldHVybiBuZXcgRXJyb3IoU3RyaW5nKHIpKX19ZnVuY3Rpb24gZ2Uocil7cmV0dXJuIFRyKHIpLm1lc3NhZ2V9dmFyIHllOyhmdW5jdGlvbihyKXtyLkZQU19EUk9QPSJmcHNfZHJvcCJ9KSh5ZXx8KHllPXt9KSk7Y29uc3QgUHI9NTAwLFJyPS44O2NsYXNzIFNyIGV4dGVuZHMgbWV7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMuaW5kZXhfPXQsdGhpcy51dWlkXz1HZSgpLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTAsdGhpcy50cmFuc2Zvcm1lcl89ZSx0aGlzLnNob3VsZFN0b3BfPSExLHRoaXMuaXNGbGFzaGVkXz0hMSx0aGlzLmZyYW1lc0Zyb21Tb3VyY2VfPTAsdGhpcy5mcHNfPTAsdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy52aWRlb0hlaWdodF89MCx0aGlzLnZpZGVvV2lkdGhfPTAsdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTEsdGhpcy50cmFuc2Zvcm1lclR5cGVfPSJDdXN0b20iLCJnZXRUcmFuc2Zvcm1lclR5cGUiaW4gZSYmKHRoaXMudHJhbnNmb3JtZXJUeXBlXz1lLmdldFRyYW5zZm9ybWVyVHlwZSgpKTtjb25zdCBzPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7Yi5yZXBvcnQocyl9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZX1hc3luYyBzdGFydChlKXtpZih0aGlzLmNvbnRyb2xsZXJfPWUsdGhpcy50cmFuc2Zvcm1lcl8mJnR5cGVvZiB0aGlzLnRyYW5zZm9ybWVyXy5zdGFydD09ImZ1bmN0aW9uIil0cnl7YXdhaXQgdGhpcy50cmFuc2Zvcm1lcl8uc3RhcnQoZSl9Y2F0Y2godCl7Y29uc3Qgcz1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLmVycm9ycy50cmFuc2Zvcm1lcl9zdGFydCkudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJFcnJvciIpLmVycm9yKGdlKHQpKS5idWlsZCgpO2IucmVwb3J0KHMpO2NvbnN0IG49e2V2ZW50TWV0YURhdGE6e3RyYW5zZm9ybWVySW5kZXg6dGhpcy5pbmRleF99LGVycm9yOnQsZnVuY3Rpb246InN0YXJ0In07dGhpcy5lbWl0KCJlcnJvciIsbil9fWFzeW5jIHRyYW5zZm9ybShlLHQpe3ZhciBzLG4sbyxpO2lmKHRoaXMubWVkaWFUcmFuc2Zvcm1lclFvc1JlcG9ydFN0YXJ0VGltZXN0YW1wXz09PTAmJih0aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF89RGF0ZS5ub3coKSksZSBpbnN0YW5jZW9mIFZpZGVvRnJhbWUmJih0aGlzLnZpZGVvSGVpZ2h0Xz0ocz1lPT1udWxsP3ZvaWQgMDplLmRpc3BsYXlIZWlnaHQpIT1udWxsP3M6MCx0aGlzLnZpZGVvV2lkdGhfPShuPWU9PW51bGw/dm9pZCAwOmUuZGlzcGxheVdpZHRoKSE9bnVsbD9uOjApLCsrdGhpcy5mcmFtZXNGcm9tU291cmNlXyx0aGlzLnRyYW5zZm9ybWVyXylpZih0aGlzLnNob3VsZFN0b3BfKWNvbnNvbGUud2FybigiW1BpcGVsaW5lXSBmbHVzaCBmcm9tIHRyYW5zZm9ybSIpLGUuY2xvc2UoKSx0aGlzLmZsdXNoKHQpLHQudGVybWluYXRlKCk7ZWxzZSB0cnl7YXdhaXQoKGk9KG89dGhpcy50cmFuc2Zvcm1lcl8pLnRyYW5zZm9ybSk9PW51bGw/dm9pZCAwOmkuY2FsbChvLGUsdCkpLCsrdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF8sdGhpcy5mcmFtZXNUcmFuc2Zvcm1lZF89PT1QciYmdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCl9Y2F0Y2goYSl7Y29uc3QgbD1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLmVycm9ycy50cmFuc2Zvcm1lcl90cmFuc2Zvcm0pLnRyYW5zZm9ybWVyVHlwZSh0aGlzLnRyYW5zZm9ybWVyVHlwZV8pLnZhcmlhdGlvbigiRXJyb3IiKS5lcnJvcihnZShhKSkuYnVpbGQoKTtiLnJlcG9ydChsKTtjb25zdCBtPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSxlcnJvcjphLGZ1bmN0aW9uOiJ0cmFuc2Zvcm0ifTt0aGlzLmVtaXQoImVycm9yIixtKX19YXN5bmMgZmx1c2goZSl7aWYodGhpcy50cmFuc2Zvcm1lcl8mJnR5cGVvZiB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaD09ImZ1bmN0aW9uIiYmIXRoaXMuaXNGbGFzaGVkXyl7dGhpcy5pc0ZsYXNoZWRfPSEwO3RyeXthd2FpdCB0aGlzLnRyYW5zZm9ybWVyXy5mbHVzaChlKX1jYXRjaChzKXtjb25zdCBuPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVRyYW5zZm9ybWVyIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFAuZXJyb3JzLnRyYW5zZm9ybWVyX2ZsdXNoKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52YXJpYXRpb24oIkVycm9yIikuZXJyb3IoZ2UocykpLmJ1aWxkKCk7Yi5yZXBvcnQobik7Y29uc3Qgbz17ZXZlbnRNZXRhRGF0YTp7dHJhbnNmb3JtZXJJbmRleDp0aGlzLmluZGV4X30sZXJyb3I6cyxmdW5jdGlvbjoiZmx1c2gifTt0aGlzLmVtaXQoImVycm9yIixvKX19dGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0KCk7Y29uc3QgdD1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmd1aWQodGhpcy51dWlkXykudHJhbnNmb3JtZXJUeXBlKHRoaXMudHJhbnNmb3JtZXJUeXBlXykudmFyaWF0aW9uKCJEZWxldGUiKS5idWlsZCgpO2IucmVwb3J0KHQpfXN0b3AoKXtjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTdG9wIHN0cmVhbS4iKSx0aGlzLmNvbnRyb2xsZXJfJiYodGhpcy5mbHVzaCh0aGlzLmNvbnRyb2xsZXJfKSx0aGlzLmNvbnRyb2xsZXJfLnRlcm1pbmF0ZSgpKSx0aGlzLnNob3VsZFN0b3BfPSEwfW1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnQoKXtsZXQgZT0oRGF0ZS5ub3coKS10aGlzLm1lZGlhVHJhbnNmb3JtZXJRb3NSZXBvcnRTdGFydFRpbWVzdGFtcF8pLzFlMyx0PXRoaXMuZnJhbWVzRnJvbVNvdXJjZV8vZSxzPXRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfL2U7aWYodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8hPS0xJiZ0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXypScj50KXtjb25zdCBvPXtldmVudE1ldGFEYXRhOnt0cmFuc2Zvcm1lckluZGV4OnRoaXMuaW5kZXhffSx3YXJuaW5nVHlwZTp5ZS5GUFNfRFJPUCxkcm9wSW5mbzp7cmVxdWVzdGVkOnRoaXMudHJhY2tFeHBlY3RlZFJhdGVfLGN1cnJlbnQ6dH19O3RoaXMuZW1pdCgid2FybiIsbyl9Y29uc3Qgbj1uZXcgXygpLmFjdGlvbigiTWVkaWFUcmFuc2Zvcm1lciIpLmZwcyh0KS50cmFuc2Zvcm1lZEZwcyhzKS5mcmFtZXNUcmFuc2Zvcm1lZCh0aGlzLmZyYW1lc1RyYW5zZm9ybWVkXykuZ3VpZCh0aGlzLnV1aWRfKS50cmFuc2Zvcm1lclR5cGUodGhpcy50cmFuc2Zvcm1lclR5cGVfKS52aWRlb0hlaWdodCh0aGlzLnZpZGVvSGVpZ2h0XykudmlkZW9XaWR0aCh0aGlzLnZpZGVvV2lkdGhfKS52YXJpYXRpb24oIlFvUyIpLmJ1aWxkKCk7Yi5yZXBvcnQobiksdGhpcy5tZWRpYVRyYW5zZm9ybWVyUW9zUmVwb3J0U3RhcnRUaW1lc3RhbXBfPTAsdGhpcy5mcmFtZXNGcm9tU291cmNlXz0wLHRoaXMuZnJhbWVzVHJhbnNmb3JtZWRfPTB9fWNsYXNzIENyIGV4dGVuZHMgbWV7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnRyYW5zZm9ybWVyc189W10sdGhpcy50cmFja0V4cGVjdGVkUmF0ZV89LTE7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2xldCBzPW5ldyBTcihlW3RdLHQpO3Mub24oImVycm9yIixuPT57dGhpcy5lbWl0KCJlcnJvciIsbil9KSxzLm9uKCJ3YXJuIixuPT57dGhpcy5lbWl0KCJ3YXJuIixuKX0pLHRoaXMudHJhbnNmb3JtZXJzXy5wdXNoKHMpfX1zZXRUcmFja0V4cGVjdGVkUmF0ZShlKXt0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXz1lO2ZvcihsZXQgdCBvZiB0aGlzLnRyYW5zZm9ybWVyc18pdC5zZXRUcmFja0V4cGVjdGVkUmF0ZSh0aGlzLnRyYWNrRXhwZWN0ZWRSYXRlXyl9YXN5bmMgc3RhcnQoZSx0KXtpZighdGhpcy50cmFuc2Zvcm1lcnNffHx0aGlzLnRyYW5zZm9ybWVyc18ubGVuZ3RoPT09MCl7Y29uc29sZS5sb2coIltQaXBlbGluZV0gTm8gdHJhbnNmb3JtZXJzLiIpO3JldHVybn10cnl7bGV0IHM9ZTtmb3IobGV0IG4gb2YgdGhpcy50cmFuc2Zvcm1lcnNfKWU9ZS5waXBlVGhyb3VnaChuZXcgVHJhbnNmb3JtU3RyZWFtKG4pKTtlLnBpcGVUbyh0KS50aGVuKGFzeW5jKCk9Pntjb25zb2xlLmxvZygiW1BpcGVsaW5lXSBTZXR1cC4iKSxhd2FpdCB0LmFib3J0KCksYXdhaXQgcy5jYW5jZWwoKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIse21lc3NhZ2U6InBpcGVsaW5lX2VuZGVkIn0pfSkuY2F0Y2goYXN5bmMgbj0+e2UuY2FuY2VsKCkudGhlbigoKT0+e2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFNodXR0aW5nIGRvd24gc3RyZWFtcyBhZnRlciBhYm9ydC4iKX0pLmNhdGNoKG89Pntjb25zb2xlLmVycm9yKCJbUGlwZWxpbmVdIEVycm9yIGZyb20gc3RyZWFtIHRyYW5zZm9ybToiLG8pfSksYXdhaXQgdC5hYm9ydChuKSxhd2FpdCBzLmNhbmNlbChuKSx0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIse21lc3NhZ2U6InBpcGVsaW5lX2VuZGVkX3dpdGhfZXJyb3IifSl9KX1jYXRjaHt0aGlzLmVtaXQoInBpcGVsaW5lSW5mbyIse21lc3NhZ2U6InBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvciJ9KSx0aGlzLmRlc3Ryb3koKTtyZXR1cm59dGhpcy5lbWl0KCJwaXBlbGluZUluZm8iLHttZXNzYWdlOiJwaXBlbGluZV9zdGFydGVkIn0pLGNvbnNvbGUubG9nKCJbUGlwZWxpbmVdIFBpcGVsaW5lIHN0YXJ0ZWQuIil9YXN5bmMgZGVzdHJveSgpe2NvbnNvbGUubG9nKCJbUGlwZWxpbmVdIERlc3Ryb3lpbmcgUGlwZWxpbmUuIik7Zm9yKGxldCBlIG9mIHRoaXMudHJhbnNmb3JtZXJzXyllLnN0b3AoKX19Y2xhc3MgT3IgZXh0ZW5kcyBtZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy51dWlkXz1HZSgpLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfPS0xO2NvbnN0IGU9bmV3IF8oKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS52YXJpYXRpb24oIkNyZWF0ZSIpLmJ1aWxkKCk7Yi5yZXBvcnQoZSl9c2V0VHJhY2tFeHBlY3RlZFJhdGUoZSl7dGhpcy50cmFja0V4cGVjdGVkUmF0ZV89ZSx0aGlzLnBpcGVsaW5lXyYmdGhpcy5waXBlbGluZV8uc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pfXRyYW5zZm9ybShlLHQpe3JldHVybiB0aGlzLnJlYWRhYmxlXz1lLHRoaXMud3JpdGFibGVfPXQsdGhpcy50cmFuc2Zvcm1JbnRlcm5hbCgpfXRyYW5zZm9ybUludGVybmFsKCl7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57aWYoIXRoaXMudHJhbnNmb3JtZXJzX3x8dGhpcy50cmFuc2Zvcm1lcnNfLmxlbmd0aD09PTApe2NvbnN0IG49bmV3IF8oKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFAuZXJyb3JzLnRyYW5zZm9ybWVyX25vbmUpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO2IucmVwb3J0KG4pLHQoIltNZWRpYVByb2Nlc3Nvcl0gTmVlZCB0byBzZXQgdHJhbnNmb3JtZXJzLiIpO3JldHVybn1pZighdGhpcy5yZWFkYWJsZV8pe2NvbnN0IG49bmV3IF8oKS5hY3Rpb24oIk1lZGlhUHJvY2Vzc29yIikuZ3VpZCh0aGlzLnV1aWRfKS5tZXNzYWdlKFAuZXJyb3JzLnJlYWRhYmxlX251bGwpLnZhcmlhdGlvbigiRXJyb3IiKS5idWlsZCgpO2IucmVwb3J0KG4pLHQoIltNZWRpYVByb2Nlc3Nvcl0gUmVhZGFibGUgaXMgbnVsbC4iKTtyZXR1cm59aWYoIXRoaXMud3JpdGFibGVfKXtjb25zdCBuPW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLmVycm9ycy53cml0YWJsZV9udWxsKS52YXJpYXRpb24oIkVycm9yIikuYnVpbGQoKTtiLnJlcG9ydChuKSx0KCJbTWVkaWFQcm9jZXNzb3JdIFdyaXRhYmxlIGlzIG51bGwuIik7cmV0dXJufWxldCBzPSExO3RoaXMucGlwZWxpbmVfJiYocz0hMCx0aGlzLnBpcGVsaW5lXy5jbGVhckxpc3RlbmVycygpLHRoaXMucGlwZWxpbmVfLmRlc3Ryb3koKSksdGhpcy5waXBlbGluZV89bmV3IENyKHRoaXMudHJhbnNmb3JtZXJzXyksdGhpcy5waXBlbGluZV8ub24oIndhcm4iLG49Pnt0aGlzLmVtaXQoIndhcm4iLG4pfSksdGhpcy5waXBlbGluZV8ub24oImVycm9yIixuPT57dGhpcy5lbWl0KCJlcnJvciIsbil9KSx0aGlzLnBpcGVsaW5lXy5vbigicGlwZWxpbmVJbmZvIixuPT57cyYmKG4ubWVzc2FnZT09PSJwaXBlbGluZV9zdGFydGVkIj9uLm1lc3NhZ2U9InBpcGVsaW5lX3Jlc3RhcnRlZCI6bi5tZXNzYWdlPT09InBpcGVsaW5lX3N0YXJ0ZWRfd2l0aF9lcnJvciImJihuLm1lc3NhZ2U9InBpcGVsaW5lX3Jlc3RhcnRlZF93aXRoX2Vycm9yIikpLHRoaXMuZW1pdCgicGlwZWxpbmVJbmZvIixuKX0pLHRoaXMudHJhY2tFeHBlY3RlZFJhdGVfIT0tMSYmdGhpcy5waXBlbGluZV8uc2V0VHJhY2tFeHBlY3RlZFJhdGUodGhpcy50cmFja0V4cGVjdGVkUmF0ZV8pLHRoaXMucGlwZWxpbmVfLnN0YXJ0KHRoaXMucmVhZGFibGVfLHRoaXMud3JpdGFibGVfKS50aGVuKCgpPT57ZSgpfSkuY2F0Y2gobj0+e3Qobil9KX0pfXNldFRyYW5zZm9ybWVycyhlKXtjb25zdCB0PW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykubWVzc2FnZShQLnVwZGF0ZXMudHJhbnNmb3JtZXJfbmV3KS52YXJpYXRpb24oIlVwZGF0ZSIpLmJ1aWxkKCk7cmV0dXJuIGIucmVwb3J0KHQpLHRoaXMudHJhbnNmb3JtZXJzXz1lLHRoaXMucmVhZGFibGVfJiZ0aGlzLndyaXRhYmxlXz90aGlzLnRyYW5zZm9ybUludGVybmFsKCk6UHJvbWlzZS5yZXNvbHZlKCl9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57dGhpcy5waXBlbGluZV8mJnRoaXMucGlwZWxpbmVfLmRlc3Ryb3koKTtjb25zdCB0PW5ldyBfKCkuYWN0aW9uKCJNZWRpYVByb2Nlc3NvciIpLmd1aWQodGhpcy51dWlkXykudmFyaWF0aW9uKCJEZWxldGUiKS5idWlsZCgpO2IucmVwb3J0KHQpLGUoKX0pfX12YXIgX2U9KHI9PihyLkxvdz0iTG93IixyLkhpZ2g9IkhpZ2giLHIpKShfZXx8e30pO2NsYXNzIFlle2NvbnN0cnVjdG9yKGUpe3RoaXMuYmx1ckZpbHRlcl89ZT09PV9lLkhpZ2g/ImJsdXIoMTVweCkiOiJibHVyKDVweCkifWRlc3Ryb3koKXtyZXR1cm4gbmV3IFByb21pc2UoZT0+e2UoKX0pfXJ1blBvc3RQcm9jZXNzaW5nKGUsdCl7dHJ5e2UuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfWNhdGNoKHMpe2NvbnNvbGUubG9nKCJbQmx1clBvc3RQcm9jZXNzXSBGYWlsZWQgdG8gZHJhdyBjYW52YXMiLHMpfX19Y2xhc3MgWmV7Y29uc3RydWN0b3IoKXt9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShlPT57dGhpcy5iZ0ltYWdlXyYmdGhpcy5iZ0ltYWdlXy5jbG9zZSgpLGUoKX0pfXNldFZpcnR1YWxCR0ltYWdlKGUpe3RoaXMuYmdJbWFnZV8mJnRoaXMuYmdJbWFnZV8uY2xvc2UoKSx0aGlzLmJnSW1hZ2VfPWV9YXN5bmMgcnVuUG9zdFByb2Nlc3NpbmcoZSx0KXtpZih0aGlzLmJnSW1hZ2VfKXtpZih0aGlzLmJnSW1hZ2VfLndpZHRoIT10LndpZHRofHx0aGlzLmJnSW1hZ2VfLmhlaWdodCE9dC5oZWlnaHQpe2NvbnN0IHM9ImhpZ2giLG49e3Jlc2l6ZVdpZHRoOnQud2lkdGgscmVzaXplSGVpZ2h0OnQuaGVpZ2h0LHJlc2l6ZVF1YWxpdHk6c307dHJ5e3RoaXMuYmdJbWFnZV89YXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAodGhpcy5iZ0ltYWdlXyxuKX1jYXRjaChvKXt0aHJvdyBvfX1lLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsZS5kcmF3SW1hZ2UodGhpcy5iZ0ltYWdlXywwLDAsdGhpcy5iZ0ltYWdlXy53aWR0aCx0aGlzLmJnSW1hZ2VfLmhlaWdodCl9fX1jbGFzcyBJcntjb25zdHJ1Y3RvcihlPTEvMCl7dGhpcy5jYXBhY2l0eT1lLHRoaXMuc3RvcmFnZT1bXX1lbnF1ZXVlKGUpe2lmKHRoaXMuc2l6ZSgpPT09dGhpcy5jYXBhY2l0eSl0aHJvdyBFcnJvcigiUXVldWUgaGFzIHJlYWNoZWQgbWF4IGNhcGFjaXR5LCB5b3UgY2Fubm90IGFkZCBtb3JlIGl0ZW1zIik7dGhpcy5zdG9yYWdlLnB1c2goZSl9ZGVxdWV1ZSgpe3JldHVybiB0aGlzLnN0b3JhZ2Uuc2hpZnQoKX1zaXplKCl7cmV0dXJuIHRoaXMuc3RvcmFnZS5sZW5ndGh9fWNvbnN0IGJlPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5xdWV1ZV89bmV3IElyfWNsZWFyUXVldWUocil7Zm9yKDt0aGlzLnF1ZXVlXy5zaXplKCk+MDspdGhpcy5xdWV1ZV8uZGVxdWV1ZSgpLmNsb3NlKCl9c2V0VmlkZW9SZWFkYWJsZShyKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9Pnt0aGlzLmZyYW1lUmVhZGVyXz1yLmdldFJlYWRlcigpLHRoaXMuZnJhbWVSZWFkZXJfLnJlYWQoKS50aGVuKHM9Pnt0aGlzLnByb2Nlc3NGcmFtZShzKX0pLmNhdGNoKHM9Pnt0KHMpfSksZSgpfSl9ZGVzdHJveSgpe3JldHVybiBuZXcgUHJvbWlzZShhc3luYyhyLGUpPT57dmFyIHQ7dGhpcy5jbGVhclF1ZXVlKCEwKSx0aGlzLmZyYW1lUmVhZGVyXz8odD10aGlzLmZyYW1lUmVhZGVyXyk9PW51bGx8fHQuY2FuY2VsKCkudGhlbigoKT0+e3IoKX0pLmNhdGNoKHM9PntlKHMpfSk6cigpfSl9cHJvY2Vzc0ZyYW1lKHIpe2lmKCFyLmRvbmUpe2lmKCF0aGlzLmZyYW1lUmVhZGVyXyl7ci52YWx1ZS5jbG9zZSgpO3JldHVybn1mb3IoO3RoaXMucXVldWVfLnNpemUoKT49YmUuTlVNQkVSX09GX0ZSQU1FU19UT19DTEVBUjspe2xldCBlPXRoaXMucXVldWVfLmRlcXVldWUoKTtlJiZlLmNsb3NlKCl9dGhpcy5xdWV1ZV8uZW5xdWV1ZShyLnZhbHVlKSx0aGlzLmZyYW1lUmVhZGVyXy5yZWFkKCkudGhlbihlPT57dGhpcy5wcm9jZXNzRnJhbWUoZSl9KS5jYXRjaChlPT57Y29uc29sZS5lcnJvcihlKX0pfX1ydW5Qb3N0UHJvY2Vzc2luZyhyLGUpe3RyeXtpZihyLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0iZGVzdGluYXRpb24tb3ZlciIsdGhpcy5xdWV1ZV8uc2l6ZSgpPmJlLk5VTUJFUl9PRl9GUkFNRVNfVE9fQ0xFQVImJnRoaXMuY2xlYXJRdWV1ZSghMSksdGhpcy5xdWV1ZV8uc2l6ZSgpPjApe2NvbnN0IHQ9dGhpcy5xdWV1ZV8uZGVxdWV1ZSgpO3IuZHJhd0ltYWdlKHQsMCwwLGUud2lkdGgsZS5oZWlnaHQpLHQuY2xvc2UoKX19Y2F0Y2godCl7Y29uc29sZS5lcnJvcigiW1ZpZGVvUG9zdFByb2Nlc3NdIEZhaWxlZCB0byBkcmF3IGNhbnZhcyIsdCl9fX07bGV0IHdlPWJlO3dlLk5VTUJFUl9PRl9GUkFNRVNfVE9fQ0xFQVI9NTtjbGFzcyB4cntjb25zdHJ1Y3RvcihlKXt0aGlzLmJsdXJGaWx0ZXJfPWU9PT1fZS5IaWdoPyJibHVyKDE1cHgpIjoiYmx1cig1cHgpIn1kZXN0cm95KCl7cmV0dXJuIG5ldyBQcm9taXNlKGU9PntlKCl9KX1ydW5Qb3N0UHJvY2Vzc2luZyhlLHQpe3RyeXtlLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLWluIixlLmZpbHRlcj10aGlzLmJsdXJGaWx0ZXJfLGUuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGUuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJkZXN0aW5hdGlvbi1vdmVyIixlLmZpbHRlcj0iYmx1cigwcHgpIixlLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KX1jYXRjaChzKXtjb25zb2xlLmxvZygiW0JsdXJQb3N0UHJvY2Vzc10gRmFpbGVkIHRvIGRyYXcgY2FudmFzIixzKX19fWNvbnN0IHc9Y2xhc3N7Y29uc3RydWN0b3IoKXtpZih0aGlzLmxhc3RQcm9jZXNzZWRUaW1lc3RhbXBfPTAsdGhpcy5uZXdJbnB1dENvdW50ZXI9MCx0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucmVzdWx0Q2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSksdGhpcy5yZXN1bHRDdHhfPXRoaXMucmVzdWx0Q2FudmFzXy5nZXRDb250ZXh0KCIyZCIse2FscGhhOiExLGRlc3luY2hyb25pemVkOiEwfSksIXRoaXMucmVzdWx0Q3R4Xyl0aHJvdyBuZXcgRXJyb3IoIlVuYWJsZSB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIik7aWYodGhpcy5zZWdtZW50YXRpb25NYXNrQ2FudmFzXz1uZXcgT2Zmc2NyZWVuQ2FudmFzKHcuU0VMRklFX1dJRFRILHcuU0VMRklFX0hJR0hUKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfPXRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uZ2V0Q29udGV4dCgiMmQiLHthbHBoYTohMSxkZXN5bmNocm9uaXplZDohMH0pLCF0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIGNyZWF0ZSBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQiKX1pbml0KHIpe3RoaXMucHJvY2Vzc0ZyYW1lQ2I9cn1hc3luYyBzZXRCYWNrZ3JvdW5kT3B0aW9ucyhyKXtpZih0eXBlb2YgdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8hPSJ1bmRlZmluZWQiKXRyeXthd2FpdCB0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXy5kZXN0cm95KCl9Y2F0Y2goZSl7dGhyb3cgZX1pZihyLnRyYW5zZm9ybWVyVHlwZT09PSJWaXJ0dWFsQmFja2dyb3VuZCIpdGhpcy50aW1lckdhcF89dy5WSVJUVUFMX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgWmU7ZWxzZSBpZihyLnRyYW5zZm9ybWVyVHlwZT09PSJCYWNrZ3JvdW5kQmx1ciIpe2xldCBlPXI7dGhpcy50aW1lckdhcF89dy5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORCx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXz1uZXcgWWUoZS5yYWRpdXMpfWVsc2UgaWYoci50cmFuc2Zvcm1lclR5cGU9PT0iVmlkZW9CYWNrZ3JvdW5kIil0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyB3ZTtlbHNlIGlmKHIudHJhbnNmb3JtZXJUeXBlPT09IlNpbHVldGVCbHVyIil7bGV0IGU9cjt0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyB4cihlLnJhZGl1cyl9ZWxzZSB0aGlzLnRpbWVyR2FwXz13LkJMVVJfUFJPQ0VTU19HQVBfTUlDUk9fU0VDT05ELHRoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfPW5ldyBZZX1jbG9zZSgpe3JldHVybiBuZXcgUHJvbWlzZSgocixlKT0+e3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfP3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLmRlc3Ryb3koKS50aGVuKCgpPT57cigpfSkuY2F0Y2godD0+e2UodCl9KTpyKCl9KX1zdGFydCgpe31hc3luYyB0cmFuc2Zvcm0ocixlKXsodGhpcy5yZXN1bHRDYW52YXNfLndpZHRoIT1yLmRpc3BsYXlXaWR0aHx8dGhpcy5yZXN1bHRDYW52YXNfLmhlaWdodCE9ci5kaXNwbGF5SGVpZ2h0KSYmKHRoaXMucmVzdWx0Q2FudmFzXy53aWR0aD1yLmRpc3BsYXlXaWR0aCx0aGlzLnJlc3VsdENhbnZhc18uaGVpZ2h0PXIuZGlzcGxheUhlaWdodCk7Y29uc3QgdD1yLnRpbWVzdGFtcDtjcmVhdGVJbWFnZUJpdG1hcChyKS50aGVuKHM9PntyLmNsb3NlKCksdGhpcy5wcm9jZXNzRnJhbWUoZSxzLHQpfSkuY2F0Y2gocz0+e2UuZW5xdWV1ZShyKX0pfXByb2Nlc3NGcmFtZShyLGUsdCl7KHRoaXMubmV3SW5wdXRDb3VudGVyPHcuTkVXX0lOUFVUX05VTUJFUl9PRl9SVU5TfHx0LXRoaXMubGFzdFByb2Nlc3NlZFRpbWVzdGFtcF8+PXRoaXMudGltZXJHYXBfKSYmKHRoaXMubGFzdFByb2Nlc3NlZFRpbWVzdGFtcF89dCx0aGlzLnByb2Nlc3NTb3VyY2UoZSksdGhpcy5uZXdJbnB1dENvdW50ZXI8dy5ORVdfSU5QVVRfTlVNQkVSX09GX1JVTlMmJnRoaXMubmV3SW5wdXRDb3VudGVyKyspLHRoaXMucmVzdWx0Q3R4Xy5zYXZlKCksdGhpcy5yZXN1bHRDdHhfLmNsZWFyUmVjdCgwLDAsdGhpcy5yZXN1bHRDYW52YXNfLndpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQpLHRoaXMuc2VnbWVudGF0aW9uTWFza0ltYWdlXyYmKHRoaXMucmVzdWx0Q3R4Xy5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb249ImNvcHkiLHRoaXMucmVzdWx0Q3R4Xy5kcmF3SW1hZ2UodGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfLDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV8ud2lkdGgsdGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfLmhlaWdodCwwLDAsdGhpcy5yZXN1bHRDYW52YXNfLndpZHRoLHRoaXMucmVzdWx0Q2FudmFzXy5oZWlnaHQpKSx0aGlzLnJlc3VsdEN0eF8uZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uPSJzb3VyY2UtYXRvcCIsdGhpcy5yZXN1bHRDdHhfLmZpbHRlcj0ibm9uZSIsdGhpcy5yZXN1bHRDdHhfLmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXyYmdGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8ucnVuUG9zdFByb2Nlc3NpbmcodGhpcy5yZXN1bHRDdHhfLGUpLHRoaXMucmVzdWx0Q3R4Xy5yZXN0b3JlKCksci5lbnF1ZXVlKG5ldyBWaWRlb0ZyYW1lKHRoaXMucmVzdWx0Q2FudmFzXyx7dGltZXN0YW1wOnQsYWxwaGE6ImRpc2NhcmQifSkpLGUuY2xvc2UoKX1wcm9jZXNzU291cmNlKHIpe2lmKHRoaXMuc2VnbWVudGF0aW9uTWFza0N0eF8uY2xlYXJSZWN0KDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uaGVpZ2h0KSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDdHhfLmRyYXdJbWFnZShyLDAsMCxyLndpZHRoLHIuaGVpZ2h0LDAsMCx0aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLndpZHRoLHRoaXMuc2VnbWVudGF0aW9uTWFza0NhbnZhc18uaGVpZ2h0KSx0aGlzLnByb2Nlc3NGcmFtZUNiKXtsZXQgZT10aGlzLnNlZ21lbnRhdGlvbk1hc2tDYW52YXNfLnRyYW5zZmVyVG9JbWFnZUJpdG1hcCgpO3RoaXMucHJvY2Vzc0ZyYW1lQ2IoZSl9fWZsdXNoKCl7fWdldFRyYW5zZm9ybWVyVHlwZSgpe3JldHVybiJCYWNrZ3JvdW5kVHJhbnNmb3JtZXIifXJlc2V0TmV3SW5wdXRDb3VuZXIoKXt0aGlzLm5ld0lucHV0Q291bnRlcj0wfXNldFZpZGVvQkdSZWFkYWJsZShyKXtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9Pnt0aGlzLnBvc3RQcm9jZXNzSW50ZXJmYWNlXyBpbnN0YW5jZW9mIHdlP3RoaXMucG9zdFByb2Nlc3NJbnRlcmZhY2VfLnNldFZpZGVvUmVhZGFibGUocikudGhlbigoKT0+e2UoKX0pLmNhdGNoKHM9Pnt0KHMpfSk6dCgicG9zdCBwcm9jZXNzIGlzIG5vdCB2aWRlbyIpfSl9c2V0VmlydHVhbEJHSW1hZ2Uocil7cmV0dXJuIG5ldyBQcm9taXNlKChlLHQpPT57dGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8gaW5zdGFuY2VvZiBaZT8odGhpcy5wb3N0UHJvY2Vzc0ludGVyZmFjZV8uc2V0VmlydHVhbEJHSW1hZ2UociksZSgpKTp0KCJwb3N0IHByb2Nlc3MgaXMgbm90IHZpZGVvIil9KX1zZXRTZWdtZW50YXRpb25NYXNrSW1hZ2Uocil7dGhpcy5zZWdtZW50YXRpb25NYXNrSW1hZ2VfJiZ0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV8uY2xvc2UoKSx0aGlzLnNlZ21lbnRhdGlvbk1hc2tJbWFnZV89cn19O2xldCBOPXc7Ti5CTFVSX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORD0yZTUsTi5WSVJUVUFMX1BST0NFU1NfR0FQX01JQ1JPX1NFQ09ORD0xNWU0LE4uTkVXX0lOUFVUX05VTUJFUl9PRl9SVU5TPTMwLE4uU0VMRklFX1dJRFRIPTI1NixOLlNFTEZJRV9ISUdIVD0xNDQ7ZnVuY3Rpb24gTXIocil7cmV0dXJuIHR5cGVvZiByPT0ib2JqZWN0IiYmciE9PW51bGwmJiJtZXNzYWdlImluIHImJnR5cGVvZiByLm1lc3NhZ2U9PSJzdHJpbmcifWZ1bmN0aW9uIEFyKHIpe2lmKE1yKHIpKXJldHVybiByO3RyeXtyZXR1cm4gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHIpKX1jYXRjaHtyZXR1cm4gbmV3IEVycm9yKFN0cmluZyhyKSl9fWZ1bmN0aW9uIFUocil7cmV0dXJuIHR5cGVvZiByPT0idW5kZWZpbmVkIj8iIjpBcihyKS5tZXNzYWdlfWlmKHR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iKXtsZXQgcj1mdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZSgocyxuKT0+e2U9bmV3IE9yLGUub24oImVycm9yIixpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfZXJyb3JfZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksZS5vbigid2FybiIsaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToibWVkaWFfcHJvY2Vzc29yX3dhcm5fZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksZS5vbigicGlwZWxpbmVJbmZvIixpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJtZWRpYV9wcm9jZXNzb3JfcGlwZWxpbmVfZXZlbnQiLG1lc3NhZ2U6aX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSksdD1uZXcgTix0LmluaXQoaT0+e3Bvc3RNZXNzYWdlKGksW2ldKX0pO2xldCBvPVtdO28ucHVzaCh0KSxlLnNldFRyYW5zZm9ybWVycyhvKS50aGVuKCgpPT57cygpfSkuY2F0Y2goaT0+e24oaSl9KX0pfSxlLHQ7b25tZXNzYWdlPWFzeW5jIHM9PntpZihzLmRhdGEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7dCYmdC5zZXRTZWdtZW50YXRpb25NYXNrSW1hZ2Uocy5kYXRhKTtyZXR1cm59Y29uc3R7b3BlcmF0aW9uOm59PXMuZGF0YTtpZihuPT09ImluaXQiKXtjb25zdHttZXRhRGF0YTpvfT1zLmRhdGE7dHlwZW9mIG89PSJzdHJpbmciJiZkcihKU09OLnBhcnNlKG8pKSxyKCkudGhlbigoKT0+e2NvbnN0IGk9e2NhbGxiYWNrVHlwZToic3VjY2VzcyIsbWVzc2FnZTpufTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShpKSl9KS5jYXRjaChpPT57Y29uc3QgYT17Y2FsbGJhY2tUeXBlOiJlcnJvciIsbWVzc2FnZTpuLGVycm9yOlUoaSl9O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGEpKX0pfWVsc2UgaWYobj09PSJ0cmFuc2Zvcm0iKXtjb25zdHtyZWFkYWJsZTpvLHdyaXRhYmxlOml9PXMuZGF0YTt0LnJlc2V0TmV3SW5wdXRDb3VuZXIoKSxlLnRyYW5zZm9ybShvLGkpLnRoZW4oKCk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSkuY2F0Y2goYT0+e2NvbnN0IGw9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpVKGEpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShsKSl9KX1lbHNlIGlmKG49PT0iZGVzdHJveSIpdC5jbG9zZSgpLmZpbmFsbHkoKCk9PntlLmRlc3Ryb3koKS50aGVuKCgpPT57Y29uc3Qgbz17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KG8pKX0pLmNhdGNoKG89Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6VShvKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSl9KTtlbHNlIGlmKG49PT0ic2V0VHJhY2tFeHBlY3RlZFJhdGUiKXtlLnNldFRyYWNrRXhwZWN0ZWRSYXRlKHMuZGF0YS5yYXRlKTtjb25zdCBvPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobykpfWVsc2UgaWYobj09PSJzZXRCYWNrZ3JvdW5kT3B0aW9ucyIpe2NvbnN0e2JhY2tncm91bmRPcHRpb25zOm99PXMuZGF0YTt0LnNldEJhY2tncm91bmRPcHRpb25zKEpTT04ucGFyc2UobykpLnRoZW4oKCk9Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSkuY2F0Y2goaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpVKGkpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KX1lbHNlIGlmKG49PT0ic2V0VmlkZW9CR1JlYWRhYmxlIil7Y29uc3R7cmVhZGFibGU6b309cy5kYXRhO3Quc2V0VmlkZW9CR1JlYWRhYmxlKG8pLnRoZW4oKCk9Pntjb25zdCBpPXtjYWxsYmFja1R5cGU6InN1Y2Nlc3MiLG1lc3NhZ2U6bn07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaSkpfSkuY2F0Y2goaT0+e2NvbnN0IGE9e2NhbGxiYWNrVHlwZToiZXJyb3IiLG1lc3NhZ2U6bixlcnJvcjpVKGkpfTtwb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShhKSl9KX1lbHNlIGlmKG49PT0ic2V0VmlydHVhbEJHSW1hZ2UiKXtjb25zdHtpbWFnZTpvfT1zLmRhdGE7dC5zZXRWaXJ0dWFsQkdJbWFnZShvKS50aGVuKCgpPT57Y29uc3QgaT17Y2FsbGJhY2tUeXBlOiJzdWNjZXNzIixtZXNzYWdlOm59O3Bvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KGkpKX0pLmNhdGNoKGk9Pntjb25zdCBhPXtjYWxsYmFja1R5cGU6ImVycm9yIixtZXNzYWdlOm4sZXJyb3I6VShpKX07cG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoYSkpfSl9fX19KSgpOwo=",sl=typeof window!="undefined"&&window.Blob&&new Blob([atob(dl)],{type:"text/javascript;charset=utf-8"});function zt(){const c=sl&&(window.URL||window.webkitURL).createObjectURL(sl);try{return c?new Worker(c,{}):new Worker("data:application/javascript;base64,"+dl,{type:"module"})}finally{c&&(window.URL||window.webkitURL).revokeObjectURL(c)}}const f=new WeakMap,le=new WeakMap,T=new WeakMap,We=Symbol("anyProducer"),al=Promise.resolve(),te=Symbol("listenerAdded"),ce=Symbol("listenerRemoved");let Ve=!1;function g(c){if(typeof c!="string"&&typeof c!="symbol")throw new TypeError("eventName must be a string or a symbol")}function ie(c){if(typeof c!="function")throw new TypeError("listener must be a function")}function v(c,e){const l=le.get(c);return l.has(e)||l.set(e,new Set),l.get(e)}function B(c,e){const l=typeof e=="string"||typeof e=="symbol"?e:We,t=T.get(c);return t.has(l)||t.set(l,new Set),t.get(l)}function Ft(c,e,l){const t=T.get(c);if(t.has(e))for(const i of t.get(e))i.enqueue(l);if(t.has(We)){const i=Promise.all([e,l]);for(const d of t.get(We))d.enqueue(i)}}function ol(c,e){e=Array.isArray(e)?e:[e];let l=!1,t=()=>{},i=[];const d={enqueue(n){i.push(n),t()},finish(){l=!0,t()}};for(const n of e)B(c,n).add(d);return{async next(){return i?i.length===0?l?(i=void 0,this.next()):(await new Promise(n=>{t=n}),this.next()):{done:!1,value:await i.shift()}:{done:!0}},async return(n){i=void 0;for(const s of e)B(c,s).delete(d);return t(),arguments.length>0?{done:!0,value:await n}:{done:!0}},[Symbol.asyncIterator](){return this}}}function Zl(c){if(c===void 0)return ml;if(!Array.isArray(c))throw new TypeError("`methodNames` must be an array of strings");for(const e of c)if(!ml.includes(e))throw typeof e!="string"?new TypeError("`methodNames` element must be a string"):new Error(`${e} is not Emittery method`);return c}const Re=c=>c===te||c===ce;class Y{static mixin(e,l){return l=Zl(l),t=>{if(typeof t!="function")throw new TypeError("`target` must be function");for(const n of l)if(t.prototype[n]!==void 0)throw new Error(`The property \`${n}\` already exists on \`target\``);function i(){return Object.defineProperty(this,e,{enumerable:!1,value:new Y}),this[e]}Object.defineProperty(t.prototype,e,{enumerable:!1,get:i});const d=n=>function(...s){return this[e][n](...s)};for(const n of l)Object.defineProperty(t.prototype,n,{enumerable:!1,value:d(n)});return t}}static get isDebugEnabled(){if(typeof process!="object")return Ve;const{env:e}=process||{env:{}};return e.DEBUG==="emittery"||e.DEBUG==="*"||Ve}static set isDebugEnabled(e){Ve=e}constructor(e={}){f.set(this,new Set),le.set(this,new Map),T.set(this,new Map),this.debug=e.debug||{},this.debug.enabled===void 0&&(this.debug.enabled=!1),this.debug.logger||(this.debug.logger=(l,t,i,d)=>{try{d=JSON.stringify(d)}catch{d=`Object with the following keys failed to stringify: ${Object.keys(d).join(",")}`}typeof i=="symbol"&&(i=i.toString());const n=new Date,s=`${n.getHours()}:${n.getMinutes()}:${n.getSeconds()}.${n.getMilliseconds()}`;console.log(`[${s}][emittery:${l}][${t}] Event Name: ${i}
|
|
4
|
+
data: ${d}`)})}logIfDebugEnabled(e,l,t){(Y.isDebugEnabled||this.debug.enabled)&&this.debug.logger(e,this.debug.name,l,t)}on(e,l){ie(l),e=Array.isArray(e)?e:[e];for(const t of e)g(t),v(this,t).add(l),this.logIfDebugEnabled("subscribe",t,void 0),Re(t)||this.emit(te,{eventName:t,listener:l});return this.off.bind(this,e,l)}off(e,l){ie(l),e=Array.isArray(e)?e:[e];for(const t of e)g(t),v(this,t).delete(l),this.logIfDebugEnabled("unsubscribe",t,void 0),Re(t)||this.emit(ce,{eventName:t,listener:l})}once(e){return new Promise(l=>{const t=this.on(e,i=>{t(),l(i)})})}events(e){e=Array.isArray(e)?e:[e];for(const l of e)g(l);return ol(this,e)}async emit(e,l){g(e),this.logIfDebugEnabled("emit",e,l),Ft(this,e,l);const t=v(this,e),i=f.get(this),d=[...t],n=Re(e)?[]:[...i];await al,await Promise.all([...d.map(async s=>{if(t.has(s))return s(l)}),...n.map(async s=>{if(i.has(s))return s(e,l)})])}async emitSerial(e,l){g(e),this.logIfDebugEnabled("emitSerial",e,l);const t=v(this,e),i=f.get(this),d=[...t],n=[...i];await al;for(const s of d)t.has(s)&&await s(l);for(const s of n)i.has(s)&&await s(e,l)}onAny(e){return ie(e),this.logIfDebugEnabled("subscribeAny",void 0,void 0),f.get(this).add(e),this.emit(te,{listener:e}),this.offAny.bind(this,e)}anyEvent(){return ol(this)}offAny(e){ie(e),this.logIfDebugEnabled("unsubscribeAny",void 0,void 0),this.emit(ce,{listener:e}),f.get(this).delete(e)}clearListeners(e){e=Array.isArray(e)?e:[e];for(const l of e)if(this.logIfDebugEnabled("clear",l,void 0),typeof l=="string"||typeof l=="symbol"){v(this,l).clear();const t=B(this,l);for(const i of t)i.finish();t.clear()}else{f.get(this).clear();for(const t of le.get(this).values())t.clear();for(const t of T.get(this).values()){for(const i of t)i.finish();t.clear()}}}listenerCount(e){e=Array.isArray(e)?e:[e];let l=0;for(const t of e){if(typeof t=="string"){l+=f.get(this).size+v(this,t).size+B(this,t).size+B(this).size;continue}typeof t!="undefined"&&g(t),l+=f.get(this).size;for(const i of le.get(this).values())l+=i.size;for(const i of T.get(this).values())l+=i.size}return l}bindMethods(e,l){if(typeof e!="object"||e===null)throw new TypeError("`target` must be an object");l=Zl(l);for(const t of l){if(e[t]!==void 0)throw new Error(`The property \`${t}\` already exists on \`target\``);Object.defineProperty(e,t,{enumerable:!1,value:this[t].bind(this)})}}}const ml=Object.getOwnPropertyNames(Y.prototype).filter(c=>c!=="constructor");Object.defineProperty(Y,"listenerAdded",{value:te,writable:!1,enumerable:!0,configurable:!1}),Object.defineProperty(Y,"listenerRemoved",{value:ce,writable:!1,enumerable:!0,configurable:!1});var rl=Y;const J=class{constructor(){this.mediapipeMap_=new Map}getVersion(c){switch(c){case"face_detection":return K.VERSION;case"face_mesh":return Ye.VERSION;case"hands":return Ie.VERSION;case"holistic":return Ke.VERSION;case"objectron":return Se.VERSION;case"selfie_segmentation":return He.VERSION;case"pose":return Le.VERSION;default:return""}}initialize(c){return new Promise(async(e,l)=>{if(c.mediaPipeModelConfigArray.length==0){l("no model was selected");return}for(let t=0;t<c.mediaPipeModelConfigArray.length;t++){const i=c.mediaPipeModelConfigArray[t];if(this.mediapipeMap_.has(i.modelType)){l("setting same type is not supported");return}if(typeof i.listener!="function"){l(`[${i.modelType}] ResultsListener must be provided`);return}let d;switch(i.modelType){case"face_mesh":d=new Ye.FaceMesh({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"face_mesh/"+this.getVersion("face_mesh"))+"/"+n});break;case"face_detection":d=new K.FaceDetection({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"face_detection/"+this.getVersion("face_detection"))+"/"+n});break;case"hands":if(d=new Ie.Hands({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"hands/"+this.getVersion("hands"))+"/"+n}),i.options){let n=i.options;n.modelComplexity||(console.warn("hands model require modelComplexity setting to 0"),n.modelComplexity=0)}else{console.warn("hands model require modelComplexity setting to 0");let n={modelComplexity:0};i.options=n}break;case"holistic":d=new Ke.Holistic({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"holistic/"+this.getVersion("holistic"))+"/"+n});break;case"objectron":d=new Se.Objectron({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"objectron/"+this.getVersion("objectron"))+"/"+n});break;case"selfie_segmentation":d=new He.SelfieSegmentation({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"selfie_segmentation/"+this.getVersion("selfie_segmentation"))+"/"+n});break;case"pose":d=new Le.Pose({locateFile:(n,s)=>(i.assetsUri||J.defaultAssetsBaseUrl+"pose/"+this.getVersion("pose"))+"/"+n});break;default:l("unknown model type");return}d.onResults(i.listener),i.options&&d.setOptions(i.options);try{await d.initialize(),this.mediapipeMap_.set(i.modelType,d)}catch(n){l(n);return}}e()})}close(c){return new Promise((e,l)=>{let t=[];if(c){let i=this.mediapipeMap_.get(c);if(i)this.mediapipeMap_.delete(c),t.push(i.close());else{l("model not exit");return}}else{for(const[i,d]of this.mediapipeMap_.entries())t.push(d.close());this.mediapipeMap_.clear()}Promise.all(t).then(()=>{e()}).catch(i=>{l(i)})})}send(c,e){return new Promise((l,t)=>{let i=[];if(e){let d=this.mediapipeMap_.get(e);if(d)i.push(d.send({image:c}));else{t("model not exit");return}}else for(const[d,n]of this.mediapipeMap_.entries())i.push(n.send({image:c}));Promise.all(i).then(()=>{l()}).catch(d=>{t(d)})})}reset(c){if(c){let e=this.mediapipeMap_.get(c);e&&typeof e.reset=="function"&&e.reset()}else for(const[e,l]of this.mediapipeMap_.entries())l&&typeof l.reset=="function"&&l.reset()}};let fe=J;fe.defaultAssetsBaseUrl="https://d3opqjmqzxf057.cloudfront.net/ml/mediapipe/";class bl{static createVideoReadable(e){return new Promise((l,t)=>{const i=document.createElement("video");let d=new AbortController,n=new AbortController;i.addEventListener("canplay",()=>{d.abort(),i.muted=!0,i.loop=!0,i.play().then(()=>{try{const s=i.captureStream(),o=new MediaStreamTrackProcessor(s.getVideoTracks()[0]);l(o.readable)}catch(s){t(s)}})},{once:!0,signal:n.signal}),i.addEventListener("error",s=>{n.abort(),t("loading error:"+s)},{once:!0,signal:d.signal}),i.src=e})}static createImageCanvas(e){return new Promise((l,t)=>{var i=new Image;i.onload=function(){createImageBitmap(i).then(d=>{i.remove(),l(d)}).catch(d=>{t(d)})},i.onerror=function(d){t(d)},i.src=e})}}class gt extends rl{constructor(){super(),this.worker_=new zt,this.trackExpectedRate_=-1,this.workerInited_=!1,this.mediapipeHelper_=new fe,this.innerEmitty_=new rl,this.worker_.addEventListener("message",e=>{if(e.data instanceof ImageBitmap)this.mediapipeHelper_.send(e.data).then(()=>{e.data.close()}).catch(l=>{let t={error:l,eventMetaData:{transformerIndex:-1},function:"transform"};this.emit("error",t)});else{let l=JSON.parse(e.data);if(l.callbackType==="success"||l.callbackType==="error")l.message==="init"?this.innerEmitty_.emit("initResults",e.data):l.message==="transform"?this.innerEmitty_.emit("transformResults",e.data):l.message==="destroy"?this.innerEmitty_.emit("destroyResults",e.data):l.message==="setBackgroundOptions"?this.innerEmitty_.emit("setBackgroundOptionsResults",e.data):l.message==="setVideoBGReadable"?this.innerEmitty_.emit("setVideoBGReadableResults",e.data):l.message==="setVirtualBGImage"&&this.innerEmitty_.emit("setVirtualBGImageResults",e.data);else if(l.callbackType==="media_processor_error_event")this.emit("error",l.message);else if(l.callbackType==="media_processor_warn_event")this.emit("warn",l.message);else if(l.callbackType==="media_processor_pipeline_event"){this.emit("pipelineInfo",l.message);let t=l.message;(t.message==="pipeline_ended"||t.message==="pipeline_ended_with_error")&&this.mediapipeHelper_.close().finally(()=>{this.worker_&&this.worker_.terminate()})}}})}init(e){return new Promise((l,t)=>{let i={modelSelection:1,selfieMode:!1};this.mediapipeHelper_.initialize({mediaPipeModelConfigArray:[{assetsUri:e.mediapipeBaseAssetsUri,modelType:"selfie_segmentation",options:i,listener:d=>{let n=d;this.worker_.postMessage(n.segmentationMask,[n.segmentationMask])}}]}).then(()=>{let d=JSON.stringify(Kt());typeof d!="string"&&(d=JSON.stringify({})),this.worker_.postMessage({operation:"init",metaData:d}),this.innerEmitty_.once("initResults").then(n=>{let s=JSON.parse(n);s.callbackType==="success"?(this.workerInited_=!0,this.trackExpectedRate_!=-1&&this.postTrackExpectedRate(),this.setBackgroundOptions(e).then(()=>{l()}).catch(o=>{t(o)})):t(s.error)}).catch(n=>{t(n)})}).catch(d=>{t(d)})})}transform(e,l){return new Promise(async(t,i)=>{this.worker_.postMessage({operation:"transform",readable:e,writable:l},[e,l]),this.innerEmitty_.once("transformResults").then(d=>{let n=JSON.parse(d);n.callbackType==="success"?t():i(n.error)}).catch(d=>{i(d)})})}destroy(){return new Promise(async(e,l)=>{this.worker_.postMessage({operation:"destroy"}),this.innerEmitty_.once("destroyResults").then(t=>{let i=JSON.parse(t);i.callbackType==="success"?this.mediapipeHelper_.close().then(()=>{e()}).catch(d=>{l(d)}):l(i.error)}).catch(t=>{l(t)})})}setTrackExpectedRate(e){this.trackExpectedRate_=e,this.postTrackExpectedRate()}postTrackExpectedRate(){this.workerInited_&&this.worker_.postMessage({operation:"setTrackExpectedRate",rate:this.trackExpectedRate_})}setBackgroundOptions(e){return new Promise((l,t)=>{this.worker_.postMessage({operation:"setBackgroundOptions",backgroundOptions:JSON.stringify(e)}),this.innerEmitty_.once("setBackgroundOptionsResults").then(i=>{let d=JSON.parse(i);d.callbackType==="success"?e.transformerType==="VideoBackground"?bl.createVideoReadable(e.backgroundAssetUri).then(n=>{this.worker_.postMessage({operation:"setVideoBGReadable",readable:n},[n]),this.innerEmitty_.once("setVideoBGReadableResults").then(s=>{let o=JSON.parse(s);o.callbackType==="success"?l():t(o.error)}).catch(s=>{t(s)})}).catch(n=>{t(n)}):e.transformerType==="VirtualBackground"?bl.createImageCanvas(e.backgroundAssetUri).then(n=>{this.worker_.postMessage({operation:"setVirtualBGImage",image:n},[n]),this.innerEmitty_.once("setVirtualBGImageResults").then(s=>{let o=JSON.parse(s);o.callbackType==="success"?l():t(o.error)}).catch(s=>{t(s)})}).catch(n=>{t(n)}):l():t(d.error)}).catch(i=>{t(i)})})}}var ul=(c=>(c.Low="Low",c.High="High",c))(ul||{});const vt=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]));function Ut(){return new Promise(async(c,e)=>{try{await Xl()}catch(l){e(l);return}vt().then(l=>{if(l===!1){e("Your browser does not support WebAssembly features.");return}c()}).catch(l=>{e(l)})})}let W,ne=-1;function kt(){return W}function xt(c){ne=c,typeof W!="undefined"&&W.setTrackExpectedRate(ne)}function Ct(c){return new Promise(async(e,l)=>{W=new gt,ne!=-1&&W.setTrackExpectedRate(ne),W.init(c).then(()=>{const t=new Nt(W);e(t)}).catch(t=>{l(t)})})}function Tt(c){return new Promise((e,l)=>{W?W.setBackgroundOptions(c).then(()=>{e()}).catch(t=>{l(t)}):l("media processor is not set")})}m.BlurRadius=ul,m.MediapipeHelper=fe,m.createVonageMediaProcessorConnector=Ct,m.getVonageEventEmitter=kt,m.isSupported=Ut,m.setBackgroundOptions=Tt,m.setTrackExpectedRate=xt,Object.defineProperties(m,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
package/dist/types/main.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { EventDataMap, MediaProcessorConnectorInterface } from '@vonage/media-processor';
|
|
2
|
-
import { BlurRadius, BackgroundBlurConfig, VirtualBackgroundConfig, AssetBackgroundConfig, VideoBackgroundConfig, MediaProcessorBaseConfig, SilueteBlurConfig } from './src/types';
|
|
2
|
+
import { BlurRadius, BackgroundBlurConfig, VirtualBackgroundConfig, AssetBackgroundConfig, VideoBackgroundConfig, MediaProcessorBaseConfig, SilueteBlurConfig, MediapipeConfig, MediaPipeResults, MediaPipeResultsListener, MediaPipeModelType, FaceDetectionResults, FaceDetectionOptions, FaceMeshResults, FaceMeshOptions, HandsResults, HandsOptions, HolisticResults, HolisticOptions, ObjectronResults, ObjectronOptions, PoseResults, PoseOptions, SelfieSegmentationResults, SelfieSegmentationOptions, MediaPipeModelConfig } from './src/types';
|
|
3
3
|
import { isSupported } from './src/utils/utils';
|
|
4
4
|
import Emittery from 'emittery';
|
|
5
|
+
import MediapipeHelper from './src/transformers/MediapipeHelper';
|
|
6
|
+
/**
|
|
7
|
+
* BackgroundOptions background options
|
|
8
|
+
*/
|
|
9
|
+
declare type BackgroundOptions = BackgroundBlurConfig | ((VirtualBackgroundConfig | VideoBackgroundConfig) & AssetBackgroundConfig) | SilueteBlurConfig;
|
|
5
10
|
/**
|
|
6
11
|
* MediaProcessorConfig specifies the transformer logic to be performed.
|
|
7
12
|
*
|
|
@@ -11,36 +16,32 @@ import Emittery from 'emittery';
|
|
|
11
16
|
* let config: MediaProcessorConfig;
|
|
12
17
|
* if(typeType === 'blur'){
|
|
13
18
|
* config = {
|
|
14
|
-
*
|
|
15
|
-
* tfliteAssetUriPath: location.href,
|
|
19
|
+
* mediapipeBaseAssetsUri: 'https://example.com', // mediapipeBaseAssetsUri is optional we provide static assets for it
|
|
16
20
|
* transformerType: 'BackgroundBlur',
|
|
17
21
|
* radius: blurLevelType === 'low' ? BlurRadius.Low : BlurRadius.High,
|
|
18
22
|
* };
|
|
19
23
|
* } else if(typeType === 'virtual'){
|
|
20
24
|
* config = {
|
|
21
|
-
*
|
|
22
|
-
* tfliteAssetUriPath: location.href,
|
|
25
|
+
* mediapipeBaseAssetsUri: 'https://example.com', // mediapipeBaseAssetsUri is optional we provide static assets for it
|
|
23
26
|
* transformerType: 'VirtualBackground',
|
|
24
27
|
* backgroundAssetUri: location.href + "images/vonage.jpeg"
|
|
25
28
|
* }
|
|
26
29
|
* } else if(typeType === 'video') {
|
|
27
30
|
* config = {
|
|
28
|
-
*
|
|
29
|
-
* tfliteAssetUriPath: location.href,
|
|
31
|
+
* mediapipeBaseAssetsUri: 'https://example.com', // mediapipeBaseAssetsUri is optional we provide static assets for it
|
|
30
32
|
* transformerType: 'VideoBackground',
|
|
31
33
|
* backgroundAssetUri: location.href + 'videos/bbb.mp4'
|
|
32
34
|
* };
|
|
33
35
|
* } else if(typeType === 'siluete') {
|
|
34
36
|
* config = {
|
|
35
|
-
*
|
|
36
|
-
* tfliteAssetUriPath: location.href,
|
|
37
|
+
* mediapipeBaseAssetsUri: 'https://example.com', // mediapipeBaseAssetsUri is optional we provide static assets for it
|
|
37
38
|
* transformerType: 'SilueteBlur',
|
|
38
39
|
* radius: blurLevelType === 'low' ? BlurRadius.Low : BlurRadius.High,
|
|
39
40
|
* };
|
|
40
41
|
* }
|
|
41
42
|
* ```
|
|
42
43
|
*/
|
|
43
|
-
declare type MediaProcessorConfig = MediaProcessorBaseConfig &
|
|
44
|
+
declare type MediaProcessorConfig = MediaProcessorBaseConfig & BackgroundOptions;
|
|
44
45
|
/**
|
|
45
46
|
* Registers for error and warn events that come from the library on run time.
|
|
46
47
|
* see @EventDataMap for more info.
|
|
@@ -57,6 +58,21 @@ declare function getVonageEventEmitter(): Emittery<EventDataMap>;
|
|
|
57
58
|
* @param trackExpectedRate - number holds the predicted track rate. -1 for disable this monitor.
|
|
58
59
|
*/
|
|
59
60
|
declare function setTrackExpectedRate(trackExpectedRate: number): void;
|
|
61
|
+
/**
|
|
62
|
+
* builder function to create MediaProcessorConnectorInterface
|
|
63
|
+
* This function hides all the functionality of the @vonage/media-processor library.
|
|
64
|
+
* using this create function promises the user the best performance of background operations.
|
|
65
|
+
* @param config - see `MediaProcessorConfig` definition
|
|
66
|
+
* @returns - `MediaProcessorConnectorInterface` feed this return value to any vonage SDK that supports this API
|
|
67
|
+
*/
|
|
60
68
|
declare function createVonageMediaProcessorConnector(config: MediaProcessorConfig): Promise<MediaProcessorConnectorInterface>;
|
|
61
|
-
|
|
62
|
-
|
|
69
|
+
/**
|
|
70
|
+
* change the background option during run time using this function.
|
|
71
|
+
* while using this function the media-processor will not be destroyed.
|
|
72
|
+
* while using this function the library promise a full resource cleanup.
|
|
73
|
+
* @param backgroundOptions - see `BackgroundOptions` definition
|
|
74
|
+
* @returns - Promise<void>
|
|
75
|
+
*/
|
|
76
|
+
declare function setBackgroundOptions(backgroundOptions: BackgroundOptions): Promise<void>;
|
|
77
|
+
export type { MediaProcessorBaseConfig, BackgroundBlurConfig, VirtualBackgroundConfig, VideoBackgroundConfig, AssetBackgroundConfig, SilueteBlurConfig, MediaProcessorConfig, BackgroundOptions, MediapipeConfig, MediaPipeResults, MediaPipeModelType, MediaPipeResultsListener, FaceDetectionResults, FaceDetectionOptions, FaceMeshResults, FaceMeshOptions, HandsResults, HandsOptions, HolisticResults, HolisticOptions, ObjectronResults, ObjectronOptions, SelfieSegmentationOptions, SelfieSegmentationResults, PoseResults, PoseOptions, MediaPipeModelConfig };
|
|
78
|
+
export { BlurRadius, createVonageMediaProcessorConnector, getVonageEventEmitter, setTrackExpectedRate, isSupported, MediapipeHelper, setBackgroundOptions };
|