@dineug/erd-editor 3.0.2 → 3.0.3
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.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
(function(wt,ms){typeof exports=="object"&&typeof module<"u"?ms(exports):typeof define=="function"&&define.amd?define(["exports"],ms):(wt=typeof globalThis<"u"?globalThis:wt||self,ms(wt["@dineug/erd-editor"]={}))})(this,function(wt){"use strict";/*!
|
|
2
2
|
* @dineug/erd-editor
|
|
3
|
-
* @version 3.0.
|
|
3
|
+
* @version 3.0.3 | Sat Dec 23 2023
|
|
4
4
|
* @author SeungHwan-Lee <dineug2@gmail.com>
|
|
5
5
|
* @license MIT
|
|
6
6
|
*//*!
|
|
@@ -7059,7 +7059,7 @@ th {
|
|
|
7059
7059
|
* @license
|
|
7060
7060
|
* Copyright 2019 Google LLC
|
|
7061
7061
|
* SPDX-License-Identifier: Apache-2.0
|
|
7062
|
-
*/const B5=Symbol("Comlink.proxy"),koe=Symbol("Comlink.endpoint"),Voe=Symbol("Comlink.releaseProxy"),H1=Symbol("Comlink.finalizer"),Uh=Symbol("Comlink.thrown"),Q5=e=>typeof e=="object"&&e!==null||typeof e=="function",Coe={canHandle:e=>Q5(e)&&e[B5],serialize(e){const{port1:t,port2:n}=new MessageChannel;return _5(e,t),[n,[n]]},deserialize(e){return e.start(),M1(e)}},Soe={canHandle:e=>Q5(e)&&Uh in e,serialize({value:e}){let t;return e instanceof Error?t={isError:!0,value:{message:e.message,name:e.name,stack:e.stack}}:t={isError:!1,value:e},[t,[]]},deserialize(e){throw e.isError?Object.assign(new Error(e.value.message),e.value):e.value}},D5=new Map([["proxy",Coe],["throw",Soe]]);function Roe(e,t){for(const n of e)if(t===n||n==="*"||n instanceof RegExp&&n.test(t))return!0;return!1}function _5(e,t=globalThis,n=["*"]){t.addEventListener("message",function i(o){if(!o||!o.data)return;if(!Roe(n,o.origin)){console.warn(`Invalid origin '${o.origin}' for comlink proxy`);return}const{id:r,type:a,path:l}=Object.assign({path:[]},o.data),u=(o.data.argumentList||[]).map(ka);let d;try{const h=l.slice(0,-1).reduce((f,g)=>f[g],e),y=l.reduce((f,g)=>f[g],e);switch(a){case"GET":d=y;break;case"SET":h[l.slice(-1)[0]]=ka(o.data.value),d=!0;break;case"APPLY":d=y.apply(h,u);break;case"CONSTRUCT":{const f=new y(...u);d=Koe(f)}break;case"ENDPOINT":{const{port1:f,port2:g}=new MessageChannel;_5(e,g),d=Noe(f,[f])}break;case"RELEASE":d=void 0;break;default:return}}catch(h){d={value:h,[Uh]:0}}Promise.resolve(d).catch(h=>({value:h,[Uh]:0})).then(h=>{const[y,f]=Bh(h);t.postMessage(Object.assign(Object.assign({},y),{id:r}),f),a==="RELEASE"&&(t.removeEventListener("message",i),q5(t),H1 in e&&typeof e[H1]=="function"&&e[H1]())}).catch(h=>{const[y,f]=Bh({value:new TypeError("Unserializable return value"),[Uh]:0});t.postMessage(Object.assign(Object.assign({},y),{id:r}),f)})}),t.start&&t.start()}function Toe(e){return e.constructor.name==="MessagePort"}function q5(e){Toe(e)&&e.close()}function M1(e,t){return z1(e,[],t)}function Ph(e){if(e)throw new Error("Proxy has been released and is not useable")}function ek(e){return os(e,{type:"RELEASE"}).then(()=>{q5(e)})}const jh=new WeakMap,Ah="FinalizationRegistry"in globalThis&&new FinalizationRegistry(e=>{const t=(jh.get(e)||0)-1;jh.set(e,t),t===0&&ek(e)});function Loe(e,t){const n=(jh.get(t)||0)+1;jh.set(t,n),Ah&&Ah.register(e,t,e)}function Yoe(e){Ah&&Ah.unregister(e)}function z1(e,t=[],n=function(){}){let i=!1;const o=new Proxy(n,{get(r,a){if(Ph(i),a===Voe)return()=>{Yoe(o),ek(e),i=!0};if(a==="then"){if(t.length===0)return{then:()=>o};const l=os(e,{type:"GET",path:t.map(u=>u.toString())}).then(ka);return l.then.bind(l)}return z1(e,[...t,a])},set(r,a,l){Ph(i);const[u,d]=Bh(l);return os(e,{type:"SET",path:[...t,a].map(h=>h.toString()),value:u},d).then(ka)},apply(r,a,l){Ph(i);const u=t[t.length-1];if(u===koe)return os(e,{type:"ENDPOINT"}).then(ka);if(u==="bind")return z1(e,t.slice(0,-1));const[d,h]=tk(l);return os(e,{type:"APPLY",path:t.map(y=>y.toString()),argumentList:d},h).then(ka)},construct(r,a){Ph(i);const[l,u]=tk(a);return os(e,{type:"CONSTRUCT",path:t.map(d=>d.toString()),argumentList:l},u).then(ka)}});return Loe(o,e),o}function woe(e){return Array.prototype.concat.apply([],e)}function tk(e){const t=e.map(Bh);return[t.map(n=>n[0]),woe(t.map(n=>n[1]))]}const nk=new WeakMap;function Noe(e,t){return nk.set(e,t),e}function Koe(e){return Object.assign(e,{[B5]:!0})}function Bh(e){for(const[t,n]of D5)if(n.canHandle(e)){const[i,o]=n.serialize(e);return[{type:"HANDLER",name:t,value:i},o]}return[{type:"RAW",value:e},nk.get(e)||[]]}function ka(e){switch(e.type){case"HANDLER":return D5.get(e.name).deserialize(e.value);case"RAW":return e.value}}function os(e,t,n){return new Promise(i=>{const o=Hoe();e.addEventListener("message",function r(a){!a.data||!a.data.id||a.data.id!==o||(e.removeEventListener("message",r),i(a.data))}),e.start&&e.start(),e.postMessage(Object.assign({id:o},t),n)})}function Hoe(){return new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-")}const Moe="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiOy8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiAqL2NvbnN0IGtuPVN5bWJvbCgiQ29tbGluay5wcm94eSIpLFBzPVN5bWJvbCgiQ29tbGluay5lbmRwb2ludCIpLGpzPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxWdD1TeW1ib2woIkNvbWxpbmsuZmluYWxpemVyIiksS2U9U3ltYm9sKCJDb21saW5rLnRocm93biIpLEluPXQ9PnR5cGVvZiB0PT0ib2JqZWN0IiYmdCE9PW51bGx8fHR5cGVvZiB0PT0iZnVuY3Rpb24iLFVzPXtjYW5IYW5kbGU6dD0+SW4odCkmJnRba25dLHNlcmlhbGl6ZSh0KXtjb25zdHtwb3J0MTplLHBvcnQyOm59PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gV3QodCxlKSxbbixbbl1dfSxkZXNlcmlhbGl6ZSh0KXtyZXR1cm4gdC5zdGFydCgpLEdzKHQpfX0sSHM9e2NhbkhhbmRsZTp0PT5Jbih0KSYmS2UgaW4gdCxzZXJpYWxpemUoe3ZhbHVlOnR9KXtsZXQgZTtyZXR1cm4gdCBpbnN0YW5jZW9mIEVycm9yP2U9e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2t9fTplPXtpc0Vycm9yOiExLHZhbHVlOnR9LFtlLFtdXX0sZGVzZXJpYWxpemUodCl7dGhyb3cgdC5pc0Vycm9yP09iamVjdC5hc3NpZ24obmV3IEVycm9yKHQudmFsdWUubWVzc2FnZSksdC52YWx1ZSk6dC52YWx1ZX19LEVuPW5ldyBNYXAoW1sicHJveHkiLFVzXSxbInRocm93IixIc11dKTtmdW5jdGlvbiBxcyh0LGUpe2Zvcihjb25zdCBuIG9mIHQpaWYoZT09PW58fG49PT0iKiJ8fG4gaW5zdGFuY2VvZiBSZWdFeHAmJm4udGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBXdCh0LGU9Z2xvYmFsVGhpcyxuPVsiKiJdKXtlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIHIocyl7aWYoIXN8fCFzLmRhdGEpcmV0dXJuO2lmKCFxcyhuLHMub3JpZ2luKSl7Y29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtzLm9yaWdpbn0nIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWNvbnN0e2lkOmksdHlwZTphLHBhdGg6b309T2JqZWN0LmFzc2lnbih7cGF0aDpbXX0scy5kYXRhKSx1PShzLmRhdGEuYXJndW1lbnRMaXN0fHxbXSkubWFwKGllKTtsZXQgbDt0cnl7Y29uc3QgYz1vLnNsaWNlKDAsLTEpLnJlZHVjZSgoeSxoKT0+eVtoXSx0KSxkPW8ucmVkdWNlKCh5LGgpPT55W2hdLHQpO3N3aXRjaChhKXtjYXNlIkdFVCI6bD1kO2JyZWFrO2Nhc2UiU0VUIjpjW28uc2xpY2UoLTEpWzBdXT1pZShzLmRhdGEudmFsdWUpLGw9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6bD1kLmFwcGx5KGMsdSk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntjb25zdCB5PW5ldyBkKC4uLnUpO2w9WHMoeSl9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2NvbnN0e3BvcnQxOnkscG9ydDI6aH09bmV3IE1lc3NhZ2VDaGFubmVsO1d0KHQsaCksbD1Lcyh5LFt5XSl9YnJlYWs7Y2FzZSJSRUxFQVNFIjpsPXZvaWQgMDticmVhaztkZWZhdWx0OnJldHVybn19Y2F0Y2goYyl7bD17dmFsdWU6YyxbS2VdOjB9fVByb21pc2UucmVzb2x2ZShsKS5jYXRjaChjPT4oe3ZhbHVlOmMsW0tlXTowfSkpLnRoZW4oYz0+e2NvbnN0W2QseV09bnQoYyk7ZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCkse2lkOml9KSx5KSxhPT09IlJFTEVBU0UiJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyKSxObihlKSxWdCBpbiB0JiZ0eXBlb2YgdFtWdF09PSJmdW5jdGlvbiImJnRbVnRdKCkpfSkuY2F0Y2goYz0+e2NvbnN0W2QseV09bnQoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFtLZV06MH0pO2UucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLHtpZDppfSkseSl9KX0pLGUuc3RhcnQmJmUuc3RhcnQoKX1mdW5jdGlvbiBZcyh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBObih0KXtZcyh0KSYmdC5jbG9zZSgpfWZ1bmN0aW9uIEdzKHQsZSl7cmV0dXJuICR0KHQsW10sZSl9ZnVuY3Rpb24gWGUodCl7aWYodCl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIHhuKHQpe3JldHVybiB5ZSh0LHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9PntObih0KX0pfWNvbnN0IGV0PW5ldyBXZWFrTWFwLHR0PSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkodD0+e2NvbnN0IGU9KGV0LmdldCh0KXx8MCktMTtldC5zZXQodCxlKSxlPT09MCYmeG4odCl9KTtmdW5jdGlvbiBKcyh0LGUpe2NvbnN0IG49KGV0LmdldChlKXx8MCkrMTtldC5zZXQoZSxuKSx0dCYmdHQucmVnaXN0ZXIodCxlLHQpfWZ1bmN0aW9uIEJzKHQpe3R0JiZ0dC51bnJlZ2lzdGVyKHQpfWZ1bmN0aW9uICR0KHQsZT1bXSxuPWZ1bmN0aW9uKCl7fSl7bGV0IHI9ITE7Y29uc3Qgcz1uZXcgUHJveHkobix7Z2V0KGksYSl7aWYoWGUociksYT09PWpzKXJldHVybigpPT57QnMocykseG4odCkscj0hMH07aWYoYT09PSJ0aGVuIil7aWYoZS5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5zfTtjb25zdCBvPXllKHQse3R5cGU6IkdFVCIscGF0aDplLm1hcCh1PT51LnRvU3RyaW5nKCkpfSkudGhlbihpZSk7cmV0dXJuIG8udGhlbi5iaW5kKG8pfXJldHVybiAkdCh0LFsuLi5lLGFdKX0sc2V0KGksYSxvKXtYZShyKTtjb25zdFt1LGxdPW50KG8pO3JldHVybiB5ZSh0LHt0eXBlOiJTRVQiLHBhdGg6Wy4uLmUsYV0ubWFwKGM9PmMudG9TdHJpbmcoKSksdmFsdWU6dX0sbCkudGhlbihpZSl9LGFwcGx5KGksYSxvKXtYZShyKTtjb25zdCB1PWVbZS5sZW5ndGgtMV07aWYodT09PVBzKXJldHVybiB5ZSh0LHt0eXBlOiJFTkRQT0lOVCJ9KS50aGVuKGllKTtpZih1PT09ImJpbmQiKXJldHVybiAkdCh0LGUuc2xpY2UoMCwtMSkpO2NvbnN0W2wsY109TW4obyk7cmV0dXJuIHllKHQse3R5cGU6IkFQUExZIixwYXRoOmUubWFwKGQ9PmQudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0Omx9LGMpLnRoZW4oaWUpfSxjb25zdHJ1Y3QoaSxhKXtYZShyKTtjb25zdFtvLHVdPU1uKGEpO3JldHVybiB5ZSh0LHt0eXBlOiJDT05TVFJVQ1QiLHBhdGg6ZS5tYXAobD0+bC50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6b30sdSkudGhlbihpZSl9fSk7cmV0dXJuIEpzKHMsdCksc31mdW5jdGlvbiBRcyh0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSx0KX1mdW5jdGlvbiBNbih0KXtjb25zdCBlPXQubWFwKG50KTtyZXR1cm5bZS5tYXAobj0+blswXSksUXMoZS5tYXAobj0+blsxXSkpXX1jb25zdCBDbj1uZXcgV2Vha01hcDtmdW5jdGlvbiBLcyh0LGUpe3JldHVybiBDbi5zZXQodCxlKSx0fWZ1bmN0aW9uIFhzKHQpe3JldHVybiBPYmplY3QuYXNzaWduKHQse1trbl06ITB9KX1mdW5jdGlvbiBudCh0KXtmb3IoY29uc3RbZSxuXW9mIEVuKWlmKG4uY2FuSGFuZGxlKHQpKXtjb25zdFtyLHNdPW4uc2VyaWFsaXplKHQpO3JldHVyblt7dHlwZToiSEFORExFUiIsbmFtZTplLHZhbHVlOnJ9LHNdfXJldHVyblt7dHlwZToiUkFXIix2YWx1ZTp0fSxDbi5nZXQodCl8fFtdXX1mdW5jdGlvbiBpZSh0KXtzd2l0Y2godC50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiBFbi5nZXQodC5uYW1lKS5kZXNlcmlhbGl6ZSh0LnZhbHVlKTtjYXNlIlJBVyI6cmV0dXJuIHQudmFsdWV9fWZ1bmN0aW9uIHllKHQsZSxuKXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2NvbnN0IHM9ZWkoKTt0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGkoYSl7IWEuZGF0YXx8IWEuZGF0YS5pZHx8YS5kYXRhLmlkIT09c3x8KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsaSkscihhLmRhdGEpKX0pLHQuc3RhcnQmJnQuc3RhcnQoKSx0LnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkOnN9LGUpLG4pfSl9ZnVuY3Rpb24gZWkoKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfS8qIQogKiBAZGluZXVnL2VyZC1lZGl0b3Itc2NoZW1hCiAqIEB2ZXJzaW9uIDAuMS4wIHwgU2F0IERlYyAyMyAyMDIzCiAqIEBhdXRob3IgU2V1bmdId2FuLUxlZSA8ZGluZXVnMkBnbWFpbC5jb20+CiAqIEBsaWNlbnNlIE1JVAogKi92YXIgdGk9dHlwZW9mIGdsb2JhbD09Im9iamVjdCImJmdsb2JhbCYmZ2xvYmFsLk9iamVjdD09PU9iamVjdCYmZ2xvYmFsO2NvbnN0IG5pPXRpO3ZhciByaT10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLHNpPW5pfHxyaXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTtjb25zdCBMdD1zaTt2YXIgaWk9THQuU3ltYm9sO2NvbnN0IFE9aWk7dmFyIERuPU9iamVjdC5wcm90b3R5cGUsYWk9RG4uaGFzT3duUHJvcGVydHksb2k9RG4udG9TdHJpbmcsVmU9UT9RLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiB1aSh0KXt2YXIgZT1haS5jYWxsKHQsVmUpLG49dFtWZV07dHJ5e3RbVmVdPXZvaWQgMDt2YXIgcj0hMH1jYXRjaHt9dmFyIHM9b2kuY2FsbCh0KTtyZXR1cm4gciYmKGU/dFtWZV09bjpkZWxldGUgdFtWZV0pLHN9dmFyIGxpPU9iamVjdC5wcm90b3R5cGUsY2k9bGkudG9TdHJpbmc7ZnVuY3Rpb24gZmkodCl7cmV0dXJuIGNpLmNhbGwodCl9dmFyIGRpPSJbb2JqZWN0IE51bGxdIixoaT0iW29iamVjdCBVbmRlZmluZWRdIixfbj1RP1EudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIHp0KHQpe3JldHVybiB0PT1udWxsP3Q9PT12b2lkIDA/aGk6ZGk6X24mJl9uIGluIE9iamVjdCh0KT91aSh0KTpmaSh0KX1mdW5jdGlvbiBydCh0KXtyZXR1cm4gdCE9bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QifXZhciBtaT0iW29iamVjdCBTeW1ib2xdIjtmdW5jdGlvbiBadCh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wifHxydCh0KSYmenQodCk9PW1pfWZ1bmN0aW9uIEZuKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLHM9QXJyYXkocik7KytuPHI7KXNbbl09ZSh0W25dLG4sdCk7cmV0dXJuIHN9dmFyIHlpPUFycmF5LmlzQXJyYXk7Y29uc3QgV2U9eWk7dmFyIGdpPTEvMCxBbj1RP1EucHJvdG90eXBlOnZvaWQgMCxWbj1Bbj9Bbi50b1N0cmluZzp2b2lkIDA7ZnVuY3Rpb24gV24odCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0O2lmKFdlKHQpKXJldHVybiBGbih0LFduKSsiIjtpZihadCh0KSlyZXR1cm4gVm4/Vm4uY2FsbCh0KToiIjt2YXIgZT10KyIiO3JldHVybiBlPT0iMCImJjEvdD09LWdpPyItMCI6ZX1mdW5jdGlvbiBzdCh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gdCE9bnVsbCYmKGU9PSJvYmplY3QifHxlPT0iZnVuY3Rpb24iKX1mdW5jdGlvbiAkbih0KXtyZXR1cm4gdH12YXIgcGk9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLHdpPSJbb2JqZWN0IEZ1bmN0aW9uXSIsdmk9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixPaT0iW29iamVjdCBQcm94eV0iO2Z1bmN0aW9uIExuKHQpe2lmKCFzdCh0KSlyZXR1cm4hMTt2YXIgZT16dCh0KTtyZXR1cm4gZT09d2l8fGU9PXZpfHxlPT1waXx8ZT09T2l9dmFyIFRpPUx0WyJfX2NvcmUtanNfc2hhcmVkX18iXTtjb25zdCBSdD1UaTt2YXIgem49ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKFJ0JiZSdC5rZXlzJiZSdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIFNpKHQpe3JldHVybiEhem4mJnpuIGluIHR9dmFyIGJpPUZ1bmN0aW9uLnByb3RvdHlwZSxraT1iaS50b1N0cmluZztmdW5jdGlvbiBJaSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIGtpLmNhbGwodCl9Y2F0Y2h7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaHt9fXJldHVybiIifXZhciBFaT0vW1xcXiQuKis/KClbXF17fXxdL2csTmk9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8seGk9RnVuY3Rpb24ucHJvdG90eXBlLE1pPU9iamVjdC5wcm90b3R5cGUsQ2k9eGkudG9TdHJpbmcsRGk9TWkuaGFzT3duUHJvcGVydHksX2k9UmVnRXhwKCJeIitDaS5jYWxsKERpKS5yZXBsYWNlKEVpLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIEZpKHQpe2lmKCFzdCh0KXx8U2kodCkpcmV0dXJuITE7dmFyIGU9TG4odCk/X2k6Tmk7cmV0dXJuIGUudGVzdChJaSh0KSl9ZnVuY3Rpb24gQWkodCxlKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtlXX1mdW5jdGlvbiBQdCh0LGUpe3ZhciBuPUFpKHQsZSk7cmV0dXJuIEZpKG4pP246dm9pZCAwfWZ1bmN0aW9uIFZpKHQsZSxuKXtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gdC5jYWxsKGUpO2Nhc2UgMTpyZXR1cm4gdC5jYWxsKGUsblswXSk7Y2FzZSAyOnJldHVybiB0LmNhbGwoZSxuWzBdLG5bMV0pO2Nhc2UgMzpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdLG5bMl0pfXJldHVybiB0LmFwcGx5KGUsbil9dmFyIFdpPTgwMCwkaT0xNixMaT1EYXRlLm5vdztmdW5jdGlvbiB6aSh0KXt2YXIgZT0wLG49MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1MaSgpLHM9JGktKHItbik7aWYobj1yLHM+MCl7aWYoKytlPj1XaSlyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX1mdW5jdGlvbiBaaSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIFJpPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PVB0KE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaHt9fSgpO2NvbnN0IGl0PVJpO3ZhciBQaT1pdD9mdW5jdGlvbih0LGUpe3JldHVybiBpdCh0LCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOlppKGUpLHdyaXRhYmxlOiEwfSl9OiRuLGppPXppKFBpKTtjb25zdCBabj1qaTtmdW5jdGlvbiBVaSh0LGUsbixyKXtmb3IodmFyIHM9dC5sZW5ndGgsaT1uKyhyPzE6LTEpO3I/aS0tOisraTxzOylpZihlKHRbaV0saSx0KSlyZXR1cm4gaTtyZXR1cm4tMX1mdW5jdGlvbiBIaSh0KXtyZXR1cm4gdCE9PXR9ZnVuY3Rpb24gcWkodCxlLG4pe2Zvcih2YXIgcj1uLTEscz10Lmxlbmd0aDsrK3I8czspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gWWkodCxlLG4pe3JldHVybiBlPT09ZT9xaSh0LGUsbik6VWkodCxIaSxuKX1mdW5jdGlvbiBHaSh0LGUpe3ZhciBuPXQ9PW51bGw/MDp0Lmxlbmd0aDtyZXR1cm4hIW4mJllpKHQsZSwwKT4tMX12YXIgSmk9OTAwNzE5OTI1NDc0MDk5MSxCaT0vXig/OjB8WzEtOV1cZCopJC87ZnVuY3Rpb24gUm4odCxlKXt2YXIgbj10eXBlb2YgdDtyZXR1cm4gZT1lPz9KaSwhIWUmJihuPT0ibnVtYmVyInx8biE9InN5bWJvbCImJkJpLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX1mdW5jdGlvbiBRaSh0LGUsbil7ZT09Il9fcHJvdG9fXyImJml0P2l0KHQsZSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH0pOnRbZV09bn1mdW5jdGlvbiBQbih0LGUpe3JldHVybiB0PT09ZXx8dCE9PXQmJmUhPT1lfXZhciBLaT1PYmplY3QucHJvdG90eXBlLFhpPUtpLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGVhKHQsZSxuKXt2YXIgcj10W2VdOyghKFhpLmNhbGwodCxlKSYmUG4ocixuKSl8fG49PT12b2lkIDAmJiEoZSBpbiB0KSkmJlFpKHQsZSxuKX12YXIgam49TWF0aC5tYXg7ZnVuY3Rpb24gVW4odCxlLG4pe3JldHVybiBlPWpuKGU9PT12b2lkIDA/dC5sZW5ndGgtMTplLDApLGZ1bmN0aW9uKCl7Zm9yKHZhciByPWFyZ3VtZW50cyxzPS0xLGk9am4oci5sZW5ndGgtZSwwKSxhPUFycmF5KGkpOysrczxpOylhW3NdPXJbZStzXTtzPS0xO2Zvcih2YXIgbz1BcnJheShlKzEpOysrczxlOylvW3NdPXJbc107cmV0dXJuIG9bZV09bihhKSxWaSh0LHRoaXMsbyl9fWZ1bmN0aW9uIHRhKHQsZSl7cmV0dXJuIFpuKFVuKHQsZSwkbiksdCsiIil9dmFyIG5hPTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gSG4odCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIiYmdD4tMSYmdCUxPT0wJiZ0PD1uYX1mdW5jdGlvbiByYSh0KXtyZXR1cm4gdCE9bnVsbCYmSG4odC5sZW5ndGgpJiYhTG4odCl9dmFyIHNhPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIHFuKHQpe3JldHVybiBydCh0KSYmenQodCk9PXNhfXZhciBZbj1PYmplY3QucHJvdG90eXBlLGlhPVluLmhhc093blByb3BlcnR5LGFhPVluLnByb3BlcnR5SXNFbnVtZXJhYmxlLG9hPXFuKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/cW46ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KHQpJiZpYS5jYWxsKHQsImNhbGxlZSIpJiYhYWEuY2FsbCh0LCJjYWxsZWUiKX07Y29uc3QgR249b2E7ZnVuY3Rpb24gdWEodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX12YXIgbGE9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sY2E9L15cdyokLztmdW5jdGlvbiBmYSh0LGUpe2lmKFdlKHQpKXJldHVybiExO3ZhciBuPXR5cGVvZiB0O3JldHVybiBuPT0ibnVtYmVyInx8bj09InN5bWJvbCJ8fG49PSJib29sZWFuInx8dD09bnVsbHx8WnQodCk/ITA6Y2EudGVzdCh0KXx8IWxhLnRlc3QodCl8fGUhPW51bGwmJnQgaW4gT2JqZWN0KGUpfXZhciBkYT1QdChPYmplY3QsImNyZWF0ZSIpO2NvbnN0ICRlPWRhO2Z1bmN0aW9uIGhhKCl7dGhpcy5fX2RhdGFfXz0kZT8kZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBtYSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX12YXIgeWE9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLGdhPU9iamVjdC5wcm90b3R5cGUscGE9Z2EuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gd2EodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZigkZSl7dmFyIG49ZVt0XTtyZXR1cm4gbj09PXlhP3ZvaWQgMDpufXJldHVybiBwYS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9dmFyIHZhPU9iamVjdC5wcm90b3R5cGUsT2E9dmEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gVGEodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gJGU/ZVt0XSE9PXZvaWQgMDpPYS5jYWxsKGUsdCl9dmFyIFNhPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBiYSh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09JGUmJmU9PT12b2lkIDA/U2E6ZSx0aGlzfWZ1bmN0aW9uIGFlKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWFlLnByb3RvdHlwZS5jbGVhcj1oYSxhZS5wcm90b3R5cGUuZGVsZXRlPW1hLGFlLnByb3RvdHlwZS5nZXQ9d2EsYWUucHJvdG90eXBlLmhhcz1UYSxhZS5wcm90b3R5cGUuc2V0PWJhO2Z1bmN0aW9uIGthKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBhdCh0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKFBuKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9dmFyIElhPUFycmF5LnByb3RvdHlwZSxFYT1JYS5zcGxpY2U7ZnVuY3Rpb24gTmEodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWF0KGUsdCk7aWYobjwwKXJldHVybiExO3ZhciByPWUubGVuZ3RoLTE7cmV0dXJuIG49PXI/ZS5wb3AoKTpFYS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiB4YSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49YXQoZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfWZ1bmN0aW9uIE1hKHQpe3JldHVybiBhdCh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIENhKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPWF0KG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9ZnVuY3Rpb24gZ2UodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19Z2UucHJvdG90eXBlLmNsZWFyPWthLGdlLnByb3RvdHlwZS5kZWxldGU9TmEsZ2UucHJvdG90eXBlLmdldD14YSxnZS5wcm90b3R5cGUuaGFzPU1hLGdlLnByb3RvdHlwZS5zZXQ9Q2E7dmFyIERhPVB0KEx0LCJNYXAiKTtjb25zdCBfYT1EYTtmdW5jdGlvbiBGYSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGFlLG1hcDpuZXcoX2F8fGdlKSxzdHJpbmc6bmV3IGFlfX1mdW5jdGlvbiBBYSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09InN0cmluZyJ8fGU9PSJudW1iZXIifHxlPT0ic3ltYm9sInx8ZT09ImJvb2xlYW4iP3QhPT0iX19wcm90b19fIjp0PT09bnVsbH1mdW5jdGlvbiBvdCh0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIEFhKGUpP25bdHlwZW9mIGU9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gVmEodCl7dmFyIGU9b3QodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX1mdW5jdGlvbiBXYSh0KXtyZXR1cm4gb3QodGhpcyx0KS5nZXQodCl9ZnVuY3Rpb24gJGEodCl7cmV0dXJuIG90KHRoaXMsdCkuaGFzKHQpfWZ1bmN0aW9uIExhKHQsZSl7dmFyIG49b3QodGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc31mdW5jdGlvbiBLKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fUsucHJvdG90eXBlLmNsZWFyPUZhLEsucHJvdG90eXBlLmRlbGV0ZT1WYSxLLnByb3RvdHlwZS5nZXQ9V2EsSy5wcm90b3R5cGUuaGFzPSRhLEsucHJvdG90eXBlLnNldD1MYTt2YXIgemE9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIGp0KHQsZSl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiJ8fGUhPW51bGwmJnR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoemEpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLHM9ZT9lLmFwcGx5KHRoaXMscik6clswXSxpPW4uY2FjaGU7aWYoaS5oYXMocykpcmV0dXJuIGkuZ2V0KHMpO3ZhciBhPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1pLnNldChzLGEpfHxpLGF9O3JldHVybiBuLmNhY2hlPW5ldyhqdC5DYWNoZXx8Syksbn1qdC5DYWNoZT1LO3ZhciBaYT01MDA7ZnVuY3Rpb24gUmEodCl7dmFyIGU9anQodCxmdW5jdGlvbihyKXtyZXR1cm4gbi5zaXplPT09WmEmJm4uY2xlYXIoKSxyfSksbj1lLmNhY2hlO3JldHVybiBlfXZhciBQYT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxqYT0vXFwoXFwpPy9nLFVhPVJhKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB0LmNoYXJDb2RlQXQoMCk9PT00NiYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoUGEsZnVuY3Rpb24obixyLHMsaSl7ZS5wdXNoKHM/aS5yZXBsYWNlKGphLCIkMSIpOnJ8fG4pfSksZX0pO2NvbnN0IEhhPVVhO2Z1bmN0aW9uIHFhKHQpe3JldHVybiB0PT1udWxsPyIiOlduKHQpfWZ1bmN0aW9uIHV0KHQsZSl7cmV0dXJuIFdlKHQpP3Q6ZmEodCxlKT9bdF06SGEocWEodCkpfXZhciBZYT0xLzA7ZnVuY3Rpb24gVXQodCl7aWYodHlwZW9mIHQ9PSJzdHJpbmcifHxadCh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiBlPT0iMCImJjEvdD09LVlhPyItMCI6ZX1mdW5jdGlvbiBHYSh0LGUpe2U9dXQoZSx0KTtmb3IodmFyIG49MCxyPWUubGVuZ3RoO3QhPW51bGwmJm48cjspdD10W1V0KGVbbisrXSldO3JldHVybiBuJiZuPT1yP3Q6dm9pZCAwfWZ1bmN0aW9uIEphKHQsZSl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgscz10Lmxlbmd0aDsrK248cjspdFtzK25dPWVbbl07cmV0dXJuIHR9dmFyIEpuPVE/US5pc0NvbmNhdFNwcmVhZGFibGU6dm9pZCAwO2Z1bmN0aW9uIEJhKHQpe3JldHVybiBXZSh0KXx8R24odCl8fCEhKEpuJiZ0JiZ0W0puXSl9ZnVuY3Rpb24gSHQodCxlLG4scixzKXt2YXIgaT0tMSxhPXQubGVuZ3RoO2ZvcihufHwobj1CYSksc3x8KHM9W10pOysraTxhOyl7dmFyIG89dFtpXTtlPjAmJm4obyk/ZT4xP0h0KG8sZS0xLG4scixzKTpKYShzLG8pOnJ8fChzW3MubGVuZ3RoXT1vKX1yZXR1cm4gc31mdW5jdGlvbiBRYSh0KXt2YXIgZT10PT1udWxsPzA6dC5sZW5ndGg7cmV0dXJuIGU/SHQodCwxKTpbXX1mdW5jdGlvbiBLYSh0KXtyZXR1cm4gWm4oVW4odCx2b2lkIDAsUWEpLHQrIiIpfXZhciBYYT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gZW8odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsWGEpLHRoaXN9ZnVuY3Rpb24gdG8odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfWZ1bmN0aW9uIGx0KHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBLOysrZTxuOyl0aGlzLmFkZCh0W2VdKX1sdC5wcm90b3R5cGUuYWRkPWx0LnByb3RvdHlwZS5wdXNoPWVvLGx0LnByb3RvdHlwZS5oYXM9dG87ZnVuY3Rpb24gbm8odCxlKXtyZXR1cm4gdC5oYXMoZSl9ZnVuY3Rpb24gcm8odCxlKXtyZXR1cm4gdCE9bnVsbCYmZSBpbiBPYmplY3QodCl9ZnVuY3Rpb24gc28odCxlLG4pe2U9dXQoZSx0KTtmb3IodmFyIHI9LTEscz1lLmxlbmd0aCxpPSExOysrcjxzOyl7dmFyIGE9VXQoZVtyXSk7aWYoIShpPXQhPW51bGwmJm4odCxhKSkpYnJlYWs7dD10W2FdfXJldHVybiBpfHwrK3IhPXM/aToocz10PT1udWxsPzA6dC5sZW5ndGgsISFzJiZIbihzKSYmUm4oYSxzKSYmKFdlKHQpfHxHbih0KSkpfWZ1bmN0aW9uIGlvKHQsZSl7cmV0dXJuIHQhPW51bGwmJnNvKHQsZSxybyl9ZnVuY3Rpb24gQm4odCl7cmV0dXJuIHJ0KHQpJiZyYSh0KX1mdW5jdGlvbiBhbyh0LGUsbil7Zm9yKHZhciByPS0xLHM9dD09bnVsbD8wOnQubGVuZ3RoOysrcjxzOylpZihuKGUsdFtyXSkpcmV0dXJuITA7cmV0dXJuITF9dmFyIG9vPTIwMDtmdW5jdGlvbiB1byh0LGUsbixyKXt2YXIgcz0tMSxpPUdpLGE9ITAsbz10Lmxlbmd0aCx1PVtdLGw9ZS5sZW5ndGg7aWYoIW8pcmV0dXJuIHU7biYmKGU9Rm4oZSx1YShuKSkpLHI/KGk9YW8sYT0hMSk6ZS5sZW5ndGg+PW9vJiYoaT1ubyxhPSExLGU9bmV3IGx0KGUpKTtlOmZvcig7KytzPG87KXt2YXIgYz10W3NdLGQ9bj09bnVsbD9jOm4oYyk7aWYoYz1yfHxjIT09MD9jOjAsYSYmZD09PWQpe2Zvcih2YXIgeT1sO3ktLTspaWYoZVt5XT09PWQpY29udGludWUgZTt1LnB1c2goYyl9ZWxzZSBpKGUsZCxyKXx8dS5wdXNoKGMpfXJldHVybiB1fXZhciBsbz10YShmdW5jdGlvbih0LGUpe3JldHVybiBCbih0KT91byh0LEh0KGUsMSxCbiwhMCkpOltdfSk7Y29uc3QgY289bG87ZnVuY3Rpb24gZm8odCxlLG4scil7aWYoIXN0KHQpKXJldHVybiB0O2U9dXQoZSx0KTtmb3IodmFyIHM9LTEsaT1lLmxlbmd0aCxhPWktMSxvPXQ7byE9bnVsbCYmKytzPGk7KXt2YXIgdT1VdChlW3NdKSxsPW47aWYodT09PSJfX3Byb3RvX18ifHx1PT09ImNvbnN0cnVjdG9yInx8dT09PSJwcm90b3R5cGUiKXJldHVybiB0O2lmKHMhPWEpe3ZhciBjPW9bdV07bD1yP3IoYyx1LG8pOnZvaWQgMCxsPT09dm9pZCAwJiYobD1zdChjKT9jOlJuKGVbcysxXSk/W106e30pfWVhKG8sdSxsKSxvPW9bdV19cmV0dXJuIHR9ZnVuY3Rpb24gaG8odCxlLG4pe2Zvcih2YXIgcj0tMSxzPWUubGVuZ3RoLGk9e307KytyPHM7KXt2YXIgYT1lW3JdLG89R2EodCxhKTtuKG8sYSkmJmZvKGksdXQoYSx0KSxvKX1yZXR1cm4gaX1mdW5jdGlvbiBtbyh0LGUpe3JldHVybiBobyh0LGUsZnVuY3Rpb24obixyKXtyZXR1cm4gaW8odCxyKX0pfUthKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PW51bGw/e306bW8odCxlKX0pO2NvbnN0IExlPXQ9PmU9PnR5cGVvZiBlPT09dCx5bz1MZSgib2JqZWN0IikscXQ9TGUoImJvb2xlYW4iKSxOPUxlKCJudW1iZXIiKSxBPUxlKCJzdHJpbmciKSxnbz1MZSgidW5kZWZpbmVkIiksUW49dD0+dD09PW51bGwsRz10PT5Rbih0KXx8Z28odCkse2lzQXJyYXk6WH09QXJyYXksVT10PT55byh0KSYmIVFuKHQpJiYhWCh0KSxZdD0odCxlKT0+bj0+TWF0aC5taW4oTWF0aC5tYXgobix0KSxlKTtmdW5jdGlvbiB3KHQsZSxuKXtyZXR1cm4gcj0+e2lmKCFuKXJldHVybjtjb25zdCBzPW5bcl07dChzKSYmKGVbcl09cyl9fWZ1bmN0aW9uIEgodCl7cmV0dXJuIGU9Pk4oZSkmJnQuaW5jbHVkZXMoZSl9ZnVuY3Rpb24gcGUoKXtjb25zdCB0PURhdGUubm93KCk7cmV0dXJue3VwZGF0ZUF0OnQsY3JlYXRlQXQ6dH19ZnVuY3Rpb24gd2UodCxlKXtjb25zdCBuPXcoTix0LGUpO24oInVwZGF0ZUF0IiksbigiY3JlYXRlQXQiKX1jb25zdCBwbz0oKT0+KHt0YWJsZUlkczpbXSxyZWxhdGlvbnNoaXBJZHM6W10saW5kZXhJZHM6W10sbWVtb0lkczpbXX0pO2Z1bmN0aW9uIHdvKHQpe2NvbnN0IGU9cG8oKTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtjb25zdCBuPXcoWCxlLHQpO3JldHVybiBuKCJ0YWJsZUlkcyIpLG4oInJlbGF0aW9uc2hpcElkcyIpLG4oImluZGV4SWRzIiksbigibWVtb0lkcyIpLGV9Y29uc3Qgdm89KCk9Pih7aWQ6IiIsbmFtZToiIix0YWJsZUlkOiIiLGluZGV4Q29sdW1uSWRzOltdLHNlcUluZGV4Q29sdW1uSWRzOltdLHVuaXF1ZTohMSxtZXRhOnBlKCl9KTtmdW5jdGlvbiBPbyh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9dm8oKSxzPXcoQSxyLG4pLGk9dyhxdCxyLG4pLGE9dyhYLHIsbik7cygiaWQiKSxzKCJuYW1lIikscygidGFibGVJZCIpLGkoInVuaXF1ZSIpLGEoImluZGV4Q29sdW1uSWRzIiksYSgic2VxSW5kZXhDb2x1bW5JZHMiKSx3ZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBLbj17QVNDOjEsREVTQzoyfSxUbz1PYmplY3QudmFsdWVzKEtuKSxTbz0oKT0+KHtpZDoiIixpbmRleElkOiIiLGNvbHVtbklkOiIiLG9yZGVyVHlwZTpLbi5BU0MsbWV0YTpwZSgpfSk7ZnVuY3Rpb24gYm8odCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPVNvKCkscz13KEEscixuKTtzKCJpZCIpLHMoImluZGV4SWQiKSxzKCJjb2x1bW5JZCIpLHcoSChUbykscixuKSgib3JkZXJUeXBlIiksd2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3Qga289KCk9Pih7fSk7ZnVuY3Rpb24gSW8odCl7Y29uc3QgZT1rbygpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdFtuLHJdb2YgT2JqZWN0LmVudHJpZXModCkpe2lmKCFYKHIpfHxyLmxlbmd0aCE9PTQpY29udGludWU7Y29uc3RbcyxpLGEsb109cjtpZihBKHMpJiZOKGkpJiZOKGEpJiZVKG8pKXtjb25zdCB1PXt9LGw9dyhOLHUsbyk7T2JqZWN0LmtleXMobykuZm9yRWFjaChsKSxlW25dPVtzLGksYSx1XX19cmV0dXJuIGV9Y29uc3QgRW89KCk9Pih7aWQ6IiIsdmFsdWU6IiIsdWk6e3g6MjAwLHk6MTAwLHpJbmRleDoyLHdpZHRoOjExNixoZWlnaHQ6MTAwLGNvbG9yOiIifSxtZXRhOnBlKCl9KTtmdW5jdGlvbiBObyh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9RW8oKSxzPXcoQSxyLG4pLGk9dyhOLHIudWksbi51aSksYT13KEEsci51aSxuLnVpKTtzKCJpZCIpLHMoInZhbHVlIiksYSgiY29sb3IiKSxpKCJ4IiksaSgieSIpLGkoInpJbmRleCIpLGkoIndpZHRoIiksaSgiaGVpZ2h0Iiksd2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3QgWG49e1plcm9PbmU6MixaZXJvTjo0LE9uZU9ubHk6OCxPbmVOOjE2fSx4bz1PYmplY3QudmFsdWVzKFhuKSxlcj17cmluZzoxLGRhc2g6Mn0sTW89T2JqZWN0LnZhbHVlcyhlciksR3Q9e2xlZnQ6MSxyaWdodDoyLHRvcDo0LGJvdHRvbTo4fSx0cj1PYmplY3QudmFsdWVzKEd0KSxDbz0oKT0+KHtpZDoiIixpZGVudGlmaWNhdGlvbjohMSxyZWxhdGlvbnNoaXBUeXBlOlhuLlplcm9OLHN0YXJ0UmVsYXRpb25zaGlwVHlwZTplci5kYXNoLHN0YXJ0Ont0YWJsZUlkOiIiLGNvbHVtbklkczpbXSx4OjAseTowLGRpcmVjdGlvbjpHdC5ib3R0b219LGVuZDp7dGFibGVJZDoiIixjb2x1bW5JZHM6W10seDowLHk6MCxkaXJlY3Rpb246R3QuYm90dG9tfSxtZXRhOnBlKCl9KTtmdW5jdGlvbiBEbyh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9Q28oKSxzPXcoQSxyLG4pLGk9dyhxdCxyLG4pLGE9dyhOLHIuc3RhcnQsbi5zdGFydCksbz13KEEsci5zdGFydCxuLnN0YXJ0KSx1PXcoTixyLmVuZCxuLmVuZCksbD13KEEsci5lbmQsbi5lbmQpO3MoImlkIiksaSgiaWRlbnRpZmljYXRpb24iKSx3KEgoeG8pLHIsbikoInJlbGF0aW9uc2hpcFR5cGUiKSx3KEgoTW8pLHIsbikoInN0YXJ0UmVsYXRpb25zaGlwVHlwZSIpLG8oInRhYmxlSWQiKSxhKCJ4IiksYSgieSIpLHcoSCh0ciksci5zdGFydCxuLnN0YXJ0KSgiZGlyZWN0aW9uIiksdyhYLHIuc3RhcnQsbi5zdGFydCkoImNvbHVtbklkcyIpLGwoInRhYmxlSWQiKSx1KCJ4IiksdSgieSIpLHcoSCh0ciksci5lbmQsbi5lbmQpKCJkaXJlY3Rpb24iKSx3KFgsci5lbmQsbi5lbmQpKCJjb2x1bW5JZHMiKSx3ZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBfbz17RVJEOiJFUkQiLHZpc3VhbGl6YXRpb246IkBkaW5ldWcvZXJkLWVkaXRvci9idWlsdGluLXZpc3VhbGl6YXRpb24iLHNjaGVtYVNRTDoiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tc2NoZW1hLXNxbCIsZ2VuZXJhdG9yQ29kZToiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tZ2VuZXJhdG9yLWNvZGUiLHNldHRpbmdzOiJzZXR0aW5ncyJ9LG9lPXt0YWJsZUNvbW1lbnQ6MSxjb2x1bW5Db21tZW50OjIsY29sdW1uRGF0YVR5cGU6NCxjb2x1bW5EZWZhdWx0OjgsY29sdW1uQXV0b0luY3JlbWVudDoxNixjb2x1bW5QcmltYXJ5S2V5OjMyLGNvbHVtblVuaXF1ZTo2NCxjb2x1bW5Ob3ROdWxsOjEyOCxyZWxhdGlvbnNoaXA6MjU2fSxlZT17Y29sdW1uTmFtZToxLGNvbHVtbkRhdGFUeXBlOjIsY29sdW1uTm90TnVsbDo0LGNvbHVtblVuaXF1ZTo4LGNvbHVtbkF1dG9JbmNyZW1lbnQ6MTYsY29sdW1uRGVmYXVsdDozMixjb2x1bW5Db21tZW50OjY0fSxucj1PYmplY3QudmFsdWVzKGVlKSxycj17TWFyaWFEQjoxLE1TU1FMOjIsTXlTUUw6NCxPcmFjbGU6OCxQb3N0Z3JlU1FMOjE2LFNRTGl0ZTozMn0sRm89T2JqZWN0LnZhbHVlcyhyciksc3I9e0dyYXBoUUw6MSxjc2hhcnA6MixKYXZhOjQsS290bGluOjgsVHlwZVNjcmlwdDoxNixKUEE6MzIsU2NhbGE6NjR9LEFvPU9iamVjdC52YWx1ZXMoc3IpLEp0PXtub25lOjEsY2FtZWxDYXNlOjIscGFzY2FsQ2FzZTo0LHNuYWtlQ2FzZTo4fSxpcj1PYmplY3QudmFsdWVzKEp0KSxhcj17bm9uZToxLGRvdWJsZVF1b3RlOjIsc2luZ2xlUXVvdGU6NCxiYWNrdGljazo4fSxWbz1PYmplY3QudmFsdWVzKGFyKSxXbz0uMSwkbz0xLExvPTJlMyx6bz0yZTQsWm89b2UudGFibGVDb21tZW50fG9lLmNvbHVtbkNvbW1lbnR8b2UuY29sdW1uRGF0YVR5cGV8b2UuY29sdW1uRGVmYXVsdHxvZS5jb2x1bW5QcmltYXJ5S2V5fG9lLmNvbHVtbk5vdE51bGx8b2UucmVsYXRpb25zaGlwLFJvPSgpPT4oe3dpZHRoOjJlMyxoZWlnaHQ6MmUzLHNjcm9sbFRvcDowLHNjcm9sbExlZnQ6MCx6b29tTGV2ZWw6MSxzaG93OlpvLGRhdGFiYXNlOnJyLk15U1FMLGRhdGFiYXNlTmFtZToiIixjYW52YXNUeXBlOl9vLkVSRCxsYW5ndWFnZTpzci5HcmFwaFFMLHRhYmxlTmFtZUNhc2U6SnQucGFzY2FsQ2FzZSxjb2x1bW5OYW1lQ2FzZTpKdC5jYW1lbENhc2UsYnJhY2tldFR5cGU6YXIubm9uZSxyZWxhdGlvbnNoaXBEYXRhVHlwZVN5bmM6ITAscmVsYXRpb25zaGlwT3B0aW1pemF0aW9uOiExLGNvbHVtbk9yZGVyOltlZS5jb2x1bW5OYW1lLGVlLmNvbHVtbkRhdGFUeXBlLGVlLmNvbHVtbk5vdE51bGwsZWUuY29sdW1uVW5pcXVlLGVlLmNvbHVtbkF1dG9JbmNyZW1lbnQsZWUuY29sdW1uRGVmYXVsdCxlZS5jb2x1bW5Db21tZW50XSxtYXhXaWR0aENvbW1lbnQ6LTF9KSxvcj1ZdChMbyx6byksUG89WXQoV28sJG8pLGpvPVl0KDYwLDIwMCk7ZnVuY3Rpb24gVW8odCl7Y29uc3QgZT1SbygpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2NvbnN0IG49dyhOLGUsdCkscj13KEEsZSx0KSxzPXcocXQsZSx0KTtyZXR1cm4gTih0LndpZHRoKSYmKGUud2lkdGg9b3IodC53aWR0aCkpLE4odC5oZWlnaHQpJiYoZS5oZWlnaHQ9b3IodC5oZWlnaHQpKSxOKHQuem9vbUxldmVsKSYmKGUuem9vbUxldmVsPVBvKHQuem9vbUxldmVsKSksTih0Lm1heFdpZHRoQ29tbWVudCkmJnQubWF4V2lkdGhDb21tZW50IT09LTEmJihlLm1heFdpZHRoQ29tbWVudD1qbyh0Lm1heFdpZHRoQ29tbWVudCkpLG4oInNjcm9sbFRvcCIpLG4oInNjcm9sbExlZnQiKSxuKCJzaG93IikscigiZGF0YWJhc2VOYW1lIikscigiY2FudmFzVHlwZSIpLHMoInJlbGF0aW9uc2hpcERhdGFUeXBlU3luYyIpLHMoInJlbGF0aW9uc2hpcE9wdGltaXphdGlvbiIpLHcoSChGbyksZSx0KSgiZGF0YWJhc2UiKSx3KEgoQW8pLGUsdCkoImxhbmd1YWdlIiksdyhIKGlyKSxlLHQpKCJ0YWJsZU5hbWVDYXNlIiksdyhIKGlyKSxlLHQpKCJjb2x1bW5OYW1lQ2FzZSIpLHcoSChWbyksZSx0KSgiYnJhY2tldFR5cGUiKSxYKHQuY29sdW1uT3JkZXIpJiZuci5sZW5ndGg9PT10LmNvbHVtbk9yZGVyLmxlbmd0aCYmY28obnIsdC5jb2x1bW5PcmRlcikubGVuZ3RoPT09MCYmKGUuY29sdW1uT3JkZXI9dC5jb2x1bW5PcmRlciksZX1jb25zdCBIbz0oKT0+KHtpZDoiIixuYW1lOiIiLGNvbW1lbnQ6IiIsY29sdW1uSWRzOltdLHNlcUNvbHVtbklkczpbXSx1aTp7eDoyMDAseToxMDAsekluZGV4OjIsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCxjb2xvcjoiIn0sbWV0YTpwZSgpfSk7ZnVuY3Rpb24gcW8odCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPUhvKCkscz13KEEscixuKSxpPXcoWCxyLG4pLGE9dyhOLHIudWksbi51aSksbz13KEEsci51aSxuLnVpKTtzKCJpZCIpLHMoIm5hbWUiKSxzKCJjb21tZW50IiksaSgiY29sdW1uSWRzIiksaSgic2VxQ29sdW1uSWRzIiksbygiY29sb3IiKSxhKCJ4IiksYSgieSIpLGEoInpJbmRleCIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLHdlKHIubWV0YSxuLm1ldGEpLHIuaWQmJihlW3IuaWRdPXIpfXJldHVybiBlfWNvbnN0IFlvPSgpPT4oe2lkOiIiLHRhYmxlSWQ6IiIsbmFtZToiIixjb21tZW50OiIiLGRhdGFUeXBlOiIiLGRlZmF1bHQ6IiIsb3B0aW9uczowLHVpOntrZXlzOjAsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCx3aWR0aERhdGFUeXBlOjYwLHdpZHRoRGVmYXVsdDo2MH0sbWV0YTpwZSgpfSk7ZnVuY3Rpb24gR28odCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPVlvKCkscz13KEEscixuKSxpPXcoTixyLG4pLGE9dyhOLHIudWksbi51aSk7cygiaWQiKSxzKCJ0YWJsZUlkIikscygibmFtZSIpLHMoImNvbW1lbnQiKSxzKCJkYXRhVHlwZSIpLHMoImRlZmF1bHQiKSxpKCJvcHRpb25zIiksYSgia2V5cyIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLGEoIndpZHRoRGF0YVR5cGUiKSxhKCJ3aWR0aERlZmF1bHQiKSx3ZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1mdW5jdGlvbiBKbyh0KXt2YXIgZSxuLHIscyxpLGE7Y29uc3Qgbz10LHU9VW8oby5zZXR0aW5ncyksbD13byhvLmRvYyksYz1JbyhvLmx3dyksZD1xbygoZT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6ZS50YWJsZUVudGl0aWVzKSx5PUdvKChuPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDpuLnRhYmxlQ29sdW1uRW50aXRpZXMpLGg9RG8oKHI9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnIucmVsYXRpb25zaGlwRW50aXRpZXMpLFM9T28oKHM9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnMuaW5kZXhFbnRpdGllcyksaj1ibygoaT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6aS5pbmRleENvbHVtbkVudGl0aWVzKSxNPU5vKChhPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDphLm1lbW9FbnRpdGllcyk7cmV0dXJue3ZlcnNpb246IjMuMC4wIixzZXR0aW5nczp1LGRvYzpsLGNvbGxlY3Rpb25zOnt0YWJsZUVudGl0aWVzOmQsdGFibGVDb2x1bW5FbnRpdGllczp5LHJlbGF0aW9uc2hpcEVudGl0aWVzOmgsaW5kZXhFbnRpdGllczpTLGluZGV4Q29sdW1uRW50aXRpZXM6aixtZW1vRW50aXRpZXM6TX0sbHd3OmN9fWZ1bmN0aW9uIEJvKHQpe3JldHVyblt0LC0xLC0xLHt9XX1mdW5jdGlvbiBCdCh0LGUsbil7cmV0dXJuIHRbZV18fCh0W2VdPUJvKG4pLHRbZV0pfWZ1bmN0aW9uIFFvKHQsZSxuLHIscyl7Y29uc3QgaT1CdCh0LG4sciksYT1pWzFdLG89aVsyXTthPGUmJihpWzFdPWUpLG88ZSYmcygpfWZ1bmN0aW9uIEtvKHQsZSxuLHIscyl7Y29uc3QgaT1CdCh0LG4sciksYT1pWzJdLG89aVsxXTthPGUmJihpWzJdPWUpLG88PWUmJnMoKX1mdW5jdGlvbiBYbyh0LGUsbixyLHMsaSl7Y29uc3QgYT1CdCh0LG4scik7KGFbM11bc10/Py0xKTw9ZSYmKGFbM11bc109ZSxpKCkpfWNsYXNzIGV1e2NvbnN0cnVjdG9yKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjb2xsZWN0aW9ucyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX1jb2xsZWN0aW9uKGUpe3JldHVybiBuZXcgdHUodGhpcy5jb2xsZWN0aW9uc1tlXSxlKX19Y2xhc3MgdHV7Y29uc3RydWN0b3IoZSxuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29sbGVjdGlvbiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29sbGVjdGlvbktleSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm59KX1zZWxlY3RCeUlkKGUpe3JldHVybiB0aGlzLmNvbGxlY3Rpb25bZV19c2VsZWN0QnlJZHMoZSl7cmV0dXJuIGUubGVuZ3RoLGUubWFwKG49PnRoaXMuc2VsZWN0QnlJZChuKSkuZmlsdGVyKEJvb2xlYW4pfXNlbGVjdEVudGl0aWVzKCl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbn1zZWxlY3RBbGwoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmNvbGxlY3Rpb24pfXNldE9uZShlKXtyZXR1cm4gdGhpcy5jb2xsZWN0aW9uW2UuaWRdPWUsdGhpc31zZXRNYW55KGUpe3JldHVybiBlLmZvckVhY2gobj0+dGhpcy5zZXRPbmUobikpLHRoaXN9c2V0QWxsKGUpe3JldHVybiB0aGlzLnJlbW92ZUFsbCgpLHRoaXMuc2V0TWFueShlKSx0aGlzfWFkZE9uZShlKXtyZXR1cm4gdGhpcy5zZWxlY3RCeUlkKGUuaWQpP3RoaXM6KHRoaXMuc2V0T25lKGUpLHRoaXMpfWFkZE1hbnkoZSl7cmV0dXJuIGUuZm9yRWFjaChuPT50aGlzLmFkZE9uZShuKSksdGhpc31yZW1vdmVPbmUoZSl7cmV0dXJuIHRoaXMuc2VsZWN0QnlJZChlKSYmUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0aGlzLmNvbGxlY3Rpb24sZSksdGhpc31yZW1vdmVNYW55KGUpe3JldHVybiBlLmZvckVhY2gobj0+dGhpcy5yZW1vdmVPbmUobikpLHRoaXN9cmVtb3ZlQWxsKCl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbj17fSx0aGlzfXVwZGF0ZU9uZShlLG4pe2NvbnN0IHI9dGhpcy5zZWxlY3RCeUlkKGUpO3JldHVybiByJiYobihyKSxyLm1ldGEudXBkYXRlQXQ9RGF0ZS5ub3coKSksdGhpc311cGRhdGVNYW55KGUsbil7cmV0dXJuIGUuZm9yRWFjaChyPT50aGlzLnVwZGF0ZU9uZShyLG4pKSx0aGlzfWdldE9yQ3JlYXRlKGUsbil7Y29uc3Qgcj10aGlzLnNlbGVjdEJ5SWQoZSk7aWYocilyZXR1cm4gcjtjb25zdCBzPW4oZSk7cmV0dXJuIHRoaXMuc2V0T25lKHMpLHRoaXMuc2VsZWN0QnlJZChlKX1hZGRPcGVyYXRvcihlLG4scixzKXtyZXR1cm4gUW8oZSxuLHIsdGhpcy5jb2xsZWN0aW9uS2V5LHMpLHRoaXN9cmVtb3ZlT3BlcmF0b3IoZSxuLHIscyl7cmV0dXJuIEtvKGUsbixyLHRoaXMuY29sbGVjdGlvbktleSxzKSx0aGlzfXJlcGxhY2VPcGVyYXRvcihlLG4scixzLGkpe3JldHVybiBYbyhlLG4scix0aGlzLmNvbGxlY3Rpb25LZXkscyxpKSx0aGlzfX1jb25zdCBWPXQ9Pm5ldyBldSh0KTtmdW5jdGlvbiBDKHQpe2NvbnN0IGU9bmV3IFNldCh0KTtyZXR1cm4gbj0+ZS5oYXMobil9dmFyIG51PXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxydT1udSxzdT10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGl1PXJ1fHxzdXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxjdD1pdSxhdT1jdC5TeW1ib2wsZnQ9YXUsdXI9T2JqZWN0LnByb3RvdHlwZSxvdT11ci5oYXNPd25Qcm9wZXJ0eSx1dT11ci50b1N0cmluZyx6ZT1mdD9mdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gbHUodCl7dmFyIGU9b3UuY2FsbCh0LHplKSxuPXRbemVdO3RyeXt0W3plXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2h7fXZhciBzPXV1LmNhbGwodCk7cmV0dXJuIHImJihlP3RbemVdPW46ZGVsZXRlIHRbemVdKSxzfXZhciBjdT1PYmplY3QucHJvdG90eXBlLGZ1PWN1LnRvU3RyaW5nO2Z1bmN0aW9uIGR1KHQpe3JldHVybiBmdS5jYWxsKHQpfXZhciBodT0iW29iamVjdCBOdWxsXSIsbXU9IltvYmplY3QgVW5kZWZpbmVkXSIsbHI9ZnQ/ZnQudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIHl1KHQpe3JldHVybiB0PT1udWxsP3Q9PT12b2lkIDA/bXU6aHU6bHImJmxyIGluIE9iamVjdCh0KT9sdSh0KTpkdSh0KX1mdW5jdGlvbiBjcih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gdCE9bnVsbCYmKGU9PSJvYmplY3QifHxlPT0iZnVuY3Rpb24iKX12YXIgZ3U9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLHB1PSJbb2JqZWN0IEZ1bmN0aW9uXSIsd3U9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIix2dT0iW29iamVjdCBQcm94eV0iO2Z1bmN0aW9uIE91KHQpe2lmKCFjcih0KSlyZXR1cm4hMTt2YXIgZT15dSh0KTtyZXR1cm4gZT09cHV8fGU9PXd1fHxlPT1ndXx8ZT09dnV9dmFyIFR1PWN0WyJfX2NvcmUtanNfc2hhcmVkX18iXSxRdD1UdSxmcj1mdW5jdGlvbigpe3ZhciB0PS9bXi5dKyQvLmV4ZWMoUXQmJlF0LmtleXMmJlF0LmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdD8iU3ltYm9sKHNyYylfMS4iK3Q6IiJ9KCk7ZnVuY3Rpb24gU3UodCl7cmV0dXJuISFmciYmZnIgaW4gdH12YXIgYnU9RnVuY3Rpb24ucHJvdG90eXBlLGt1PWJ1LnRvU3RyaW5nO2Z1bmN0aW9uIEl1KHQpe2lmKHQhPW51bGwpe3RyeXtyZXR1cm4ga3UuY2FsbCh0KX1jYXRjaHt9dHJ5e3JldHVybiB0KyIifWNhdGNoe319cmV0dXJuIiJ9dmFyIEV1PS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxOdT0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyx4dT1GdW5jdGlvbi5wcm90b3R5cGUsTXU9T2JqZWN0LnByb3RvdHlwZSxDdT14dS50b1N0cmluZyxEdT1NdS5oYXNPd25Qcm9wZXJ0eSxfdT1SZWdFeHAoIl4iK0N1LmNhbGwoRHUpLnJlcGxhY2UoRXUsIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7ZnVuY3Rpb24gRnUodCl7aWYoIWNyKHQpfHxTdSh0KSlyZXR1cm4hMTt2YXIgZT1PdSh0KT9fdTpOdTtyZXR1cm4gZS50ZXN0KEl1KHQpKX1mdW5jdGlvbiBBdSh0LGUpe3JldHVybiB0PT1udWxsP3ZvaWQgMDp0W2VdfWZ1bmN0aW9uIEt0KHQsZSl7dmFyIG49QXUodCxlKTtyZXR1cm4gRnUobik/bjp2b2lkIDB9ZnVuY3Rpb24gVnUoKXt9ZnVuY3Rpb24gV3UodCxlLG4scil7Zm9yKHZhciBzPXQubGVuZ3RoLGk9bisocj8xOi0xKTtyP2ktLTorK2k8czspaWYoZSh0W2ldLGksdCkpcmV0dXJuIGk7cmV0dXJuLTF9ZnVuY3Rpb24gJHUodCl7cmV0dXJuIHQhPT10fWZ1bmN0aW9uIEx1KHQsZSxuKXtmb3IodmFyIHI9bi0xLHM9dC5sZW5ndGg7KytyPHM7KWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIHp1KHQsZSxuKXtyZXR1cm4gZT09PWU/THUodCxlLG4pOld1KHQsJHUsbil9ZnVuY3Rpb24gWnUodCxlKXt2YXIgbj10PT1udWxsPzA6dC5sZW5ndGg7cmV0dXJuISFuJiZ6dSh0LGUsMCk+LTF9ZnVuY3Rpb24gUnUodCxlKXtyZXR1cm4gdD09PWV8fHQhPT10JiZlIT09ZX12YXIgUHU9S3QoT2JqZWN0LCJjcmVhdGUiKSxaZT1QdTtmdW5jdGlvbiBqdSgpe3RoaXMuX19kYXRhX189WmU/WmUobnVsbCk6e30sdGhpcy5zaXplPTB9ZnVuY3Rpb24gVXUodCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9dmFyIEh1PSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIixxdT1PYmplY3QucHJvdG90eXBlLFl1PXF1Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIEd1KHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoWmUpe3ZhciBuPWVbdF07cmV0dXJuIG49PT1IdT92b2lkIDA6bn1yZXR1cm4gWXUuY2FsbChlLHQpP2VbdF06dm9pZCAwfXZhciBKdT1PYmplY3QucHJvdG90eXBlLEJ1PUp1Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFF1KHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIFplP2VbdF0hPT12b2lkIDA6QnUuY2FsbChlLHQpfXZhciBLdT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gWHUodCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxuW3RdPVplJiZlPT09dm9pZCAwP0t1OmUsdGhpc31mdW5jdGlvbiB1ZSh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX11ZS5wcm90b3R5cGUuY2xlYXI9anUsdWUucHJvdG90eXBlLmRlbGV0ZT1VdSx1ZS5wcm90b3R5cGUuZ2V0PUd1LHVlLnByb3RvdHlwZS5oYXM9UXUsdWUucHJvdG90eXBlLnNldD1YdTtmdW5jdGlvbiBlbCgpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9ZnVuY3Rpb24gZHQodCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihSdSh0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfXZhciB0bD1BcnJheS5wcm90b3R5cGUsbmw9dGwuc3BsaWNlO2Z1bmN0aW9uIHJsKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1kdChlLHQpO2lmKG48MClyZXR1cm4hMTt2YXIgcj1lLmxlbmd0aC0xO3JldHVybiBuPT1yP2UucG9wKCk6bmwuY2FsbChlLG4sMSksLS10aGlzLnNpemUsITB9ZnVuY3Rpb24gc2wodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWR0KGUsdCk7cmV0dXJuIG48MD92b2lkIDA6ZVtuXVsxXX1mdW5jdGlvbiBpbCh0KXtyZXR1cm4gZHQodGhpcy5fX2RhdGFfXyx0KT4tMX1mdW5jdGlvbiBhbCh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj1kdChuLHQpO3JldHVybiByPDA/KCsrdGhpcy5zaXplLG4ucHVzaChbdCxlXSkpOm5bcl1bMV09ZSx0aGlzfWZ1bmN0aW9uIHZlKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fXZlLnByb3RvdHlwZS5jbGVhcj1lbCx2ZS5wcm90b3R5cGUuZGVsZXRlPXJsLHZlLnByb3RvdHlwZS5nZXQ9c2wsdmUucHJvdG90eXBlLmhhcz1pbCx2ZS5wcm90b3R5cGUuc2V0PWFsO3ZhciBvbD1LdChjdCwiTWFwIiksdWw9b2w7ZnVuY3Rpb24gbGwoKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyB1ZSxtYXA6bmV3KHVsfHx2ZSksc3RyaW5nOm5ldyB1ZX19ZnVuY3Rpb24gY2wodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIGU9PSJzdHJpbmcifHxlPT0ibnVtYmVyInx8ZT09InN5bWJvbCJ8fGU9PSJib29sZWFuIj90IT09Il9fcHJvdG9fXyI6dD09PW51bGx9ZnVuY3Rpb24gaHQodCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybiBjbChlKT9uW3R5cGVvZiBlPT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIGZsKHQpe3ZhciBlPWh0KHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9ZnVuY3Rpb24gZGwodCl7cmV0dXJuIGh0KHRoaXMsdCkuZ2V0KHQpfWZ1bmN0aW9uIGhsKHQpe3JldHVybiBodCh0aGlzLHQpLmhhcyh0KX1mdW5jdGlvbiBtbCh0LGUpe3ZhciBuPWh0KHRoaXMsdCkscj1uLnNpemU7cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplKz1uLnNpemU9PXI/MDoxLHRoaXN9ZnVuY3Rpb24gT2UodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19T2UucHJvdG90eXBlLmNsZWFyPWxsLE9lLnByb3RvdHlwZS5kZWxldGU9ZmwsT2UucHJvdG90eXBlLmdldD1kbCxPZS5wcm90b3R5cGUuaGFzPWhsLE9lLnByb3RvdHlwZS5zZXQ9bWw7dmFyIHlsPUt0KGN0LCJTZXQiKSxYdD15bCxnbD0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gcGwodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsZ2wpLHRoaXN9ZnVuY3Rpb24gd2wodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfWZ1bmN0aW9uIG10KHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBPZTsrK2U8bjspdGhpcy5hZGQodFtlXSl9bXQucHJvdG90eXBlLmFkZD1tdC5wcm90b3R5cGUucHVzaD1wbCxtdC5wcm90b3R5cGUuaGFzPXdsO2Z1bmN0aW9uIHZsKHQsZSl7cmV0dXJuIHQuaGFzKGUpfWZ1bmN0aW9uIGRyKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHIpe25bKytlXT1yfSksbn1mdW5jdGlvbiBPbCh0LGUsbil7Zm9yKHZhciByPS0xLHM9dD09bnVsbD8wOnQubGVuZ3RoOysrcjxzOylpZihuKGUsdFtyXSkpcmV0dXJuITA7cmV0dXJuITF9dmFyIFRsPTEvMCxTbD1YdCYmMS9kcihuZXcgWHQoWywtMF0pKVsxXT09VGw/ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBYdCh0KX06VnUsYmw9U2wsa2w9MjAwO2Z1bmN0aW9uIElsKHQsZSxuKXt2YXIgcj0tMSxzPVp1LGk9dC5sZW5ndGgsYT0hMCxvPVtdLHU9bztpZihuKWE9ITEscz1PbDtlbHNlIGlmKGk+PWtsKXt2YXIgbD1lP251bGw6YmwodCk7aWYobClyZXR1cm4gZHIobCk7YT0hMSxzPXZsLHU9bmV3IG10fWVsc2UgdT1lP1tdOm87ZTpmb3IoOysrcjxpOyl7dmFyIGM9dFtyXSxkPWU/ZShjKTpjO2lmKGM9bnx8YyE9PTA/YzowLGEmJmQ9PT1kKXtmb3IodmFyIHk9dS5sZW5ndGg7eS0tOylpZih1W3ldPT09ZCljb250aW51ZSBlO2UmJnUucHVzaChkKSxvLnB1c2goYyl9ZWxzZSBzKHUsZCxuKXx8KHUhPT1vJiZ1LnB1c2goZCksby5wdXNoKGMpKX1yZXR1cm4gb31mdW5jdGlvbiBUZSh0KXtyZXR1cm4gdCYmdC5sZW5ndGg/SWwodCk6W119Y2xhc3MgbGUgZXh0ZW5kcyBFcnJvcnt9Y2xhc3MgRWwgZXh0ZW5kcyBsZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCBEYXRlVGltZTogJHtlLnRvTWVzc2FnZSgpfWApfX1jbGFzcyBObCBleHRlbmRzIGxle2NvbnN0cnVjdG9yKGUpe3N1cGVyKGBJbnZhbGlkIEludGVydmFsOiAke2UudG9NZXNzYWdlKCl9YCl9fWNsYXNzIHhsIGV4dGVuZHMgbGV7Y29uc3RydWN0b3IoZSl7c3VwZXIoYEludmFsaWQgRHVyYXRpb246ICR7ZS50b01lc3NhZ2UoKX1gKX19Y2xhc3MgU2UgZXh0ZW5kcyBsZXt9Y2xhc3MgaHIgZXh0ZW5kcyBsZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCB1bml0ICR7ZX1gKX19Y2xhc3MgXyBleHRlbmRzIGxle31jbGFzcyB0ZSBleHRlbmRzIGxle2NvbnN0cnVjdG9yKCl7c3VwZXIoIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3MiKX19Y29uc3QgZj0ibnVtZXJpYyIsej0ic2hvcnQiLEY9ImxvbmciLHl0PXt5ZWFyOmYsbW9udGg6ZixkYXk6Zn0sbXI9e3llYXI6Zixtb250aDp6LGRheTpmfSxNbD17eWVhcjpmLG1vbnRoOnosZGF5OmYsd2Vla2RheTp6fSx5cj17eWVhcjpmLG1vbnRoOkYsZGF5OmZ9LGdyPXt5ZWFyOmYsbW9udGg6RixkYXk6Zix3ZWVrZGF5OkZ9LHByPXtob3VyOmYsbWludXRlOmZ9LHdyPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmZ9LHZyPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOnp9LE9yPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOkZ9LFRyPXtob3VyOmYsbWludXRlOmYsaG91ckN5Y2xlOiJoMjMifSxTcj17aG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLGhvdXJDeWNsZToiaDIzIn0sYnI9e2hvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zixob3VyQ3ljbGU6ImgyMyIsdGltZVpvbmVOYW1lOnp9LGtyPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsaG91ckN5Y2xlOiJoMjMiLHRpbWVab25lTmFtZTpGfSxJcj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSxFcj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxOcj17eWVhcjpmLG1vbnRoOnosZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSx4cj17eWVhcjpmLG1vbnRoOnosZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxDbD17eWVhcjpmLG1vbnRoOnosZGF5OmYsd2Vla2RheTp6LGhvdXI6ZixtaW51dGU6Zn0sTXI9e3llYXI6Zixtb250aDpGLGRheTpmLGhvdXI6ZixtaW51dGU6Zix0aW1lWm9uZU5hbWU6en0sQ3I9e3llYXI6Zixtb250aDpGLGRheTpmLGhvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zix0aW1lWm9uZU5hbWU6en0sRHI9e3llYXI6Zixtb250aDpGLGRheTpmLHdlZWtkYXk6Rixob3VyOmYsbWludXRlOmYsdGltZVpvbmVOYW1lOkZ9LF9yPXt5ZWFyOmYsbW9udGg6RixkYXk6Zix3ZWVrZGF5OkYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLHRpbWVab25lTmFtZTpGfTtjbGFzcyBSZXtnZXQgdHlwZSgpe3Rocm93IG5ldyB0ZX1nZXQgbmFtZSgpe3Rocm93IG5ldyB0ZX1nZXQgaWFuYU5hbWUoKXtyZXR1cm4gdGhpcy5uYW1lfWdldCBpc1VuaXZlcnNhbCgpe3Rocm93IG5ldyB0ZX1vZmZzZXROYW1lKGUsbil7dGhyb3cgbmV3IHRlfWZvcm1hdE9mZnNldChlLG4pe3Rocm93IG5ldyB0ZX1vZmZzZXQoZSl7dGhyb3cgbmV3IHRlfWVxdWFscyhlKXt0aHJvdyBuZXcgdGV9Z2V0IGlzVmFsaWQoKXt0aHJvdyBuZXcgdGV9fWxldCBlbj1udWxsO2NsYXNzIGd0IGV4dGVuZHMgUmV7c3RhdGljIGdldCBpbnN0YW5jZSgpe3JldHVybiBlbj09PW51bGwmJihlbj1uZXcgZ3QpLGVufWdldCB0eXBlKCl7cmV0dXJuInN5c3RlbSJ9Z2V0IG5hbWUoKXtyZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZX1nZXQgaXNVbml2ZXJzYWwoKXtyZXR1cm4hMX1vZmZzZXROYW1lKGUse2Zvcm1hdDpuLGxvY2FsZTpyfSl7cmV0dXJuIG5zKGUsbixyKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gSGUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe3JldHVybi1uZXcgRGF0ZShlKS5nZXRUaW1lem9uZU9mZnNldCgpfWVxdWFscyhlKXtyZXR1cm4gZS50eXBlPT09InN5c3RlbSJ9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMH19bGV0IHB0PXt9O2Z1bmN0aW9uIERsKHQpe3JldHVybiBwdFt0XXx8KHB0W3RdPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCJlbi1VUyIse2hvdXIxMjohMSx0aW1lWm9uZTp0LHllYXI6Im51bWVyaWMiLG1vbnRoOiIyLWRpZ2l0IixkYXk6IjItZGlnaXQiLGhvdXI6IjItZGlnaXQiLG1pbnV0ZToiMi1kaWdpdCIsc2Vjb25kOiIyLWRpZ2l0IixlcmE6InNob3J0In0pKSxwdFt0XX1jb25zdCBfbD17eWVhcjowLG1vbnRoOjEsZGF5OjIsZXJhOjMsaG91cjo0LG1pbnV0ZTo1LHNlY29uZDo2fTtmdW5jdGlvbiBGbCh0LGUpe2NvbnN0IG49dC5mb3JtYXQoZSkucmVwbGFjZSgvXHUyMDBFL2csIiIpLHI9LyhcZCspXC8oXGQrKVwvKFxkKykgKEFEfEJDKSw/IChcZCspOihcZCspOihcZCspLy5leGVjKG4pLFsscyxpLGEsbyx1LGwsY109cjtyZXR1cm5bYSxzLGksbyx1LGwsY119ZnVuY3Rpb24gQWwodCxlKXtjb25zdCBuPXQuZm9ybWF0VG9QYXJ0cyhlKSxyPVtdO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cysrKXtjb25zdHt0eXBlOmksdmFsdWU6YX09bltzXSxvPV9sW2ldO2k9PT0iZXJhIj9yW29dPWE6ZyhvKXx8KHJbb109cGFyc2VJbnQoYSwxMCkpfXJldHVybiByfWxldCB3dD17fTtjbGFzcyBKIGV4dGVuZHMgUmV7c3RhdGljIGNyZWF0ZShlKXtyZXR1cm4gd3RbZV18fCh3dFtlXT1uZXcgSihlKSksd3RbZV19c3RhdGljIHJlc2V0Q2FjaGUoKXt3dD17fSxwdD17fX1zdGF0aWMgaXNWYWxpZFNwZWNpZmllcihlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkWm9uZShlKX1zdGF0aWMgaXNWYWxpZFpvbmUoZSl7aWYoIWUpcmV0dXJuITE7dHJ5e3JldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tVVMiLHt0aW1lWm9uZTplfSkuZm9ybWF0KCksITB9Y2F0Y2h7cmV0dXJuITF9fWNvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lLHRoaXMudmFsaWQ9Si5pc1ZhbGlkWm9uZShlKX1nZXQgdHlwZSgpe3JldHVybiJpYW5hIn1nZXQgbmFtZSgpe3JldHVybiB0aGlzLnpvbmVOYW1lfWdldCBpc1VuaXZlcnNhbCgpe3JldHVybiExfW9mZnNldE5hbWUoZSx7Zm9ybWF0Om4sbG9jYWxlOnJ9KXtyZXR1cm4gbnMoZSxuLHIsdGhpcy5uYW1lKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gSGUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe2NvbnN0IG49bmV3IERhdGUoZSk7aWYoaXNOYU4obikpcmV0dXJuIE5hTjtjb25zdCByPURsKHRoaXMubmFtZSk7bGV0W3MsaSxhLG8sdSxsLGNdPXIuZm9ybWF0VG9QYXJ0cz9BbChyLG4pOkZsKHIsbik7bz09PSJCQyImJihzPS1NYXRoLmFicyhzKSsxKTtjb25zdCB5PWJ0KHt5ZWFyOnMsbW9udGg6aSxkYXk6YSxob3VyOnU9PT0yND8wOnUsbWludXRlOmwsc2Vjb25kOmMsbWlsbGlzZWNvbmQ6MH0pO2xldCBoPStuO2NvbnN0IFM9aCUxZTM7cmV0dXJuIGgtPVM+PTA/UzoxZTMrUywoeS1oKS8oNjAqMWUzKX1lcXVhbHMoZSl7cmV0dXJuIGUudHlwZT09PSJpYW5hIiYmZS5uYW1lPT09dGhpcy5uYW1lfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMudmFsaWR9fWxldCBGcj17fTtmdW5jdGlvbiBWbCh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPUZyW25dO3JldHVybiByfHwocj1uZXcgSW50bC5MaXN0Rm9ybWF0KHQsZSksRnJbbl09cikscn1sZXQgdG49e307ZnVuY3Rpb24gbm4odCxlPXt9KXtjb25zdCBuPUpTT04uc3RyaW5naWZ5KFt0LGVdKTtsZXQgcj10bltuXTtyZXR1cm4gcnx8KHI9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodCxlKSx0bltuXT1yKSxyfWxldCBybj17fTtmdW5jdGlvbiBXbCh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPXJuW25dO3JldHVybiByfHwocj1uZXcgSW50bC5OdW1iZXJGb3JtYXQodCxlKSxybltuXT1yKSxyfWxldCBzbj17fTtmdW5jdGlvbiAkbCh0LGU9e30pe2NvbnN0e2Jhc2U6biwuLi5yfT1lLHM9SlNPTi5zdHJpbmdpZnkoW3Qscl0pO2xldCBpPXNuW3NdO3JldHVybiBpfHwoaT1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodCxlKSxzbltzXT1pKSxpfWxldCBQZT1udWxsO2Z1bmN0aW9uIExsKCl7cmV0dXJuIFBlfHwoUGU9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUsUGUpfWxldCBBcj17fTtmdW5jdGlvbiB6bCh0KXtsZXQgZT1Bclt0XTtpZighZSl7Y29uc3Qgbj1uZXcgSW50bC5Mb2NhbGUodCk7ZT0iZ2V0V2Vla0luZm8iaW4gbj9uLmdldFdlZWtJbmZvKCk6bi53ZWVrSW5mbyxBclt0XT1lfXJldHVybiBlfWZ1bmN0aW9uIFpsKHQpe2NvbnN0IGU9dC5pbmRleE9mKCIteC0iKTtlIT09LTEmJih0PXQuc3Vic3RyaW5nKDAsZSkpO2NvbnN0IG49dC5pbmRleE9mKCItdS0iKTtpZihuPT09LTEpcmV0dXJuW3RdO3tsZXQgcixzO3RyeXtyPW5uKHQpLnJlc29sdmVkT3B0aW9ucygpLHM9dH1jYXRjaHtjb25zdCB1PXQuc3Vic3RyaW5nKDAsbik7cj1ubih1KS5yZXNvbHZlZE9wdGlvbnMoKSxzPXV9Y29uc3R7bnVtYmVyaW5nU3lzdGVtOmksY2FsZW5kYXI6YX09cjtyZXR1cm5bcyxpLGFdfX1mdW5jdGlvbiBSbCh0LGUsbil7cmV0dXJuKG58fGUpJiYodC5pbmNsdWRlcygiLXUtIil8fCh0Kz0iLXUiKSxuJiYodCs9YC1jYS0ke259YCksZSYmKHQrPWAtbnUtJHtlfWApKSx0fWZ1bmN0aW9uIFBsKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTE7bjw9MTI7bisrKXtjb25zdCByPXAudXRjKDIwMDksbiwxKTtlLnB1c2godChyKSl9cmV0dXJuIGV9ZnVuY3Rpb24gamwodCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MTtuPD03O24rKyl7Y29uc3Qgcj1wLnV0YygyMDE2LDExLDEzK24pO2UucHVzaCh0KHIpKX1yZXR1cm4gZX1mdW5jdGlvbiB2dCh0LGUsbixyKXtjb25zdCBzPXQubGlzdGluZ01vZGUoKTtyZXR1cm4gcz09PSJlcnJvciI/bnVsbDpzPT09ImVuIj9uKGUpOnIoZSl9ZnVuY3Rpb24gVWwodCl7cmV0dXJuIHQubnVtYmVyaW5nU3lzdGVtJiZ0Lm51bWJlcmluZ1N5c3RlbSE9PSJsYXRuIj8hMTp0Lm51bWJlcmluZ1N5c3RlbT09PSJsYXRuInx8IXQubG9jYWxlfHx0LmxvY2FsZS5zdGFydHNXaXRoKCJlbiIpfHxuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0LmludGwpLnJlc29sdmVkT3B0aW9ucygpLm51bWJlcmluZ1N5c3RlbT09PSJsYXRuIn1jbGFzcyBIbHtjb25zdHJ1Y3RvcihlLG4scil7dGhpcy5wYWRUbz1yLnBhZFRvfHwwLHRoaXMuZmxvb3I9ci5mbG9vcnx8ITE7Y29uc3R7cGFkVG86cyxmbG9vcjppLC4uLmF9PXI7aWYoIW58fE9iamVjdC5rZXlzKGEpLmxlbmd0aD4wKXtjb25zdCBvPXt1c2VHcm91cGluZzohMSwuLi5yfTtyLnBhZFRvPjAmJihvLm1pbmltdW1JbnRlZ2VyRGlnaXRzPXIucGFkVG8pLHRoaXMuaW5mPVdsKGUsbyl9fWZvcm1hdChlKXtpZih0aGlzLmluZil7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6ZTtyZXR1cm4gdGhpcy5pbmYuZm9ybWF0KG4pfWVsc2V7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6ZG4oZSwzKTtyZXR1cm4gRShuLHRoaXMucGFkVG8pfX19Y2xhc3MgcWx7Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz1yLHRoaXMub3JpZ2luYWxab25lPXZvaWQgMDtsZXQgcztpZih0aGlzLm9wdHMudGltZVpvbmUpdGhpcy5kdD1lO2Vsc2UgaWYoZS56b25lLnR5cGU9PT0iZml4ZWQiKXtjb25zdCBhPS0xKihlLm9mZnNldC82MCksbz1hPj0wP2BFdGMvR01UKyR7YX1gOmBFdGMvR01UJHthfWA7ZS5vZmZzZXQhPT0wJiZKLmNyZWF0ZShvKS52YWxpZD8ocz1vLHRoaXMuZHQ9ZSk6KHM9IlVUQyIsdGhpcy5kdD1lLm9mZnNldD09PTA/ZTplLnNldFpvbmUoIlVUQyIpLnBsdXMoe21pbnV0ZXM6ZS5vZmZzZXR9KSx0aGlzLm9yaWdpbmFsWm9uZT1lLnpvbmUpfWVsc2UgZS56b25lLnR5cGU9PT0ic3lzdGVtIj90aGlzLmR0PWU6ZS56b25lLnR5cGU9PT0iaWFuYSI/KHRoaXMuZHQ9ZSxzPWUuem9uZS5uYW1lKToocz0iVVRDIix0aGlzLmR0PWUuc2V0Wm9uZSgiVVRDIikucGx1cyh7bWludXRlczplLm9mZnNldH0pLHRoaXMub3JpZ2luYWxab25lPWUuem9uZSk7Y29uc3QgaT17Li4udGhpcy5vcHRzfTtpLnRpbWVab25lPWkudGltZVpvbmV8fHMsdGhpcy5kdGY9bm4obixpKX1mb3JtYXQoKXtyZXR1cm4gdGhpcy5vcmlnaW5hbFpvbmU/dGhpcy5mb3JtYXRUb1BhcnRzKCkubWFwKCh7dmFsdWU6ZX0pPT5lKS5qb2luKCIiKTp0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKX1mb3JtYXRUb1BhcnRzKCl7Y29uc3QgZT10aGlzLmR0Zi5mb3JtYXRUb1BhcnRzKHRoaXMuZHQudG9KU0RhdGUoKSk7cmV0dXJuIHRoaXMub3JpZ2luYWxab25lP2UubWFwKG49PntpZihuLnR5cGU9PT0idGltZVpvbmVOYW1lIil7Y29uc3Qgcj10aGlzLm9yaWdpbmFsWm9uZS5vZmZzZXROYW1lKHRoaXMuZHQudHMse2xvY2FsZTp0aGlzLmR0LmxvY2FsZSxmb3JtYXQ6dGhpcy5vcHRzLnRpbWVab25lTmFtZX0pO3JldHVybnsuLi5uLHZhbHVlOnJ9fWVsc2UgcmV0dXJuIG59KTplfXJlc29sdmVkT3B0aW9ucygpe3JldHVybiB0aGlzLmR0Zi5yZXNvbHZlZE9wdGlvbnMoKX19Y2xhc3MgWWx7Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz17c3R5bGU6ImxvbmciLC4uLnJ9LCFuJiZLcigpJiYodGhpcy5ydGY9JGwoZSxyKSl9Zm9ybWF0KGUsbil7cmV0dXJuIHRoaXMucnRmP3RoaXMucnRmLmZvcm1hdChlLG4pOmhjKG4sZSx0aGlzLm9wdHMubnVtZXJpYyx0aGlzLm9wdHMuc3R5bGUhPT0ibG9uZyIpfWZvcm1hdFRvUGFydHMoZSxuKXtyZXR1cm4gdGhpcy5ydGY/dGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhlLG4pOltdfX1jb25zdCBHbD17Zmlyc3REYXk6MSxtaW5pbWFsRGF5czo0LHdlZWtlbmQ6WzYsN119O2NsYXNzIFR7c3RhdGljIGZyb21PcHRzKGUpe3JldHVybiBULmNyZWF0ZShlLmxvY2FsZSxlLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyLGUud2Vla1NldHRpbmdzLGUuZGVmYXVsdFRvRU4pfXN0YXRpYyBjcmVhdGUoZSxuLHIscyxpPSExKXtjb25zdCBhPWV8fEkuZGVmYXVsdExvY2FsZSxvPWF8fChpPyJlbi1VUyI6TGwoKSksdT1ufHxJLmRlZmF1bHROdW1iZXJpbmdTeXN0ZW0sbD1yfHxJLmRlZmF1bHRPdXRwdXRDYWxlbmRhcixjPWNuKHMpfHxJLmRlZmF1bHRXZWVrU2V0dGluZ3M7cmV0dXJuIG5ldyBUKG8sdSxsLGMsYSl9c3RhdGljIHJlc2V0Q2FjaGUoKXtQZT1udWxsLHRuPXt9LHJuPXt9LHNuPXt9fXN0YXRpYyBmcm9tT2JqZWN0KHtsb2NhbGU6ZSxudW1iZXJpbmdTeXN0ZW06bixvdXRwdXRDYWxlbmRhcjpyLHdlZWtTZXR0aW5nczpzfT17fSl7cmV0dXJuIFQuY3JlYXRlKGUsbixyLHMpfWNvbnN0cnVjdG9yKGUsbixyLHMsaSl7Y29uc3RbYSxvLHVdPVpsKGUpO3RoaXMubG9jYWxlPWEsdGhpcy5udW1iZXJpbmdTeXN0ZW09bnx8b3x8bnVsbCx0aGlzLm91dHB1dENhbGVuZGFyPXJ8fHV8fG51bGwsdGhpcy53ZWVrU2V0dGluZ3M9cyx0aGlzLmludGw9UmwodGhpcy5sb2NhbGUsdGhpcy5udW1iZXJpbmdTeXN0ZW0sdGhpcy5vdXRwdXRDYWxlbmRhciksdGhpcy53ZWVrZGF5c0NhY2hlPXtmb3JtYXQ6e30sc3RhbmRhbG9uZTp7fX0sdGhpcy5tb250aHNDYWNoZT17Zm9ybWF0Ont9LHN0YW5kYWxvbmU6e319LHRoaXMubWVyaWRpZW1DYWNoZT1udWxsLHRoaXMuZXJhQ2FjaGU9e30sdGhpcy5zcGVjaWZpZWRMb2NhbGU9aSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPW51bGx9Z2V0IGZhc3ROdW1iZXJzKCl7cmV0dXJuIHRoaXMuZmFzdE51bWJlcnNDYWNoZWQ9PW51bGwmJih0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPVVsKHRoaXMpKSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkfWxpc3RpbmdNb2RlKCl7Y29uc3QgZT10aGlzLmlzRW5nbGlzaCgpLG49KHRoaXMubnVtYmVyaW5nU3lzdGVtPT09bnVsbHx8dGhpcy5udW1iZXJpbmdTeXN0ZW09PT0ibGF0biIpJiYodGhpcy5vdXRwdXRDYWxlbmRhcj09PW51bGx8fHRoaXMub3V0cHV0Q2FsZW5kYXI9PT0iZ3JlZ29yeSIpO3JldHVybiBlJiZuPyJlbiI6ImludGwifWNsb25lKGUpe3JldHVybiFlfHxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5sZW5ndGg9PT0wP3RoaXM6VC5jcmVhdGUoZS5sb2NhbGV8fHRoaXMuc3BlY2lmaWVkTG9jYWxlLGUubnVtYmVyaW5nU3lzdGVtfHx0aGlzLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyfHx0aGlzLm91dHB1dENhbGVuZGFyLGNuKGUud2Vla1NldHRpbmdzKXx8dGhpcy53ZWVrU2V0dGluZ3MsZS5kZWZhdWx0VG9FTnx8ITEpfXJlZGVmYXVsdFRvRU4oZT17fSl7cmV0dXJuIHRoaXMuY2xvbmUoey4uLmUsZGVmYXVsdFRvRU46ITB9KX1yZWRlZmF1bHRUb1N5c3RlbShlPXt9KXtyZXR1cm4gdGhpcy5jbG9uZSh7Li4uZSxkZWZhdWx0VG9FTjohMX0pfW1vbnRocyhlLG49ITEpe3JldHVybiB2dCh0aGlzLGUsaXMsKCk9Pntjb25zdCByPW4/e21vbnRoOmUsZGF5OiJudW1lcmljIn06e21vbnRoOmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMubW9udGhzQ2FjaGVbc11bZV18fCh0aGlzLm1vbnRoc0NhY2hlW3NdW2VdPVBsKGk9PnRoaXMuZXh0cmFjdChpLHIsIm1vbnRoIikpKSx0aGlzLm1vbnRoc0NhY2hlW3NdW2VdfSl9d2Vla2RheXMoZSxuPSExKXtyZXR1cm4gdnQodGhpcyxlLHVzLCgpPT57Y29uc3Qgcj1uP3t3ZWVrZGF5OmUseWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9Ont3ZWVrZGF5OmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXXx8KHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXT1qbChpPT50aGlzLmV4dHJhY3QoaSxyLCJ3ZWVrZGF5IikpKSx0aGlzLndlZWtkYXlzQ2FjaGVbc11bZV19KX1tZXJpZGllbXMoKXtyZXR1cm4gdnQodGhpcyx2b2lkIDAsKCk9PmxzLCgpPT57aWYoIXRoaXMubWVyaWRpZW1DYWNoZSl7Y29uc3QgZT17aG91cjoibnVtZXJpYyIsaG91ckN5Y2xlOiJoMTIifTt0aGlzLm1lcmlkaWVtQ2FjaGU9W3AudXRjKDIwMTYsMTEsMTMsOSkscC51dGMoMjAxNiwxMSwxMywxOSldLm1hcChuPT50aGlzLmV4dHJhY3QobixlLCJkYXlwZXJpb2QiKSl9cmV0dXJuIHRoaXMubWVyaWRpZW1DYWNoZX0pfWVyYXMoZSl7cmV0dXJuIHZ0KHRoaXMsZSxjcywoKT0+e2NvbnN0IG49e2VyYTplfTtyZXR1cm4gdGhpcy5lcmFDYWNoZVtlXXx8KHRoaXMuZXJhQ2FjaGVbZV09W3AudXRjKC00MCwxLDEpLHAudXRjKDIwMTcsMSwxKV0ubWFwKHI9PnRoaXMuZXh0cmFjdChyLG4sImVyYSIpKSksdGhpcy5lcmFDYWNoZVtlXX0pfWV4dHJhY3QoZSxuLHIpe2NvbnN0IHM9dGhpcy5kdEZvcm1hdHRlcihlLG4pLGk9cy5mb3JtYXRUb1BhcnRzKCksYT1pLmZpbmQobz0+by50eXBlLnRvTG93ZXJDYXNlKCk9PT1yKTtyZXR1cm4gYT9hLnZhbHVlOm51bGx9bnVtYmVyRm9ybWF0dGVyKGU9e30pe3JldHVybiBuZXcgSGwodGhpcy5pbnRsLGUuZm9yY2VTaW1wbGV8fHRoaXMuZmFzdE51bWJlcnMsZSl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gbmV3IHFsKGUsdGhpcy5pbnRsLG4pfXJlbEZvcm1hdHRlcihlPXt9KXtyZXR1cm4gbmV3IFlsKHRoaXMuaW50bCx0aGlzLmlzRW5nbGlzaCgpLGUpfWxpc3RGb3JtYXR0ZXIoZT17fSl7cmV0dXJuIFZsKHRoaXMuaW50bCxlKX1pc0VuZ2xpc2goKXtyZXR1cm4gdGhpcy5sb2NhbGU9PT0iZW4ifHx0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpPT09ImVuLXVzInx8bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUuc3RhcnRzV2l0aCgiZW4tdXMiKX1nZXRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gdGhpcy53ZWVrU2V0dGluZ3M/dGhpcy53ZWVrU2V0dGluZ3M6WHIoKT96bCh0aGlzLmxvY2FsZSk6R2x9Z2V0U3RhcnRPZldlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5maXJzdERheX1nZXRNaW5EYXlzSW5GaXJzdFdlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5taW5pbWFsRGF5c31nZXRXZWVrZW5kRGF5cygpe3JldHVybiB0aGlzLmdldFdlZWtTZXR0aW5ncygpLndlZWtlbmR9ZXF1YWxzKGUpe3JldHVybiB0aGlzLmxvY2FsZT09PWUubG9jYWxlJiZ0aGlzLm51bWJlcmluZ1N5c3RlbT09PWUubnVtYmVyaW5nU3lzdGVtJiZ0aGlzLm91dHB1dENhbGVuZGFyPT09ZS5vdXRwdXRDYWxlbmRhcn19bGV0IGFuPW51bGw7Y2xhc3MgRCBleHRlbmRzIFJle3N0YXRpYyBnZXQgdXRjSW5zdGFuY2UoKXtyZXR1cm4gYW49PT1udWxsJiYoYW49bmV3IEQoMCkpLGFufXN0YXRpYyBpbnN0YW5jZShlKXtyZXR1cm4gZT09PTA/RC51dGNJbnN0YW5jZTpuZXcgRChlKX1zdGF0aWMgcGFyc2VTcGVjaWZpZXIoZSl7aWYoZSl7Y29uc3Qgbj1lLm1hdGNoKC9edXRjKD86KFsrLV1cZHsxLDJ9KSg/OjooXGR7Mn0pKT8pPyQvaSk7aWYobilyZXR1cm4gbmV3IEQoa3QoblsxXSxuWzJdKSl9cmV0dXJuIG51bGx9Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmZpeGVkPWV9Z2V0IHR5cGUoKXtyZXR1cm4iZml4ZWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJVVEMiOmBVVEMke0hlKHRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9Z2V0IGlhbmFOYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJFdGMvVVRDIjpgRXRjL0dNVCR7SGUoLXRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9b2Zmc2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9Zm9ybWF0T2Zmc2V0KGUsbil7cmV0dXJuIEhlKHRoaXMuZml4ZWQsbil9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITB9b2Zmc2V0KCl7cmV0dXJuIHRoaXMuZml4ZWR9ZXF1YWxzKGUpe3JldHVybiBlLnR5cGU9PT0iZml4ZWQiJiZlLmZpeGVkPT09dGhpcy5maXhlZH1nZXQgaXNWYWxpZCgpe3JldHVybiEwfX1jbGFzcyBKbCBleHRlbmRzIFJle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lfWdldCB0eXBlKCl7cmV0dXJuImludmFsaWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuem9uZU5hbWV9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITF9b2Zmc2V0TmFtZSgpe3JldHVybiBudWxsfWZvcm1hdE9mZnNldCgpe3JldHVybiIifW9mZnNldCgpe3JldHVybiBOYU59ZXF1YWxzKCl7cmV0dXJuITF9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMX19ZnVuY3Rpb24gbmUodCxlKXtpZihnKHQpfHx0PT09bnVsbClyZXR1cm4gZTtpZih0IGluc3RhbmNlb2YgUmUpcmV0dXJuIHQ7aWYoS2wodCkpe2NvbnN0IG49dC50b0xvd2VyQ2FzZSgpO3JldHVybiBuPT09ImRlZmF1bHQiP2U6bj09PSJsb2NhbCJ8fG49PT0ic3lzdGVtIj9ndC5pbnN0YW5jZTpuPT09InV0YyJ8fG49PT0iZ210Ij9ELnV0Y0luc3RhbmNlOkQucGFyc2VTcGVjaWZpZXIobil8fEouY3JlYXRlKHQpfWVsc2UgcmV0dXJuIGNlKHQpP0QuaW5zdGFuY2UodCk6dHlwZW9mIHQ9PSJvYmplY3QiJiYib2Zmc2V0ImluIHQmJnR5cGVvZiB0Lm9mZnNldD09ImZ1bmN0aW9uIj90Om5ldyBKbCh0KX1sZXQgVnI9KCk9PkRhdGUubm93KCksV3I9InN5c3RlbSIsJHI9bnVsbCxMcj1udWxsLHpyPW51bGwsWnI9NjAsUnIsUHI9bnVsbDtjbGFzcyBJe3N0YXRpYyBnZXQgbm93KCl7cmV0dXJuIFZyfXN0YXRpYyBzZXQgbm93KGUpe1ZyPWV9c3RhdGljIHNldCBkZWZhdWx0Wm9uZShlKXtXcj1lfXN0YXRpYyBnZXQgZGVmYXVsdFpvbmUoKXtyZXR1cm4gbmUoV3IsZ3QuaW5zdGFuY2UpfXN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpe3JldHVybiAkcn1zdGF0aWMgc2V0IGRlZmF1bHRMb2NhbGUoZSl7JHI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0oKXtyZXR1cm4gTHJ9c3RhdGljIHNldCBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtKGUpe0xyPWV9c3RhdGljIGdldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoKXtyZXR1cm4genJ9c3RhdGljIHNldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoZSl7enI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gUHJ9c3RhdGljIHNldCBkZWZhdWx0V2Vla1NldHRpbmdzKGUpe1ByPWNuKGUpfXN0YXRpYyBnZXQgdHdvRGlnaXRDdXRvZmZZZWFyKCl7cmV0dXJuIFpyfXN0YXRpYyBzZXQgdHdvRGlnaXRDdXRvZmZZZWFyKGUpe1pyPWUlMTAwfXN0YXRpYyBnZXQgdGhyb3dPbkludmFsaWQoKXtyZXR1cm4gUnJ9c3RhdGljIHNldCB0aHJvd09uSW52YWxpZChlKXtScj1lfXN0YXRpYyByZXNldENhY2hlcygpe1QucmVzZXRDYWNoZSgpLEoucmVzZXRDYWNoZSgpfX1jbGFzcyBae2NvbnN0cnVjdG9yKGUsbil7dGhpcy5yZWFzb249ZSx0aGlzLmV4cGxhbmF0aW9uPW59dG9NZXNzYWdlKCl7cmV0dXJuIHRoaXMuZXhwbGFuYXRpb24/YCR7dGhpcy5yZWFzb259OiAke3RoaXMuZXhwbGFuYXRpb259YDp0aGlzLnJlYXNvbn19Y29uc3QganI9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF0sVXI9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV07ZnVuY3Rpb24gVyh0LGUpe3JldHVybiBuZXcgWigidW5pdCBvdXQgb2YgcmFuZ2UiLGB5b3Ugc3BlY2lmaWVkICR7ZX0gKG9mIHR5cGUgJHt0eXBlb2YgZX0pIGFzIGEgJHt0fSwgd2hpY2ggaXMgaW52YWxpZGApfWZ1bmN0aW9uIG9uKHQsZSxuKXtjb25zdCByPW5ldyBEYXRlKERhdGUuVVRDKHQsZS0xLG4pKTt0PDEwMCYmdD49MCYmci5zZXRVVENGdWxsWWVhcihyLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCk7Y29uc3Qgcz1yLmdldFVUQ0RheSgpO3JldHVybiBzPT09MD83OnN9ZnVuY3Rpb24gSHIodCxlLG4pe3JldHVybiBuKyhqZSh0KT9VcjpqcilbZS0xXX1mdW5jdGlvbiBxcih0LGUpe2NvbnN0IG49amUodCk/VXI6anIscj1uLmZpbmRJbmRleChpPT5pPGUpLHM9ZS1uW3JdO3JldHVybnttb250aDpyKzEsZGF5OnN9fWZ1bmN0aW9uIHVuKHQsZSl7cmV0dXJuKHQtZSs3KSU3KzF9ZnVuY3Rpb24gT3QodCxlPTQsbj0xKXtjb25zdHt5ZWFyOnIsbW9udGg6cyxkYXk6aX09dCxhPUhyKHIscyxpKSxvPXVuKG9uKHIscyxpKSxuKTtsZXQgdT1NYXRoLmZsb29yKChhLW8rMTQtZSkvNyksbDtyZXR1cm4gdTwxPyhsPXItMSx1PVVlKGwsZSxuKSk6dT5VZShyLGUsbik/KGw9cisxLHU9MSk6bD1yLHt3ZWVrWWVhcjpsLHdlZWtOdW1iZXI6dSx3ZWVrZGF5Om8sLi4uRXQodCl9fWZ1bmN0aW9uIFlyKHQsZT00LG49MSl7Y29uc3R7d2Vla1llYXI6cix3ZWVrTnVtYmVyOnMsd2Vla2RheTppfT10LGE9dW4ob24ociwxLGUpLG4pLG89a2Uocik7bGV0IHU9cyo3K2ktYS03K2UsbDt1PDE/KGw9ci0xLHUrPWtlKGwpKTp1Pm8/KGw9cisxLHUtPWtlKHIpKTpsPXI7Y29uc3R7bW9udGg6YyxkYXk6ZH09cXIobCx1KTtyZXR1cm57eWVhcjpsLG1vbnRoOmMsZGF5OmQsLi4uRXQodCl9fWZ1bmN0aW9uIGxuKHQpe2NvbnN0e3llYXI6ZSxtb250aDpuLGRheTpyfT10LHM9SHIoZSxuLHIpO3JldHVybnt5ZWFyOmUsb3JkaW5hbDpzLC4uLkV0KHQpfX1mdW5jdGlvbiBHcih0KXtjb25zdHt5ZWFyOmUsb3JkaW5hbDpufT10LHttb250aDpyLGRheTpzfT1xcihlLG4pO3JldHVybnt5ZWFyOmUsbW9udGg6cixkYXk6cywuLi5FdCh0KX19ZnVuY3Rpb24gSnIodCxlKXtpZighZyh0LmxvY2FsV2Vla2RheSl8fCFnKHQubG9jYWxXZWVrTnVtYmVyKXx8IWcodC5sb2NhbFdlZWtZZWFyKSl7aWYoIWcodC53ZWVrZGF5KXx8IWcodC53ZWVrTnVtYmVyKXx8IWcodC53ZWVrWWVhcikpdGhyb3cgbmV3IFNlKCJDYW5ub3QgbWl4IGxvY2FsZS1iYXNlZCB3ZWVrIGZpZWxkcyB3aXRoIElTTy1iYXNlZCB3ZWVrIGZpZWxkcyIpO3JldHVybiBnKHQubG9jYWxXZWVrZGF5KXx8KHQud2Vla2RheT10LmxvY2FsV2Vla2RheSksZyh0LmxvY2FsV2Vla051bWJlcil8fCh0LndlZWtOdW1iZXI9dC5sb2NhbFdlZWtOdW1iZXIpLGcodC5sb2NhbFdlZWtZZWFyKXx8KHQud2Vla1llYXI9dC5sb2NhbFdlZWtZZWFyKSxkZWxldGUgdC5sb2NhbFdlZWtkYXksZGVsZXRlIHQubG9jYWxXZWVrTnVtYmVyLGRlbGV0ZSB0LmxvY2FsV2Vla1llYXIse21pbkRheXNJbkZpcnN0V2VlazplLmdldE1pbkRheXNJbkZpcnN0V2VlaygpLHN0YXJ0T2ZXZWVrOmUuZ2V0U3RhcnRPZldlZWsoKX19ZWxzZSByZXR1cm57bWluRGF5c0luRmlyc3RXZWVrOjQsc3RhcnRPZldlZWs6MX19ZnVuY3Rpb24gQmwodCxlPTQsbj0xKXtjb25zdCByPVR0KHQud2Vla1llYXIpLHM9JCh0LndlZWtOdW1iZXIsMSxVZSh0LndlZWtZZWFyLGUsbikpLGk9JCh0LndlZWtkYXksMSw3KTtyZXR1cm4gcj9zP2k/ITE6Vygid2Vla2RheSIsdC53ZWVrZGF5KTpXKCJ3ZWVrIix0LndlZWtOdW1iZXIpOlcoIndlZWtZZWFyIix0LndlZWtZZWFyKX1mdW5jdGlvbiBRbCh0KXtjb25zdCBlPVR0KHQueWVhciksbj0kKHQub3JkaW5hbCwxLGtlKHQueWVhcikpO3JldHVybiBlP24/ITE6Vygib3JkaW5hbCIsdC5vcmRpbmFsKTpXKCJ5ZWFyIix0LnllYXIpfWZ1bmN0aW9uIEJyKHQpe2NvbnN0IGU9VHQodC55ZWFyKSxuPSQodC5tb250aCwxLDEyKSxyPSQodC5kYXksMSxTdCh0LnllYXIsdC5tb250aCkpO3JldHVybiBlP24/cj8hMTpXKCJkYXkiLHQuZGF5KTpXKCJtb250aCIsdC5tb250aCk6VygieWVhciIsdC55ZWFyKX1mdW5jdGlvbiBRcih0KXtjb25zdHtob3VyOmUsbWludXRlOm4sc2Vjb25kOnIsbWlsbGlzZWNvbmQ6c309dCxpPSQoZSwwLDIzKXx8ZT09PTI0JiZuPT09MCYmcj09PTAmJnM9PT0wLGE9JChuLDAsNTkpLG89JChyLDAsNTkpLHU9JChzLDAsOTk5KTtyZXR1cm4gaT9hP28/dT8hMTpXKCJtaWxsaXNlY29uZCIscyk6Vygic2Vjb25kIixyKTpXKCJtaW51dGUiLG4pOlcoImhvdXIiLGUpfWZ1bmN0aW9uIGcodCl7cmV0dXJuIHR5cGVvZiB0PiJ1In1mdW5jdGlvbiBjZSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIifWZ1bmN0aW9uIFR0KHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciImJnQlMT09PTB9ZnVuY3Rpb24gS2wodCl7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIn1mdW5jdGlvbiBYbCh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIEtyKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXR9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIFhyKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5Mb2NhbGUmJigid2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlfHwiZ2V0V2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlKX1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gZWModCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19ZnVuY3Rpb24gZXModCxlLG4pe2lmKHQubGVuZ3RoIT09MClyZXR1cm4gdC5yZWR1Y2UoKHIscyk9Pntjb25zdCBpPVtlKHMpLHNdO3JldHVybiByJiZuKHJbMF0saVswXSk9PT1yWzBdP3I6aX0sbnVsbClbMV19ZnVuY3Rpb24gdGModCxlKXtyZXR1cm4gZS5yZWR1Y2UoKG4scik9PihuW3JdPXRbcl0sbikse30pfWZ1bmN0aW9uIGJlKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIGNuKHQpe2lmKHQ9PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIHQhPSJvYmplY3QiKXRocm93IG5ldyBfKCJXZWVrIHNldHRpbmdzIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYoISQodC5maXJzdERheSwxLDcpfHwhJCh0Lm1pbmltYWxEYXlzLDEsNyl8fCFBcnJheS5pc0FycmF5KHQud2Vla2VuZCl8fHQud2Vla2VuZC5zb21lKGU9PiEkKGUsMSw3KSkpdGhyb3cgbmV3IF8oIkludmFsaWQgd2VlayBzZXR0aW5ncyIpO3JldHVybntmaXJzdERheTp0LmZpcnN0RGF5LG1pbmltYWxEYXlzOnQubWluaW1hbERheXMsd2Vla2VuZDpBcnJheS5mcm9tKHQud2Vla2VuZCl9fWZ1bmN0aW9uICQodCxlLG4pe3JldHVybiBUdCh0KSYmdD49ZSYmdDw9bn1mdW5jdGlvbiBuYyh0LGUpe3JldHVybiB0LWUqTWF0aC5mbG9vcih0L2UpfWZ1bmN0aW9uIEUodCxlPTIpe2NvbnN0IG49dDwwO2xldCByO3JldHVybiBuP3I9Ii0iKygiIistdCkucGFkU3RhcnQoZSwiMCIpOnI9KCIiK3QpLnBhZFN0YXJ0KGUsIjAiKSxyfWZ1bmN0aW9uIHJlKHQpe2lmKCEoZyh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlSW50KHQsMTApfWZ1bmN0aW9uIGZlKHQpe2lmKCEoZyh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlRmxvYXQodCl9ZnVuY3Rpb24gZm4odCl7aWYoIShnKHQpfHx0PT09bnVsbHx8dD09PSIiKSl7Y29uc3QgZT1wYXJzZUZsb2F0KCIwLiIrdCkqMWUzO3JldHVybiBNYXRoLmZsb29yKGUpfX1mdW5jdGlvbiBkbih0LGUsbj0hMSl7Y29uc3Qgcj0xMCoqZTtyZXR1cm4obj9NYXRoLnRydW5jOk1hdGgucm91bmQpKHQqcikvcn1mdW5jdGlvbiBqZSh0KXtyZXR1cm4gdCU0PT09MCYmKHQlMTAwIT09MHx8dCU0MDA9PT0wKX1mdW5jdGlvbiBrZSh0KXtyZXR1cm4gamUodCk/MzY2OjM2NX1mdW5jdGlvbiBTdCh0LGUpe2NvbnN0IG49bmMoZS0xLDEyKSsxLHI9dCsoZS1uKS8xMjtyZXR1cm4gbj09PTI/amUocik/Mjk6Mjg6WzMxLG51bGwsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdW24tMV19ZnVuY3Rpb24gYnQodCl7bGV0IGU9RGF0ZS5VVEModC55ZWFyLHQubW9udGgtMSx0LmRheSx0LmhvdXIsdC5taW51dGUsdC5zZWNvbmQsdC5taWxsaXNlY29uZCk7cmV0dXJuIHQueWVhcjwxMDAmJnQueWVhcj49MCYmKGU9bmV3IERhdGUoZSksZS5zZXRVVENGdWxsWWVhcih0LnllYXIsdC5tb250aC0xLHQuZGF5KSksK2V9ZnVuY3Rpb24gdHModCxlLG4pe3JldHVybi11bihvbih0LDEsZSksbikrZS0xfWZ1bmN0aW9uIFVlKHQsZT00LG49MSl7Y29uc3Qgcj10cyh0LGUsbikscz10cyh0KzEsZSxuKTtyZXR1cm4oa2UodCktcitzKS83fWZ1bmN0aW9uIGhuKHQpe3JldHVybiB0Pjk5P3Q6dD5JLnR3b0RpZ2l0Q3V0b2ZmWWVhcj8xOTAwK3Q6MmUzK3R9ZnVuY3Rpb24gbnModCxlLG4scj1udWxsKXtjb25zdCBzPW5ldyBEYXRlKHQpLGk9e2hvdXJDeWNsZToiaDIzIix5ZWFyOiJudW1lcmljIixtb250aDoiMi1kaWdpdCIsZGF5OiIyLWRpZ2l0Iixob3VyOiIyLWRpZ2l0IixtaW51dGU6IjItZGlnaXQifTtyJiYoaS50aW1lWm9uZT1yKTtjb25zdCBhPXt0aW1lWm9uZU5hbWU6ZSwuLi5pfSxvPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KG4sYSkuZm9ybWF0VG9QYXJ0cyhzKS5maW5kKHU9PnUudHlwZS50b0xvd2VyQ2FzZSgpPT09InRpbWV6b25lbmFtZSIpO3JldHVybiBvP28udmFsdWU6bnVsbH1mdW5jdGlvbiBrdCh0LGUpe2xldCBuPXBhcnNlSW50KHQsMTApO051bWJlci5pc05hTihuKSYmKG49MCk7Y29uc3Qgcj1wYXJzZUludChlLDEwKXx8MCxzPW48MHx8T2JqZWN0LmlzKG4sLTApPy1yOnI7cmV0dXJuIG4qNjArc31mdW5jdGlvbiBycyh0KXtjb25zdCBlPU51bWJlcih0KTtpZih0eXBlb2YgdD09ImJvb2xlYW4ifHx0PT09IiJ8fE51bWJlci5pc05hTihlKSl0aHJvdyBuZXcgXyhgSW52YWxpZCB1bml0IHZhbHVlICR7dH1gKTtyZXR1cm4gZX1mdW5jdGlvbiBJdCh0LGUpe2NvbnN0IG49e307Zm9yKGNvbnN0IHIgaW4gdClpZihiZSh0LHIpKXtjb25zdCBzPXRbcl07aWYocz09bnVsbCljb250aW51ZTtuW2UocildPXJzKHMpfXJldHVybiBufWZ1bmN0aW9uIEhlKHQsZSl7Y29uc3Qgbj1NYXRoLnRydW5jKE1hdGguYWJzKHQvNjApKSxyPU1hdGgudHJ1bmMoTWF0aC5hYnModCU2MCkpLHM9dD49MD8iKyI6Ii0iO3N3aXRjaChlKXtjYXNlInNob3J0IjpyZXR1cm5gJHtzfSR7RShuLDIpfToke0UociwyKX1gO2Nhc2UibmFycm93IjpyZXR1cm5gJHtzfSR7bn0ke3I+MD9gOiR7cn1gOiIifWA7Y2FzZSJ0ZWNoaWUiOnJldHVybmAke3N9JHtFKG4sMil9JHtFKHIsMil9YDtkZWZhdWx0OnRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSBmb3JtYXQgJHtlfSBpcyBvdXQgb2YgcmFuZ2UgZm9yIHByb3BlcnR5IGZvcm1hdGApfX1mdW5jdGlvbiBFdCh0KXtyZXR1cm4gdGModCxbImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdKX1jb25zdCByYz1bIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc3M9WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxzYz1bIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdO2Z1bmN0aW9uIGlzKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLnNjXTtjYXNlInNob3J0IjpyZXR1cm5bLi4uc3NdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLnJjXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl07Y2FzZSIyLWRpZ2l0IjpyZXR1cm5bIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjEwIiwiMTEiLCIxMiJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IGFzPVsiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiLCJTdW5kYXkiXSxvcz1bIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCIsIlN1biJdLGljPVsiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIiwiUyJdO2Z1bmN0aW9uIHVzKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLmljXTtjYXNlInNob3J0IjpyZXR1cm5bLi4ub3NdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLmFzXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IGxzPVsiQU0iLCJQTSJdLGFjPVsiQmVmb3JlIENocmlzdCIsIkFubm8gRG9taW5pIl0sb2M9WyJCQyIsIkFEIl0sdWM9WyJCIiwiQSJdO2Z1bmN0aW9uIGNzKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLnVjXTtjYXNlInNob3J0IjpyZXR1cm5bLi4ub2NdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLmFjXTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBsYyh0KXtyZXR1cm4gbHNbdC5ob3VyPDEyPzA6MV19ZnVuY3Rpb24gY2ModCxlKXtyZXR1cm4gdXMoZSlbdC53ZWVrZGF5LTFdfWZ1bmN0aW9uIGZjKHQsZSl7cmV0dXJuIGlzKGUpW3QubW9udGgtMV19ZnVuY3Rpb24gZGModCxlKXtyZXR1cm4gY3MoZSlbdC55ZWFyPDA/MDoxXX1mdW5jdGlvbiBoYyh0LGUsbj0iYWx3YXlzIixyPSExKXtjb25zdCBzPXt5ZWFyczpbInllYXIiLCJ5ci4iXSxxdWFydGVyczpbInF1YXJ0ZXIiLCJxdHIuIl0sbW9udGhzOlsibW9udGgiLCJtby4iXSx3ZWVrczpbIndlZWsiLCJ3ay4iXSxkYXlzOlsiZGF5IiwiZGF5IiwiZGF5cyJdLGhvdXJzOlsiaG91ciIsImhyLiJdLG1pbnV0ZXM6WyJtaW51dGUiLCJtaW4uIl0sc2Vjb25kczpbInNlY29uZCIsInNlYy4iXX0saT1bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiXS5pbmRleE9mKHQpPT09LTE7aWYobj09PSJhdXRvIiYmaSl7Y29uc3QgZD10PT09ImRheXMiO3N3aXRjaChlKXtjYXNlIDE6cmV0dXJuIGQ/InRvbW9ycm93IjpgbmV4dCAke3NbdF1bMF19YDtjYXNlLTE6cmV0dXJuIGQ/Inllc3RlcmRheSI6YGxhc3QgJHtzW3RdWzBdfWA7Y2FzZSAwOnJldHVybiBkPyJ0b2RheSI6YHRoaXMgJHtzW3RdWzBdfWB9fWNvbnN0IGE9T2JqZWN0LmlzKGUsLTApfHxlPDAsbz1NYXRoLmFicyhlKSx1PW89PT0xLGw9c1t0XSxjPXI/dT9sWzFdOmxbMl18fGxbMV06dT9zW3RdWzBdOnQ7cmV0dXJuIGE/YCR7b30gJHtjfSBhZ29gOmBpbiAke299ICR7Y31gfWZ1bmN0aW9uIGZzKHQsZSl7bGV0IG49IiI7Zm9yKGNvbnN0IHIgb2YgdClyLmxpdGVyYWw/bis9ci52YWw6bis9ZShyLnZhbCk7cmV0dXJuIG59Y29uc3QgbWM9e0Q6eXQsREQ6bXIsREREOnlyLEREREQ6Z3IsdDpwcix0dDp3cix0dHQ6dnIsdHR0dDpPcixUOlRyLFRUOlNyLFRUVDpicixUVFRUOmtyLGY6SXIsZmY6TnIsZmZmOk1yLGZmZmY6RHIsRjpFcixGRjp4cixGRkY6Q3IsRkZGRjpfcn07Y2xhc3MgeHtzdGF0aWMgY3JlYXRlKGUsbj17fSl7cmV0dXJuIG5ldyB4KGUsbil9c3RhdGljIHBhcnNlRm9ybWF0KGUpe2xldCBuPW51bGwscj0iIixzPSExO2NvbnN0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2NvbnN0IG89ZS5jaGFyQXQoYSk7bz09PSInIj8oci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLG49bnVsbCxyPSIiLHM9IXMpOnN8fG89PT1uP3IrPW86KHIubGVuZ3RoPjAmJmkucHVzaCh7bGl0ZXJhbDovXlxzKyQvLnRlc3QociksdmFsOnJ9KSxyPW8sbj1vKX1yZXR1cm4gci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLGl9c3RhdGljIG1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoZSl7cmV0dXJuIG1jW2VdfWNvbnN0cnVjdG9yKGUsbil7dGhpcy5vcHRzPW4sdGhpcy5sb2M9ZSx0aGlzLnN5c3RlbUxvYz1udWxsfWZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGUsbil7cmV0dXJuIHRoaXMuc3lzdGVtTG9jPT09bnVsbCYmKHRoaXMuc3lzdGVtTG9jPXRoaXMubG9jLnJlZGVmYXVsdFRvU3lzdGVtKCkpLHRoaXMuc3lzdGVtTG9jLmR0Rm9ybWF0dGVyKGUsey4uLnRoaXMub3B0cywuLi5ufSkuZm9ybWF0KCl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZSx7Li4udGhpcy5vcHRzLC4uLm59KX1mb3JtYXREYXRlVGltZShlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0KCl9Zm9ybWF0RGF0ZVRpbWVQYXJ0cyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0VG9QYXJ0cygpfWZvcm1hdEludGVydmFsKGUsbil7cmV0dXJuIHRoaXMuZHRGb3JtYXR0ZXIoZS5zdGFydCxuKS5kdGYuZm9ybWF0UmFuZ2UoZS5zdGFydC50b0pTRGF0ZSgpLGUuZW5kLnRvSlNEYXRlKCkpfXJlc29sdmVkT3B0aW9ucyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikucmVzb2x2ZWRPcHRpb25zKCl9bnVtKGUsbj0wKXtpZih0aGlzLm9wdHMuZm9yY2VTaW1wbGUpcmV0dXJuIEUoZSxuKTtjb25zdCByPXsuLi50aGlzLm9wdHN9O3JldHVybiBuPjAmJihyLnBhZFRvPW4pLHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihyKS5mb3JtYXQoZSl9Zm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj10aGlzLmxvYy5saXN0aW5nTW9kZSgpPT09ImVuIixzPXRoaXMubG9jLm91dHB1dENhbGVuZGFyJiZ0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciE9PSJncmVnb3J5IixpPShoLFMpPT50aGlzLmxvYy5leHRyYWN0KGUsaCxTKSxhPWg9PmUuaXNPZmZzZXRGaXhlZCYmZS5vZmZzZXQ9PT0wJiZoLmFsbG93Wj8iWiI6ZS5pc1ZhbGlkP2Uuem9uZS5mb3JtYXRPZmZzZXQoZS50cyxoLmZvcm1hdCk6IiIsbz0oKT0+cj9sYyhlKTppKHtob3VyOiJudW1lcmljIixob3VyQ3ljbGU6ImgxMiJ9LCJkYXlwZXJpb2QiKSx1PShoLFMpPT5yP2ZjKGUsaCk6aShTP3ttb250aDpofTp7bW9udGg6aCxkYXk6Im51bWVyaWMifSwibW9udGgiKSxsPShoLFMpPT5yP2NjKGUsaCk6aShTP3t3ZWVrZGF5Omh9Ont3ZWVrZGF5OmgsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9LCJ3ZWVrZGF5IiksYz1oPT57Y29uc3QgUz14Lm1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoaCk7cmV0dXJuIFM/dGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChlLFMpOmh9LGQ9aD0+cj9kYyhlLGgpOmkoe2VyYTpofSwiZXJhIikseT1oPT57c3dpdGNoKGgpe2Nhc2UiUyI6cmV0dXJuIHRoaXMubnVtKGUubWlsbGlzZWNvbmQpO2Nhc2UidSI6Y2FzZSJTU1MiOnJldHVybiB0aGlzLm51bShlLm1pbGxpc2Vjb25kLDMpO2Nhc2UicyI6cmV0dXJuIHRoaXMubnVtKGUuc2Vjb25kKTtjYXNlInNzIjpyZXR1cm4gdGhpcy5udW0oZS5zZWNvbmQsMik7Y2FzZSJ1dSI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS5taWxsaXNlY29uZC8xMCksMik7Y2FzZSJ1dXUiOnJldHVybiB0aGlzLm51bShNYXRoLmZsb29yKGUubWlsbGlzZWNvbmQvMTAwKSk7Y2FzZSJtIjpyZXR1cm4gdGhpcy5udW0oZS5taW51dGUpO2Nhc2UibW0iOnJldHVybiB0aGlzLm51bShlLm1pbnV0ZSwyKTtjYXNlImgiOnJldHVybiB0aGlzLm51bShlLmhvdXIlMTI9PT0wPzEyOmUuaG91ciUxMik7Y2FzZSJoaCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciUxMj09PTA/MTI6ZS5ob3VyJTEyLDIpO2Nhc2UiSCI6cmV0dXJuIHRoaXMubnVtKGUuaG91cik7Y2FzZSJISCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciwyKTtjYXNlIloiOnJldHVybiBhKHtmb3JtYXQ6Im5hcnJvdyIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaIjpyZXR1cm4gYSh7Zm9ybWF0OiJzaG9ydCIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaWiI6cmV0dXJuIGEoe2Zvcm1hdDoidGVjaGllIixhbGxvd1o6dGhpcy5vcHRzLmFsbG93Wn0pO2Nhc2UiWlpaWiI6cmV0dXJuIGUuem9uZS5vZmZzZXROYW1lKGUudHMse2Zvcm1hdDoic2hvcnQiLGxvY2FsZTp0aGlzLmxvYy5sb2NhbGV9KTtjYXNlIlpaWlpaIjpyZXR1cm4gZS56b25lLm9mZnNldE5hbWUoZS50cyx7Zm9ybWF0OiJsb25nIixsb2NhbGU6dGhpcy5sb2MubG9jYWxlfSk7Y2FzZSJ6IjpyZXR1cm4gZS56b25lTmFtZTtjYXNlImEiOnJldHVybiBvKCk7Y2FzZSJkIjpyZXR1cm4gcz9pKHtkYXk6Im51bWVyaWMifSwiZGF5Iik6dGhpcy5udW0oZS5kYXkpO2Nhc2UiZGQiOnJldHVybiBzP2koe2RheToiMi1kaWdpdCJ9LCJkYXkiKTp0aGlzLm51bShlLmRheSwyKTtjYXNlImMiOnJldHVybiB0aGlzLm51bShlLndlZWtkYXkpO2Nhc2UiY2NjIjpyZXR1cm4gbCgic2hvcnQiLCEwKTtjYXNlImNjY2MiOnJldHVybiBsKCJsb25nIiwhMCk7Y2FzZSJjY2NjYyI6cmV0dXJuIGwoIm5hcnJvdyIsITApO2Nhc2UiRSI6cmV0dXJuIHRoaXMubnVtKGUud2Vla2RheSk7Y2FzZSJFRUUiOnJldHVybiBsKCJzaG9ydCIsITEpO2Nhc2UiRUVFRSI6cmV0dXJuIGwoImxvbmciLCExKTtjYXNlIkVFRUVFIjpyZXR1cm4gbCgibmFycm93IiwhMSk7Y2FzZSJMIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyIsZGF5OiJudW1lcmljIn0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCk7Y2FzZSJMTCI6cmV0dXJuIHM/aSh7bW9udGg6IjItZGlnaXQiLGRheToibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgsMik7Y2FzZSJMTEwiOnJldHVybiB1KCJzaG9ydCIsITApO2Nhc2UiTExMTCI6cmV0dXJuIHUoImxvbmciLCEwKTtjYXNlIkxMTExMIjpyZXR1cm4gdSgibmFycm93IiwhMCk7Y2FzZSJNIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgpO2Nhc2UiTU0iOnJldHVybiBzP2koe21vbnRoOiIyLWRpZ2l0In0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCwyKTtjYXNlIk1NTSI6cmV0dXJuIHUoInNob3J0IiwhMSk7Y2FzZSJNTU1NIjpyZXR1cm4gdSgibG9uZyIsITEpO2Nhc2UiTU1NTU0iOnJldHVybiB1KCJuYXJyb3ciLCExKTtjYXNlInkiOnJldHVybiBzP2koe3llYXI6Im51bWVyaWMifSwieWVhciIpOnRoaXMubnVtKGUueWVhcik7Y2FzZSJ5eSI6cmV0dXJuIHM/aSh7eWVhcjoiMi1kaWdpdCJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLDIpO2Nhc2UieXl5eSI6cmV0dXJuIHM/aSh7eWVhcjoibnVtZXJpYyJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLDQpO2Nhc2UieXl5eXl5IjpyZXR1cm4gcz9pKHt5ZWFyOiJudW1lcmljIn0sInllYXIiKTp0aGlzLm51bShlLnllYXIsNik7Y2FzZSJHIjpyZXR1cm4gZCgic2hvcnQiKTtjYXNlIkdHIjpyZXR1cm4gZCgibG9uZyIpO2Nhc2UiR0dHR0ciOnJldHVybiBkKCJuYXJyb3ciKTtjYXNlImtrIjpyZXR1cm4gdGhpcy5udW0oZS53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwyKTtjYXNlImtra2siOnJldHVybiB0aGlzLm51bShlLndlZWtZZWFyLDQpO2Nhc2UiVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlcik7Y2FzZSJXVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlciwyKTtjYXNlIm4iOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla051bWJlcik7Y2FzZSJubiI6cmV0dXJuIHRoaXMubnVtKGUubG9jYWxXZWVrTnVtYmVyLDIpO2Nhc2UiaWkiOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla1llYXIudG9TdHJpbmcoKS5zbGljZSgtMiksMik7Y2FzZSJpaWlpIjpyZXR1cm4gdGhpcy5udW0oZS5sb2NhbFdlZWtZZWFyLDQpO2Nhc2UibyI6cmV0dXJuIHRoaXMubnVtKGUub3JkaW5hbCk7Y2FzZSJvb28iOnJldHVybiB0aGlzLm51bShlLm9yZGluYWwsMyk7Y2FzZSJxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyKTtjYXNlInFxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyLDIpO2Nhc2UiWCI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS50cy8xZTMpKTtjYXNlIngiOnJldHVybiB0aGlzLm51bShlLnRzKTtkZWZhdWx0OnJldHVybiBjKGgpfX07cmV0dXJuIGZzKHgucGFyc2VGb3JtYXQobikseSl9Zm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj11PT57c3dpdGNoKHVbMF0pe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpyZXR1cm4iaG91ciI7Y2FzZSJkIjpyZXR1cm4iZGF5IjtjYXNlInciOnJldHVybiJ3ZWVrIjtjYXNlIk0iOnJldHVybiJtb250aCI7Y2FzZSJ5IjpyZXR1cm4ieWVhciI7ZGVmYXVsdDpyZXR1cm4gbnVsbH19LHM9dT0+bD0+e2NvbnN0IGM9cihsKTtyZXR1cm4gYz90aGlzLm51bSh1LmdldChjKSxsLmxlbmd0aCk6bH0saT14LnBhcnNlRm9ybWF0KG4pLGE9aS5yZWR1Y2UoKHUse2xpdGVyYWw6bCx2YWw6Y30pPT5sP3U6dS5jb25jYXQoYyksW10pLG89ZS5zaGlmdFRvKC4uLmEubWFwKHIpLmZpbHRlcih1PT51KSk7cmV0dXJuIGZzKGkscyhvKSl9fWNvbnN0IGRzPS9bQS1aYS16XystXXsxLDI1Nn0oPzo6P1wvW0EtWmEtejAtOV8rLV17MSwyNTZ9KD86XC9bQS1aYS16MC05XystXXsxLDI1Nn0pPyk/LztmdW5jdGlvbiBJZSguLi50KXtjb25zdCBlPXQucmVkdWNlKChuLHIpPT5uK3Iuc291cmNlLCIiKTtyZXR1cm4gUmVnRXhwKGBeJHtlfSRgKX1mdW5jdGlvbiBFZSguLi50KXtyZXR1cm4gZT0+dC5yZWR1Y2UoKFtuLHIsc10saSk9Pntjb25zdFthLG8sdV09aShlLHMpO3JldHVyblt7Li4ubiwuLi5hfSxvfHxyLHVdfSxbe30sbnVsbCwxXSkuc2xpY2UoMCwyKX1mdW5jdGlvbiBOZSh0LC4uLmUpe2lmKHQ9PW51bGwpcmV0dXJuW251bGwsbnVsbF07Zm9yKGNvbnN0W24scl1vZiBlKXtjb25zdCBzPW4uZXhlYyh0KTtpZihzKXJldHVybiByKHMpfXJldHVybltudWxsLG51bGxdfWZ1bmN0aW9uIGhzKC4uLnQpe3JldHVybihlLG4pPT57Y29uc3Qgcj17fTtsZXQgcztmb3Iocz0wO3M8dC5sZW5ndGg7cysrKXJbdFtzXV09cmUoZVtuK3NdKTtyZXR1cm5bcixudWxsLG4rc119fWNvbnN0IG1zPS8oPzooWil8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8pLyx5Yz1gKD86JHttcy5zb3VyY2V9Pyg/OlxcWygke2RzLnNvdXJjZX0pXFxdKT8pP2AsbW49LyhcZFxkKSg/Ojo/KFxkXGQpKD86Oj8oXGRcZCkoPzpbLixdKFxkezEsMzB9KSk/KT8pPy8seXM9UmVnRXhwKGAke21uLnNvdXJjZX0ke3ljfWApLHluPVJlZ0V4cChgKD86VCR7eXMuc291cmNlfSk/YCksZ2M9LyhbKy1dXGR7Nn18XGR7NH0pKD86LT8oXGRcZCkoPzotPyhcZFxkKSk/KT8vLHBjPS8oXGR7NH0pLT9XKFxkXGQpKD86LT8oXGQpKT8vLHdjPS8oXGR7NH0pLT8oXGR7M30pLyx2Yz1ocygid2Vla1llYXIiLCJ3ZWVrTnVtYmVyIiwid2Vla0RheSIpLE9jPWhzKCJ5ZWFyIiwib3JkaW5hbCIpLFRjPS8oXGR7NH0pLShcZFxkKS0oXGRcZCkvLGdzPVJlZ0V4cChgJHttbi5zb3VyY2V9ID8oPzoke21zLnNvdXJjZX18KCR7ZHMuc291cmNlfSkpP2ApLFNjPVJlZ0V4cChgKD86ICR7Z3Muc291cmNlfSk/YCk7ZnVuY3Rpb24geGUodCxlLG4pe2NvbnN0IHI9dFtlXTtyZXR1cm4gZyhyKT9uOnJlKHIpfWZ1bmN0aW9uIGJjKHQsZSl7cmV0dXJuW3t5ZWFyOnhlKHQsZSksbW9udGg6eGUodCxlKzEsMSksZGF5OnhlKHQsZSsyLDEpfSxudWxsLGUrM119ZnVuY3Rpb24gTWUodCxlKXtyZXR1cm5be2hvdXJzOnhlKHQsZSwwKSxtaW51dGVzOnhlKHQsZSsxLDApLHNlY29uZHM6eGUodCxlKzIsMCksbWlsbGlzZWNvbmRzOmZuKHRbZSszXSl9LG51bGwsZSs0XX1mdW5jdGlvbiBxZSh0LGUpe2NvbnN0IG49IXRbZV0mJiF0W2UrMV0scj1rdCh0W2UrMV0sdFtlKzJdKSxzPW4/bnVsbDpELmluc3RhbmNlKHIpO3JldHVyblt7fSxzLGUrM119ZnVuY3Rpb24gWWUodCxlKXtjb25zdCBuPXRbZV0/Si5jcmVhdGUodFtlXSk6bnVsbDtyZXR1cm5be30sbixlKzFdfWNvbnN0IGtjPVJlZ0V4cChgXlQ/JHttbi5zb3VyY2V9JGApLEljPS9eLT9QKD86KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pWSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pTSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pVyk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pRCk/KD86VCg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KUgpPyg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KU0pPyg/OigtP1xkezEsMjB9KSg/OlsuLF0oLT9cZHsxLDIwfSkpP1MpPyk/KSQvO2Z1bmN0aW9uIEVjKHQpe2NvbnN0W2UsbixyLHMsaSxhLG8sdSxsXT10LGM9ZVswXT09PSItIixkPXUmJnVbMF09PT0iLSIseT0oaCxTPSExKT0+aCE9PXZvaWQgMCYmKFN8fGgmJmMpPy1oOmg7cmV0dXJuW3t5ZWFyczp5KGZlKG4pKSxtb250aHM6eShmZShyKSksd2Vla3M6eShmZShzKSksZGF5czp5KGZlKGkpKSxob3Vyczp5KGZlKGEpKSxtaW51dGVzOnkoZmUobykpLHNlY29uZHM6eShmZSh1KSx1PT09Ii0wIiksbWlsbGlzZWNvbmRzOnkoZm4obCksZCl9XX1jb25zdCBOYz17R01UOjAsRURUOi00KjYwLEVTVDotNSo2MCxDRFQ6LTUqNjAsQ1NUOi02KjYwLE1EVDotNio2MCxNU1Q6LTcqNjAsUERUOi03KjYwLFBTVDotOCo2MH07ZnVuY3Rpb24gZ24odCxlLG4scixzLGksYSl7Y29uc3Qgbz17eWVhcjplLmxlbmd0aD09PTI/aG4ocmUoZSkpOnJlKGUpLG1vbnRoOnNzLmluZGV4T2YobikrMSxkYXk6cmUociksaG91cjpyZShzKSxtaW51dGU6cmUoaSl9O3JldHVybiBhJiYoby5zZWNvbmQ9cmUoYSkpLHQmJihvLndlZWtkYXk9dC5sZW5ndGg+Mz9hcy5pbmRleE9mKHQpKzE6b3MuaW5kZXhPZih0KSsxKSxvfWNvbnN0IHhjPS9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksXHMpPyhcZHsxLDJ9KVxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxzKFxkezIsNH0pXHMoXGRcZCk6KFxkXGQpKD86OihcZFxkKSk/XHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KD86KFsrLV1cZFxkKShcZFxkKSkpJC87ZnVuY3Rpb24gTWModCl7Y29uc3RbLGUsbixyLHMsaSxhLG8sdSxsLGMsZF09dCx5PWduKGUscyxyLG4saSxhLG8pO2xldCBoO3JldHVybiB1P2g9TmNbdV06bD9oPTA6aD1rdChjLGQpLFt5LG5ldyBEKGgpXX1mdW5jdGlvbiBDYyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9cKFteKCldKlwpfFtcblx0XS9nLCIgIikucmVwbGFjZSgvKFxzXHMrKS9nLCIgIikudHJpbSgpfWNvbnN0IERjPS9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksIChcZFxkKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpIChcZHs0fSkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sX2M9L14oTW9uZGF5fFR1ZXNkYXl8V2VkbmVzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheXxTdW5kYXkpLCAoXGRcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sRmM9L14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXGR8XGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgKFxkezR9KSQvO2Z1bmN0aW9uIHBzKHQpe2NvbnN0WyxlLG4scixzLGksYSxvXT10O3JldHVybltnbihlLHMscixuLGksYSxvKSxELnV0Y0luc3RhbmNlXX1mdW5jdGlvbiBBYyh0KXtjb25zdFssZSxuLHIscyxpLGEsb109dDtyZXR1cm5bZ24oZSxvLG4scixzLGksYSksRC51dGNJbnN0YW5jZV19Y29uc3QgVmM9SWUoZ2MseW4pLFdjPUllKHBjLHluKSwkYz1JZSh3Yyx5biksTGM9SWUoeXMpLHdzPUVlKGJjLE1lLHFlLFllKSx6Yz1FZSh2YyxNZSxxZSxZZSksWmM9RWUoT2MsTWUscWUsWWUpLFJjPUVlKE1lLHFlLFllKTtmdW5jdGlvbiBQYyh0KXtyZXR1cm4gTmUodCxbVmMsd3NdLFtXYyx6Y10sWyRjLFpjXSxbTGMsUmNdKX1mdW5jdGlvbiBqYyh0KXtyZXR1cm4gTmUoQ2ModCksW3hjLE1jXSl9ZnVuY3Rpb24gVWModCl7cmV0dXJuIE5lKHQsW0RjLHBzXSxbX2MscHNdLFtGYyxBY10pfWZ1bmN0aW9uIEhjKHQpe3JldHVybiBOZSh0LFtJYyxFY10pfWNvbnN0IHFjPUVlKE1lKTtmdW5jdGlvbiBZYyh0KXtyZXR1cm4gTmUodCxba2MscWNdKX1jb25zdCBHYz1JZShUYyxTYyksSmM9SWUoZ3MpLEJjPUVlKE1lLHFlLFllKTtmdW5jdGlvbiBRYyh0KXtyZXR1cm4gTmUodCxbR2Msd3NdLFtKYyxCY10pfWNvbnN0IHZzPSJJbnZhbGlkIER1cmF0aW9uIixPcz17d2Vla3M6e2RheXM6Nyxob3Vyczo3KjI0LG1pbnV0ZXM6NyoyNCo2MCxzZWNvbmRzOjcqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOjcqMjQqNjAqNjAqMWUzfSxkYXlzOntob3VyczoyNCxtaW51dGVzOjI0KjYwLHNlY29uZHM6MjQqNjAqNjAsbWlsbGlzZWNvbmRzOjI0KjYwKjYwKjFlM30saG91cnM6e21pbnV0ZXM6NjAsc2Vjb25kczo2MCo2MCxtaWxsaXNlY29uZHM6NjAqNjAqMWUzfSxtaW51dGVzOntzZWNvbmRzOjYwLG1pbGxpc2Vjb25kczo2MCoxZTN9LHNlY29uZHM6e21pbGxpc2Vjb25kczoxZTN9fSxLYz17eWVhcnM6e3F1YXJ0ZXJzOjQsbW9udGhzOjEyLHdlZWtzOjUyLGRheXM6MzY1LGhvdXJzOjM2NSoyNCxtaW51dGVzOjM2NSoyNCo2MCxzZWNvbmRzOjM2NSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzY1KjI0KjYwKjYwKjFlM30scXVhcnRlcnM6e21vbnRoczozLHdlZWtzOjEzLGRheXM6OTEsaG91cnM6OTEqMjQsbWludXRlczo5MSoyNCo2MCxzZWNvbmRzOjkxKjI0KjYwKjYwLG1pbGxpc2Vjb25kczo5MSoyNCo2MCo2MCoxZTN9LG1vbnRoczp7d2Vla3M6NCxkYXlzOjMwLGhvdXJzOjMwKjI0LG1pbnV0ZXM6MzAqMjQqNjAsc2Vjb25kczozMCoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzAqMjQqNjAqNjAqMWUzfSwuLi5Pc30sTD0xNDYwOTcvNDAwLENlPTE0NjA5Ny80ODAwLFhjPXt5ZWFyczp7cXVhcnRlcnM6NCxtb250aHM6MTIsd2Vla3M6TC83LGRheXM6TCxob3VyczpMKjI0LG1pbnV0ZXM6TCoyNCo2MCxzZWNvbmRzOkwqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzfSxxdWFydGVyczp7bW9udGhzOjMsd2Vla3M6TC8yOCxkYXlzOkwvNCxob3VyczpMKjI0LzQsbWludXRlczpMKjI0KjYwLzQsc2Vjb25kczpMKjI0KjYwKjYwLzQsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzLzR9LG1vbnRoczp7d2Vla3M6Q2UvNyxkYXlzOkNlLGhvdXJzOkNlKjI0LG1pbnV0ZXM6Q2UqMjQqNjAsc2Vjb25kczpDZSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6Q2UqMjQqNjAqNjAqMWUzfSwuLi5Pc30sZGU9WyJ5ZWFycyIsInF1YXJ0ZXJzIiwibW9udGhzIiwid2Vla3MiLCJkYXlzIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsIm1pbGxpc2Vjb25kcyJdLGVmPWRlLnNsaWNlKDApLnJldmVyc2UoKTtmdW5jdGlvbiBzZSh0LGUsbj0hMSl7Y29uc3Qgcj17dmFsdWVzOm4/ZS52YWx1ZXM6ey4uLnQudmFsdWVzLC4uLmUudmFsdWVzfHx7fX0sbG9jOnQubG9jLmNsb25lKGUubG9jKSxjb252ZXJzaW9uQWNjdXJhY3k6ZS5jb252ZXJzaW9uQWNjdXJhY3l8fHQuY29udmVyc2lvbkFjY3VyYWN5LG1hdHJpeDplLm1hdHJpeHx8dC5tYXRyaXh9O3JldHVybiBuZXcgdihyKX1mdW5jdGlvbiBUcyh0LGUpe2xldCBuPWUubWlsbGlzZWNvbmRzPz8wO2Zvcihjb25zdCByIG9mIGVmLnNsaWNlKDEpKWVbcl0mJihuKz1lW3JdKnRbcl0ubWlsbGlzZWNvbmRzKTtyZXR1cm4gbn1mdW5jdGlvbiBTcyh0LGUpe2NvbnN0IG49VHModCxlKTwwPy0xOjE7ZGUucmVkdWNlUmlnaHQoKHIscyk9PntpZihnKGVbc10pKXJldHVybiByO2lmKHIpe2NvbnN0IGk9ZVtyXSpuLGE9dFtzXVtyXSxvPU1hdGguZmxvb3IoaS9hKTtlW3NdKz1vKm4sZVtyXS09byphKm59cmV0dXJuIHN9LG51bGwpLGRlLnJlZHVjZSgocixzKT0+e2lmKGcoZVtzXSkpcmV0dXJuIHI7aWYocil7Y29uc3QgaT1lW3JdJTE7ZVtyXS09aSxlW3NdKz1pKnRbcl1bc119cmV0dXJuIHN9LG51bGwpfWZ1bmN0aW9uIHRmKHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyh0KSlyIT09MCYmKGVbbl09cik7cmV0dXJuIGV9Y2xhc3Mgdntjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuY29udmVyc2lvbkFjY3VyYWN5PT09Imxvbmd0ZXJtInx8ITE7bGV0IHI9bj9YYzpLYztlLm1hdHJpeCYmKHI9ZS5tYXRyaXgpLHRoaXMudmFsdWVzPWUudmFsdWVzLHRoaXMubG9jPWUubG9jfHxULmNyZWF0ZSgpLHRoaXMuY29udmVyc2lvbkFjY3VyYWN5PW4/Imxvbmd0ZXJtIjoiY2FzdWFsIix0aGlzLmludmFsaWQ9ZS5pbnZhbGlkfHxudWxsLHRoaXMubWF0cml4PXIsdGhpcy5pc0x1eG9uRHVyYXRpb249ITB9c3RhdGljIGZyb21NaWxsaXMoZSxuKXtyZXR1cm4gdi5mcm9tT2JqZWN0KHttaWxsaXNlY29uZHM6ZX0sbil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtpZihlPT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IF8oYER1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290ICR7ZT09PW51bGw/Im51bGwiOnR5cGVvZiBlfWApO3JldHVybiBuZXcgdih7dmFsdWVzOkl0KGUsdi5ub3JtYWxpemVVbml0KSxsb2M6VC5mcm9tT2JqZWN0KG4pLGNvbnZlcnNpb25BY2N1cmFjeTpuLmNvbnZlcnNpb25BY2N1cmFjeSxtYXRyaXg6bi5tYXRyaXh9KX1zdGF0aWMgZnJvbUR1cmF0aW9uTGlrZShlKXtpZihjZShlKSlyZXR1cm4gdi5mcm9tTWlsbGlzKGUpO2lmKHYuaXNEdXJhdGlvbihlKSlyZXR1cm4gZTtpZih0eXBlb2YgZT09Im9iamVjdCIpcmV0dXJuIHYuZnJvbU9iamVjdChlKTt0aHJvdyBuZXcgXyhgVW5rbm93biBkdXJhdGlvbiBhcmd1bWVudCAke2V9IG9mIHR5cGUgJHt0eXBlb2YgZX1gKX1zdGF0aWMgZnJvbUlTTyhlLG4pe2NvbnN0W3JdPUhjKGUpO3JldHVybiByP3YuZnJvbU9iamVjdChyLG4pOnYuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGZyb21JU09UaW1lKGUsbil7Y29uc3Rbcl09WWMoZSk7cmV0dXJuIHI/di5mcm9tT2JqZWN0KHIsbik6di5pbnZhbGlkKCJ1bnBhcnNhYmxlIixgdGhlIGlucHV0ICIke2V9IiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKX1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IF8oIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIFo/ZTpuZXcgWihlLG4pO2lmKEkudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IHhsKHIpO3JldHVybiBuZXcgdih7aW52YWxpZDpyfSl9c3RhdGljIG5vcm1hbGl6ZVVuaXQoZSl7Y29uc3Qgbj17eWVhcjoieWVhcnMiLHllYXJzOiJ5ZWFycyIscXVhcnRlcjoicXVhcnRlcnMiLHF1YXJ0ZXJzOiJxdWFydGVycyIsbW9udGg6Im1vbnRocyIsbW9udGhzOiJtb250aHMiLHdlZWs6IndlZWtzIix3ZWVrczoid2Vla3MiLGRheToiZGF5cyIsZGF5czoiZGF5cyIsaG91cjoiaG91cnMiLGhvdXJzOiJob3VycyIsbWludXRlOiJtaW51dGVzIixtaW51dGVzOiJtaW51dGVzIixzZWNvbmQ6InNlY29uZHMiLHNlY29uZHM6InNlY29uZHMiLG1pbGxpc2Vjb25kOiJtaWxsaXNlY29uZHMiLG1pbGxpc2Vjb25kczoibWlsbGlzZWNvbmRzIn1bZSYmZS50b0xvd2VyQ2FzZSgpXTtpZighbil0aHJvdyBuZXcgaHIoZSk7cmV0dXJuIG59c3RhdGljIGlzRHVyYXRpb24oZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkR1cmF0aW9ufHwhMX1nZXQgbG9jYWxlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5sb2NhbGU6bnVsbH1nZXQgbnVtYmVyaW5nU3lzdGVtKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW06bnVsbH10b0Zvcm1hdChlLG49e30pe2NvbnN0IHI9ey4uLm4sZmxvb3I6bi5yb3VuZCE9PSExJiZuLmZsb29yIT09ITF9O3JldHVybiB0aGlzLmlzVmFsaWQ/eC5jcmVhdGUodGhpcy5sb2MscikuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsZSk6dnN9dG9IdW1hbihlPXt9KXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB2cztjb25zdCBuPWRlLm1hcChyPT57Y29uc3Qgcz10aGlzLnZhbHVlc1tyXTtyZXR1cm4gZyhzKT9udWxsOnRoaXMubG9jLm51bWJlckZvcm1hdHRlcih7c3R5bGU6InVuaXQiLHVuaXREaXNwbGF5OiJsb25nIiwuLi5lLHVuaXQ6ci5zbGljZSgwLC0xKX0pLmZvcm1hdChzKX0pLmZpbHRlcihyPT5yKTtyZXR1cm4gdGhpcy5sb2MubGlzdEZvcm1hdHRlcih7dHlwZToiY29uanVuY3Rpb24iLHN0eWxlOmUubGlzdFN0eWxlfHwibmFycm93IiwuLi5lfSkuZm9ybWF0KG4pfXRvT2JqZWN0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD97Li4udGhpcy52YWx1ZXN9Ont9fXRvSVNPKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtsZXQgZT0iUCI7cmV0dXJuIHRoaXMueWVhcnMhPT0wJiYoZSs9dGhpcy55ZWFycysiWSIpLCh0aGlzLm1vbnRocyE9PTB8fHRoaXMucXVhcnRlcnMhPT0wKSYmKGUrPXRoaXMubW9udGhzK3RoaXMucXVhcnRlcnMqMysiTSIpLHRoaXMud2Vla3MhPT0wJiYoZSs9dGhpcy53ZWVrcysiVyIpLHRoaXMuZGF5cyE9PTAmJihlKz10aGlzLmRheXMrIkQiKSwodGhpcy5ob3VycyE9PTB8fHRoaXMubWludXRlcyE9PTB8fHRoaXMuc2Vjb25kcyE9PTB8fHRoaXMubWlsbGlzZWNvbmRzIT09MCkmJihlKz0iVCIpLHRoaXMuaG91cnMhPT0wJiYoZSs9dGhpcy5ob3VycysiSCIpLHRoaXMubWludXRlcyE9PTAmJihlKz10aGlzLm1pbnV0ZXMrIk0iKSwodGhpcy5zZWNvbmRzIT09MHx8dGhpcy5taWxsaXNlY29uZHMhPT0wKSYmKGUrPWRuKHRoaXMuc2Vjb25kcyt0aGlzLm1pbGxpc2Vjb25kcy8xZTMsMykrIlMiKSxlPT09IlAiJiYoZSs9IlQwUyIpLGV9dG9JU09UaW1lKGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3Qgbj10aGlzLnRvTWlsbGlzKCk7cmV0dXJuIG48MHx8bj49ODY0ZTU/bnVsbDooZT17c3VwcHJlc3NNaWxsaXNlY29uZHM6ITEsc3VwcHJlc3NTZWNvbmRzOiExLGluY2x1ZGVQcmVmaXg6ITEsZm9ybWF0OiJleHRlbmRlZCIsLi4uZSxpbmNsdWRlT2Zmc2V0OiExfSxwLmZyb21NaWxsaXMobix7em9uZToiVVRDIn0pLnRvSVNPVGltZShlKSl9dG9KU09OKCl7cmV0dXJuIHRoaXMudG9JU08oKX10b1N0cmluZygpe3JldHVybiB0aGlzLnRvSVNPKCl9W1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gRHVyYXRpb24geyB2YWx1ZXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZXMpfSB9YDpgRHVyYXRpb24geyBJbnZhbGlkLCByZWFzb246ICR7dGhpcy5pbnZhbGlkUmVhc29ufSB9YH10b01pbGxpcygpe3JldHVybiB0aGlzLmlzVmFsaWQ/VHModGhpcy5tYXRyaXgsdGhpcy52YWx1ZXMpOk5hTn12YWx1ZU9mKCl7cmV0dXJuIHRoaXMudG9NaWxsaXMoKX1wbHVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj12LmZyb21EdXJhdGlvbkxpa2UoZSkscj17fTtmb3IoY29uc3QgcyBvZiBkZSkoYmUobi52YWx1ZXMscyl8fGJlKHRoaXMudmFsdWVzLHMpKSYmKHJbc109bi5nZXQocykrdGhpcy5nZXQocykpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6cn0sITApfW1pbnVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj12LmZyb21EdXJhdGlvbkxpa2UoZSk7cmV0dXJuIHRoaXMucGx1cyhuLm5lZ2F0ZSgpKX1tYXBVbml0cyhlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49e307Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmtleXModGhpcy52YWx1ZXMpKW5bcl09cnMoZSh0aGlzLnZhbHVlc1tyXSxyKSk7cmV0dXJuIHNlKHRoaXMse3ZhbHVlczpufSwhMCl9Z2V0KGUpe3JldHVybiB0aGlzW3Yubm9ybWFsaXplVW5pdChlKV19c2V0KGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj17Li4udGhpcy52YWx1ZXMsLi4uSXQoZSx2Lm5vcm1hbGl6ZVVuaXQpfTtyZXR1cm4gc2UodGhpcyx7dmFsdWVzOm59KX1yZWNvbmZpZ3VyZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sY29udmVyc2lvbkFjY3VyYWN5OnIsbWF0cml4OnN9PXt9KXtjb25zdCBhPXtsb2M6dGhpcy5sb2MuY2xvbmUoe2xvY2FsZTplLG51bWJlcmluZ1N5c3RlbTpufSksbWF0cml4OnMsY29udmVyc2lvbkFjY3VyYWN5OnJ9O3JldHVybiBzZSh0aGlzLGEpfWFzKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKGUpLmdldChlKTpOYU59bm9ybWFsaXplKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPXRoaXMudG9PYmplY3QoKTtyZXR1cm4gU3ModGhpcy5tYXRyaXgsZSksc2UodGhpcyx7dmFsdWVzOmV9LCEwKX1yZXNjYWxlKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPXRmKHRoaXMubm9ybWFsaXplKCkuc2hpZnRUb0FsbCgpLnRvT2JqZWN0KCkpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6ZX0sITApfXNoaWZ0VG8oLi4uZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztpZihlLmxlbmd0aD09PTApcmV0dXJuIHRoaXM7ZT1lLm1hcChhPT52Lm5vcm1hbGl6ZVVuaXQoYSkpO2NvbnN0IG49e30scj17fSxzPXRoaXMudG9PYmplY3QoKTtsZXQgaTtmb3IoY29uc3QgYSBvZiBkZSlpZihlLmluZGV4T2YoYSk+PTApe2k9YTtsZXQgbz0wO2Zvcihjb25zdCBsIGluIHIpbys9dGhpcy5tYXRyaXhbbF1bYV0qcltsXSxyW2xdPTA7Y2Uoc1thXSkmJihvKz1zW2FdKTtjb25zdCB1PU1hdGgudHJ1bmMobyk7blthXT11LHJbYV09KG8qMWUzLXUqMWUzKS8xZTN9ZWxzZSBjZShzW2FdKSYmKHJbYV09c1thXSk7Zm9yKGNvbnN0IGEgaW4gcilyW2FdIT09MCYmKG5baV0rPWE9PT1pP3JbYV06clthXS90aGlzLm1hdHJpeFtpXVthXSk7cmV0dXJuIFNzKHRoaXMubWF0cml4LG4pLHNlKHRoaXMse3ZhbHVlczpufSwhMCl9c2hpZnRUb0FsbCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKCJ5ZWFycyIsIm1vbnRocyIsIndlZWtzIiwiZGF5cyIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiKTp0aGlzfW5lZ2F0ZSgpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3QgZT17fTtmb3IoY29uc3QgbiBvZiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykpZVtuXT10aGlzLnZhbHVlc1tuXT09PTA/MDotdGhpcy52YWx1ZXNbbl07cmV0dXJuIHNlKHRoaXMse3ZhbHVlczplfSwhMCl9Z2V0IHllYXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy55ZWFyc3x8MDpOYU59Z2V0IHF1YXJ0ZXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5xdWFydGVyc3x8MDpOYU59Z2V0IG1vbnRocygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMubW9udGhzfHwwOk5hTn1nZXQgd2Vla3MoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLndlZWtzfHwwOk5hTn1nZXQgZGF5cygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMuZGF5c3x8MDpOYU59Z2V0IGhvdXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5ob3Vyc3x8MDpOYU59Z2V0IG1pbnV0ZXMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLm1pbnV0ZXN8fDA6TmFOfWdldCBzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5zZWNvbmRzfHwwOk5hTn1nZXQgbWlsbGlzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5taWxsaXNlY29uZHN8fDA6TmFOfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZD09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1lcXVhbHMoZSl7aWYoIXRoaXMuaXNWYWxpZHx8IWUuaXNWYWxpZHx8IXRoaXMubG9jLmVxdWFscyhlLmxvYykpcmV0dXJuITE7ZnVuY3Rpb24gbihyLHMpe3JldHVybiByPT09dm9pZCAwfHxyPT09MD9zPT09dm9pZCAwfHxzPT09MDpyPT09c31mb3IoY29uc3QgciBvZiBkZSlpZighbih0aGlzLnZhbHVlc1tyXSxlLnZhbHVlc1tyXSkpcmV0dXJuITE7cmV0dXJuITB9fWNvbnN0IERlPSJJbnZhbGlkIEludGVydmFsIjtmdW5jdGlvbiBuZih0LGUpe3JldHVybiF0fHwhdC5pc1ZhbGlkP2suaW52YWxpZCgibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0Iik6IWV8fCFlLmlzVmFsaWQ/ay5pbnZhbGlkKCJtaXNzaW5nIG9yIGludmFsaWQgZW5kIik6ZTx0P2suaW52YWxpZCgiZW5kIGJlZm9yZSBzdGFydCIsYFRoZSBlbmQgb2YgYW4gaW50ZXJ2YWwgbXVzdCBiZSBhZnRlciBpdHMgc3RhcnQsIGJ1dCB5b3UgaGFkIHN0YXJ0PSR7dC50b0lTTygpfSBhbmQgZW5kPSR7ZS50b0lTTygpfWApOm51bGx9Y2xhc3Mga3tjb25zdHJ1Y3RvcihlKXt0aGlzLnM9ZS5zdGFydCx0aGlzLmU9ZS5lbmQsdGhpcy5pbnZhbGlkPWUuaW52YWxpZHx8bnVsbCx0aGlzLmlzTHV4b25JbnRlcnZhbD0hMH1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IF8oIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgSW50ZXJ2YWwgaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIFo/ZTpuZXcgWihlLG4pO2lmKEkudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IE5sKHIpO3JldHVybiBuZXcgayh7aW52YWxpZDpyfSl9c3RhdGljIGZyb21EYXRlVGltZXMoZSxuKXtjb25zdCByPUplKGUpLHM9SmUobiksaT1uZihyLHMpO3JldHVybiBpPz9uZXcgayh7c3RhcnQ6cixlbmQ6c30pfXN0YXRpYyBhZnRlcihlLG4pe2NvbnN0IHI9di5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SmUoZSk7cmV0dXJuIGsuZnJvbURhdGVUaW1lcyhzLHMucGx1cyhyKSl9c3RhdGljIGJlZm9yZShlLG4pe2NvbnN0IHI9di5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SmUoZSk7cmV0dXJuIGsuZnJvbURhdGVUaW1lcyhzLm1pbnVzKHIpLHMpfXN0YXRpYyBmcm9tSVNPKGUsbil7Y29uc3RbcixzXT0oZXx8IiIpLnNwbGl0KCIvIiwyKTtpZihyJiZzKXtsZXQgaSxhO3RyeXtpPXAuZnJvbUlTTyhyLG4pLGE9aS5pc1ZhbGlkfWNhdGNoe2E9ITF9bGV0IG8sdTt0cnl7bz1wLmZyb21JU08ocyxuKSx1PW8uaXNWYWxpZH1jYXRjaHt1PSExfWlmKGEmJnUpcmV0dXJuIGsuZnJvbURhdGVUaW1lcyhpLG8pO2lmKGEpe2NvbnN0IGw9di5mcm9tSVNPKHMsbik7aWYobC5pc1ZhbGlkKXJldHVybiBrLmFmdGVyKGksbCl9ZWxzZSBpZih1KXtjb25zdCBsPXYuZnJvbUlTTyhyLG4pO2lmKGwuaXNWYWxpZClyZXR1cm4gay5iZWZvcmUobyxsKX19cmV0dXJuIGsuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGlzSW50ZXJ2YWwoZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkludGVydmFsfHwhMX1nZXQgc3RhcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczpudWxsfWdldCBlbmQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTpudWxsfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZFJlYXNvbj09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1sZW5ndGgoZT0ibWlsbGlzZWNvbmRzIil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnRvRHVyYXRpb24oZSkuZ2V0KGUpOk5hTn1jb3VudChlPSJtaWxsaXNlY29uZHMiLG4pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIE5hTjtjb25zdCByPXRoaXMuc3RhcnQuc3RhcnRPZihlLG4pO2xldCBzO3JldHVybiBuIT1udWxsJiZuLnVzZUxvY2FsZVdlZWtzP3M9dGhpcy5lbmQucmVjb25maWd1cmUoe2xvY2FsZTpyLmxvY2FsZX0pOnM9dGhpcy5lbmQscz1zLnN0YXJ0T2YoZSxuKSxNYXRoLmZsb29yKHMuZGlmZihyLGUpLmdldChlKSkrKHMudmFsdWVPZigpIT09dGhpcy5lbmQudmFsdWVPZigpKX1oYXNTYW1lKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5pc0VtcHR5KCl8fHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucyxlKTohMX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMucy52YWx1ZU9mKCk9PT10aGlzLmUudmFsdWVPZigpfWlzQWZ0ZXIoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM+ZTohMX1pc0JlZm9yZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTw9ZTohMX1jb250YWlucyhlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczw9ZSYmdGhpcy5lPmU6ITF9c2V0KHtzdGFydDplLGVuZDpufT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9rLmZyb21EYXRlVGltZXMoZXx8dGhpcy5zLG58fHRoaXMuZSk6dGhpc31zcGxpdEF0KC4uLmUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuW107Y29uc3Qgbj1lLm1hcChKZSkuZmlsdGVyKGE9PnRoaXMuY29udGFpbnMoYSkpLnNvcnQoKGEsbyk9PmEudG9NaWxsaXMoKS1vLnRvTWlsbGlzKCkpLHI9W107bGV0e3N9PXRoaXMsaT0wO2Zvcig7czx0aGlzLmU7KXtjb25zdCBhPW5baV18fHRoaXMuZSxvPSthPit0aGlzLmU/dGhpcy5lOmE7ci5wdXNoKGsuZnJvbURhdGVUaW1lcyhzLG8pKSxzPW8saSs9MX1yZXR1cm4gcn1zcGxpdEJ5KGUpe2NvbnN0IG49di5mcm9tRHVyYXRpb25MaWtlKGUpO2lmKCF0aGlzLmlzVmFsaWR8fCFuLmlzVmFsaWR8fG4uYXMoIm1pbGxpc2Vjb25kcyIpPT09MClyZXR1cm5bXTtsZXR7czpyfT10aGlzLHM9MSxpO2NvbnN0IGE9W107Zm9yKDtyPHRoaXMuZTspe2NvbnN0IG89dGhpcy5zdGFydC5wbHVzKG4ubWFwVW5pdHModT0+dSpzKSk7aT0rbz4rdGhpcy5lP3RoaXMuZTpvLGEucHVzaChrLmZyb21EYXRlVGltZXMocixpKSkscj1pLHMrPTF9cmV0dXJuIGF9ZGl2aWRlRXF1YWxseShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpL2UpLnNsaWNlKDAsZSk6W119b3ZlcmxhcHMoZSl7cmV0dXJuIHRoaXMuZT5lLnMmJnRoaXMuczxlLmV9YWJ1dHNTdGFydChlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkPyt0aGlzLmU9PStlLnM6ITF9YWJ1dHNFbmQoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD8rZS5lPT0rdGhpcy5zOiExfWVuZ3VsZnMoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM8PWUucyYmdGhpcy5lPj1lLmU6ITF9ZXF1YWxzKGUpe3JldHVybiF0aGlzLmlzVmFsaWR8fCFlLmlzVmFsaWQ/ITE6dGhpcy5zLmVxdWFscyhlLnMpJiZ0aGlzLmUuZXF1YWxzKGUuZSl9aW50ZXJzZWN0aW9uKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj10aGlzLnM+ZS5zP3RoaXMuczplLnMscj10aGlzLmU8ZS5lP3RoaXMuZTplLmU7cmV0dXJuIG4+PXI/bnVsbDprLmZyb21EYXRlVGltZXMobixyKX11bmlvbihlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49dGhpcy5zPGUucz90aGlzLnM6ZS5zLHI9dGhpcy5lPmUuZT90aGlzLmU6ZS5lO3JldHVybiBrLmZyb21EYXRlVGltZXMobixyKX1zdGF0aWMgbWVyZ2UoZSl7Y29uc3RbbixyXT1lLnNvcnQoKHMsaSk9PnMucy1pLnMpLnJlZHVjZSgoW3MsaV0sYSk9Pmk/aS5vdmVybGFwcyhhKXx8aS5hYnV0c1N0YXJ0KGEpP1tzLGkudW5pb24oYSldOltzLmNvbmNhdChbaV0pLGFdOltzLGFdLFtbXSxudWxsXSk7cmV0dXJuIHImJm4ucHVzaChyKSxufXN0YXRpYyB4b3IoZSl7bGV0IG49bnVsbCxyPTA7Y29uc3Qgcz1bXSxpPWUubWFwKHU9Plt7dGltZTp1LnMsdHlwZToicyJ9LHt0aW1lOnUuZSx0eXBlOiJlIn1dKSxhPUFycmF5LnByb3RvdHlwZS5jb25jYXQoLi4uaSksbz1hLnNvcnQoKHUsbCk9PnUudGltZS1sLnRpbWUpO2Zvcihjb25zdCB1IG9mIG8pcis9dS50eXBlPT09InMiPzE6LTEscj09PTE/bj11LnRpbWU6KG4mJituIT0rdS50aW1lJiZzLnB1c2goay5mcm9tRGF0ZVRpbWVzKG4sdS50aW1lKSksbj1udWxsKTtyZXR1cm4gay5tZXJnZShzKX1kaWZmZXJlbmNlKC4uLmUpe3JldHVybiBrLnhvcihbdGhpc10uY29uY2F0KGUpKS5tYXAobj0+dGhpcy5pbnRlcnNlY3Rpb24obikpLmZpbHRlcihuPT5uJiYhbi5pc0VtcHR5KCkpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gWyR7dGhpcy5zLnRvSVNPKCl9IOKAkyAke3RoaXMuZS50b0lTTygpfSlgOkRlfVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YEludGVydmFsIHsgc3RhcnQ6ICR7dGhpcy5zLnRvSVNPKCl9LCBlbmQ6ICR7dGhpcy5lLnRvSVNPKCl9IH1gOmBJbnRlcnZhbCB7IEludmFsaWQsIHJlYXNvbjogJHt0aGlzLmludmFsaWRSZWFzb259IH1gfXRvTG9jYWxlU3RyaW5nKGU9eXQsbj17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD94LmNyZWF0ZSh0aGlzLnMubG9jLmNsb25lKG4pLGUpLmZvcm1hdEludGVydmFsKHRoaXMpOkRlfXRvSVNPKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPKGUpfS8ke3RoaXMuZS50b0lTTyhlKX1gOkRlfXRvSVNPRGF0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPRGF0ZSgpfS8ke3RoaXMuZS50b0lTT0RhdGUoKX1gOkRlfXRvSVNPVGltZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0lTT1RpbWUoZSl9LyR7dGhpcy5lLnRvSVNPVGltZShlKX1gOkRlfXRvRm9ybWF0KGUse3NlcGFyYXRvcjpuPSIg4oCTICJ9PXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0Zvcm1hdChlKX0ke259JHt0aGlzLmUudG9Gb3JtYXQoZSl9YDpEZX10b0R1cmF0aW9uKGUsbil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmUuZGlmZih0aGlzLnMsZSxuKTp2LmludmFsaWQodGhpcy5pbnZhbGlkUmVhc29uKX1tYXBFbmRwb2ludHMoZSl7cmV0dXJuIGsuZnJvbURhdGVUaW1lcyhlKHRoaXMucyksZSh0aGlzLmUpKX19Y2xhc3MgTnR7c3RhdGljIGhhc0RTVChlPUkuZGVmYXVsdFpvbmUpe2NvbnN0IG49cC5ub3coKS5zZXRab25lKGUpLnNldCh7bW9udGg6MTJ9KTtyZXR1cm4hZS5pc1VuaXZlcnNhbCYmbi5vZmZzZXQhPT1uLnNldCh7bW9udGg6Nn0pLm9mZnNldH1zdGF0aWMgaXNWYWxpZElBTkFab25lKGUpe3JldHVybiBKLmlzVmFsaWRab25lKGUpfXN0YXRpYyBub3JtYWxpemVab25lKGUpe3JldHVybiBuZShlLEkuZGVmYXVsdFpvbmUpfXN0YXRpYyBnZXRTdGFydE9mV2Vlayh7bG9jYWxlOmU9bnVsbCxsb2NPYmo6bj1udWxsfT17fSl7cmV0dXJuKG58fFQuY3JlYXRlKGUpKS5nZXRTdGFydE9mV2VlaygpfXN0YXRpYyBnZXRNaW5pbXVtRGF5c0luRmlyc3RXZWVrKHtsb2NhbGU6ZT1udWxsLGxvY09iajpuPW51bGx9PXt9KXtyZXR1cm4obnx8VC5jcmVhdGUoZSkpLmdldE1pbkRheXNJbkZpcnN0V2VlaygpfXN0YXRpYyBnZXRXZWVrZW5kV2Vla2RheXMoe2xvY2FsZTplPW51bGwsbG9jT2JqOm49bnVsbH09e30pe3JldHVybihufHxULmNyZWF0ZShlKSkuZ2V0V2Vla2VuZERheXMoKS5zbGljZSgpfXN0YXRpYyBtb250aHMoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fFQuY3JlYXRlKG4scixpKSkubW9udGhzKGUpfXN0YXRpYyBtb250aHNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fFQuY3JlYXRlKG4scixpKSkubW9udGhzKGUsITApfXN0YXRpYyB3ZWVrZGF5cyhlPSJsb25nIix7bG9jYWxlOm49bnVsbCxudW1iZXJpbmdTeXN0ZW06cj1udWxsLGxvY09iajpzPW51bGx9PXt9KXtyZXR1cm4oc3x8VC5jcmVhdGUobixyLG51bGwpKS53ZWVrZGF5cyhlKX1zdGF0aWMgd2Vla2RheXNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsfT17fSl7cmV0dXJuKHN8fFQuY3JlYXRlKG4scixudWxsKSkud2Vla2RheXMoZSwhMCl9c3RhdGljIG1lcmlkaWVtcyh7bG9jYWxlOmU9bnVsbH09e30pe3JldHVybiBULmNyZWF0ZShlKS5tZXJpZGllbXMoKX1zdGF0aWMgZXJhcyhlPSJzaG9ydCIse2xvY2FsZTpuPW51bGx9PXt9KXtyZXR1cm4gVC5jcmVhdGUobixudWxsLCJncmVnb3J5IikuZXJhcyhlKX1zdGF0aWMgZmVhdHVyZXMoKXtyZXR1cm57cmVsYXRpdmU6S3IoKSxsb2NhbGVXZWVrOlhyKCl9fX1mdW5jdGlvbiBicyh0LGUpe2NvbnN0IG49cz0+cy50b1VUQygwLHtrZWVwTG9jYWxUaW1lOiEwfSkuc3RhcnRPZigiZGF5IikudmFsdWVPZigpLHI9bihlKS1uKHQpO3JldHVybiBNYXRoLmZsb29yKHYuZnJvbU1pbGxpcyhyKS5hcygiZGF5cyIpKX1mdW5jdGlvbiByZih0LGUsbil7Y29uc3Qgcj1bWyJ5ZWFycyIsKHUsbCk9PmwueWVhci11LnllYXJdLFsicXVhcnRlcnMiLCh1LGwpPT5sLnF1YXJ0ZXItdS5xdWFydGVyKyhsLnllYXItdS55ZWFyKSo0XSxbIm1vbnRocyIsKHUsbCk9PmwubW9udGgtdS5tb250aCsobC55ZWFyLXUueWVhcikqMTJdLFsid2Vla3MiLCh1LGwpPT57Y29uc3QgYz1icyh1LGwpO3JldHVybihjLWMlNykvN31dLFsiZGF5cyIsYnNdXSxzPXt9LGk9dDtsZXQgYSxvO2Zvcihjb25zdFt1LGxdb2YgciluLmluZGV4T2YodSk+PTAmJihhPXUsc1t1XT1sKHQsZSksbz1pLnBsdXMocyksbz5lPyhzW3VdLS0sdD1pLnBsdXMocyksdD5lJiYobz10LHNbdV0tLSx0PWkucGx1cyhzKSkpOnQ9byk7cmV0dXJuW3QscyxvLGFdfWZ1bmN0aW9uIHNmKHQsZSxuLHIpe2xldFtzLGksYSxvXT1yZih0LGUsbik7Y29uc3QgdT1lLXMsbD1uLmZpbHRlcihkPT5bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiXS5pbmRleE9mKGQpPj0wKTtsLmxlbmd0aD09PTAmJihhPGUmJihhPXMucGx1cyh7W29dOjF9KSksYSE9PXMmJihpW29dPShpW29dfHwwKSt1LyhhLXMpKSk7Y29uc3QgYz12LmZyb21PYmplY3QoaSxyKTtyZXR1cm4gbC5sZW5ndGg+MD92LmZyb21NaWxsaXModSxyKS5zaGlmdFRvKC4uLmwpLnBsdXMoYyk6Y31jb25zdCBwbj17YXJhYjoiW9mgLdmpXSIsYXJhYmV4dDoiW9uwLdu5XSIsYmFsaToiW+GtkC3hrZldIixiZW5nOiJb4KemLeCnr10iLGRldmE6IlvgpaYt4KWvXSIsZnVsbHdpZGU6IlvvvJAt77yZXSIsZ3VqcjoiW+Crpi3gq69dIixoYW5pZGVjOiJb44CHfOS4gHzkuox85LiJfOWbm3zkupR85YWtfOS4g3zlhat85LmdXSIsa2htcjoiW+GfoC3hn6ldIixrbmRhOiJb4LOmLeCzr10iLGxhb286Ilvgu5At4LuZXSIsbGltYjoiW+Glhi3hpY9dIixtbHltOiJb4LWmLeC1r10iLG1vbmc6IlvhoJAt4aCZXSIsbXltcjoiW+GBgC3hgYldIixvcnlhOiJb4K2mLeCtr10iLHRhbWxkZWM6Ilvgr6Yt4K+vXSIsdGVsdToiW+Cxpi3gsa9dIix0aGFpOiJb4LmQLeC5mV0iLHRpYnQ6IlvgvKAt4LypXSIsbGF0bjoiXFxkIn0sa3M9e2FyYWI6WzE2MzIsMTY0MV0sYXJhYmV4dDpbMTc3NiwxNzg1XSxiYWxpOls2OTkyLDcwMDFdLGJlbmc6WzI1MzQsMjU0M10sZGV2YTpbMjQwNiwyNDE1XSxmdWxsd2lkZTpbNjUyOTYsNjUzMDNdLGd1anI6WzI3OTAsMjc5OV0sa2htcjpbNjExMiw2MTIxXSxrbmRhOlszMzAyLDMzMTFdLGxhb286WzM3OTIsMzgwMV0sbGltYjpbNjQ3MCw2NDc5XSxtbHltOlszNDMwLDM0MzldLG1vbmc6WzYxNjAsNjE2OV0sbXltcjpbNDE2MCw0MTY5XSxvcnlhOlsyOTE4LDI5MjddLHRhbWxkZWM6WzMwNDYsMzA1NV0sdGVsdTpbMzE3NCwzMTgzXSx0aGFpOlszNjY0LDM2NzNdLHRpYnQ6WzM4NzIsMzg4MV19LGFmPXBuLmhhbmlkZWMucmVwbGFjZSgvW1xbfFxdXS9nLCIiKS5zcGxpdCgiIik7ZnVuY3Rpb24gb2YodCl7bGV0IGU9cGFyc2VJbnQodCwxMCk7aWYoaXNOYU4oZSkpe2U9IiI7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dC5jaGFyQ29kZUF0KG4pO2lmKHRbbl0uc2VhcmNoKHBuLmhhbmlkZWMpIT09LTEpZSs9YWYuaW5kZXhPZih0W25dKTtlbHNlIGZvcihjb25zdCBzIGluIGtzKXtjb25zdFtpLGFdPWtzW3NdO3I+PWkmJnI8PWEmJihlKz1yLWkpfX1yZXR1cm4gcGFyc2VJbnQoZSwxMCl9ZWxzZSByZXR1cm4gZX1mdW5jdGlvbiBSKHtudW1iZXJpbmdTeXN0ZW06dH0sZT0iIil7cmV0dXJuIG5ldyBSZWdFeHAoYCR7cG5bdHx8ImxhdG4iXX0ke2V9YCl9Y29uc3QgdWY9Im1pc3NpbmcgSW50bC5EYXRlVGltZUZvcm1hdC5mb3JtYXRUb1BhcnRzIHN1cHBvcnQiO2Z1bmN0aW9uIE8odCxlPW49Pm4pe3JldHVybntyZWdleDp0LGRlc2VyOihbbl0pPT5lKG9mKG4pKX19Y29uc3QgSXM9IlsgwqBdIixFcz1uZXcgUmVnRXhwKElzLCJnIik7ZnVuY3Rpb24gbGYodCl7cmV0dXJuIHQucmVwbGFjZSgvXC4vZywiXFwuPyIpLnJlcGxhY2UoRXMsSXMpfWZ1bmN0aW9uIE5zKHQpe3JldHVybiB0LnJlcGxhY2UoL1wuL2csIiIpLnJlcGxhY2UoRXMsIiAiKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIFAodCxlKXtyZXR1cm4gdD09PW51bGw/bnVsbDp7cmVnZXg6UmVnRXhwKHQubWFwKGxmKS5qb2luKCJ8IikpLGRlc2VyOihbbl0pPT50LmZpbmRJbmRleChyPT5OcyhuKT09PU5zKHIpKStlfX1mdW5jdGlvbiB4cyh0LGUpe3JldHVybntyZWdleDp0LGRlc2VyOihbLG4scl0pPT5rdChuLHIpLGdyb3VwczplfX1mdW5jdGlvbiB4dCh0KXtyZXR1cm57cmVnZXg6dCxkZXNlcjooW2VdKT0+ZX19ZnVuY3Rpb24gY2YodCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfWZ1bmN0aW9uIGZmKHQsZSl7Y29uc3Qgbj1SKGUpLHI9UihlLCJ7Mn0iKSxzPVIoZSwiezN9IiksaT1SKGUsIns0fSIpLGE9UihlLCJ7Nn0iKSxvPVIoZSwiezEsMn0iKSx1PVIoZSwiezEsM30iKSxsPVIoZSwiezEsNn0iKSxjPVIoZSwiezEsOX0iKSxkPVIoZSwiezIsNH0iKSx5PVIoZSwiezQsNn0iKSxoPU09Pih7cmVnZXg6UmVnRXhwKGNmKE0udmFsKSksZGVzZXI6KFtxXSk9PnEsbGl0ZXJhbDohMH0pLGo9KE09PntpZih0LmxpdGVyYWwpcmV0dXJuIGgoTSk7c3dpdGNoKE0udmFsKXtjYXNlIkciOnJldHVybiBQKGUuZXJhcygic2hvcnQiKSwwKTtjYXNlIkdHIjpyZXR1cm4gUChlLmVyYXMoImxvbmciKSwwKTtjYXNlInkiOnJldHVybiBPKGwpO2Nhc2UieXkiOnJldHVybiBPKGQsaG4pO2Nhc2UieXl5eSI6cmV0dXJuIE8oaSk7Y2FzZSJ5eXl5eSI6cmV0dXJuIE8oeSk7Y2FzZSJ5eXl5eXkiOnJldHVybiBPKGEpO2Nhc2UiTSI6cmV0dXJuIE8obyk7Y2FzZSJNTSI6cmV0dXJuIE8ocik7Y2FzZSJNTU0iOnJldHVybiBQKGUubW9udGhzKCJzaG9ydCIsITApLDEpO2Nhc2UiTU1NTSI6cmV0dXJuIFAoZS5tb250aHMoImxvbmciLCEwKSwxKTtjYXNlIkwiOnJldHVybiBPKG8pO2Nhc2UiTEwiOnJldHVybiBPKHIpO2Nhc2UiTExMIjpyZXR1cm4gUChlLm1vbnRocygic2hvcnQiLCExKSwxKTtjYXNlIkxMTEwiOnJldHVybiBQKGUubW9udGhzKCJsb25nIiwhMSksMSk7Y2FzZSJkIjpyZXR1cm4gTyhvKTtjYXNlImRkIjpyZXR1cm4gTyhyKTtjYXNlIm8iOnJldHVybiBPKHUpO2Nhc2Uib29vIjpyZXR1cm4gTyhzKTtjYXNlIkhIIjpyZXR1cm4gTyhyKTtjYXNlIkgiOnJldHVybiBPKG8pO2Nhc2UiaGgiOnJldHVybiBPKHIpO2Nhc2UiaCI6cmV0dXJuIE8obyk7Y2FzZSJtbSI6cmV0dXJuIE8ocik7Y2FzZSJtIjpyZXR1cm4gTyhvKTtjYXNlInEiOnJldHVybiBPKG8pO2Nhc2UicXEiOnJldHVybiBPKHIpO2Nhc2UicyI6cmV0dXJuIE8obyk7Y2FzZSJzcyI6cmV0dXJuIE8ocik7Y2FzZSJTIjpyZXR1cm4gTyh1KTtjYXNlIlNTUyI6cmV0dXJuIE8ocyk7Y2FzZSJ1IjpyZXR1cm4geHQoYyk7Y2FzZSJ1dSI6cmV0dXJuIHh0KG8pO2Nhc2UidXV1IjpyZXR1cm4gTyhuKTtjYXNlImEiOnJldHVybiBQKGUubWVyaWRpZW1zKCksMCk7Y2FzZSJra2trIjpyZXR1cm4gTyhpKTtjYXNlImtrIjpyZXR1cm4gTyhkLGhuKTtjYXNlIlciOnJldHVybiBPKG8pO2Nhc2UiV1ciOnJldHVybiBPKHIpO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4gTyhuKTtjYXNlIkVFRSI6cmV0dXJuIFAoZS53ZWVrZGF5cygic2hvcnQiLCExKSwxKTtjYXNlIkVFRUUiOnJldHVybiBQKGUud2Vla2RheXMoImxvbmciLCExKSwxKTtjYXNlImNjYyI6cmV0dXJuIFAoZS53ZWVrZGF5cygic2hvcnQiLCEwKSwxKTtjYXNlImNjY2MiOnJldHVybiBQKGUud2Vla2RheXMoImxvbmciLCEwKSwxKTtjYXNlIloiOmNhc2UiWloiOnJldHVybiB4cyhuZXcgUmVnRXhwKGAoWystXSR7by5zb3VyY2V9KSg/OjooJHtyLnNvdXJjZX0pKT9gKSwyKTtjYXNlIlpaWiI6cmV0dXJuIHhzKG5ldyBSZWdFeHAoYChbKy1dJHtvLnNvdXJjZX0pKCR7ci5zb3VyY2V9KT9gKSwyKTtjYXNlInoiOnJldHVybiB4dCgvW2Etel8rLS9dezEsMjU2fT8vaSk7Y2FzZSIgIjpyZXR1cm4geHQoL1teXFNcblxyXS8pO2RlZmF1bHQ6cmV0dXJuIGgoTSl9fSkodCl8fHtpbnZhbGlkUmVhc29uOnVmfTtyZXR1cm4gai50b2tlbj10LGp9Y29uc3QgZGY9e3llYXI6eyIyLWRpZ2l0IjoieXkiLG51bWVyaWM6Inl5eXl5In0sbW9udGg6e251bWVyaWM6Ik0iLCIyLWRpZ2l0IjoiTU0iLHNob3J0OiJNTU0iLGxvbmc6Ik1NTU0ifSxkYXk6e251bWVyaWM6ImQiLCIyLWRpZ2l0IjoiZGQifSx3ZWVrZGF5OntzaG9ydDoiRUVFIixsb25nOiJFRUVFIn0sZGF5cGVyaW9kOiJhIixkYXlQZXJpb2Q6ImEiLGhvdXIxMjp7bnVtZXJpYzoiaCIsIjItZGlnaXQiOiJoaCJ9LGhvdXIyNDp7bnVtZXJpYzoiSCIsIjItZGlnaXQiOiJISCJ9LG1pbnV0ZTp7bnVtZXJpYzoibSIsIjItZGlnaXQiOiJtbSJ9LHNlY29uZDp7bnVtZXJpYzoicyIsIjItZGlnaXQiOiJzcyJ9LHRpbWVab25lTmFtZTp7bG9uZzoiWlpaWloiLHNob3J0OiJaWloifX07ZnVuY3Rpb24gaGYodCxlLG4pe2NvbnN0e3R5cGU6cix2YWx1ZTpzfT10O2lmKHI9PT0ibGl0ZXJhbCIpe2NvbnN0IHU9L15ccyskLy50ZXN0KHMpO3JldHVybntsaXRlcmFsOiF1LHZhbDp1PyIgIjpzfX1jb25zdCBpPWVbcl07bGV0IGE9cjtyPT09ImhvdXIiJiYoZS5ob3VyMTIhPW51bGw/YT1lLmhvdXIxMj8iaG91cjEyIjoiaG91cjI0IjplLmhvdXJDeWNsZSE9bnVsbD9lLmhvdXJDeWNsZT09PSJoMTEifHxlLmhvdXJDeWNsZT09PSJoMTIiP2E9ImhvdXIxMiI6YT0iaG91cjI0IjphPW4uaG91cjEyPyJob3VyMTIiOiJob3VyMjQiKTtsZXQgbz1kZlthXTtpZih0eXBlb2Ygbz09Im9iamVjdCImJihvPW9baV0pLG8pcmV0dXJue2xpdGVyYWw6ITEsdmFsOm99fWZ1bmN0aW9uIG1mKHQpe3JldHVybltgXiR7dC5tYXAobj0+bi5yZWdleCkucmVkdWNlKChuLHIpPT5gJHtufSgke3Iuc291cmNlfSlgLCIiKX0kYCx0XX1mdW5jdGlvbiB5Zih0LGUsbil7Y29uc3Qgcj10Lm1hdGNoKGUpO2lmKHIpe2NvbnN0IHM9e307bGV0IGk9MTtmb3IoY29uc3QgYSBpbiBuKWlmKGJlKG4sYSkpe2NvbnN0IG89blthXSx1PW8uZ3JvdXBzP28uZ3JvdXBzKzE6MTshby5saXRlcmFsJiZvLnRva2VuJiYoc1tvLnRva2VuLnZhbFswXV09by5kZXNlcihyLnNsaWNlKGksaSt1KSkpLGkrPXV9cmV0dXJuW3Isc119ZWxzZSByZXR1cm5bcix7fV19ZnVuY3Rpb24gZ2YodCl7Y29uc3QgZT1pPT57c3dpdGNoKGkpe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpjYXNlIkgiOnJldHVybiJob3VyIjtjYXNlImQiOnJldHVybiJkYXkiO2Nhc2UibyI6cmV0dXJuIm9yZGluYWwiO2Nhc2UiTCI6Y2FzZSJNIjpyZXR1cm4ibW9udGgiO2Nhc2UieSI6cmV0dXJuInllYXIiO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4id2Vla2RheSI7Y2FzZSJXIjpyZXR1cm4id2Vla051bWJlciI7Y2FzZSJrIjpyZXR1cm4id2Vla1llYXIiO2Nhc2UicSI6cmV0dXJuInF1YXJ0ZXIiO2RlZmF1bHQ6cmV0dXJuIG51bGx9fTtsZXQgbj1udWxsLHI7cmV0dXJuIGcodC56KXx8KG49Si5jcmVhdGUodC56KSksZyh0LlopfHwobnx8KG49bmV3IEQodC5aKSkscj10LlopLGcodC5xKXx8KHQuTT0odC5xLTEpKjMrMSksZyh0LmgpfHwodC5oPDEyJiZ0LmE9PT0xP3QuaCs9MTI6dC5oPT09MTImJnQuYT09PTAmJih0Lmg9MCkpLHQuRz09PTAmJnQueSYmKHQueT0tdC55KSxnKHQudSl8fCh0LlM9Zm4odC51KSksW09iamVjdC5rZXlzKHQpLnJlZHVjZSgoaSxhKT0+e2NvbnN0IG89ZShhKTtyZXR1cm4gbyYmKGlbb109dFthXSksaX0se30pLG4scl19bGV0IHduPW51bGw7ZnVuY3Rpb24gcGYoKXtyZXR1cm4gd258fCh3bj1wLmZyb21NaWxsaXMoMTU1NTU1NTU1NTU1NSkpLHdufWZ1bmN0aW9uIHdmKHQsZSl7aWYodC5saXRlcmFsKXJldHVybiB0O2NvbnN0IG49eC5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHQudmFsKSxyPURzKG4sZSk7cmV0dXJuIHI9PW51bGx8fHIuaW5jbHVkZXModm9pZCAwKT90OnJ9ZnVuY3Rpb24gTXModCxlKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi50Lm1hcChuPT53ZihuLGUpKSl9ZnVuY3Rpb24gQ3ModCxlLG4pe2NvbnN0IHI9TXMoeC5wYXJzZUZvcm1hdChuKSx0KSxzPXIubWFwKGE9PmZmKGEsdCkpLGk9cy5maW5kKGE9PmEuaW52YWxpZFJlYXNvbik7aWYoaSlyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixpbnZhbGlkUmVhc29uOmkuaW52YWxpZFJlYXNvbn07e2NvbnN0W2Esb109bWYocyksdT1SZWdFeHAoYSwiaSIpLFtsLGNdPXlmKGUsdSxvKSxbZCx5LGhdPWM/Z2YoYyk6W251bGwsbnVsbCx2b2lkIDBdO2lmKGJlKGMsImEiKSYmYmUoYywiSCIpKXRocm93IG5ldyBTZSgiQ2FuJ3QgaW5jbHVkZSBtZXJpZGllbSB3aGVuIHNwZWNpZnlpbmcgMjQtaG91ciBmb3JtYXQiKTtyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixyZWdleDp1LHJhd01hdGNoZXM6bCxtYXRjaGVzOmMscmVzdWx0OmQsem9uZTp5LHNwZWNpZmljT2Zmc2V0Omh9fX1mdW5jdGlvbiB2Zih0LGUsbil7Y29uc3R7cmVzdWx0OnIsem9uZTpzLHNwZWNpZmljT2Zmc2V0OmksaW52YWxpZFJlYXNvbjphfT1Dcyh0LGUsbik7cmV0dXJuW3IscyxpLGFdfWZ1bmN0aW9uIERzKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7Y29uc3Qgcj14LmNyZWF0ZShlLHQpLmR0Rm9ybWF0dGVyKHBmKCkpLHM9ci5mb3JtYXRUb1BhcnRzKCksaT1yLnJlc29sdmVkT3B0aW9ucygpO3JldHVybiBzLm1hcChhPT5oZihhLHQsaSkpfWNvbnN0IHZuPSJJbnZhbGlkIERhdGVUaW1lIixfcz04NjRlMTM7ZnVuY3Rpb24gTXQodCl7cmV0dXJuIG5ldyBaKCJ1bnN1cHBvcnRlZCB6b25lIixgdGhlIHpvbmUgIiR7dC5uYW1lfSIgaXMgbm90IHN1cHBvcnRlZGApfWZ1bmN0aW9uIE9uKHQpe3JldHVybiB0LndlZWtEYXRhPT09bnVsbCYmKHQud2Vla0RhdGE9T3QodC5jKSksdC53ZWVrRGF0YX1mdW5jdGlvbiBUbih0KXtyZXR1cm4gdC5sb2NhbFdlZWtEYXRhPT09bnVsbCYmKHQubG9jYWxXZWVrRGF0YT1PdCh0LmMsdC5sb2MuZ2V0TWluRGF5c0luRmlyc3RXZWVrKCksdC5sb2MuZ2V0U3RhcnRPZldlZWsoKSkpLHQubG9jYWxXZWVrRGF0YX1mdW5jdGlvbiBoZSh0LGUpe2NvbnN0IG49e3RzOnQudHMsem9uZTp0LnpvbmUsYzp0LmMsbzp0Lm8sbG9jOnQubG9jLGludmFsaWQ6dC5pbnZhbGlkfTtyZXR1cm4gbmV3IHAoey4uLm4sLi4uZSxvbGQ6bn0pfWZ1bmN0aW9uIEZzKHQsZSxuKXtsZXQgcj10LWUqNjAqMWUzO2NvbnN0IHM9bi5vZmZzZXQocik7aWYoZT09PXMpcmV0dXJuW3IsZV07ci09KHMtZSkqNjAqMWUzO2NvbnN0IGk9bi5vZmZzZXQocik7cmV0dXJuIHM9PT1pP1tyLHNdOlt0LU1hdGgubWluKHMsaSkqNjAqMWUzLE1hdGgubWF4KHMsaSldfWZ1bmN0aW9uIEN0KHQsZSl7dCs9ZSo2MCoxZTM7Y29uc3Qgbj1uZXcgRGF0ZSh0KTtyZXR1cm57eWVhcjpuLmdldFVUQ0Z1bGxZZWFyKCksbW9udGg6bi5nZXRVVENNb250aCgpKzEsZGF5Om4uZ2V0VVRDRGF0ZSgpLGhvdXI6bi5nZXRVVENIb3VycygpLG1pbnV0ZTpuLmdldFVUQ01pbnV0ZXMoKSxzZWNvbmQ6bi5nZXRVVENTZWNvbmRzKCksbWlsbGlzZWNvbmQ6bi5nZXRVVENNaWxsaXNlY29uZHMoKX19ZnVuY3Rpb24gRHQodCxlLG4pe3JldHVybiBGcyhidCh0KSxlLG4pfWZ1bmN0aW9uIEFzKHQsZSl7Y29uc3Qgbj10Lm8scj10LmMueWVhcitNYXRoLnRydW5jKGUueWVhcnMpLHM9dC5jLm1vbnRoK01hdGgudHJ1bmMoZS5tb250aHMpK01hdGgudHJ1bmMoZS5xdWFydGVycykqMyxpPXsuLi50LmMseWVhcjpyLG1vbnRoOnMsZGF5Ok1hdGgubWluKHQuYy5kYXksU3QocixzKSkrTWF0aC50cnVuYyhlLmRheXMpK01hdGgudHJ1bmMoZS53ZWVrcykqN30sYT12LmZyb21PYmplY3Qoe3llYXJzOmUueWVhcnMtTWF0aC50cnVuYyhlLnllYXJzKSxxdWFydGVyczplLnF1YXJ0ZXJzLU1hdGgudHJ1bmMoZS5xdWFydGVycyksbW9udGhzOmUubW9udGhzLU1hdGgudHJ1bmMoZS5tb250aHMpLHdlZWtzOmUud2Vla3MtTWF0aC50cnVuYyhlLndlZWtzKSxkYXlzOmUuZGF5cy1NYXRoLnRydW5jKGUuZGF5cyksaG91cnM6ZS5ob3VycyxtaW51dGVzOmUubWludXRlcyxzZWNvbmRzOmUuc2Vjb25kcyxtaWxsaXNlY29uZHM6ZS5taWxsaXNlY29uZHN9KS5hcygibWlsbGlzZWNvbmRzIiksbz1idChpKTtsZXRbdSxsXT1GcyhvLG4sdC56b25lKTtyZXR1cm4gYSE9PTAmJih1Kz1hLGw9dC56b25lLm9mZnNldCh1KSkse3RzOnUsbzpsfX1mdW5jdGlvbiBHZSh0LGUsbixyLHMsaSl7Y29uc3R7c2V0Wm9uZTphLHpvbmU6b309bjtpZih0JiZPYmplY3Qua2V5cyh0KS5sZW5ndGghPT0wfHxlKXtjb25zdCB1PWV8fG8sbD1wLmZyb21PYmplY3QodCx7Li4ubix6b25lOnUsc3BlY2lmaWNPZmZzZXQ6aX0pO3JldHVybiBhP2w6bC5zZXRab25lKG8pfWVsc2UgcmV0dXJuIHAuaW52YWxpZChuZXcgWigidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtzfSIgY2FuJ3QgYmUgcGFyc2VkIGFzICR7cn1gKSl9ZnVuY3Rpb24gX3QodCxlLG49ITApe3JldHVybiB0LmlzVmFsaWQ/eC5jcmVhdGUoVC5jcmVhdGUoImVuLVVTIikse2FsbG93WjpuLGZvcmNlU2ltcGxlOiEwfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHQsZSk6bnVsbH1mdW5jdGlvbiBTbih0LGUpe2NvbnN0IG49dC5jLnllYXI+OTk5OXx8dC5jLnllYXI8MDtsZXQgcj0iIjtyZXR1cm4gbiYmdC5jLnllYXI+PTAmJihyKz0iKyIpLHIrPUUodC5jLnllYXIsbj82OjQpLGU/KHIrPSItIixyKz1FKHQuYy5tb250aCkscis9Ii0iLHIrPUUodC5jLmRheSkpOihyKz1FKHQuYy5tb250aCkscis9RSh0LmMuZGF5KSkscn1mdW5jdGlvbiBWcyh0LGUsbixyLHMsaSl7bGV0IGE9RSh0LmMuaG91cik7cmV0dXJuIGU/KGErPSI6IixhKz1FKHQuYy5taW51dGUpLCh0LmMubWlsbGlzZWNvbmQhPT0wfHx0LmMuc2Vjb25kIT09MHx8IW4pJiYoYSs9IjoiKSk6YSs9RSh0LmMubWludXRlKSwodC5jLm1pbGxpc2Vjb25kIT09MHx8dC5jLnNlY29uZCE9PTB8fCFuKSYmKGErPUUodC5jLnNlY29uZCksKHQuYy5taWxsaXNlY29uZCE9PTB8fCFyKSYmKGErPSIuIixhKz1FKHQuYy5taWxsaXNlY29uZCwzKSkpLHMmJih0LmlzT2Zmc2V0Rml4ZWQmJnQub2Zmc2V0PT09MCYmIWk/YSs9IloiOnQubzwwPyhhKz0iLSIsYSs9RShNYXRoLnRydW5jKC10Lm8vNjApKSxhKz0iOiIsYSs9RShNYXRoLnRydW5jKC10Lm8lNjApKSk6KGErPSIrIixhKz1FKE1hdGgudHJ1bmModC5vLzYwKSksYSs9IjoiLGErPUUoTWF0aC50cnVuYyh0Lm8lNjApKSkpLGkmJihhKz0iWyIrdC56b25lLmlhbmFOYW1lKyJdIiksYX1jb25zdCBXcz17bW9udGg6MSxkYXk6MSxob3VyOjAsbWludXRlOjAsc2Vjb25kOjAsbWlsbGlzZWNvbmQ6MH0sT2Y9e3dlZWtOdW1iZXI6MSx3ZWVrZGF5OjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LFRmPXtvcmRpbmFsOjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LCRzPVsieWVhciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sU2Y9WyJ3ZWVrWWVhciIsIndlZWtOdW1iZXIiLCJ3ZWVrZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sYmY9WyJ5ZWFyIiwib3JkaW5hbCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdO2Z1bmN0aW9uIGtmKHQpe2NvbnN0IGU9e3llYXI6InllYXIiLHllYXJzOiJ5ZWFyIixtb250aDoibW9udGgiLG1vbnRoczoibW9udGgiLGRheToiZGF5IixkYXlzOiJkYXkiLGhvdXI6ImhvdXIiLGhvdXJzOiJob3VyIixtaW51dGU6Im1pbnV0ZSIsbWludXRlczoibWludXRlIixxdWFydGVyOiJxdWFydGVyIixxdWFydGVyczoicXVhcnRlciIsc2Vjb25kOiJzZWNvbmQiLHNlY29uZHM6InNlY29uZCIsbWlsbGlzZWNvbmQ6Im1pbGxpc2Vjb25kIixtaWxsaXNlY29uZHM6Im1pbGxpc2Vjb25kIix3ZWVrZGF5OiJ3ZWVrZGF5Iix3ZWVrZGF5czoid2Vla2RheSIsd2Vla251bWJlcjoid2Vla051bWJlciIsd2Vla3NudW1iZXI6IndlZWtOdW1iZXIiLHdlZWtudW1iZXJzOiJ3ZWVrTnVtYmVyIix3ZWVreWVhcjoid2Vla1llYXIiLHdlZWt5ZWFyczoid2Vla1llYXIiLG9yZGluYWw6Im9yZGluYWwifVt0LnRvTG93ZXJDYXNlKCldO2lmKCFlKXRocm93IG5ldyBocih0KTtyZXR1cm4gZX1mdW5jdGlvbiBMcyh0KXtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlImxvY2Fsd2Vla2RheSI6Y2FzZSJsb2NhbHdlZWtkYXlzIjpyZXR1cm4ibG9jYWxXZWVrZGF5IjtjYXNlImxvY2Fsd2Vla251bWJlciI6Y2FzZSJsb2NhbHdlZWtudW1iZXJzIjpyZXR1cm4ibG9jYWxXZWVrTnVtYmVyIjtjYXNlImxvY2Fsd2Vla3llYXIiOmNhc2UibG9jYWx3ZWVreWVhcnMiOnJldHVybiJsb2NhbFdlZWtZZWFyIjtkZWZhdWx0OnJldHVybiBrZih0KX19ZnVuY3Rpb24genModCxlKXtjb25zdCBuPW5lKGUuem9uZSxJLmRlZmF1bHRab25lKSxyPVQuZnJvbU9iamVjdChlKSxzPUkubm93KCk7bGV0IGksYTtpZihnKHQueWVhcikpaT1zO2Vsc2V7Zm9yKGNvbnN0IGwgb2YgJHMpZyh0W2xdKSYmKHRbbF09V3NbbF0pO2NvbnN0IG89QnIodCl8fFFyKHQpO2lmKG8pcmV0dXJuIHAuaW52YWxpZChvKTtjb25zdCB1PW4ub2Zmc2V0KHMpO1tpLGFdPUR0KHQsdSxuKX1yZXR1cm4gbmV3IHAoe3RzOmksem9uZTpuLGxvYzpyLG86YX0pfWZ1bmN0aW9uIFpzKHQsZSxuKXtjb25zdCByPWcobi5yb3VuZCk/ITA6bi5yb3VuZCxzPShhLG8pPT4oYT1kbihhLHJ8fG4uY2FsZW5kYXJ5PzA6MiwhMCksZS5sb2MuY2xvbmUobikucmVsRm9ybWF0dGVyKG4pLmZvcm1hdChhLG8pKSxpPWE9Pm4uY2FsZW5kYXJ5P2UuaGFzU2FtZSh0LGEpPzA6ZS5zdGFydE9mKGEpLmRpZmYodC5zdGFydE9mKGEpLGEpLmdldChhKTplLmRpZmYodCxhKS5nZXQoYSk7aWYobi51bml0KXJldHVybiBzKGkobi51bml0KSxuLnVuaXQpO2Zvcihjb25zdCBhIG9mIG4udW5pdHMpe2NvbnN0IG89aShhKTtpZihNYXRoLmFicyhvKT49MSlyZXR1cm4gcyhvLGEpfXJldHVybiBzKHQ+ZT8tMDowLG4udW5pdHNbbi51bml0cy5sZW5ndGgtMV0pfWZ1bmN0aW9uIFJzKHQpe2xldCBlPXt9LG47cmV0dXJuIHQubGVuZ3RoPjAmJnR5cGVvZiB0W3QubGVuZ3RoLTFdPT0ib2JqZWN0Ij8oZT10W3QubGVuZ3RoLTFdLG49QXJyYXkuZnJvbSh0KS5zbGljZSgwLHQubGVuZ3RoLTEpKTpuPUFycmF5LmZyb20odCksW2Usbl19Y2xhc3MgcHtjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuem9uZXx8SS5kZWZhdWx0Wm9uZTtsZXQgcj1lLmludmFsaWR8fChOdW1iZXIuaXNOYU4oZS50cyk/bmV3IFooImludmFsaWQgaW5wdXQiKTpudWxsKXx8KG4uaXNWYWxpZD9udWxsOk10KG4pKTt0aGlzLnRzPWcoZS50cyk/SS5ub3coKTplLnRzO2xldCBzPW51bGwsaT1udWxsO2lmKCFyKWlmKGUub2xkJiZlLm9sZC50cz09PXRoaXMudHMmJmUub2xkLnpvbmUuZXF1YWxzKG4pKVtzLGldPVtlLm9sZC5jLGUub2xkLm9dO2Vsc2V7Y29uc3Qgbz1uLm9mZnNldCh0aGlzLnRzKTtzPUN0KHRoaXMudHMsbykscj1OdW1iZXIuaXNOYU4ocy55ZWFyKT9uZXcgWigiaW52YWxpZCBpbnB1dCIpOm51bGwscz1yP251bGw6cyxpPXI/bnVsbDpvfXRoaXMuX3pvbmU9bix0aGlzLmxvYz1lLmxvY3x8VC5jcmVhdGUoKSx0aGlzLmludmFsaWQ9cix0aGlzLndlZWtEYXRhPW51bGwsdGhpcy5sb2NhbFdlZWtEYXRhPW51bGwsdGhpcy5jPXMsdGhpcy5vPWksdGhpcy5pc0x1eG9uRGF0ZVRpbWU9ITB9c3RhdGljIG5vdygpe3JldHVybiBuZXcgcCh7fSl9c3RhdGljIGxvY2FsKCl7Y29uc3RbZSxuXT1Scyhhcmd1bWVudHMpLFtyLHMsaSxhLG8sdSxsXT1uO3JldHVybiB6cyh7eWVhcjpyLG1vbnRoOnMsZGF5OmksaG91cjphLG1pbnV0ZTpvLHNlY29uZDp1LG1pbGxpc2Vjb25kOmx9LGUpfXN0YXRpYyB1dGMoKXtjb25zdFtlLG5dPVJzKGFyZ3VtZW50cyksW3IscyxpLGEsbyx1LGxdPW47cmV0dXJuIGUuem9uZT1ELnV0Y0luc3RhbmNlLHpzKHt5ZWFyOnIsbW9udGg6cyxkYXk6aSxob3VyOmEsbWludXRlOm8sc2Vjb25kOnUsbWlsbGlzZWNvbmQ6bH0sZSl9c3RhdGljIGZyb21KU0RhdGUoZSxuPXt9KXtjb25zdCByPVhsKGUpP2UudmFsdWVPZigpOk5hTjtpZihOdW1iZXIuaXNOYU4ocikpcmV0dXJuIHAuaW52YWxpZCgiaW52YWxpZCBpbnB1dCIpO2NvbnN0IHM9bmUobi56b25lLEkuZGVmYXVsdFpvbmUpO3JldHVybiBzLmlzVmFsaWQ/bmV3IHAoe3RzOnIsem9uZTpzLGxvYzpULmZyb21PYmplY3Qobil9KTpwLmludmFsaWQoTXQocykpfXN0YXRpYyBmcm9tTWlsbGlzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIGU8LV9zfHxlPl9zP3AuaW52YWxpZCgiVGltZXN0YW1wIG91dCBvZiByYW5nZSIpOm5ldyBwKHt0czplLHpvbmU6bmUobi56b25lLEkuZGVmYXVsdFpvbmUpLGxvYzpULmZyb21PYmplY3Qobil9KTt0aHJvdyBuZXcgXyhgZnJvbU1pbGxpcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dCwgYnV0IHJlY2VpdmVkIGEgJHt0eXBlb2YgZX0gd2l0aCB2YWx1ZSAke2V9YCl9c3RhdGljIGZyb21TZWNvbmRzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIG5ldyBwKHt0czplKjFlMyx6b25lOm5lKG4uem9uZSxJLmRlZmF1bHRab25lKSxsb2M6VC5mcm9tT2JqZWN0KG4pfSk7dGhyb3cgbmV3IF8oImZyb21TZWNvbmRzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0Iil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtlPWV8fHt9O2NvbnN0IHI9bmUobi56b25lLEkuZGVmYXVsdFpvbmUpO2lmKCFyLmlzVmFsaWQpcmV0dXJuIHAuaW52YWxpZChNdChyKSk7Y29uc3Qgcz1ULmZyb21PYmplY3QobiksaT1JdChlLExzKSx7bWluRGF5c0luRmlyc3RXZWVrOmEsc3RhcnRPZldlZWs6b309SnIoaSxzKSx1PUkubm93KCksbD1nKG4uc3BlY2lmaWNPZmZzZXQpP3Iub2Zmc2V0KHUpOm4uc3BlY2lmaWNPZmZzZXQsYz0hZyhpLm9yZGluYWwpLGQ9IWcoaS55ZWFyKSx5PSFnKGkubW9udGgpfHwhZyhpLmRheSksaD1kfHx5LFM9aS53ZWVrWWVhcnx8aS53ZWVrTnVtYmVyO2lmKChofHxjKSYmUyl0aHJvdyBuZXcgU2UoIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHMiKTtpZih5JiZjKXRocm93IG5ldyBTZSgiQ2FuJ3QgbWl4IG9yZGluYWwgZGF0ZXMgd2l0aCBtb250aC9kYXkiKTtjb25zdCBqPVN8fGkud2Vla2RheSYmIWg7bGV0IE0scSxCPUN0KHUsbCk7aj8oTT1TZixxPU9mLEI9T3QoQixhLG8pKTpjPyhNPWJmLHE9VGYsQj1sbihCKSk6KE09JHMscT1Xcyk7bGV0IF9lPSExO2Zvcihjb25zdCBtZSBvZiBNKXtjb25zdCBBdD1pW21lXTtnKEF0KT9fZT9pW21lXT1xW21lXTppW21lXT1CW21lXTpfZT0hMH1jb25zdCBGdD1qP0JsKGksYSxvKTpjP1FsKGkpOkJyKGkpLGI9RnR8fFFyKGkpO2lmKGIpcmV0dXJuIHAuaW52YWxpZChiKTtjb25zdCBGZT1qP1lyKGksYSxvKTpjP0dyKGkpOmksW2JuLEJlXT1EdChGZSxsLHIpLEFlPW5ldyBwKHt0czpibix6b25lOnIsbzpCZSxsb2M6c30pO3JldHVybiBpLndlZWtkYXkmJmgmJmUud2Vla2RheSE9PUFlLndlZWtkYXk/cC5pbnZhbGlkKCJtaXNtYXRjaGVkIHdlZWtkYXkiLGB5b3UgY2FuJ3Qgc3BlY2lmeSBib3RoIGEgd2Vla2RheSBvZiAke2kud2Vla2RheX0gYW5kIGEgZGF0ZSBvZiAke0FlLnRvSVNPKCl9YCk6QWV9c3RhdGljIGZyb21JU08oZSxuPXt9KXtjb25zdFtyLHNdPVBjKGUpO3JldHVybiBHZShyLHMsbiwiSVNPIDg2MDEiLGUpfXN0YXRpYyBmcm9tUkZDMjgyMihlLG49e30pe2NvbnN0W3Isc109amMoZSk7cmV0dXJuIEdlKHIscyxuLCJSRkMgMjgyMiIsZSl9c3RhdGljIGZyb21IVFRQKGUsbj17fSl7Y29uc3RbcixzXT1VYyhlKTtyZXR1cm4gR2UocixzLG4sIkhUVFAiLG4pfXN0YXRpYyBmcm9tRm9ybWF0KGUsbixyPXt9KXtpZihnKGUpfHxnKG4pKXRocm93IG5ldyBfKCJmcm9tRm9ybWF0IHJlcXVpcmVzIGFuIGlucHV0IHN0cmluZyBhbmQgYSBmb3JtYXQiKTtjb25zdHtsb2NhbGU6cz1udWxsLG51bWJlcmluZ1N5c3RlbTppPW51bGx9PXIsYT1ULmZyb21PcHRzKHtsb2NhbGU6cyxudW1iZXJpbmdTeXN0ZW06aSxkZWZhdWx0VG9FTjohMH0pLFtvLHUsbCxjXT12ZihhLGUsbik7cmV0dXJuIGM/cC5pbnZhbGlkKGMpOkdlKG8sdSxyLGBmb3JtYXQgJHtufWAsZSxsKX1zdGF0aWMgZnJvbVN0cmluZyhlLG4scj17fSl7cmV0dXJuIHAuZnJvbUZvcm1hdChlLG4scil9c3RhdGljIGZyb21TUUwoZSxuPXt9KXtjb25zdFtyLHNdPVFjKGUpO3JldHVybiBHZShyLHMsbiwiU1FMIixlKX1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IF8oIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRGF0ZVRpbWUgaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIFo/ZTpuZXcgWihlLG4pO2lmKEkudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IEVsKHIpO3JldHVybiBuZXcgcCh7aW52YWxpZDpyfSl9c3RhdGljIGlzRGF0ZVRpbWUoZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkRhdGVUaW1lfHwhMX1zdGF0aWMgcGFyc2VGb3JtYXRGb3JPcHRzKGUsbj17fSl7Y29uc3Qgcj1EcyhlLFQuZnJvbU9iamVjdChuKSk7cmV0dXJuIHI/ci5tYXAocz0+cz9zLnZhbDpudWxsKS5qb2luKCIiKTpudWxsfXN0YXRpYyBleHBhbmRGb3JtYXQoZSxuPXt9KXtyZXR1cm4gTXMoeC5wYXJzZUZvcm1hdChlKSxULmZyb21PYmplY3QobikpLm1hcChzPT5zLnZhbCkuam9pbigiIil9Z2V0KGUpe3JldHVybiB0aGlzW2VdfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZD09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1nZXQgbG9jYWxlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5sb2NhbGU6bnVsbH1nZXQgbnVtYmVyaW5nU3lzdGVtKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW06bnVsbH1nZXQgb3V0cHV0Q2FsZW5kYXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMubG9jLm91dHB1dENhbGVuZGFyOm51bGx9Z2V0IHpvbmUoKXtyZXR1cm4gdGhpcy5fem9uZX1nZXQgem9uZU5hbWUoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuem9uZS5uYW1lOm51bGx9Z2V0IHllYXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy55ZWFyOk5hTn1nZXQgcXVhcnRlcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/TWF0aC5jZWlsKHRoaXMuYy5tb250aC8zKTpOYU59Z2V0IG1vbnRoKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMubW9udGg6TmFOfWdldCBkYXkoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5kYXk6TmFOfWdldCBob3VyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMuaG91cjpOYU59Z2V0IG1pbnV0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLm1pbnV0ZTpOYU59Z2V0IHNlY29uZCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLnNlY29uZDpOYU59Z2V0IG1pbGxpc2Vjb25kKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMubWlsbGlzZWNvbmQ6TmFOfWdldCB3ZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/T24odGhpcykud2Vla1llYXI6TmFOfWdldCB3ZWVrTnVtYmVyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Pbih0aGlzKS53ZWVrTnVtYmVyOk5hTn1nZXQgd2Vla2RheSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/T24odGhpcykud2Vla2RheTpOYU59Z2V0IGlzV2Vla2VuZCgpe3JldHVybiB0aGlzLmlzVmFsaWQmJnRoaXMubG9jLmdldFdlZWtlbmREYXlzKCkuaW5jbHVkZXModGhpcy53ZWVrZGF5KX1nZXQgbG9jYWxXZWVrZGF5KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Ubih0aGlzKS53ZWVrZGF5Ok5hTn1nZXQgbG9jYWxXZWVrTnVtYmVyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Ubih0aGlzKS53ZWVrTnVtYmVyOk5hTn1nZXQgbG9jYWxXZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/VG4odGhpcykud2Vla1llYXI6TmFOfWdldCBvcmRpbmFsKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9sbih0aGlzLmMpLm9yZGluYWw6TmFOfWdldCBtb250aFNob3J0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OdC5tb250aHMoInNob3J0Iix7bG9jT2JqOnRoaXMubG9jfSlbdGhpcy5tb250aC0xXTpudWxsfWdldCBtb250aExvbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP050Lm1vbnRocygibG9uZyIse2xvY09iajp0aGlzLmxvY30pW3RoaXMubW9udGgtMV06bnVsbH1nZXQgd2Vla2RheVNob3J0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OdC53ZWVrZGF5cygic2hvcnQiLHtsb2NPYmo6dGhpcy5sb2N9KVt0aGlzLndlZWtkYXktMV06bnVsbH1nZXQgd2Vla2RheUxvbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP050LndlZWtkYXlzKCJsb25nIix7bG9jT2JqOnRoaXMubG9jfSlbdGhpcy53ZWVrZGF5LTFdOm51bGx9Z2V0IG9mZnNldCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/K3RoaXMubzpOYU59Z2V0IG9mZnNldE5hbWVTaG9ydCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cyx7Zm9ybWF0OiJzaG9ydCIsbG9jYWxlOnRoaXMubG9jYWxlfSk6bnVsbH1nZXQgb2Zmc2V0TmFtZUxvbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuem9uZS5vZmZzZXROYW1lKHRoaXMudHMse2Zvcm1hdDoibG9uZyIsbG9jYWxlOnRoaXMubG9jYWxlfSk6bnVsbH1nZXQgaXNPZmZzZXRGaXhlZCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLmlzVW5pdmVyc2FsOm51bGx9Z2V0IGlzSW5EU1QoKXtyZXR1cm4gdGhpcy5pc09mZnNldEZpeGVkPyExOnRoaXMub2Zmc2V0PnRoaXMuc2V0KHttb250aDoxLGRheToxfSkub2Zmc2V0fHx0aGlzLm9mZnNldD50aGlzLnNldCh7bW9udGg6NX0pLm9mZnNldH1nZXRQb3NzaWJsZU9mZnNldHMoKXtpZighdGhpcy5pc1ZhbGlkfHx0aGlzLmlzT2Zmc2V0Rml4ZWQpcmV0dXJuW3RoaXNdO2NvbnN0IGU9ODY0ZTUsbj02ZTQscj1idCh0aGlzLmMpLHM9dGhpcy56b25lLm9mZnNldChyLWUpLGk9dGhpcy56b25lLm9mZnNldChyK2UpLGE9dGhpcy56b25lLm9mZnNldChyLXMqbiksbz10aGlzLnpvbmUub2Zmc2V0KHItaSpuKTtpZihhPT09bylyZXR1cm5bdGhpc107Y29uc3QgdT1yLWEqbixsPXItbypuLGM9Q3QodSxhKSxkPUN0KGwsbyk7cmV0dXJuIGMuaG91cj09PWQuaG91ciYmYy5taW51dGU9PT1kLm1pbnV0ZSYmYy5zZWNvbmQ9PT1kLnNlY29uZCYmYy5taWxsaXNlY29uZD09PWQubWlsbGlzZWNvbmQ/W2hlKHRoaXMse3RzOnV9KSxoZSh0aGlzLHt0czpsfSldOlt0aGlzXX1nZXQgaXNJbkxlYXBZZWFyKCl7cmV0dXJuIGplKHRoaXMueWVhcil9Z2V0IGRheXNJbk1vbnRoKCl7cmV0dXJuIFN0KHRoaXMueWVhcix0aGlzLm1vbnRoKX1nZXQgZGF5c0luWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/a2UodGhpcy55ZWFyKTpOYU59Z2V0IHdlZWtzSW5XZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/VWUodGhpcy53ZWVrWWVhcik6TmFOfWdldCB3ZWVrc0luTG9jYWxXZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/VWUodGhpcy5sb2NhbFdlZWtZZWFyLHRoaXMubG9jLmdldE1pbkRheXNJbkZpcnN0V2VlaygpLHRoaXMubG9jLmdldFN0YXJ0T2ZXZWVrKCkpOk5hTn1yZXNvbHZlZExvY2FsZU9wdGlvbnMoZT17fSl7Y29uc3R7bG9jYWxlOm4sbnVtYmVyaW5nU3lzdGVtOnIsY2FsZW5kYXI6c309eC5jcmVhdGUodGhpcy5sb2MuY2xvbmUoZSksZSkucmVzb2x2ZWRPcHRpb25zKHRoaXMpO3JldHVybntsb2NhbGU6bixudW1iZXJpbmdTeXN0ZW06cixvdXRwdXRDYWxlbmRhcjpzfX10b1VUQyhlPTAsbj17fSl7cmV0dXJuIHRoaXMuc2V0Wm9uZShELmluc3RhbmNlKGUpLG4pfXRvTG9jYWwoKXtyZXR1cm4gdGhpcy5zZXRab25lKEkuZGVmYXVsdFpvbmUpfXNldFpvbmUoZSx7a2VlcExvY2FsVGltZTpuPSExLGtlZXBDYWxlbmRhclRpbWU6cj0hMX09e30pe2lmKGU9bmUoZSxJLmRlZmF1bHRab25lKSxlLmVxdWFscyh0aGlzLnpvbmUpKXJldHVybiB0aGlzO2lmKGUuaXNWYWxpZCl7bGV0IHM9dGhpcy50cztpZihufHxyKXtjb25zdCBpPWUub2Zmc2V0KHRoaXMudHMpLGE9dGhpcy50b09iamVjdCgpO1tzXT1EdChhLGksZSl9cmV0dXJuIGhlKHRoaXMse3RzOnMsem9uZTplfSl9ZWxzZSByZXR1cm4gcC5pbnZhbGlkKE10KGUpKX1yZWNvbmZpZ3VyZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sb3V0cHV0Q2FsZW5kYXI6cn09e30pe2NvbnN0IHM9dGhpcy5sb2MuY2xvbmUoe2xvY2FsZTplLG51bWJlcmluZ1N5c3RlbTpuLG91dHB1dENhbGVuZGFyOnJ9KTtyZXR1cm4gaGUodGhpcyx7bG9jOnN9KX1zZXRMb2NhbGUoZSl7cmV0dXJuIHRoaXMucmVjb25maWd1cmUoe2xvY2FsZTplfSl9c2V0KGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1JdChlLExzKSx7bWluRGF5c0luRmlyc3RXZWVrOnIsc3RhcnRPZldlZWs6c309SnIobix0aGlzLmxvYyksaT0hZyhuLndlZWtZZWFyKXx8IWcobi53ZWVrTnVtYmVyKXx8IWcobi53ZWVrZGF5KSxhPSFnKG4ub3JkaW5hbCksbz0hZyhuLnllYXIpLHU9IWcobi5tb250aCl8fCFnKG4uZGF5KSxsPW98fHUsYz1uLndlZWtZZWFyfHxuLndlZWtOdW1iZXI7aWYoKGx8fGEpJiZjKXRocm93IG5ldyBTZSgiQ2FuJ3QgbWl4IHdlZWtZZWFyL3dlZWtOdW1iZXIgdW5pdHMgd2l0aCB5ZWFyL21vbnRoL2RheSBvciBvcmRpbmFscyIpO2lmKHUmJmEpdGhyb3cgbmV3IFNlKCJDYW4ndCBtaXggb3JkaW5hbCBkYXRlcyB3aXRoIG1vbnRoL2RheSIpO2xldCBkO2k/ZD1Zcih7Li4uT3QodGhpcy5jLHIscyksLi4ubn0scixzKTpnKG4ub3JkaW5hbCk/KGQ9ey4uLnRoaXMudG9PYmplY3QoKSwuLi5ufSxnKG4uZGF5KSYmKGQuZGF5PU1hdGgubWluKFN0KGQueWVhcixkLm1vbnRoKSxkLmRheSkpKTpkPUdyKHsuLi5sbih0aGlzLmMpLC4uLm59KTtjb25zdFt5LGhdPUR0KGQsdGhpcy5vLHRoaXMuem9uZSk7cmV0dXJuIGhlKHRoaXMse3RzOnksbzpofSl9cGx1cyhlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49di5mcm9tRHVyYXRpb25MaWtlKGUpO3JldHVybiBoZSh0aGlzLEFzKHRoaXMsbikpfW1pbnVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj12LmZyb21EdXJhdGlvbkxpa2UoZSkubmVnYXRlKCk7cmV0dXJuIGhlKHRoaXMsQXModGhpcyxuKSl9c3RhcnRPZihlLHt1c2VMb2NhbGVXZWVrczpuPSExfT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCByPXt9LHM9di5ub3JtYWxpemVVbml0KGUpO3N3aXRjaChzKXtjYXNlInllYXJzIjpyLm1vbnRoPTE7Y2FzZSJxdWFydGVycyI6Y2FzZSJtb250aHMiOnIuZGF5PTE7Y2FzZSJ3ZWVrcyI6Y2FzZSJkYXlzIjpyLmhvdXI9MDtjYXNlImhvdXJzIjpyLm1pbnV0ZT0wO2Nhc2UibWludXRlcyI6ci5zZWNvbmQ9MDtjYXNlInNlY29uZHMiOnIubWlsbGlzZWNvbmQ9MDticmVha31pZihzPT09IndlZWtzIilpZihuKXtjb25zdCBpPXRoaXMubG9jLmdldFN0YXJ0T2ZXZWVrKCkse3dlZWtkYXk6YX09dGhpczthPGkmJihyLndlZWtOdW1iZXI9dGhpcy53ZWVrTnVtYmVyLTEpLHIud2Vla2RheT1pfWVsc2Ugci53ZWVrZGF5PTE7aWYocz09PSJxdWFydGVycyIpe2NvbnN0IGk9TWF0aC5jZWlsKHRoaXMubW9udGgvMyk7ci5tb250aD0oaS0xKSozKzF9cmV0dXJuIHRoaXMuc2V0KHIpfWVuZE9mKGUsbil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnBsdXMoe1tlXToxfSkuc3RhcnRPZihlLG4pLm1pbnVzKDEpOnRoaXN9dG9Gb3JtYXQoZSxuPXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3guY3JlYXRlKHRoaXMubG9jLnJlZGVmYXVsdFRvRU4obikpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLGUpOnZufXRvTG9jYWxlU3RyaW5nKGU9eXQsbj17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD94LmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShuKSxlKS5mb3JtYXREYXRlVGltZSh0aGlzKTp2bn10b0xvY2FsZVBhcnRzKGU9e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/eC5jcmVhdGUodGhpcy5sb2MuY2xvbmUoZSksZSkuZm9ybWF0RGF0ZVRpbWVQYXJ0cyh0aGlzKTpbXX10b0lTTyh7Zm9ybWF0OmU9ImV4dGVuZGVkIixzdXBwcmVzc1NlY29uZHM6bj0hMSxzdXBwcmVzc01pbGxpc2Vjb25kczpyPSExLGluY2x1ZGVPZmZzZXQ6cz0hMCxleHRlbmRlZFpvbmU6aT0hMX09e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3QgYT1lPT09ImV4dGVuZGVkIjtsZXQgbz1Tbih0aGlzLGEpO3JldHVybiBvKz0iVCIsbys9VnModGhpcyxhLG4scixzLGkpLG99dG9JU09EYXRlKHtmb3JtYXQ6ZT0iZXh0ZW5kZWQifT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Tbih0aGlzLGU9PT0iZXh0ZW5kZWQiKTpudWxsfXRvSVNPV2Vla0RhdGUoKXtyZXR1cm4gX3QodGhpcywia2tray0nVydXVy1jIil9dG9JU09UaW1lKHtzdXBwcmVzc01pbGxpc2Vjb25kczplPSExLHN1cHByZXNzU2Vjb25kczpuPSExLGluY2x1ZGVPZmZzZXQ6cj0hMCxpbmNsdWRlUHJlZml4OnM9ITEsZXh0ZW5kZWRab25lOmk9ITEsZm9ybWF0OmE9ImV4dGVuZGVkIn09e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/KHM/IlQiOiIiKStWcyh0aGlzLGE9PT0iZXh0ZW5kZWQiLG4sZSxyLGkpOm51bGx9dG9SRkMyODIyKCl7cmV0dXJuIF90KHRoaXMsIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgWlpaIiwhMSl9dG9IVFRQKCl7cmV0dXJuIF90KHRoaXMudG9VVEMoKSwiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyAnR01UJyIpfXRvU1FMRGF0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/U24odGhpcywhMCk6bnVsbH10b1NRTFRpbWUoe2luY2x1ZGVPZmZzZXQ6ZT0hMCxpbmNsdWRlWm9uZTpuPSExLGluY2x1ZGVPZmZzZXRTcGFjZTpyPSEwfT17fSl7bGV0IHM9IkhIOm1tOnNzLlNTUyI7cmV0dXJuKG58fGUpJiYociYmKHMrPSIgIiksbj9zKz0ieiI6ZSYmKHMrPSJaWiIpKSxfdCh0aGlzLHMsITApfXRvU1FMKGU9e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy50b1NRTERhdGUoKX0gJHt0aGlzLnRvU1FMVGltZShlKX1gOm51bGx9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudG9JU08oKTp2bn1bU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV0oKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2BEYXRlVGltZSB7IHRzOiAke3RoaXMudG9JU08oKX0sIHpvbmU6ICR7dGhpcy56b25lLm5hbWV9LCBsb2NhbGU6ICR7dGhpcy5sb2NhbGV9IH1gOmBEYXRlVGltZSB7IEludmFsaWQsIHJlYXNvbjogJHt0aGlzLmludmFsaWRSZWFzb259IH1gfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy50b01pbGxpcygpfXRvTWlsbGlzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnRzOk5hTn10b1NlY29uZHMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudHMvMWUzOk5hTn10b1VuaXhJbnRlZ2VyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9NYXRoLmZsb29yKHRoaXMudHMvMWUzKTpOYU59dG9KU09OKCl7cmV0dXJuIHRoaXMudG9JU08oKX10b0JTT04oKXtyZXR1cm4gdGhpcy50b0pTRGF0ZSgpfXRvT2JqZWN0KGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJue307Y29uc3Qgbj17Li4udGhpcy5jfTtyZXR1cm4gZS5pbmNsdWRlQ29uZmlnJiYobi5vdXRwdXRDYWxlbmRhcj10aGlzLm91dHB1dENhbGVuZGFyLG4ubnVtYmVyaW5nU3lzdGVtPXRoaXMubG9jLm51bWJlcmluZ1N5c3RlbSxuLmxvY2FsZT10aGlzLmxvYy5sb2NhbGUpLG59dG9KU0RhdGUoKXtyZXR1cm4gbmV3IERhdGUodGhpcy5pc1ZhbGlkP3RoaXMudHM6TmFOKX1kaWZmKGUsbj0ibWlsbGlzZWNvbmRzIixyPXt9KXtpZighdGhpcy5pc1ZhbGlkfHwhZS5pc1ZhbGlkKXJldHVybiB2LmludmFsaWQoImNyZWF0ZWQgYnkgZGlmZmluZyBhbiBpbnZhbGlkIERhdGVUaW1lIik7Y29uc3Qgcz17bG9jYWxlOnRoaXMubG9jYWxlLG51bWJlcmluZ1N5c3RlbTp0aGlzLm51bWJlcmluZ1N5c3RlbSwuLi5yfSxpPWVjKG4pLm1hcCh2Lm5vcm1hbGl6ZVVuaXQpLGE9ZS52YWx1ZU9mKCk+dGhpcy52YWx1ZU9mKCksbz1hP3RoaXM6ZSx1PWE/ZTp0aGlzLGw9c2Yobyx1LGkscyk7cmV0dXJuIGE/bC5uZWdhdGUoKTpsfWRpZmZOb3coZT0ibWlsbGlzZWNvbmRzIixuPXt9KXtyZXR1cm4gdGhpcy5kaWZmKHAubm93KCksZSxuKX11bnRpbChlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2suZnJvbURhdGVUaW1lcyh0aGlzLGUpOnRoaXN9aGFzU2FtZShlLG4scil7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4hMTtjb25zdCBzPWUudmFsdWVPZigpLGk9dGhpcy5zZXRab25lKGUuem9uZSx7a2VlcExvY2FsVGltZTohMH0pO3JldHVybiBpLnN0YXJ0T2YobixyKTw9cyYmczw9aS5lbmRPZihuLHIpfWVxdWFscyhlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkJiZlLmlzVmFsaWQmJnRoaXMudmFsdWVPZigpPT09ZS52YWx1ZU9mKCkmJnRoaXMuem9uZS5lcXVhbHMoZS56b25lKSYmdGhpcy5sb2MuZXF1YWxzKGUubG9jKX10b1JlbGF0aXZlKGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3Qgbj1lLmJhc2V8fHAuZnJvbU9iamVjdCh7fSx7em9uZTp0aGlzLnpvbmV9KSxyPWUucGFkZGluZz90aGlzPG4/LWUucGFkZGluZzplLnBhZGRpbmc6MDtsZXQgcz1bInllYXJzIiwibW9udGhzIiwiZGF5cyIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiXSxpPWUudW5pdDtyZXR1cm4gQXJyYXkuaXNBcnJheShlLnVuaXQpJiYocz1lLnVuaXQsaT12b2lkIDApLFpzKG4sdGhpcy5wbHVzKHIpLHsuLi5lLG51bWVyaWM6ImFsd2F5cyIsdW5pdHM6cyx1bml0Oml9KX10b1JlbGF0aXZlQ2FsZW5kYXIoZT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9acyhlLmJhc2V8fHAuZnJvbU9iamVjdCh7fSx7em9uZTp0aGlzLnpvbmV9KSx0aGlzLHsuLi5lLG51bWVyaWM6ImF1dG8iLHVuaXRzOlsieWVhcnMiLCJtb250aHMiLCJkYXlzIl0sY2FsZW5kYXJ5OiEwfSk6bnVsbH1zdGF0aWMgbWluKC4uLmUpe2lmKCFlLmV2ZXJ5KHAuaXNEYXRlVGltZSkpdGhyb3cgbmV3IF8oIm1pbiByZXF1aXJlcyBhbGwgYXJndW1lbnRzIGJlIERhdGVUaW1lcyIpO3JldHVybiBlcyhlLG49Pm4udmFsdWVPZigpLE1hdGgubWluKX1zdGF0aWMgbWF4KC4uLmUpe2lmKCFlLmV2ZXJ5KHAuaXNEYXRlVGltZSkpdGhyb3cgbmV3IF8oIm1heCByZXF1aXJlcyBhbGwgYXJndW1lbnRzIGJlIERhdGVUaW1lcyIpO3JldHVybiBlcyhlLG49Pm4udmFsdWVPZigpLE1hdGgubWF4KX1zdGF0aWMgZnJvbUZvcm1hdEV4cGxhaW4oZSxuLHI9e30pe2NvbnN0e2xvY2FsZTpzPW51bGwsbnVtYmVyaW5nU3lzdGVtOmk9bnVsbH09cixhPVQuZnJvbU9wdHMoe2xvY2FsZTpzLG51bWJlcmluZ1N5c3RlbTppLGRlZmF1bHRUb0VOOiEwfSk7cmV0dXJuIENzKGEsZSxuKX1zdGF0aWMgZnJvbVN0cmluZ0V4cGxhaW4oZSxuLHI9e30pe3JldHVybiBwLmZyb21Gb3JtYXRFeHBsYWluKGUsbixyKX1zdGF0aWMgZ2V0IERBVEVfU0hPUlQoKXtyZXR1cm4geXR9c3RhdGljIGdldCBEQVRFX01FRCgpe3JldHVybiBtcn1zdGF0aWMgZ2V0IERBVEVfTUVEX1dJVEhfV0VFS0RBWSgpe3JldHVybiBNbH1zdGF0aWMgZ2V0IERBVEVfRlVMTCgpe3JldHVybiB5cn1zdGF0aWMgZ2V0IERBVEVfSFVHRSgpe3JldHVybiBncn1zdGF0aWMgZ2V0IFRJTUVfU0lNUExFKCl7cmV0dXJuIHByfXN0YXRpYyBnZXQgVElNRV9XSVRIX1NFQ09ORFMoKXtyZXR1cm4gd3J9c3RhdGljIGdldCBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKCl7cmV0dXJuIHZyfXN0YXRpYyBnZXQgVElNRV9XSVRIX0xPTkdfT0ZGU0VUKCl7cmV0dXJuIE9yfXN0YXRpYyBnZXQgVElNRV8yNF9TSU1QTEUoKXtyZXR1cm4gVHJ9c3RhdGljIGdldCBUSU1FXzI0X1dJVEhfU0VDT05EUygpe3JldHVybiBTcn1zdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQoKXtyZXR1cm4gYnJ9c3RhdGljIGdldCBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQoKXtyZXR1cm4ga3J9c3RhdGljIGdldCBEQVRFVElNRV9TSE9SVCgpe3JldHVybiBJcn1zdGF0aWMgZ2V0IERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUygpe3JldHVybiBFcn1zdGF0aWMgZ2V0IERBVEVUSU1FX01FRCgpe3JldHVybiBOcn1zdGF0aWMgZ2V0IERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMoKXtyZXR1cm4geHJ9c3RhdGljIGdldCBEQVRFVElNRV9NRURfV0lUSF9XRUVLREFZKCl7cmV0dXJuIENsfXN0YXRpYyBnZXQgREFURVRJTUVfRlVMTCgpe3JldHVybiBNcn1zdGF0aWMgZ2V0IERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIENyfXN0YXRpYyBnZXQgREFURVRJTUVfSFVHRSgpe3JldHVybiBEcn1zdGF0aWMgZ2V0IERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIF9yfX1mdW5jdGlvbiBKZSh0KXtpZihwLmlzRGF0ZVRpbWUodCkpcmV0dXJuIHQ7aWYodCYmdC52YWx1ZU9mJiZjZSh0LnZhbHVlT2YoKSkpcmV0dXJuIHAuZnJvbUpTRGF0ZSh0KTtpZih0JiZ0eXBlb2YgdD09Im9iamVjdCIpcmV0dXJuIHAuZnJvbU9iamVjdCh0KTt0aHJvdyBuZXcgXyhgVW5rbm93biBkYXRldGltZSBhcmd1bWVudDogJHt0fSwgb2YgdHlwZSAke3R5cGVvZiB0fWApfWZ1bmN0aW9uIElmKHtjb2xsZWN0aW9uczp0LGx3dzplfSx7dGFibGVJZHM6bix0YWJsZUNvbHVtbklkczpyLHJlbGF0aW9uc2hpcElkczpzLGluZGV4SWRzOmksaW5kZXhDb2x1bW5JZHM6YSxtZW1vSWRzOm99KXtWKHQpLmNvbGxlY3Rpb24oInRhYmxlRW50aXRpZXMiKS5yZW1vdmVNYW55KG4pLFYodCkuY29sbGVjdGlvbigidGFibGVDb2x1bW5FbnRpdGllcyIpLnJlbW92ZU1hbnkociksVih0KS5jb2xsZWN0aW9uKCJyZWxhdGlvbnNoaXBFbnRpdGllcyIpLnJlbW92ZU1hbnkocyksVih0KS5jb2xsZWN0aW9uKCJpbmRleEVudGl0aWVzIikucmVtb3ZlTWFueShpKSxWKHQpLmNvbGxlY3Rpb24oImluZGV4Q29sdW1uRW50aXRpZXMiKS5yZW1vdmVNYW55KGEpLFYodCkuY29sbGVjdGlvbigibWVtb0VudGl0aWVzIikucmVtb3ZlTWFueShvKSxbLi4ubiwuLi5yLC4uLnMsLi4uaSwuLi5hLC4uLm9dLmZvckVhY2godT0+UmVmbGVjdC5kZWxldGVQcm9wZXJ0eShlLHUpKX1jb25zdCBFZj0zMCxOZj1DKFsidGFibGVFbnRpdGllcyIsInRhYmxlQ29sdW1uRW50aXRpZXMiLCJyZWxhdGlvbnNoaXBFbnRpdGllcyIsImluZGV4RW50aXRpZXMiLCJpbmRleENvbHVtbkVudGl0aWVzIiwibWVtb0VudGl0aWVzIl0pO2NsYXNzIHhme2FzeW5jIHJ1bihlKXtjb25zdCBuPUpTT04ucGFyc2UoZSkscj1KbyhuKSx7ZG9jOnt0YWJsZUlkczpzLG1lbW9JZHM6aSxpbmRleElkczphLHJlbGF0aW9uc2hpcElkczpvfSxjb2xsZWN0aW9uczp1LGx3dzpsfT1yLGM9QyhzKSxkPUMoaSkseT1DKGEpLGg9QyhvKSxTPU1mKHAubm93KCkpLGo9Vih1KS5jb2xsZWN0aW9uKCJ0YWJsZUVudGl0aWVzIiksTT1WKHUpLmNvbGxlY3Rpb24oInRhYmxlQ29sdW1uRW50aXRpZXMiKSxxPVYodSkuY29sbGVjdGlvbigiaW5kZXhFbnRpdGllcyIpLEI9Vih1KS5jb2xsZWN0aW9uKCJpbmRleENvbHVtbkVudGl0aWVzIiksX2U9Vih1KS5jb2xsZWN0aW9uKCJyZWxhdGlvbnNoaXBFbnRpdGllcyIpLEZ0PVYodSkuY29sbGVjdGlvbigibWVtb0VudGl0aWVzIiksYj17dGFibGVJZHM6Wy4uLmouc2VsZWN0QWxsKCkuZmlsdGVyKFMoYykpLm1hcCgoe2lkOm19KT0+bSldLHRhYmxlQ29sdW1uSWRzOltdLHJlbGF0aW9uc2hpcElkczpbLi4uX2Uuc2VsZWN0QWxsKCkuZmlsdGVyKFMoaCkpLm1hcCgoe2lkOm19KT0+bSldLGluZGV4SWRzOlsuLi5xLnNlbGVjdEFsbCgpLmZpbHRlcihTKHkpKS5tYXAoKHtpZDptfSk9Pm0pXSxpbmRleENvbHVtbklkczpbXSxtZW1vSWRzOlsuLi5GdC5zZWxlY3RBbGwoKS5maWx0ZXIoUyhkKSkubWFwKCh7aWQ6bX0pPT5tKV19LEZlPUMoYi50YWJsZUlkcyksYm49QyhiLnJlbGF0aW9uc2hpcElkcyk7bGV0IEJlPUMoYi5pbmRleElkcyk7Yi50YWJsZUNvbHVtbklkcy5wdXNoKC4uLk0uc2VsZWN0QWxsKCkuZmlsdGVyKCh7dGFibGVJZDptfSk9PkZlKG0pKS5tYXAoKHtpZDptfSk9Pm0pKSxiLnJlbGF0aW9uc2hpcElkcy5wdXNoKC4uLl9lLnNlbGVjdEFsbCgpLmZpbHRlcigoe2lkOm0sc3RhcnQ6WSxlbmQ6UWV9KT0+IWJuKG0pJiYoRmUoWS50YWJsZUlkKXx8RmUoUWUudGFibGVJZCkpKS5tYXAoKHtpZDptfSk9Pm0pKSxiLmluZGV4SWRzLnB1c2goLi4ucS5zZWxlY3RBbGwoKS5maWx0ZXIoKHtpZDptLHRhYmxlSWQ6WX0pPT4hQmUobSkmJkZlKFkpKS5tYXAoKHtpZDptfSk9Pm0pKSxCZT1DKGIuaW5kZXhJZHMpLGIuaW5kZXhDb2x1bW5JZHMucHVzaCguLi5CLnNlbGVjdEFsbCgpLmZpbHRlcigoe2luZGV4SWQ6bX0pPT5CZShtKSkubWFwKCh7aWQ6bX0pPT5tKSksSWYocixiKTtjb25zdCBBZT1DKGouc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksbWU9QyhNLnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpLEF0PUMocS5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxEZj1DKEIuc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksX2Y9QyhfZS5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxGZj1DKEZ0LnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpO3JldHVybiBiLnRhYmxlQ29sdW1uSWRzLnB1c2goLi4uTS5zZWxlY3RBbGwoKS5maWx0ZXIoKHt0YWJsZUlkOm0saWQ6WSxtZXRhOlFlfSk9PiFBZShtKSYmUygoKT0+ITEpKHtpZDpZLG1ldGE6UWV9KSkubWFwKCh7aWQ6bX0pPT5tKSksYi5pbmRleENvbHVtbklkcy5wdXNoKC4uLkIuc2VsZWN0QWxsKCkuZmlsdGVyKCh7aW5kZXhJZDptLGlkOlksbWV0YTpRZX0pPT4hQXQobSkmJlMoKCk9PiExKSh7aWQ6WSxtZXRhOlFlfSkpLm1hcCgoe2lkOm19KT0+bSkpLE9iamVjdC5lbnRyaWVzKGwpLmZvckVhY2goKFttLFtZXV0pPT57aWYoTmYoWSkpc3dpdGNoKFkpe2Nhc2UidGFibGVFbnRpdGllcyI6IUFlKG0pJiZiLnRhYmxlSWRzLnB1c2gobSk7YnJlYWs7Y2FzZSJ0YWJsZUNvbHVtbkVudGl0aWVzIjohbWUobSkmJmIudGFibGVDb2x1bW5JZHMucHVzaChtKTticmVhaztjYXNlInJlbGF0aW9uc2hpcEVudGl0aWVzIjohX2YobSkmJmIucmVsYXRpb25zaGlwSWRzLnB1c2gobSk7YnJlYWs7Y2FzZSJpbmRleEVudGl0aWVzIjohQXQobSkmJmIuaW5kZXhJZHMucHVzaChtKTticmVhaztjYXNlImluZGV4Q29sdW1uRW50aXRpZXMiOiFEZihtKSYmYi5pbmRleENvbHVtbklkcy5wdXNoKG0pO2JyZWFrO2Nhc2UibWVtb0VudGl0aWVzIjohRmYobSkmJmIubWVtb0lkcy5wdXNoKG0pO2JyZWFrfX0pLHt0YWJsZUlkczpUZShiLnRhYmxlSWRzKSx0YWJsZUNvbHVtbklkczpUZShiLnRhYmxlQ29sdW1uSWRzKSxyZWxhdGlvbnNoaXBJZHM6VGUoYi5yZWxhdGlvbnNoaXBJZHMpLGluZGV4SWRzOlRlKGIuaW5kZXhJZHMpLGluZGV4Q29sdW1uSWRzOlRlKGIuaW5kZXhDb2x1bW5JZHMpLG1lbW9JZHM6VGUoYi5tZW1vSWRzKX19fWNvbnN0IE1mPXQ9PmU9Pih7aWQ6bixtZXRhOnJ9KT0+e2lmKGUobikpcmV0dXJuITE7Y29uc3Qgcz1NYXRoLmZsb29yKHQuZGlmZihwLmZyb21NaWxsaXMoci51cGRhdGVBdCksImRheXMiKS50b09iamVjdCgpLmRheXM/PzApO3JldHVybiBFZjxzfSxDZj1uZXcgeGY7c2VsZi5vbmNvbm5lY3Q9dD0+e2NvbnN0IGU9dC5wb3J0c1swXTtXdChDZixlKX19KSgpOwo=";function zoe(e){return new SharedWorker("data:application/javascript;base64,"+Moe,{name:e==null?void 0:e.name})}const ik="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiOy8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiAqL2NvbnN0IGtuPVN5bWJvbCgiQ29tbGluay5wcm94eSIpLFBzPVN5bWJvbCgiQ29tbGluay5lbmRwb2ludCIpLGpzPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxWdD1TeW1ib2woIkNvbWxpbmsuZmluYWxpemVyIiksS2U9U3ltYm9sKCJDb21saW5rLnRocm93biIpLEluPXQ9PnR5cGVvZiB0PT0ib2JqZWN0IiYmdCE9PW51bGx8fHR5cGVvZiB0PT0iZnVuY3Rpb24iLFVzPXtjYW5IYW5kbGU6dD0+SW4odCkmJnRba25dLHNlcmlhbGl6ZSh0KXtjb25zdHtwb3J0MTplLHBvcnQyOm59PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gV3QodCxlKSxbbixbbl1dfSxkZXNlcmlhbGl6ZSh0KXtyZXR1cm4gdC5zdGFydCgpLEdzKHQpfX0sSHM9e2NhbkhhbmRsZTp0PT5Jbih0KSYmS2UgaW4gdCxzZXJpYWxpemUoe3ZhbHVlOnR9KXtsZXQgZTtyZXR1cm4gdCBpbnN0YW5jZW9mIEVycm9yP2U9e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2t9fTplPXtpc0Vycm9yOiExLHZhbHVlOnR9LFtlLFtdXX0sZGVzZXJpYWxpemUodCl7dGhyb3cgdC5pc0Vycm9yP09iamVjdC5hc3NpZ24obmV3IEVycm9yKHQudmFsdWUubWVzc2FnZSksdC52YWx1ZSk6dC52YWx1ZX19LEVuPW5ldyBNYXAoW1sicHJveHkiLFVzXSxbInRocm93IixIc11dKTtmdW5jdGlvbiBxcyh0LGUpe2Zvcihjb25zdCBuIG9mIHQpaWYoZT09PW58fG49PT0iKiJ8fG4gaW5zdGFuY2VvZiBSZWdFeHAmJm4udGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBXdCh0LGU9Z2xvYmFsVGhpcyxuPVsiKiJdKXtlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIHIocyl7aWYoIXN8fCFzLmRhdGEpcmV0dXJuO2lmKCFxcyhuLHMub3JpZ2luKSl7Y29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtzLm9yaWdpbn0nIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWNvbnN0e2lkOmksdHlwZTphLHBhdGg6b309T2JqZWN0LmFzc2lnbih7cGF0aDpbXX0scy5kYXRhKSx1PShzLmRhdGEuYXJndW1lbnRMaXN0fHxbXSkubWFwKGllKTtsZXQgbDt0cnl7Y29uc3QgYz1vLnNsaWNlKDAsLTEpLnJlZHVjZSgoeSxoKT0+eVtoXSx0KSxkPW8ucmVkdWNlKCh5LGgpPT55W2hdLHQpO3N3aXRjaChhKXtjYXNlIkdFVCI6bD1kO2JyZWFrO2Nhc2UiU0VUIjpjW28uc2xpY2UoLTEpWzBdXT1pZShzLmRhdGEudmFsdWUpLGw9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6bD1kLmFwcGx5KGMsdSk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntjb25zdCB5PW5ldyBkKC4uLnUpO2w9WHMoeSl9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2NvbnN0e3BvcnQxOnkscG9ydDI6aH09bmV3IE1lc3NhZ2VDaGFubmVsO1d0KHQsaCksbD1Lcyh5LFt5XSl9YnJlYWs7Y2FzZSJSRUxFQVNFIjpsPXZvaWQgMDticmVhaztkZWZhdWx0OnJldHVybn19Y2F0Y2goYyl7bD17dmFsdWU6YyxbS2VdOjB9fVByb21pc2UucmVzb2x2ZShsKS5jYXRjaChjPT4oe3ZhbHVlOmMsW0tlXTowfSkpLnRoZW4oYz0+e2NvbnN0W2QseV09bnQoYyk7ZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCkse2lkOml9KSx5KSxhPT09IlJFTEVBU0UiJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyKSxObihlKSxWdCBpbiB0JiZ0eXBlb2YgdFtWdF09PSJmdW5jdGlvbiImJnRbVnRdKCkpfSkuY2F0Y2goYz0+e2NvbnN0W2QseV09bnQoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFtLZV06MH0pO2UucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLHtpZDppfSkseSl9KX0pLGUuc3RhcnQmJmUuc3RhcnQoKX1mdW5jdGlvbiBZcyh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBObih0KXtZcyh0KSYmdC5jbG9zZSgpfWZ1bmN0aW9uIEdzKHQsZSl7cmV0dXJuICR0KHQsW10sZSl9ZnVuY3Rpb24gWGUodCl7aWYodCl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIHhuKHQpe3JldHVybiB5ZSh0LHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9PntObih0KX0pfWNvbnN0IGV0PW5ldyBXZWFrTWFwLHR0PSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkodD0+e2NvbnN0IGU9KGV0LmdldCh0KXx8MCktMTtldC5zZXQodCxlKSxlPT09MCYmeG4odCl9KTtmdW5jdGlvbiBKcyh0LGUpe2NvbnN0IG49KGV0LmdldChlKXx8MCkrMTtldC5zZXQoZSxuKSx0dCYmdHQucmVnaXN0ZXIodCxlLHQpfWZ1bmN0aW9uIEJzKHQpe3R0JiZ0dC51bnJlZ2lzdGVyKHQpfWZ1bmN0aW9uICR0KHQsZT1bXSxuPWZ1bmN0aW9uKCl7fSl7bGV0IHI9ITE7Y29uc3Qgcz1uZXcgUHJveHkobix7Z2V0KGksYSl7aWYoWGUociksYT09PWpzKXJldHVybigpPT57QnMocykseG4odCkscj0hMH07aWYoYT09PSJ0aGVuIil7aWYoZS5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5zfTtjb25zdCBvPXllKHQse3R5cGU6IkdFVCIscGF0aDplLm1hcCh1PT51LnRvU3RyaW5nKCkpfSkudGhlbihpZSk7cmV0dXJuIG8udGhlbi5iaW5kKG8pfXJldHVybiAkdCh0LFsuLi5lLGFdKX0sc2V0KGksYSxvKXtYZShyKTtjb25zdFt1LGxdPW50KG8pO3JldHVybiB5ZSh0LHt0eXBlOiJTRVQiLHBhdGg6Wy4uLmUsYV0ubWFwKGM9PmMudG9TdHJpbmcoKSksdmFsdWU6dX0sbCkudGhlbihpZSl9LGFwcGx5KGksYSxvKXtYZShyKTtjb25zdCB1PWVbZS5sZW5ndGgtMV07aWYodT09PVBzKXJldHVybiB5ZSh0LHt0eXBlOiJFTkRQT0lOVCJ9KS50aGVuKGllKTtpZih1PT09ImJpbmQiKXJldHVybiAkdCh0LGUuc2xpY2UoMCwtMSkpO2NvbnN0W2wsY109TW4obyk7cmV0dXJuIHllKHQse3R5cGU6IkFQUExZIixwYXRoOmUubWFwKGQ9PmQudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0Omx9LGMpLnRoZW4oaWUpfSxjb25zdHJ1Y3QoaSxhKXtYZShyKTtjb25zdFtvLHVdPU1uKGEpO3JldHVybiB5ZSh0LHt0eXBlOiJDT05TVFJVQ1QiLHBhdGg6ZS5tYXAobD0+bC50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6b30sdSkudGhlbihpZSl9fSk7cmV0dXJuIEpzKHMsdCksc31mdW5jdGlvbiBRcyh0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSx0KX1mdW5jdGlvbiBNbih0KXtjb25zdCBlPXQubWFwKG50KTtyZXR1cm5bZS5tYXAobj0+blswXSksUXMoZS5tYXAobj0+blsxXSkpXX1jb25zdCBDbj1uZXcgV2Vha01hcDtmdW5jdGlvbiBLcyh0LGUpe3JldHVybiBDbi5zZXQodCxlKSx0fWZ1bmN0aW9uIFhzKHQpe3JldHVybiBPYmplY3QuYXNzaWduKHQse1trbl06ITB9KX1mdW5jdGlvbiBudCh0KXtmb3IoY29uc3RbZSxuXW9mIEVuKWlmKG4uY2FuSGFuZGxlKHQpKXtjb25zdFtyLHNdPW4uc2VyaWFsaXplKHQpO3JldHVyblt7dHlwZToiSEFORExFUiIsbmFtZTplLHZhbHVlOnJ9LHNdfXJldHVyblt7dHlwZToiUkFXIix2YWx1ZTp0fSxDbi5nZXQodCl8fFtdXX1mdW5jdGlvbiBpZSh0KXtzd2l0Y2godC50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiBFbi5nZXQodC5uYW1lKS5kZXNlcmlhbGl6ZSh0LnZhbHVlKTtjYXNlIlJBVyI6cmV0dXJuIHQudmFsdWV9fWZ1bmN0aW9uIHllKHQsZSxuKXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2NvbnN0IHM9ZWkoKTt0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGkoYSl7IWEuZGF0YXx8IWEuZGF0YS5pZHx8YS5kYXRhLmlkIT09c3x8KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsaSkscihhLmRhdGEpKX0pLHQuc3RhcnQmJnQuc3RhcnQoKSx0LnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkOnN9LGUpLG4pfSl9ZnVuY3Rpb24gZWkoKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfS8qIQogKiBAZGluZXVnL2VyZC1lZGl0b3Itc2NoZW1hCiAqIEB2ZXJzaW9uIDAuMS4wIHwgU2F0IERlYyAyMyAyMDIzCiAqIEBhdXRob3IgU2V1bmdId2FuLUxlZSA8ZGluZXVnMkBnbWFpbC5jb20+CiAqIEBsaWNlbnNlIE1JVAogKi92YXIgdGk9dHlwZW9mIGdsb2JhbD09Im9iamVjdCImJmdsb2JhbCYmZ2xvYmFsLk9iamVjdD09PU9iamVjdCYmZ2xvYmFsO2NvbnN0IG5pPXRpO3ZhciByaT10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLHNpPW5pfHxyaXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTtjb25zdCBMdD1zaTt2YXIgaWk9THQuU3ltYm9sO2NvbnN0IFE9aWk7dmFyIERuPU9iamVjdC5wcm90b3R5cGUsYWk9RG4uaGFzT3duUHJvcGVydHksb2k9RG4udG9TdHJpbmcsVmU9UT9RLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiB1aSh0KXt2YXIgZT1haS5jYWxsKHQsVmUpLG49dFtWZV07dHJ5e3RbVmVdPXZvaWQgMDt2YXIgcj0hMH1jYXRjaHt9dmFyIHM9b2kuY2FsbCh0KTtyZXR1cm4gciYmKGU/dFtWZV09bjpkZWxldGUgdFtWZV0pLHN9dmFyIGxpPU9iamVjdC5wcm90b3R5cGUsY2k9bGkudG9TdHJpbmc7ZnVuY3Rpb24gZmkodCl7cmV0dXJuIGNpLmNhbGwodCl9dmFyIGRpPSJbb2JqZWN0IE51bGxdIixoaT0iW29iamVjdCBVbmRlZmluZWRdIixfbj1RP1EudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIHp0KHQpe3JldHVybiB0PT1udWxsP3Q9PT12b2lkIDA/aGk6ZGk6X24mJl9uIGluIE9iamVjdCh0KT91aSh0KTpmaSh0KX1mdW5jdGlvbiBydCh0KXtyZXR1cm4gdCE9bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QifXZhciBtaT0iW29iamVjdCBTeW1ib2xdIjtmdW5jdGlvbiBadCh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wifHxydCh0KSYmenQodCk9PW1pfWZ1bmN0aW9uIEZuKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLHM9QXJyYXkocik7KytuPHI7KXNbbl09ZSh0W25dLG4sdCk7cmV0dXJuIHN9dmFyIHlpPUFycmF5LmlzQXJyYXk7Y29uc3QgV2U9eWk7dmFyIGdpPTEvMCxBbj1RP1EucHJvdG90eXBlOnZvaWQgMCxWbj1Bbj9Bbi50b1N0cmluZzp2b2lkIDA7ZnVuY3Rpb24gV24odCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0O2lmKFdlKHQpKXJldHVybiBGbih0LFduKSsiIjtpZihadCh0KSlyZXR1cm4gVm4/Vm4uY2FsbCh0KToiIjt2YXIgZT10KyIiO3JldHVybiBlPT0iMCImJjEvdD09LWdpPyItMCI6ZX1mdW5jdGlvbiBzdCh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gdCE9bnVsbCYmKGU9PSJvYmplY3QifHxlPT0iZnVuY3Rpb24iKX1mdW5jdGlvbiAkbih0KXtyZXR1cm4gdH12YXIgcGk9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLHdpPSJbb2JqZWN0IEZ1bmN0aW9uXSIsdmk9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixPaT0iW29iamVjdCBQcm94eV0iO2Z1bmN0aW9uIExuKHQpe2lmKCFzdCh0KSlyZXR1cm4hMTt2YXIgZT16dCh0KTtyZXR1cm4gZT09d2l8fGU9PXZpfHxlPT1waXx8ZT09T2l9dmFyIFRpPUx0WyJfX2NvcmUtanNfc2hhcmVkX18iXTtjb25zdCBSdD1UaTt2YXIgem49ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKFJ0JiZSdC5rZXlzJiZSdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIFNpKHQpe3JldHVybiEhem4mJnpuIGluIHR9dmFyIGJpPUZ1bmN0aW9uLnByb3RvdHlwZSxraT1iaS50b1N0cmluZztmdW5jdGlvbiBJaSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIGtpLmNhbGwodCl9Y2F0Y2h7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaHt9fXJldHVybiIifXZhciBFaT0vW1xcXiQuKis/KClbXF17fXxdL2csTmk9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8seGk9RnVuY3Rpb24ucHJvdG90eXBlLE1pPU9iamVjdC5wcm90b3R5cGUsQ2k9eGkudG9TdHJpbmcsRGk9TWkuaGFzT3duUHJvcGVydHksX2k9UmVnRXhwKCJeIitDaS5jYWxsKERpKS5yZXBsYWNlKEVpLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIEZpKHQpe2lmKCFzdCh0KXx8U2kodCkpcmV0dXJuITE7dmFyIGU9TG4odCk/X2k6Tmk7cmV0dXJuIGUudGVzdChJaSh0KSl9ZnVuY3Rpb24gQWkodCxlKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtlXX1mdW5jdGlvbiBQdCh0LGUpe3ZhciBuPUFpKHQsZSk7cmV0dXJuIEZpKG4pP246dm9pZCAwfWZ1bmN0aW9uIFZpKHQsZSxuKXtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gdC5jYWxsKGUpO2Nhc2UgMTpyZXR1cm4gdC5jYWxsKGUsblswXSk7Y2FzZSAyOnJldHVybiB0LmNhbGwoZSxuWzBdLG5bMV0pO2Nhc2UgMzpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdLG5bMl0pfXJldHVybiB0LmFwcGx5KGUsbil9dmFyIFdpPTgwMCwkaT0xNixMaT1EYXRlLm5vdztmdW5jdGlvbiB6aSh0KXt2YXIgZT0wLG49MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1MaSgpLHM9JGktKHItbik7aWYobj1yLHM+MCl7aWYoKytlPj1XaSlyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX1mdW5jdGlvbiBaaSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIFJpPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PVB0KE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaHt9fSgpO2NvbnN0IGl0PVJpO3ZhciBQaT1pdD9mdW5jdGlvbih0LGUpe3JldHVybiBpdCh0LCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOlppKGUpLHdyaXRhYmxlOiEwfSl9OiRuLGppPXppKFBpKTtjb25zdCBabj1qaTtmdW5jdGlvbiBVaSh0LGUsbixyKXtmb3IodmFyIHM9dC5sZW5ndGgsaT1uKyhyPzE6LTEpO3I/aS0tOisraTxzOylpZihlKHRbaV0saSx0KSlyZXR1cm4gaTtyZXR1cm4tMX1mdW5jdGlvbiBIaSh0KXtyZXR1cm4gdCE9PXR9ZnVuY3Rpb24gcWkodCxlLG4pe2Zvcih2YXIgcj1uLTEscz10Lmxlbmd0aDsrK3I8czspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gWWkodCxlLG4pe3JldHVybiBlPT09ZT9xaSh0LGUsbik6VWkodCxIaSxuKX1mdW5jdGlvbiBHaSh0LGUpe3ZhciBuPXQ9PW51bGw/MDp0Lmxlbmd0aDtyZXR1cm4hIW4mJllpKHQsZSwwKT4tMX12YXIgSmk9OTAwNzE5OTI1NDc0MDk5MSxCaT0vXig/OjB8WzEtOV1cZCopJC87ZnVuY3Rpb24gUm4odCxlKXt2YXIgbj10eXBlb2YgdDtyZXR1cm4gZT1lPz9KaSwhIWUmJihuPT0ibnVtYmVyInx8biE9InN5bWJvbCImJkJpLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX1mdW5jdGlvbiBRaSh0LGUsbil7ZT09Il9fcHJvdG9fXyImJml0P2l0KHQsZSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH0pOnRbZV09bn1mdW5jdGlvbiBQbih0LGUpe3JldHVybiB0PT09ZXx8dCE9PXQmJmUhPT1lfXZhciBLaT1PYmplY3QucHJvdG90eXBlLFhpPUtpLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGVhKHQsZSxuKXt2YXIgcj10W2VdOyghKFhpLmNhbGwodCxlKSYmUG4ocixuKSl8fG49PT12b2lkIDAmJiEoZSBpbiB0KSkmJlFpKHQsZSxuKX12YXIgam49TWF0aC5tYXg7ZnVuY3Rpb24gVW4odCxlLG4pe3JldHVybiBlPWpuKGU9PT12b2lkIDA/dC5sZW5ndGgtMTplLDApLGZ1bmN0aW9uKCl7Zm9yKHZhciByPWFyZ3VtZW50cyxzPS0xLGk9am4oci5sZW5ndGgtZSwwKSxhPUFycmF5KGkpOysrczxpOylhW3NdPXJbZStzXTtzPS0xO2Zvcih2YXIgbz1BcnJheShlKzEpOysrczxlOylvW3NdPXJbc107cmV0dXJuIG9bZV09bihhKSxWaSh0LHRoaXMsbyl9fWZ1bmN0aW9uIHRhKHQsZSl7cmV0dXJuIFpuKFVuKHQsZSwkbiksdCsiIil9dmFyIG5hPTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gSG4odCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIiYmdD4tMSYmdCUxPT0wJiZ0PD1uYX1mdW5jdGlvbiByYSh0KXtyZXR1cm4gdCE9bnVsbCYmSG4odC5sZW5ndGgpJiYhTG4odCl9dmFyIHNhPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIHFuKHQpe3JldHVybiBydCh0KSYmenQodCk9PXNhfXZhciBZbj1PYmplY3QucHJvdG90eXBlLGlhPVluLmhhc093blByb3BlcnR5LGFhPVluLnByb3BlcnR5SXNFbnVtZXJhYmxlLG9hPXFuKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/cW46ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KHQpJiZpYS5jYWxsKHQsImNhbGxlZSIpJiYhYWEuY2FsbCh0LCJjYWxsZWUiKX07Y29uc3QgR249b2E7ZnVuY3Rpb24gdWEodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX12YXIgbGE9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sY2E9L15cdyokLztmdW5jdGlvbiBmYSh0LGUpe2lmKFdlKHQpKXJldHVybiExO3ZhciBuPXR5cGVvZiB0O3JldHVybiBuPT0ibnVtYmVyInx8bj09InN5bWJvbCJ8fG49PSJib29sZWFuInx8dD09bnVsbHx8WnQodCk/ITA6Y2EudGVzdCh0KXx8IWxhLnRlc3QodCl8fGUhPW51bGwmJnQgaW4gT2JqZWN0KGUpfXZhciBkYT1QdChPYmplY3QsImNyZWF0ZSIpO2NvbnN0ICRlPWRhO2Z1bmN0aW9uIGhhKCl7dGhpcy5fX2RhdGFfXz0kZT8kZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBtYSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX12YXIgeWE9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLGdhPU9iamVjdC5wcm90b3R5cGUscGE9Z2EuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gd2EodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZigkZSl7dmFyIG49ZVt0XTtyZXR1cm4gbj09PXlhP3ZvaWQgMDpufXJldHVybiBwYS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9dmFyIHZhPU9iamVjdC5wcm90b3R5cGUsT2E9dmEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gVGEodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gJGU/ZVt0XSE9PXZvaWQgMDpPYS5jYWxsKGUsdCl9dmFyIFNhPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBiYSh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09JGUmJmU9PT12b2lkIDA/U2E6ZSx0aGlzfWZ1bmN0aW9uIGFlKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWFlLnByb3RvdHlwZS5jbGVhcj1oYSxhZS5wcm90b3R5cGUuZGVsZXRlPW1hLGFlLnByb3RvdHlwZS5nZXQ9d2EsYWUucHJvdG90eXBlLmhhcz1UYSxhZS5wcm90b3R5cGUuc2V0PWJhO2Z1bmN0aW9uIGthKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBhdCh0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKFBuKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9dmFyIElhPUFycmF5LnByb3RvdHlwZSxFYT1JYS5zcGxpY2U7ZnVuY3Rpb24gTmEodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWF0KGUsdCk7aWYobjwwKXJldHVybiExO3ZhciByPWUubGVuZ3RoLTE7cmV0dXJuIG49PXI/ZS5wb3AoKTpFYS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiB4YSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49YXQoZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfWZ1bmN0aW9uIE1hKHQpe3JldHVybiBhdCh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIENhKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPWF0KG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9ZnVuY3Rpb24gZ2UodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19Z2UucHJvdG90eXBlLmNsZWFyPWthLGdlLnByb3RvdHlwZS5kZWxldGU9TmEsZ2UucHJvdG90eXBlLmdldD14YSxnZS5wcm90b3R5cGUuaGFzPU1hLGdlLnByb3RvdHlwZS5zZXQ9Q2E7dmFyIERhPVB0KEx0LCJNYXAiKTtjb25zdCBfYT1EYTtmdW5jdGlvbiBGYSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGFlLG1hcDpuZXcoX2F8fGdlKSxzdHJpbmc6bmV3IGFlfX1mdW5jdGlvbiBBYSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09InN0cmluZyJ8fGU9PSJudW1iZXIifHxlPT0ic3ltYm9sInx8ZT09ImJvb2xlYW4iP3QhPT0iX19wcm90b19fIjp0PT09bnVsbH1mdW5jdGlvbiBvdCh0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIEFhKGUpP25bdHlwZW9mIGU9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gVmEodCl7dmFyIGU9b3QodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX1mdW5jdGlvbiBXYSh0KXtyZXR1cm4gb3QodGhpcyx0KS5nZXQodCl9ZnVuY3Rpb24gJGEodCl7cmV0dXJuIG90KHRoaXMsdCkuaGFzKHQpfWZ1bmN0aW9uIExhKHQsZSl7dmFyIG49b3QodGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc31mdW5jdGlvbiBLKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fUsucHJvdG90eXBlLmNsZWFyPUZhLEsucHJvdG90eXBlLmRlbGV0ZT1WYSxLLnByb3RvdHlwZS5nZXQ9V2EsSy5wcm90b3R5cGUuaGFzPSRhLEsucHJvdG90eXBlLnNldD1MYTt2YXIgemE9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIGp0KHQsZSl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiJ8fGUhPW51bGwmJnR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoemEpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLHM9ZT9lLmFwcGx5KHRoaXMscik6clswXSxpPW4uY2FjaGU7aWYoaS5oYXMocykpcmV0dXJuIGkuZ2V0KHMpO3ZhciBhPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1pLnNldChzLGEpfHxpLGF9O3JldHVybiBuLmNhY2hlPW5ldyhqdC5DYWNoZXx8Syksbn1qdC5DYWNoZT1LO3ZhciBaYT01MDA7ZnVuY3Rpb24gUmEodCl7dmFyIGU9anQodCxmdW5jdGlvbihyKXtyZXR1cm4gbi5zaXplPT09WmEmJm4uY2xlYXIoKSxyfSksbj1lLmNhY2hlO3JldHVybiBlfXZhciBQYT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxqYT0vXFwoXFwpPy9nLFVhPVJhKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB0LmNoYXJDb2RlQXQoMCk9PT00NiYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoUGEsZnVuY3Rpb24obixyLHMsaSl7ZS5wdXNoKHM/aS5yZXBsYWNlKGphLCIkMSIpOnJ8fG4pfSksZX0pO2NvbnN0IEhhPVVhO2Z1bmN0aW9uIHFhKHQpe3JldHVybiB0PT1udWxsPyIiOlduKHQpfWZ1bmN0aW9uIHV0KHQsZSl7cmV0dXJuIFdlKHQpP3Q6ZmEodCxlKT9bdF06SGEocWEodCkpfXZhciBZYT0xLzA7ZnVuY3Rpb24gVXQodCl7aWYodHlwZW9mIHQ9PSJzdHJpbmcifHxadCh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiBlPT0iMCImJjEvdD09LVlhPyItMCI6ZX1mdW5jdGlvbiBHYSh0LGUpe2U9dXQoZSx0KTtmb3IodmFyIG49MCxyPWUubGVuZ3RoO3QhPW51bGwmJm48cjspdD10W1V0KGVbbisrXSldO3JldHVybiBuJiZuPT1yP3Q6dm9pZCAwfWZ1bmN0aW9uIEphKHQsZSl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgscz10Lmxlbmd0aDsrK248cjspdFtzK25dPWVbbl07cmV0dXJuIHR9dmFyIEpuPVE/US5pc0NvbmNhdFNwcmVhZGFibGU6dm9pZCAwO2Z1bmN0aW9uIEJhKHQpe3JldHVybiBXZSh0KXx8R24odCl8fCEhKEpuJiZ0JiZ0W0puXSl9ZnVuY3Rpb24gSHQodCxlLG4scixzKXt2YXIgaT0tMSxhPXQubGVuZ3RoO2ZvcihufHwobj1CYSksc3x8KHM9W10pOysraTxhOyl7dmFyIG89dFtpXTtlPjAmJm4obyk/ZT4xP0h0KG8sZS0xLG4scixzKTpKYShzLG8pOnJ8fChzW3MubGVuZ3RoXT1vKX1yZXR1cm4gc31mdW5jdGlvbiBRYSh0KXt2YXIgZT10PT1udWxsPzA6dC5sZW5ndGg7cmV0dXJuIGU/SHQodCwxKTpbXX1mdW5jdGlvbiBLYSh0KXtyZXR1cm4gWm4oVW4odCx2b2lkIDAsUWEpLHQrIiIpfXZhciBYYT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gZW8odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsWGEpLHRoaXN9ZnVuY3Rpb24gdG8odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfWZ1bmN0aW9uIGx0KHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBLOysrZTxuOyl0aGlzLmFkZCh0W2VdKX1sdC5wcm90b3R5cGUuYWRkPWx0LnByb3RvdHlwZS5wdXNoPWVvLGx0LnByb3RvdHlwZS5oYXM9dG87ZnVuY3Rpb24gbm8odCxlKXtyZXR1cm4gdC5oYXMoZSl9ZnVuY3Rpb24gcm8odCxlKXtyZXR1cm4gdCE9bnVsbCYmZSBpbiBPYmplY3QodCl9ZnVuY3Rpb24gc28odCxlLG4pe2U9dXQoZSx0KTtmb3IodmFyIHI9LTEscz1lLmxlbmd0aCxpPSExOysrcjxzOyl7dmFyIGE9VXQoZVtyXSk7aWYoIShpPXQhPW51bGwmJm4odCxhKSkpYnJlYWs7dD10W2FdfXJldHVybiBpfHwrK3IhPXM/aToocz10PT1udWxsPzA6dC5sZW5ndGgsISFzJiZIbihzKSYmUm4oYSxzKSYmKFdlKHQpfHxHbih0KSkpfWZ1bmN0aW9uIGlvKHQsZSl7cmV0dXJuIHQhPW51bGwmJnNvKHQsZSxybyl9ZnVuY3Rpb24gQm4odCl7cmV0dXJuIHJ0KHQpJiZyYSh0KX1mdW5jdGlvbiBhbyh0LGUsbil7Zm9yKHZhciByPS0xLHM9dD09bnVsbD8wOnQubGVuZ3RoOysrcjxzOylpZihuKGUsdFtyXSkpcmV0dXJuITA7cmV0dXJuITF9dmFyIG9vPTIwMDtmdW5jdGlvbiB1byh0LGUsbixyKXt2YXIgcz0tMSxpPUdpLGE9ITAsbz10Lmxlbmd0aCx1PVtdLGw9ZS5sZW5ndGg7aWYoIW8pcmV0dXJuIHU7biYmKGU9Rm4oZSx1YShuKSkpLHI/KGk9YW8sYT0hMSk6ZS5sZW5ndGg+PW9vJiYoaT1ubyxhPSExLGU9bmV3IGx0KGUpKTtlOmZvcig7KytzPG87KXt2YXIgYz10W3NdLGQ9bj09bnVsbD9jOm4oYyk7aWYoYz1yfHxjIT09MD9jOjAsYSYmZD09PWQpe2Zvcih2YXIgeT1sO3ktLTspaWYoZVt5XT09PWQpY29udGludWUgZTt1LnB1c2goYyl9ZWxzZSBpKGUsZCxyKXx8dS5wdXNoKGMpfXJldHVybiB1fXZhciBsbz10YShmdW5jdGlvbih0LGUpe3JldHVybiBCbih0KT91byh0LEh0KGUsMSxCbiwhMCkpOltdfSk7Y29uc3QgY289bG87ZnVuY3Rpb24gZm8odCxlLG4scil7aWYoIXN0KHQpKXJldHVybiB0O2U9dXQoZSx0KTtmb3IodmFyIHM9LTEsaT1lLmxlbmd0aCxhPWktMSxvPXQ7byE9bnVsbCYmKytzPGk7KXt2YXIgdT1VdChlW3NdKSxsPW47aWYodT09PSJfX3Byb3RvX18ifHx1PT09ImNvbnN0cnVjdG9yInx8dT09PSJwcm90b3R5cGUiKXJldHVybiB0O2lmKHMhPWEpe3ZhciBjPW9bdV07bD1yP3IoYyx1LG8pOnZvaWQgMCxsPT09dm9pZCAwJiYobD1zdChjKT9jOlJuKGVbcysxXSk/W106e30pfWVhKG8sdSxsKSxvPW9bdV19cmV0dXJuIHR9ZnVuY3Rpb24gaG8odCxlLG4pe2Zvcih2YXIgcj0tMSxzPWUubGVuZ3RoLGk9e307KytyPHM7KXt2YXIgYT1lW3JdLG89R2EodCxhKTtuKG8sYSkmJmZvKGksdXQoYSx0KSxvKX1yZXR1cm4gaX1mdW5jdGlvbiBtbyh0LGUpe3JldHVybiBobyh0LGUsZnVuY3Rpb24obixyKXtyZXR1cm4gaW8odCxyKX0pfUthKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PW51bGw/e306bW8odCxlKX0pO2NvbnN0IExlPXQ9PmU9PnR5cGVvZiBlPT09dCx5bz1MZSgib2JqZWN0IikscXQ9TGUoImJvb2xlYW4iKSxOPUxlKCJudW1iZXIiKSxBPUxlKCJzdHJpbmciKSxnbz1MZSgidW5kZWZpbmVkIiksUW49dD0+dD09PW51bGwsRz10PT5Rbih0KXx8Z28odCkse2lzQXJyYXk6WH09QXJyYXksVT10PT55byh0KSYmIVFuKHQpJiYhWCh0KSxZdD0odCxlKT0+bj0+TWF0aC5taW4oTWF0aC5tYXgobix0KSxlKTtmdW5jdGlvbiB3KHQsZSxuKXtyZXR1cm4gcj0+e2lmKCFuKXJldHVybjtjb25zdCBzPW5bcl07dChzKSYmKGVbcl09cyl9fWZ1bmN0aW9uIEgodCl7cmV0dXJuIGU9Pk4oZSkmJnQuaW5jbHVkZXMoZSl9ZnVuY3Rpb24gcGUoKXtjb25zdCB0PURhdGUubm93KCk7cmV0dXJue3VwZGF0ZUF0OnQsY3JlYXRlQXQ6dH19ZnVuY3Rpb24gd2UodCxlKXtjb25zdCBuPXcoTix0LGUpO24oInVwZGF0ZUF0IiksbigiY3JlYXRlQXQiKX1jb25zdCBwbz0oKT0+KHt0YWJsZUlkczpbXSxyZWxhdGlvbnNoaXBJZHM6W10saW5kZXhJZHM6W10sbWVtb0lkczpbXX0pO2Z1bmN0aW9uIHdvKHQpe2NvbnN0IGU9cG8oKTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtjb25zdCBuPXcoWCxlLHQpO3JldHVybiBuKCJ0YWJsZUlkcyIpLG4oInJlbGF0aW9uc2hpcElkcyIpLG4oImluZGV4SWRzIiksbigibWVtb0lkcyIpLGV9Y29uc3Qgdm89KCk9Pih7aWQ6IiIsbmFtZToiIix0YWJsZUlkOiIiLGluZGV4Q29sdW1uSWRzOltdLHNlcUluZGV4Q29sdW1uSWRzOltdLHVuaXF1ZTohMSxtZXRhOnBlKCl9KTtmdW5jdGlvbiBPbyh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9dm8oKSxzPXcoQSxyLG4pLGk9dyhxdCxyLG4pLGE9dyhYLHIsbik7cygiaWQiKSxzKCJuYW1lIikscygidGFibGVJZCIpLGkoInVuaXF1ZSIpLGEoImluZGV4Q29sdW1uSWRzIiksYSgic2VxSW5kZXhDb2x1bW5JZHMiKSx3ZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBLbj17QVNDOjEsREVTQzoyfSxUbz1PYmplY3QudmFsdWVzKEtuKSxTbz0oKT0+KHtpZDoiIixpbmRleElkOiIiLGNvbHVtbklkOiIiLG9yZGVyVHlwZTpLbi5BU0MsbWV0YTpwZSgpfSk7ZnVuY3Rpb24gYm8odCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPVNvKCkscz13KEEscixuKTtzKCJpZCIpLHMoImluZGV4SWQiKSxzKCJjb2x1bW5JZCIpLHcoSChUbykscixuKSgib3JkZXJUeXBlIiksd2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3Qga289KCk9Pih7fSk7ZnVuY3Rpb24gSW8odCl7Y29uc3QgZT1rbygpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdFtuLHJdb2YgT2JqZWN0LmVudHJpZXModCkpe2lmKCFYKHIpfHxyLmxlbmd0aCE9PTQpY29udGludWU7Y29uc3RbcyxpLGEsb109cjtpZihBKHMpJiZOKGkpJiZOKGEpJiZVKG8pKXtjb25zdCB1PXt9LGw9dyhOLHUsbyk7T2JqZWN0LmtleXMobykuZm9yRWFjaChsKSxlW25dPVtzLGksYSx1XX19cmV0dXJuIGV9Y29uc3QgRW89KCk9Pih7aWQ6IiIsdmFsdWU6IiIsdWk6e3g6MjAwLHk6MTAwLHpJbmRleDoyLHdpZHRoOjExNixoZWlnaHQ6MTAwLGNvbG9yOiIifSxtZXRhOnBlKCl9KTtmdW5jdGlvbiBObyh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9RW8oKSxzPXcoQSxyLG4pLGk9dyhOLHIudWksbi51aSksYT13KEEsci51aSxuLnVpKTtzKCJpZCIpLHMoInZhbHVlIiksYSgiY29sb3IiKSxpKCJ4IiksaSgieSIpLGkoInpJbmRleCIpLGkoIndpZHRoIiksaSgiaGVpZ2h0Iiksd2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3QgWG49e1plcm9PbmU6MixaZXJvTjo0LE9uZU9ubHk6OCxPbmVOOjE2fSx4bz1PYmplY3QudmFsdWVzKFhuKSxlcj17cmluZzoxLGRhc2g6Mn0sTW89T2JqZWN0LnZhbHVlcyhlciksR3Q9e2xlZnQ6MSxyaWdodDoyLHRvcDo0LGJvdHRvbTo4fSx0cj1PYmplY3QudmFsdWVzKEd0KSxDbz0oKT0+KHtpZDoiIixpZGVudGlmaWNhdGlvbjohMSxyZWxhdGlvbnNoaXBUeXBlOlhuLlplcm9OLHN0YXJ0UmVsYXRpb25zaGlwVHlwZTplci5kYXNoLHN0YXJ0Ont0YWJsZUlkOiIiLGNvbHVtbklkczpbXSx4OjAseTowLGRpcmVjdGlvbjpHdC5ib3R0b219LGVuZDp7dGFibGVJZDoiIixjb2x1bW5JZHM6W10seDowLHk6MCxkaXJlY3Rpb246R3QuYm90dG9tfSxtZXRhOnBlKCl9KTtmdW5jdGlvbiBEbyh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9Q28oKSxzPXcoQSxyLG4pLGk9dyhxdCxyLG4pLGE9dyhOLHIuc3RhcnQsbi5zdGFydCksbz13KEEsci5zdGFydCxuLnN0YXJ0KSx1PXcoTixyLmVuZCxuLmVuZCksbD13KEEsci5lbmQsbi5lbmQpO3MoImlkIiksaSgiaWRlbnRpZmljYXRpb24iKSx3KEgoeG8pLHIsbikoInJlbGF0aW9uc2hpcFR5cGUiKSx3KEgoTW8pLHIsbikoInN0YXJ0UmVsYXRpb25zaGlwVHlwZSIpLG8oInRhYmxlSWQiKSxhKCJ4IiksYSgieSIpLHcoSCh0ciksci5zdGFydCxuLnN0YXJ0KSgiZGlyZWN0aW9uIiksdyhYLHIuc3RhcnQsbi5zdGFydCkoImNvbHVtbklkcyIpLGwoInRhYmxlSWQiKSx1KCJ4IiksdSgieSIpLHcoSCh0ciksci5lbmQsbi5lbmQpKCJkaXJlY3Rpb24iKSx3KFgsci5lbmQsbi5lbmQpKCJjb2x1bW5JZHMiKSx3ZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBfbz17RVJEOiJFUkQiLHZpc3VhbGl6YXRpb246IkBkaW5ldWcvZXJkLWVkaXRvci9idWlsdGluLXZpc3VhbGl6YXRpb24iLHNjaGVtYVNRTDoiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tc2NoZW1hLXNxbCIsZ2VuZXJhdG9yQ29kZToiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tZ2VuZXJhdG9yLWNvZGUiLHNldHRpbmdzOiJzZXR0aW5ncyJ9LG9lPXt0YWJsZUNvbW1lbnQ6MSxjb2x1bW5Db21tZW50OjIsY29sdW1uRGF0YVR5cGU6NCxjb2x1bW5EZWZhdWx0OjgsY29sdW1uQXV0b0luY3JlbWVudDoxNixjb2x1bW5QcmltYXJ5S2V5OjMyLGNvbHVtblVuaXF1ZTo2NCxjb2x1bW5Ob3ROdWxsOjEyOCxyZWxhdGlvbnNoaXA6MjU2fSxlZT17Y29sdW1uTmFtZToxLGNvbHVtbkRhdGFUeXBlOjIsY29sdW1uTm90TnVsbDo0LGNvbHVtblVuaXF1ZTo4LGNvbHVtbkF1dG9JbmNyZW1lbnQ6MTYsY29sdW1uRGVmYXVsdDozMixjb2x1bW5Db21tZW50OjY0fSxucj1PYmplY3QudmFsdWVzKGVlKSxycj17TWFyaWFEQjoxLE1TU1FMOjIsTXlTUUw6NCxPcmFjbGU6OCxQb3N0Z3JlU1FMOjE2LFNRTGl0ZTozMn0sRm89T2JqZWN0LnZhbHVlcyhyciksc3I9e0dyYXBoUUw6MSxjc2hhcnA6MixKYXZhOjQsS290bGluOjgsVHlwZVNjcmlwdDoxNixKUEE6MzIsU2NhbGE6NjR9LEFvPU9iamVjdC52YWx1ZXMoc3IpLEp0PXtub25lOjEsY2FtZWxDYXNlOjIscGFzY2FsQ2FzZTo0LHNuYWtlQ2FzZTo4fSxpcj1PYmplY3QudmFsdWVzKEp0KSxhcj17bm9uZToxLGRvdWJsZVF1b3RlOjIsc2luZ2xlUXVvdGU6NCxiYWNrdGljazo4fSxWbz1PYmplY3QudmFsdWVzKGFyKSxXbz0uMSwkbz0xLExvPTJlMyx6bz0yZTQsWm89b2UudGFibGVDb21tZW50fG9lLmNvbHVtbkNvbW1lbnR8b2UuY29sdW1uRGF0YVR5cGV8b2UuY29sdW1uRGVmYXVsdHxvZS5jb2x1bW5QcmltYXJ5S2V5fG9lLmNvbHVtbk5vdE51bGx8b2UucmVsYXRpb25zaGlwLFJvPSgpPT4oe3dpZHRoOjJlMyxoZWlnaHQ6MmUzLHNjcm9sbFRvcDowLHNjcm9sbExlZnQ6MCx6b29tTGV2ZWw6MSxzaG93OlpvLGRhdGFiYXNlOnJyLk15U1FMLGRhdGFiYXNlTmFtZToiIixjYW52YXNUeXBlOl9vLkVSRCxsYW5ndWFnZTpzci5HcmFwaFFMLHRhYmxlTmFtZUNhc2U6SnQucGFzY2FsQ2FzZSxjb2x1bW5OYW1lQ2FzZTpKdC5jYW1lbENhc2UsYnJhY2tldFR5cGU6YXIubm9uZSxyZWxhdGlvbnNoaXBEYXRhVHlwZVN5bmM6ITAscmVsYXRpb25zaGlwT3B0aW1pemF0aW9uOiExLGNvbHVtbk9yZGVyOltlZS5jb2x1bW5OYW1lLGVlLmNvbHVtbkRhdGFUeXBlLGVlLmNvbHVtbk5vdE51bGwsZWUuY29sdW1uVW5pcXVlLGVlLmNvbHVtbkF1dG9JbmNyZW1lbnQsZWUuY29sdW1uRGVmYXVsdCxlZS5jb2x1bW5Db21tZW50XSxtYXhXaWR0aENvbW1lbnQ6LTF9KSxvcj1ZdChMbyx6byksUG89WXQoV28sJG8pLGpvPVl0KDYwLDIwMCk7ZnVuY3Rpb24gVW8odCl7Y29uc3QgZT1SbygpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2NvbnN0IG49dyhOLGUsdCkscj13KEEsZSx0KSxzPXcocXQsZSx0KTtyZXR1cm4gTih0LndpZHRoKSYmKGUud2lkdGg9b3IodC53aWR0aCkpLE4odC5oZWlnaHQpJiYoZS5oZWlnaHQ9b3IodC5oZWlnaHQpKSxOKHQuem9vbUxldmVsKSYmKGUuem9vbUxldmVsPVBvKHQuem9vbUxldmVsKSksTih0Lm1heFdpZHRoQ29tbWVudCkmJnQubWF4V2lkdGhDb21tZW50IT09LTEmJihlLm1heFdpZHRoQ29tbWVudD1qbyh0Lm1heFdpZHRoQ29tbWVudCkpLG4oInNjcm9sbFRvcCIpLG4oInNjcm9sbExlZnQiKSxuKCJzaG93IikscigiZGF0YWJhc2VOYW1lIikscigiY2FudmFzVHlwZSIpLHMoInJlbGF0aW9uc2hpcERhdGFUeXBlU3luYyIpLHMoInJlbGF0aW9uc2hpcE9wdGltaXphdGlvbiIpLHcoSChGbyksZSx0KSgiZGF0YWJhc2UiKSx3KEgoQW8pLGUsdCkoImxhbmd1YWdlIiksdyhIKGlyKSxlLHQpKCJ0YWJsZU5hbWVDYXNlIiksdyhIKGlyKSxlLHQpKCJjb2x1bW5OYW1lQ2FzZSIpLHcoSChWbyksZSx0KSgiYnJhY2tldFR5cGUiKSxYKHQuY29sdW1uT3JkZXIpJiZuci5sZW5ndGg9PT10LmNvbHVtbk9yZGVyLmxlbmd0aCYmY28obnIsdC5jb2x1bW5PcmRlcikubGVuZ3RoPT09MCYmKGUuY29sdW1uT3JkZXI9dC5jb2x1bW5PcmRlciksZX1jb25zdCBIbz0oKT0+KHtpZDoiIixuYW1lOiIiLGNvbW1lbnQ6IiIsY29sdW1uSWRzOltdLHNlcUNvbHVtbklkczpbXSx1aTp7eDoyMDAseToxMDAsekluZGV4OjIsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCxjb2xvcjoiIn0sbWV0YTpwZSgpfSk7ZnVuY3Rpb24gcW8odCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPUhvKCkscz13KEEscixuKSxpPXcoWCxyLG4pLGE9dyhOLHIudWksbi51aSksbz13KEEsci51aSxuLnVpKTtzKCJpZCIpLHMoIm5hbWUiKSxzKCJjb21tZW50IiksaSgiY29sdW1uSWRzIiksaSgic2VxQ29sdW1uSWRzIiksbygiY29sb3IiKSxhKCJ4IiksYSgieSIpLGEoInpJbmRleCIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLHdlKHIubWV0YSxuLm1ldGEpLHIuaWQmJihlW3IuaWRdPXIpfXJldHVybiBlfWNvbnN0IFlvPSgpPT4oe2lkOiIiLHRhYmxlSWQ6IiIsbmFtZToiIixjb21tZW50OiIiLGRhdGFUeXBlOiIiLGRlZmF1bHQ6IiIsb3B0aW9uczowLHVpOntrZXlzOjAsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCx3aWR0aERhdGFUeXBlOjYwLHdpZHRoRGVmYXVsdDo2MH0sbWV0YTpwZSgpfSk7ZnVuY3Rpb24gR28odCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPVlvKCkscz13KEEscixuKSxpPXcoTixyLG4pLGE9dyhOLHIudWksbi51aSk7cygiaWQiKSxzKCJ0YWJsZUlkIikscygibmFtZSIpLHMoImNvbW1lbnQiKSxzKCJkYXRhVHlwZSIpLHMoImRlZmF1bHQiKSxpKCJvcHRpb25zIiksYSgia2V5cyIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLGEoIndpZHRoRGF0YVR5cGUiKSxhKCJ3aWR0aERlZmF1bHQiKSx3ZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1mdW5jdGlvbiBKbyh0KXt2YXIgZSxuLHIscyxpLGE7Y29uc3Qgbz10LHU9VW8oby5zZXR0aW5ncyksbD13byhvLmRvYyksYz1JbyhvLmx3dyksZD1xbygoZT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6ZS50YWJsZUVudGl0aWVzKSx5PUdvKChuPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDpuLnRhYmxlQ29sdW1uRW50aXRpZXMpLGg9RG8oKHI9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnIucmVsYXRpb25zaGlwRW50aXRpZXMpLFM9T28oKHM9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnMuaW5kZXhFbnRpdGllcyksaj1ibygoaT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6aS5pbmRleENvbHVtbkVudGl0aWVzKSxNPU5vKChhPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDphLm1lbW9FbnRpdGllcyk7cmV0dXJue3ZlcnNpb246IjMuMC4wIixzZXR0aW5nczp1LGRvYzpsLGNvbGxlY3Rpb25zOnt0YWJsZUVudGl0aWVzOmQsdGFibGVDb2x1bW5FbnRpdGllczp5LHJlbGF0aW9uc2hpcEVudGl0aWVzOmgsaW5kZXhFbnRpdGllczpTLGluZGV4Q29sdW1uRW50aXRpZXM6aixtZW1vRW50aXRpZXM6TX0sbHd3OmN9fWZ1bmN0aW9uIEJvKHQpe3JldHVyblt0LC0xLC0xLHt9XX1mdW5jdGlvbiBCdCh0LGUsbil7cmV0dXJuIHRbZV18fCh0W2VdPUJvKG4pLHRbZV0pfWZ1bmN0aW9uIFFvKHQsZSxuLHIscyl7Y29uc3QgaT1CdCh0LG4sciksYT1pWzFdLG89aVsyXTthPGUmJihpWzFdPWUpLG88ZSYmcygpfWZ1bmN0aW9uIEtvKHQsZSxuLHIscyl7Y29uc3QgaT1CdCh0LG4sciksYT1pWzJdLG89aVsxXTthPGUmJihpWzJdPWUpLG88PWUmJnMoKX1mdW5jdGlvbiBYbyh0LGUsbixyLHMsaSl7Y29uc3QgYT1CdCh0LG4scik7KGFbM11bc10/Py0xKTw9ZSYmKGFbM11bc109ZSxpKCkpfWNsYXNzIGV1e2NvbnN0cnVjdG9yKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjb2xsZWN0aW9ucyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX1jb2xsZWN0aW9uKGUpe3JldHVybiBuZXcgdHUodGhpcy5jb2xsZWN0aW9uc1tlXSxlKX19Y2xhc3MgdHV7Y29uc3RydWN0b3IoZSxuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29sbGVjdGlvbiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29sbGVjdGlvbktleSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm59KX1zZWxlY3RCeUlkKGUpe3JldHVybiB0aGlzLmNvbGxlY3Rpb25bZV19c2VsZWN0QnlJZHMoZSl7cmV0dXJuIGUubGVuZ3RoLGUubWFwKG49PnRoaXMuc2VsZWN0QnlJZChuKSkuZmlsdGVyKEJvb2xlYW4pfXNlbGVjdEVudGl0aWVzKCl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbn1zZWxlY3RBbGwoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmNvbGxlY3Rpb24pfXNldE9uZShlKXtyZXR1cm4gdGhpcy5jb2xsZWN0aW9uW2UuaWRdPWUsdGhpc31zZXRNYW55KGUpe3JldHVybiBlLmZvckVhY2gobj0+dGhpcy5zZXRPbmUobikpLHRoaXN9c2V0QWxsKGUpe3JldHVybiB0aGlzLnJlbW92ZUFsbCgpLHRoaXMuc2V0TWFueShlKSx0aGlzfWFkZE9uZShlKXtyZXR1cm4gdGhpcy5zZWxlY3RCeUlkKGUuaWQpP3RoaXM6KHRoaXMuc2V0T25lKGUpLHRoaXMpfWFkZE1hbnkoZSl7cmV0dXJuIGUuZm9yRWFjaChuPT50aGlzLmFkZE9uZShuKSksdGhpc31yZW1vdmVPbmUoZSl7cmV0dXJuIHRoaXMuc2VsZWN0QnlJZChlKSYmUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0aGlzLmNvbGxlY3Rpb24sZSksdGhpc31yZW1vdmVNYW55KGUpe3JldHVybiBlLmZvckVhY2gobj0+dGhpcy5yZW1vdmVPbmUobikpLHRoaXN9cmVtb3ZlQWxsKCl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbj17fSx0aGlzfXVwZGF0ZU9uZShlLG4pe2NvbnN0IHI9dGhpcy5zZWxlY3RCeUlkKGUpO3JldHVybiByJiYobihyKSxyLm1ldGEudXBkYXRlQXQ9RGF0ZS5ub3coKSksdGhpc311cGRhdGVNYW55KGUsbil7cmV0dXJuIGUuZm9yRWFjaChyPT50aGlzLnVwZGF0ZU9uZShyLG4pKSx0aGlzfWdldE9yQ3JlYXRlKGUsbil7Y29uc3Qgcj10aGlzLnNlbGVjdEJ5SWQoZSk7aWYocilyZXR1cm4gcjtjb25zdCBzPW4oZSk7cmV0dXJuIHRoaXMuc2V0T25lKHMpLHRoaXMuc2VsZWN0QnlJZChlKX1hZGRPcGVyYXRvcihlLG4scixzKXtyZXR1cm4gUW8oZSxuLHIsdGhpcy5jb2xsZWN0aW9uS2V5LHMpLHRoaXN9cmVtb3ZlT3BlcmF0b3IoZSxuLHIscyl7cmV0dXJuIEtvKGUsbixyLHRoaXMuY29sbGVjdGlvbktleSxzKSx0aGlzfXJlcGxhY2VPcGVyYXRvcihlLG4scixzLGkpe3JldHVybiBYbyhlLG4scix0aGlzLmNvbGxlY3Rpb25LZXkscyxpKSx0aGlzfX1jb25zdCBWPXQ9Pm5ldyBldSh0KTtmdW5jdGlvbiBDKHQpe2NvbnN0IGU9bmV3IFNldCh0KTtyZXR1cm4gbj0+ZS5oYXMobil9dmFyIG51PXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxydT1udSxzdT10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGl1PXJ1fHxzdXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxjdD1pdSxhdT1jdC5TeW1ib2wsZnQ9YXUsdXI9T2JqZWN0LnByb3RvdHlwZSxvdT11ci5oYXNPd25Qcm9wZXJ0eSx1dT11ci50b1N0cmluZyx6ZT1mdD9mdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gbHUodCl7dmFyIGU9b3UuY2FsbCh0LHplKSxuPXRbemVdO3RyeXt0W3plXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2h7fXZhciBzPXV1LmNhbGwodCk7cmV0dXJuIHImJihlP3RbemVdPW46ZGVsZXRlIHRbemVdKSxzfXZhciBjdT1PYmplY3QucHJvdG90eXBlLGZ1PWN1LnRvU3RyaW5nO2Z1bmN0aW9uIGR1KHQpe3JldHVybiBmdS5jYWxsKHQpfXZhciBodT0iW29iamVjdCBOdWxsXSIsbXU9IltvYmplY3QgVW5kZWZpbmVkXSIsbHI9ZnQ/ZnQudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIHl1KHQpe3JldHVybiB0PT1udWxsP3Q9PT12b2lkIDA/bXU6aHU6bHImJmxyIGluIE9iamVjdCh0KT9sdSh0KTpkdSh0KX1mdW5jdGlvbiBjcih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gdCE9bnVsbCYmKGU9PSJvYmplY3QifHxlPT0iZnVuY3Rpb24iKX12YXIgZ3U9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLHB1PSJbb2JqZWN0IEZ1bmN0aW9uXSIsd3U9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIix2dT0iW29iamVjdCBQcm94eV0iO2Z1bmN0aW9uIE91KHQpe2lmKCFjcih0KSlyZXR1cm4hMTt2YXIgZT15dSh0KTtyZXR1cm4gZT09cHV8fGU9PXd1fHxlPT1ndXx8ZT09dnV9dmFyIFR1PWN0WyJfX2NvcmUtanNfc2hhcmVkX18iXSxRdD1UdSxmcj1mdW5jdGlvbigpe3ZhciB0PS9bXi5dKyQvLmV4ZWMoUXQmJlF0LmtleXMmJlF0LmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdD8iU3ltYm9sKHNyYylfMS4iK3Q6IiJ9KCk7ZnVuY3Rpb24gU3UodCl7cmV0dXJuISFmciYmZnIgaW4gdH12YXIgYnU9RnVuY3Rpb24ucHJvdG90eXBlLGt1PWJ1LnRvU3RyaW5nO2Z1bmN0aW9uIEl1KHQpe2lmKHQhPW51bGwpe3RyeXtyZXR1cm4ga3UuY2FsbCh0KX1jYXRjaHt9dHJ5e3JldHVybiB0KyIifWNhdGNoe319cmV0dXJuIiJ9dmFyIEV1PS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxOdT0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyx4dT1GdW5jdGlvbi5wcm90b3R5cGUsTXU9T2JqZWN0LnByb3RvdHlwZSxDdT14dS50b1N0cmluZyxEdT1NdS5oYXNPd25Qcm9wZXJ0eSxfdT1SZWdFeHAoIl4iK0N1LmNhbGwoRHUpLnJlcGxhY2UoRXUsIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7ZnVuY3Rpb24gRnUodCl7aWYoIWNyKHQpfHxTdSh0KSlyZXR1cm4hMTt2YXIgZT1PdSh0KT9fdTpOdTtyZXR1cm4gZS50ZXN0KEl1KHQpKX1mdW5jdGlvbiBBdSh0LGUpe3JldHVybiB0PT1udWxsP3ZvaWQgMDp0W2VdfWZ1bmN0aW9uIEt0KHQsZSl7dmFyIG49QXUodCxlKTtyZXR1cm4gRnUobik/bjp2b2lkIDB9ZnVuY3Rpb24gVnUoKXt9ZnVuY3Rpb24gV3UodCxlLG4scil7Zm9yKHZhciBzPXQubGVuZ3RoLGk9bisocj8xOi0xKTtyP2ktLTorK2k8czspaWYoZSh0W2ldLGksdCkpcmV0dXJuIGk7cmV0dXJuLTF9ZnVuY3Rpb24gJHUodCl7cmV0dXJuIHQhPT10fWZ1bmN0aW9uIEx1KHQsZSxuKXtmb3IodmFyIHI9bi0xLHM9dC5sZW5ndGg7KytyPHM7KWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIHp1KHQsZSxuKXtyZXR1cm4gZT09PWU/THUodCxlLG4pOld1KHQsJHUsbil9ZnVuY3Rpb24gWnUodCxlKXt2YXIgbj10PT1udWxsPzA6dC5sZW5ndGg7cmV0dXJuISFuJiZ6dSh0LGUsMCk+LTF9ZnVuY3Rpb24gUnUodCxlKXtyZXR1cm4gdD09PWV8fHQhPT10JiZlIT09ZX12YXIgUHU9S3QoT2JqZWN0LCJjcmVhdGUiKSxaZT1QdTtmdW5jdGlvbiBqdSgpe3RoaXMuX19kYXRhX189WmU/WmUobnVsbCk6e30sdGhpcy5zaXplPTB9ZnVuY3Rpb24gVXUodCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9dmFyIEh1PSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIixxdT1PYmplY3QucHJvdG90eXBlLFl1PXF1Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIEd1KHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoWmUpe3ZhciBuPWVbdF07cmV0dXJuIG49PT1IdT92b2lkIDA6bn1yZXR1cm4gWXUuY2FsbChlLHQpP2VbdF06dm9pZCAwfXZhciBKdT1PYmplY3QucHJvdG90eXBlLEJ1PUp1Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFF1KHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIFplP2VbdF0hPT12b2lkIDA6QnUuY2FsbChlLHQpfXZhciBLdT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gWHUodCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxuW3RdPVplJiZlPT09dm9pZCAwP0t1OmUsdGhpc31mdW5jdGlvbiB1ZSh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX11ZS5wcm90b3R5cGUuY2xlYXI9anUsdWUucHJvdG90eXBlLmRlbGV0ZT1VdSx1ZS5wcm90b3R5cGUuZ2V0PUd1LHVlLnByb3RvdHlwZS5oYXM9UXUsdWUucHJvdG90eXBlLnNldD1YdTtmdW5jdGlvbiBlbCgpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9ZnVuY3Rpb24gZHQodCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihSdSh0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfXZhciB0bD1BcnJheS5wcm90b3R5cGUsbmw9dGwuc3BsaWNlO2Z1bmN0aW9uIHJsKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1kdChlLHQpO2lmKG48MClyZXR1cm4hMTt2YXIgcj1lLmxlbmd0aC0xO3JldHVybiBuPT1yP2UucG9wKCk6bmwuY2FsbChlLG4sMSksLS10aGlzLnNpemUsITB9ZnVuY3Rpb24gc2wodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWR0KGUsdCk7cmV0dXJuIG48MD92b2lkIDA6ZVtuXVsxXX1mdW5jdGlvbiBpbCh0KXtyZXR1cm4gZHQodGhpcy5fX2RhdGFfXyx0KT4tMX1mdW5jdGlvbiBhbCh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj1kdChuLHQpO3JldHVybiByPDA/KCsrdGhpcy5zaXplLG4ucHVzaChbdCxlXSkpOm5bcl1bMV09ZSx0aGlzfWZ1bmN0aW9uIHZlKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fXZlLnByb3RvdHlwZS5jbGVhcj1lbCx2ZS5wcm90b3R5cGUuZGVsZXRlPXJsLHZlLnByb3RvdHlwZS5nZXQ9c2wsdmUucHJvdG90eXBlLmhhcz1pbCx2ZS5wcm90b3R5cGUuc2V0PWFsO3ZhciBvbD1LdChjdCwiTWFwIiksdWw9b2w7ZnVuY3Rpb24gbGwoKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyB1ZSxtYXA6bmV3KHVsfHx2ZSksc3RyaW5nOm5ldyB1ZX19ZnVuY3Rpb24gY2wodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIGU9PSJzdHJpbmcifHxlPT0ibnVtYmVyInx8ZT09InN5bWJvbCJ8fGU9PSJib29sZWFuIj90IT09Il9fcHJvdG9fXyI6dD09PW51bGx9ZnVuY3Rpb24gaHQodCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybiBjbChlKT9uW3R5cGVvZiBlPT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIGZsKHQpe3ZhciBlPWh0KHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9ZnVuY3Rpb24gZGwodCl7cmV0dXJuIGh0KHRoaXMsdCkuZ2V0KHQpfWZ1bmN0aW9uIGhsKHQpe3JldHVybiBodCh0aGlzLHQpLmhhcyh0KX1mdW5jdGlvbiBtbCh0LGUpe3ZhciBuPWh0KHRoaXMsdCkscj1uLnNpemU7cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplKz1uLnNpemU9PXI/MDoxLHRoaXN9ZnVuY3Rpb24gT2UodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19T2UucHJvdG90eXBlLmNsZWFyPWxsLE9lLnByb3RvdHlwZS5kZWxldGU9ZmwsT2UucHJvdG90eXBlLmdldD1kbCxPZS5wcm90b3R5cGUuaGFzPWhsLE9lLnByb3RvdHlwZS5zZXQ9bWw7dmFyIHlsPUt0KGN0LCJTZXQiKSxYdD15bCxnbD0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gcGwodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsZ2wpLHRoaXN9ZnVuY3Rpb24gd2wodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfWZ1bmN0aW9uIG10KHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBPZTsrK2U8bjspdGhpcy5hZGQodFtlXSl9bXQucHJvdG90eXBlLmFkZD1tdC5wcm90b3R5cGUucHVzaD1wbCxtdC5wcm90b3R5cGUuaGFzPXdsO2Z1bmN0aW9uIHZsKHQsZSl7cmV0dXJuIHQuaGFzKGUpfWZ1bmN0aW9uIGRyKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHIpe25bKytlXT1yfSksbn1mdW5jdGlvbiBPbCh0LGUsbil7Zm9yKHZhciByPS0xLHM9dD09bnVsbD8wOnQubGVuZ3RoOysrcjxzOylpZihuKGUsdFtyXSkpcmV0dXJuITA7cmV0dXJuITF9dmFyIFRsPTEvMCxTbD1YdCYmMS9kcihuZXcgWHQoWywtMF0pKVsxXT09VGw/ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBYdCh0KX06VnUsYmw9U2wsa2w9MjAwO2Z1bmN0aW9uIElsKHQsZSxuKXt2YXIgcj0tMSxzPVp1LGk9dC5sZW5ndGgsYT0hMCxvPVtdLHU9bztpZihuKWE9ITEscz1PbDtlbHNlIGlmKGk+PWtsKXt2YXIgbD1lP251bGw6YmwodCk7aWYobClyZXR1cm4gZHIobCk7YT0hMSxzPXZsLHU9bmV3IG10fWVsc2UgdT1lP1tdOm87ZTpmb3IoOysrcjxpOyl7dmFyIGM9dFtyXSxkPWU/ZShjKTpjO2lmKGM9bnx8YyE9PTA/YzowLGEmJmQ9PT1kKXtmb3IodmFyIHk9dS5sZW5ndGg7eS0tOylpZih1W3ldPT09ZCljb250aW51ZSBlO2UmJnUucHVzaChkKSxvLnB1c2goYyl9ZWxzZSBzKHUsZCxuKXx8KHUhPT1vJiZ1LnB1c2goZCksby5wdXNoKGMpKX1yZXR1cm4gb31mdW5jdGlvbiBUZSh0KXtyZXR1cm4gdCYmdC5sZW5ndGg/SWwodCk6W119Y2xhc3MgbGUgZXh0ZW5kcyBFcnJvcnt9Y2xhc3MgRWwgZXh0ZW5kcyBsZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCBEYXRlVGltZTogJHtlLnRvTWVzc2FnZSgpfWApfX1jbGFzcyBObCBleHRlbmRzIGxle2NvbnN0cnVjdG9yKGUpe3N1cGVyKGBJbnZhbGlkIEludGVydmFsOiAke2UudG9NZXNzYWdlKCl9YCl9fWNsYXNzIHhsIGV4dGVuZHMgbGV7Y29uc3RydWN0b3IoZSl7c3VwZXIoYEludmFsaWQgRHVyYXRpb246ICR7ZS50b01lc3NhZ2UoKX1gKX19Y2xhc3MgU2UgZXh0ZW5kcyBsZXt9Y2xhc3MgaHIgZXh0ZW5kcyBsZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCB1bml0ICR7ZX1gKX19Y2xhc3MgXyBleHRlbmRzIGxle31jbGFzcyB0ZSBleHRlbmRzIGxle2NvbnN0cnVjdG9yKCl7c3VwZXIoIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3MiKX19Y29uc3QgZj0ibnVtZXJpYyIsej0ic2hvcnQiLEY9ImxvbmciLHl0PXt5ZWFyOmYsbW9udGg6ZixkYXk6Zn0sbXI9e3llYXI6Zixtb250aDp6LGRheTpmfSxNbD17eWVhcjpmLG1vbnRoOnosZGF5OmYsd2Vla2RheTp6fSx5cj17eWVhcjpmLG1vbnRoOkYsZGF5OmZ9LGdyPXt5ZWFyOmYsbW9udGg6RixkYXk6Zix3ZWVrZGF5OkZ9LHByPXtob3VyOmYsbWludXRlOmZ9LHdyPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmZ9LHZyPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOnp9LE9yPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOkZ9LFRyPXtob3VyOmYsbWludXRlOmYsaG91ckN5Y2xlOiJoMjMifSxTcj17aG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLGhvdXJDeWNsZToiaDIzIn0sYnI9e2hvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zixob3VyQ3ljbGU6ImgyMyIsdGltZVpvbmVOYW1lOnp9LGtyPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsaG91ckN5Y2xlOiJoMjMiLHRpbWVab25lTmFtZTpGfSxJcj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSxFcj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxOcj17eWVhcjpmLG1vbnRoOnosZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSx4cj17eWVhcjpmLG1vbnRoOnosZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxDbD17eWVhcjpmLG1vbnRoOnosZGF5OmYsd2Vla2RheTp6LGhvdXI6ZixtaW51dGU6Zn0sTXI9e3llYXI6Zixtb250aDpGLGRheTpmLGhvdXI6ZixtaW51dGU6Zix0aW1lWm9uZU5hbWU6en0sQ3I9e3llYXI6Zixtb250aDpGLGRheTpmLGhvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zix0aW1lWm9uZU5hbWU6en0sRHI9e3llYXI6Zixtb250aDpGLGRheTpmLHdlZWtkYXk6Rixob3VyOmYsbWludXRlOmYsdGltZVpvbmVOYW1lOkZ9LF9yPXt5ZWFyOmYsbW9udGg6RixkYXk6Zix3ZWVrZGF5OkYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLHRpbWVab25lTmFtZTpGfTtjbGFzcyBSZXtnZXQgdHlwZSgpe3Rocm93IG5ldyB0ZX1nZXQgbmFtZSgpe3Rocm93IG5ldyB0ZX1nZXQgaWFuYU5hbWUoKXtyZXR1cm4gdGhpcy5uYW1lfWdldCBpc1VuaXZlcnNhbCgpe3Rocm93IG5ldyB0ZX1vZmZzZXROYW1lKGUsbil7dGhyb3cgbmV3IHRlfWZvcm1hdE9mZnNldChlLG4pe3Rocm93IG5ldyB0ZX1vZmZzZXQoZSl7dGhyb3cgbmV3IHRlfWVxdWFscyhlKXt0aHJvdyBuZXcgdGV9Z2V0IGlzVmFsaWQoKXt0aHJvdyBuZXcgdGV9fWxldCBlbj1udWxsO2NsYXNzIGd0IGV4dGVuZHMgUmV7c3RhdGljIGdldCBpbnN0YW5jZSgpe3JldHVybiBlbj09PW51bGwmJihlbj1uZXcgZ3QpLGVufWdldCB0eXBlKCl7cmV0dXJuInN5c3RlbSJ9Z2V0IG5hbWUoKXtyZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZX1nZXQgaXNVbml2ZXJzYWwoKXtyZXR1cm4hMX1vZmZzZXROYW1lKGUse2Zvcm1hdDpuLGxvY2FsZTpyfSl7cmV0dXJuIG5zKGUsbixyKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gSGUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe3JldHVybi1uZXcgRGF0ZShlKS5nZXRUaW1lem9uZU9mZnNldCgpfWVxdWFscyhlKXtyZXR1cm4gZS50eXBlPT09InN5c3RlbSJ9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMH19bGV0IHB0PXt9O2Z1bmN0aW9uIERsKHQpe3JldHVybiBwdFt0XXx8KHB0W3RdPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCJlbi1VUyIse2hvdXIxMjohMSx0aW1lWm9uZTp0LHllYXI6Im51bWVyaWMiLG1vbnRoOiIyLWRpZ2l0IixkYXk6IjItZGlnaXQiLGhvdXI6IjItZGlnaXQiLG1pbnV0ZToiMi1kaWdpdCIsc2Vjb25kOiIyLWRpZ2l0IixlcmE6InNob3J0In0pKSxwdFt0XX1jb25zdCBfbD17eWVhcjowLG1vbnRoOjEsZGF5OjIsZXJhOjMsaG91cjo0LG1pbnV0ZTo1LHNlY29uZDo2fTtmdW5jdGlvbiBGbCh0LGUpe2NvbnN0IG49dC5mb3JtYXQoZSkucmVwbGFjZSgvXHUyMDBFL2csIiIpLHI9LyhcZCspXC8oXGQrKVwvKFxkKykgKEFEfEJDKSw/IChcZCspOihcZCspOihcZCspLy5leGVjKG4pLFsscyxpLGEsbyx1LGwsY109cjtyZXR1cm5bYSxzLGksbyx1LGwsY119ZnVuY3Rpb24gQWwodCxlKXtjb25zdCBuPXQuZm9ybWF0VG9QYXJ0cyhlKSxyPVtdO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cysrKXtjb25zdHt0eXBlOmksdmFsdWU6YX09bltzXSxvPV9sW2ldO2k9PT0iZXJhIj9yW29dPWE6ZyhvKXx8KHJbb109cGFyc2VJbnQoYSwxMCkpfXJldHVybiByfWxldCB3dD17fTtjbGFzcyBKIGV4dGVuZHMgUmV7c3RhdGljIGNyZWF0ZShlKXtyZXR1cm4gd3RbZV18fCh3dFtlXT1uZXcgSihlKSksd3RbZV19c3RhdGljIHJlc2V0Q2FjaGUoKXt3dD17fSxwdD17fX1zdGF0aWMgaXNWYWxpZFNwZWNpZmllcihlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkWm9uZShlKX1zdGF0aWMgaXNWYWxpZFpvbmUoZSl7aWYoIWUpcmV0dXJuITE7dHJ5e3JldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tVVMiLHt0aW1lWm9uZTplfSkuZm9ybWF0KCksITB9Y2F0Y2h7cmV0dXJuITF9fWNvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lLHRoaXMudmFsaWQ9Si5pc1ZhbGlkWm9uZShlKX1nZXQgdHlwZSgpe3JldHVybiJpYW5hIn1nZXQgbmFtZSgpe3JldHVybiB0aGlzLnpvbmVOYW1lfWdldCBpc1VuaXZlcnNhbCgpe3JldHVybiExfW9mZnNldE5hbWUoZSx7Zm9ybWF0Om4sbG9jYWxlOnJ9KXtyZXR1cm4gbnMoZSxuLHIsdGhpcy5uYW1lKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gSGUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe2NvbnN0IG49bmV3IERhdGUoZSk7aWYoaXNOYU4obikpcmV0dXJuIE5hTjtjb25zdCByPURsKHRoaXMubmFtZSk7bGV0W3MsaSxhLG8sdSxsLGNdPXIuZm9ybWF0VG9QYXJ0cz9BbChyLG4pOkZsKHIsbik7bz09PSJCQyImJihzPS1NYXRoLmFicyhzKSsxKTtjb25zdCB5PWJ0KHt5ZWFyOnMsbW9udGg6aSxkYXk6YSxob3VyOnU9PT0yND8wOnUsbWludXRlOmwsc2Vjb25kOmMsbWlsbGlzZWNvbmQ6MH0pO2xldCBoPStuO2NvbnN0IFM9aCUxZTM7cmV0dXJuIGgtPVM+PTA/UzoxZTMrUywoeS1oKS8oNjAqMWUzKX1lcXVhbHMoZSl7cmV0dXJuIGUudHlwZT09PSJpYW5hIiYmZS5uYW1lPT09dGhpcy5uYW1lfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMudmFsaWR9fWxldCBGcj17fTtmdW5jdGlvbiBWbCh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPUZyW25dO3JldHVybiByfHwocj1uZXcgSW50bC5MaXN0Rm9ybWF0KHQsZSksRnJbbl09cikscn1sZXQgdG49e307ZnVuY3Rpb24gbm4odCxlPXt9KXtjb25zdCBuPUpTT04uc3RyaW5naWZ5KFt0LGVdKTtsZXQgcj10bltuXTtyZXR1cm4gcnx8KHI9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodCxlKSx0bltuXT1yKSxyfWxldCBybj17fTtmdW5jdGlvbiBXbCh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPXJuW25dO3JldHVybiByfHwocj1uZXcgSW50bC5OdW1iZXJGb3JtYXQodCxlKSxybltuXT1yKSxyfWxldCBzbj17fTtmdW5jdGlvbiAkbCh0LGU9e30pe2NvbnN0e2Jhc2U6biwuLi5yfT1lLHM9SlNPTi5zdHJpbmdpZnkoW3Qscl0pO2xldCBpPXNuW3NdO3JldHVybiBpfHwoaT1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodCxlKSxzbltzXT1pKSxpfWxldCBQZT1udWxsO2Z1bmN0aW9uIExsKCl7cmV0dXJuIFBlfHwoUGU9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUsUGUpfWxldCBBcj17fTtmdW5jdGlvbiB6bCh0KXtsZXQgZT1Bclt0XTtpZighZSl7Y29uc3Qgbj1uZXcgSW50bC5Mb2NhbGUodCk7ZT0iZ2V0V2Vla0luZm8iaW4gbj9uLmdldFdlZWtJbmZvKCk6bi53ZWVrSW5mbyxBclt0XT1lfXJldHVybiBlfWZ1bmN0aW9uIFpsKHQpe2NvbnN0IGU9dC5pbmRleE9mKCIteC0iKTtlIT09LTEmJih0PXQuc3Vic3RyaW5nKDAsZSkpO2NvbnN0IG49dC5pbmRleE9mKCItdS0iKTtpZihuPT09LTEpcmV0dXJuW3RdO3tsZXQgcixzO3RyeXtyPW5uKHQpLnJlc29sdmVkT3B0aW9ucygpLHM9dH1jYXRjaHtjb25zdCB1PXQuc3Vic3RyaW5nKDAsbik7cj1ubih1KS5yZXNvbHZlZE9wdGlvbnMoKSxzPXV9Y29uc3R7bnVtYmVyaW5nU3lzdGVtOmksY2FsZW5kYXI6YX09cjtyZXR1cm5bcyxpLGFdfX1mdW5jdGlvbiBSbCh0LGUsbil7cmV0dXJuKG58fGUpJiYodC5pbmNsdWRlcygiLXUtIil8fCh0Kz0iLXUiKSxuJiYodCs9YC1jYS0ke259YCksZSYmKHQrPWAtbnUtJHtlfWApKSx0fWZ1bmN0aW9uIFBsKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTE7bjw9MTI7bisrKXtjb25zdCByPXAudXRjKDIwMDksbiwxKTtlLnB1c2godChyKSl9cmV0dXJuIGV9ZnVuY3Rpb24gamwodCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MTtuPD03O24rKyl7Y29uc3Qgcj1wLnV0YygyMDE2LDExLDEzK24pO2UucHVzaCh0KHIpKX1yZXR1cm4gZX1mdW5jdGlvbiB2dCh0LGUsbixyKXtjb25zdCBzPXQubGlzdGluZ01vZGUoKTtyZXR1cm4gcz09PSJlcnJvciI/bnVsbDpzPT09ImVuIj9uKGUpOnIoZSl9ZnVuY3Rpb24gVWwodCl7cmV0dXJuIHQubnVtYmVyaW5nU3lzdGVtJiZ0Lm51bWJlcmluZ1N5c3RlbSE9PSJsYXRuIj8hMTp0Lm51bWJlcmluZ1N5c3RlbT09PSJsYXRuInx8IXQubG9jYWxlfHx0LmxvY2FsZS5zdGFydHNXaXRoKCJlbiIpfHxuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0LmludGwpLnJlc29sdmVkT3B0aW9ucygpLm51bWJlcmluZ1N5c3RlbT09PSJsYXRuIn1jbGFzcyBIbHtjb25zdHJ1Y3RvcihlLG4scil7dGhpcy5wYWRUbz1yLnBhZFRvfHwwLHRoaXMuZmxvb3I9ci5mbG9vcnx8ITE7Y29uc3R7cGFkVG86cyxmbG9vcjppLC4uLmF9PXI7aWYoIW58fE9iamVjdC5rZXlzKGEpLmxlbmd0aD4wKXtjb25zdCBvPXt1c2VHcm91cGluZzohMSwuLi5yfTtyLnBhZFRvPjAmJihvLm1pbmltdW1JbnRlZ2VyRGlnaXRzPXIucGFkVG8pLHRoaXMuaW5mPVdsKGUsbyl9fWZvcm1hdChlKXtpZih0aGlzLmluZil7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6ZTtyZXR1cm4gdGhpcy5pbmYuZm9ybWF0KG4pfWVsc2V7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6ZG4oZSwzKTtyZXR1cm4gRShuLHRoaXMucGFkVG8pfX19Y2xhc3MgcWx7Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz1yLHRoaXMub3JpZ2luYWxab25lPXZvaWQgMDtsZXQgcztpZih0aGlzLm9wdHMudGltZVpvbmUpdGhpcy5kdD1lO2Vsc2UgaWYoZS56b25lLnR5cGU9PT0iZml4ZWQiKXtjb25zdCBhPS0xKihlLm9mZnNldC82MCksbz1hPj0wP2BFdGMvR01UKyR7YX1gOmBFdGMvR01UJHthfWA7ZS5vZmZzZXQhPT0wJiZKLmNyZWF0ZShvKS52YWxpZD8ocz1vLHRoaXMuZHQ9ZSk6KHM9IlVUQyIsdGhpcy5kdD1lLm9mZnNldD09PTA/ZTplLnNldFpvbmUoIlVUQyIpLnBsdXMoe21pbnV0ZXM6ZS5vZmZzZXR9KSx0aGlzLm9yaWdpbmFsWm9uZT1lLnpvbmUpfWVsc2UgZS56b25lLnR5cGU9PT0ic3lzdGVtIj90aGlzLmR0PWU6ZS56b25lLnR5cGU9PT0iaWFuYSI/KHRoaXMuZHQ9ZSxzPWUuem9uZS5uYW1lKToocz0iVVRDIix0aGlzLmR0PWUuc2V0Wm9uZSgiVVRDIikucGx1cyh7bWludXRlczplLm9mZnNldH0pLHRoaXMub3JpZ2luYWxab25lPWUuem9uZSk7Y29uc3QgaT17Li4udGhpcy5vcHRzfTtpLnRpbWVab25lPWkudGltZVpvbmV8fHMsdGhpcy5kdGY9bm4obixpKX1mb3JtYXQoKXtyZXR1cm4gdGhpcy5vcmlnaW5hbFpvbmU/dGhpcy5mb3JtYXRUb1BhcnRzKCkubWFwKCh7dmFsdWU6ZX0pPT5lKS5qb2luKCIiKTp0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKX1mb3JtYXRUb1BhcnRzKCl7Y29uc3QgZT10aGlzLmR0Zi5mb3JtYXRUb1BhcnRzKHRoaXMuZHQudG9KU0RhdGUoKSk7cmV0dXJuIHRoaXMub3JpZ2luYWxab25lP2UubWFwKG49PntpZihuLnR5cGU9PT0idGltZVpvbmVOYW1lIil7Y29uc3Qgcj10aGlzLm9yaWdpbmFsWm9uZS5vZmZzZXROYW1lKHRoaXMuZHQudHMse2xvY2FsZTp0aGlzLmR0LmxvY2FsZSxmb3JtYXQ6dGhpcy5vcHRzLnRpbWVab25lTmFtZX0pO3JldHVybnsuLi5uLHZhbHVlOnJ9fWVsc2UgcmV0dXJuIG59KTplfXJlc29sdmVkT3B0aW9ucygpe3JldHVybiB0aGlzLmR0Zi5yZXNvbHZlZE9wdGlvbnMoKX19Y2xhc3MgWWx7Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz17c3R5bGU6ImxvbmciLC4uLnJ9LCFuJiZLcigpJiYodGhpcy5ydGY9JGwoZSxyKSl9Zm9ybWF0KGUsbil7cmV0dXJuIHRoaXMucnRmP3RoaXMucnRmLmZvcm1hdChlLG4pOmhjKG4sZSx0aGlzLm9wdHMubnVtZXJpYyx0aGlzLm9wdHMuc3R5bGUhPT0ibG9uZyIpfWZvcm1hdFRvUGFydHMoZSxuKXtyZXR1cm4gdGhpcy5ydGY/dGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhlLG4pOltdfX1jb25zdCBHbD17Zmlyc3REYXk6MSxtaW5pbWFsRGF5czo0LHdlZWtlbmQ6WzYsN119O2NsYXNzIFR7c3RhdGljIGZyb21PcHRzKGUpe3JldHVybiBULmNyZWF0ZShlLmxvY2FsZSxlLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyLGUud2Vla1NldHRpbmdzLGUuZGVmYXVsdFRvRU4pfXN0YXRpYyBjcmVhdGUoZSxuLHIscyxpPSExKXtjb25zdCBhPWV8fEkuZGVmYXVsdExvY2FsZSxvPWF8fChpPyJlbi1VUyI6TGwoKSksdT1ufHxJLmRlZmF1bHROdW1iZXJpbmdTeXN0ZW0sbD1yfHxJLmRlZmF1bHRPdXRwdXRDYWxlbmRhcixjPWNuKHMpfHxJLmRlZmF1bHRXZWVrU2V0dGluZ3M7cmV0dXJuIG5ldyBUKG8sdSxsLGMsYSl9c3RhdGljIHJlc2V0Q2FjaGUoKXtQZT1udWxsLHRuPXt9LHJuPXt9LHNuPXt9fXN0YXRpYyBmcm9tT2JqZWN0KHtsb2NhbGU6ZSxudW1iZXJpbmdTeXN0ZW06bixvdXRwdXRDYWxlbmRhcjpyLHdlZWtTZXR0aW5nczpzfT17fSl7cmV0dXJuIFQuY3JlYXRlKGUsbixyLHMpfWNvbnN0cnVjdG9yKGUsbixyLHMsaSl7Y29uc3RbYSxvLHVdPVpsKGUpO3RoaXMubG9jYWxlPWEsdGhpcy5udW1iZXJpbmdTeXN0ZW09bnx8b3x8bnVsbCx0aGlzLm91dHB1dENhbGVuZGFyPXJ8fHV8fG51bGwsdGhpcy53ZWVrU2V0dGluZ3M9cyx0aGlzLmludGw9UmwodGhpcy5sb2NhbGUsdGhpcy5udW1iZXJpbmdTeXN0ZW0sdGhpcy5vdXRwdXRDYWxlbmRhciksdGhpcy53ZWVrZGF5c0NhY2hlPXtmb3JtYXQ6e30sc3RhbmRhbG9uZTp7fX0sdGhpcy5tb250aHNDYWNoZT17Zm9ybWF0Ont9LHN0YW5kYWxvbmU6e319LHRoaXMubWVyaWRpZW1DYWNoZT1udWxsLHRoaXMuZXJhQ2FjaGU9e30sdGhpcy5zcGVjaWZpZWRMb2NhbGU9aSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPW51bGx9Z2V0IGZhc3ROdW1iZXJzKCl7cmV0dXJuIHRoaXMuZmFzdE51bWJlcnNDYWNoZWQ9PW51bGwmJih0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPVVsKHRoaXMpKSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkfWxpc3RpbmdNb2RlKCl7Y29uc3QgZT10aGlzLmlzRW5nbGlzaCgpLG49KHRoaXMubnVtYmVyaW5nU3lzdGVtPT09bnVsbHx8dGhpcy5udW1iZXJpbmdTeXN0ZW09PT0ibGF0biIpJiYodGhpcy5vdXRwdXRDYWxlbmRhcj09PW51bGx8fHRoaXMub3V0cHV0Q2FsZW5kYXI9PT0iZ3JlZ29yeSIpO3JldHVybiBlJiZuPyJlbiI6ImludGwifWNsb25lKGUpe3JldHVybiFlfHxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5sZW5ndGg9PT0wP3RoaXM6VC5jcmVhdGUoZS5sb2NhbGV8fHRoaXMuc3BlY2lmaWVkTG9jYWxlLGUubnVtYmVyaW5nU3lzdGVtfHx0aGlzLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyfHx0aGlzLm91dHB1dENhbGVuZGFyLGNuKGUud2Vla1NldHRpbmdzKXx8dGhpcy53ZWVrU2V0dGluZ3MsZS5kZWZhdWx0VG9FTnx8ITEpfXJlZGVmYXVsdFRvRU4oZT17fSl7cmV0dXJuIHRoaXMuY2xvbmUoey4uLmUsZGVmYXVsdFRvRU46ITB9KX1yZWRlZmF1bHRUb1N5c3RlbShlPXt9KXtyZXR1cm4gdGhpcy5jbG9uZSh7Li4uZSxkZWZhdWx0VG9FTjohMX0pfW1vbnRocyhlLG49ITEpe3JldHVybiB2dCh0aGlzLGUsaXMsKCk9Pntjb25zdCByPW4/e21vbnRoOmUsZGF5OiJudW1lcmljIn06e21vbnRoOmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMubW9udGhzQ2FjaGVbc11bZV18fCh0aGlzLm1vbnRoc0NhY2hlW3NdW2VdPVBsKGk9PnRoaXMuZXh0cmFjdChpLHIsIm1vbnRoIikpKSx0aGlzLm1vbnRoc0NhY2hlW3NdW2VdfSl9d2Vla2RheXMoZSxuPSExKXtyZXR1cm4gdnQodGhpcyxlLHVzLCgpPT57Y29uc3Qgcj1uP3t3ZWVrZGF5OmUseWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9Ont3ZWVrZGF5OmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXXx8KHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXT1qbChpPT50aGlzLmV4dHJhY3QoaSxyLCJ3ZWVrZGF5IikpKSx0aGlzLndlZWtkYXlzQ2FjaGVbc11bZV19KX1tZXJpZGllbXMoKXtyZXR1cm4gdnQodGhpcyx2b2lkIDAsKCk9PmxzLCgpPT57aWYoIXRoaXMubWVyaWRpZW1DYWNoZSl7Y29uc3QgZT17aG91cjoibnVtZXJpYyIsaG91ckN5Y2xlOiJoMTIifTt0aGlzLm1lcmlkaWVtQ2FjaGU9W3AudXRjKDIwMTYsMTEsMTMsOSkscC51dGMoMjAxNiwxMSwxMywxOSldLm1hcChuPT50aGlzLmV4dHJhY3QobixlLCJkYXlwZXJpb2QiKSl9cmV0dXJuIHRoaXMubWVyaWRpZW1DYWNoZX0pfWVyYXMoZSl7cmV0dXJuIHZ0KHRoaXMsZSxjcywoKT0+e2NvbnN0IG49e2VyYTplfTtyZXR1cm4gdGhpcy5lcmFDYWNoZVtlXXx8KHRoaXMuZXJhQ2FjaGVbZV09W3AudXRjKC00MCwxLDEpLHAudXRjKDIwMTcsMSwxKV0ubWFwKHI9PnRoaXMuZXh0cmFjdChyLG4sImVyYSIpKSksdGhpcy5lcmFDYWNoZVtlXX0pfWV4dHJhY3QoZSxuLHIpe2NvbnN0IHM9dGhpcy5kdEZvcm1hdHRlcihlLG4pLGk9cy5mb3JtYXRUb1BhcnRzKCksYT1pLmZpbmQobz0+by50eXBlLnRvTG93ZXJDYXNlKCk9PT1yKTtyZXR1cm4gYT9hLnZhbHVlOm51bGx9bnVtYmVyRm9ybWF0dGVyKGU9e30pe3JldHVybiBuZXcgSGwodGhpcy5pbnRsLGUuZm9yY2VTaW1wbGV8fHRoaXMuZmFzdE51bWJlcnMsZSl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gbmV3IHFsKGUsdGhpcy5pbnRsLG4pfXJlbEZvcm1hdHRlcihlPXt9KXtyZXR1cm4gbmV3IFlsKHRoaXMuaW50bCx0aGlzLmlzRW5nbGlzaCgpLGUpfWxpc3RGb3JtYXR0ZXIoZT17fSl7cmV0dXJuIFZsKHRoaXMuaW50bCxlKX1pc0VuZ2xpc2goKXtyZXR1cm4gdGhpcy5sb2NhbGU9PT0iZW4ifHx0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpPT09ImVuLXVzInx8bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUuc3RhcnRzV2l0aCgiZW4tdXMiKX1nZXRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gdGhpcy53ZWVrU2V0dGluZ3M/dGhpcy53ZWVrU2V0dGluZ3M6WHIoKT96bCh0aGlzLmxvY2FsZSk6R2x9Z2V0U3RhcnRPZldlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5maXJzdERheX1nZXRNaW5EYXlzSW5GaXJzdFdlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5taW5pbWFsRGF5c31nZXRXZWVrZW5kRGF5cygpe3JldHVybiB0aGlzLmdldFdlZWtTZXR0aW5ncygpLndlZWtlbmR9ZXF1YWxzKGUpe3JldHVybiB0aGlzLmxvY2FsZT09PWUubG9jYWxlJiZ0aGlzLm51bWJlcmluZ1N5c3RlbT09PWUubnVtYmVyaW5nU3lzdGVtJiZ0aGlzLm91dHB1dENhbGVuZGFyPT09ZS5vdXRwdXRDYWxlbmRhcn19bGV0IGFuPW51bGw7Y2xhc3MgRCBleHRlbmRzIFJle3N0YXRpYyBnZXQgdXRjSW5zdGFuY2UoKXtyZXR1cm4gYW49PT1udWxsJiYoYW49bmV3IEQoMCkpLGFufXN0YXRpYyBpbnN0YW5jZShlKXtyZXR1cm4gZT09PTA/RC51dGNJbnN0YW5jZTpuZXcgRChlKX1zdGF0aWMgcGFyc2VTcGVjaWZpZXIoZSl7aWYoZSl7Y29uc3Qgbj1lLm1hdGNoKC9edXRjKD86KFsrLV1cZHsxLDJ9KSg/OjooXGR7Mn0pKT8pPyQvaSk7aWYobilyZXR1cm4gbmV3IEQoa3QoblsxXSxuWzJdKSl9cmV0dXJuIG51bGx9Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmZpeGVkPWV9Z2V0IHR5cGUoKXtyZXR1cm4iZml4ZWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJVVEMiOmBVVEMke0hlKHRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9Z2V0IGlhbmFOYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJFdGMvVVRDIjpgRXRjL0dNVCR7SGUoLXRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9b2Zmc2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9Zm9ybWF0T2Zmc2V0KGUsbil7cmV0dXJuIEhlKHRoaXMuZml4ZWQsbil9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITB9b2Zmc2V0KCl7cmV0dXJuIHRoaXMuZml4ZWR9ZXF1YWxzKGUpe3JldHVybiBlLnR5cGU9PT0iZml4ZWQiJiZlLmZpeGVkPT09dGhpcy5maXhlZH1nZXQgaXNWYWxpZCgpe3JldHVybiEwfX1jbGFzcyBKbCBleHRlbmRzIFJle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lfWdldCB0eXBlKCl7cmV0dXJuImludmFsaWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuem9uZU5hbWV9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITF9b2Zmc2V0TmFtZSgpe3JldHVybiBudWxsfWZvcm1hdE9mZnNldCgpe3JldHVybiIifW9mZnNldCgpe3JldHVybiBOYU59ZXF1YWxzKCl7cmV0dXJuITF9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMX19ZnVuY3Rpb24gbmUodCxlKXtpZihnKHQpfHx0PT09bnVsbClyZXR1cm4gZTtpZih0IGluc3RhbmNlb2YgUmUpcmV0dXJuIHQ7aWYoS2wodCkpe2NvbnN0IG49dC50b0xvd2VyQ2FzZSgpO3JldHVybiBuPT09ImRlZmF1bHQiP2U6bj09PSJsb2NhbCJ8fG49PT0ic3lzdGVtIj9ndC5pbnN0YW5jZTpuPT09InV0YyJ8fG49PT0iZ210Ij9ELnV0Y0luc3RhbmNlOkQucGFyc2VTcGVjaWZpZXIobil8fEouY3JlYXRlKHQpfWVsc2UgcmV0dXJuIGNlKHQpP0QuaW5zdGFuY2UodCk6dHlwZW9mIHQ9PSJvYmplY3QiJiYib2Zmc2V0ImluIHQmJnR5cGVvZiB0Lm9mZnNldD09ImZ1bmN0aW9uIj90Om5ldyBKbCh0KX1sZXQgVnI9KCk9PkRhdGUubm93KCksV3I9InN5c3RlbSIsJHI9bnVsbCxMcj1udWxsLHpyPW51bGwsWnI9NjAsUnIsUHI9bnVsbDtjbGFzcyBJe3N0YXRpYyBnZXQgbm93KCl7cmV0dXJuIFZyfXN0YXRpYyBzZXQgbm93KGUpe1ZyPWV9c3RhdGljIHNldCBkZWZhdWx0Wm9uZShlKXtXcj1lfXN0YXRpYyBnZXQgZGVmYXVsdFpvbmUoKXtyZXR1cm4gbmUoV3IsZ3QuaW5zdGFuY2UpfXN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpe3JldHVybiAkcn1zdGF0aWMgc2V0IGRlZmF1bHRMb2NhbGUoZSl7JHI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0oKXtyZXR1cm4gTHJ9c3RhdGljIHNldCBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtKGUpe0xyPWV9c3RhdGljIGdldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoKXtyZXR1cm4genJ9c3RhdGljIHNldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoZSl7enI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gUHJ9c3RhdGljIHNldCBkZWZhdWx0V2Vla1NldHRpbmdzKGUpe1ByPWNuKGUpfXN0YXRpYyBnZXQgdHdvRGlnaXRDdXRvZmZZZWFyKCl7cmV0dXJuIFpyfXN0YXRpYyBzZXQgdHdvRGlnaXRDdXRvZmZZZWFyKGUpe1pyPWUlMTAwfXN0YXRpYyBnZXQgdGhyb3dPbkludmFsaWQoKXtyZXR1cm4gUnJ9c3RhdGljIHNldCB0aHJvd09uSW52YWxpZChlKXtScj1lfXN0YXRpYyByZXNldENhY2hlcygpe1QucmVzZXRDYWNoZSgpLEoucmVzZXRDYWNoZSgpfX1jbGFzcyBae2NvbnN0cnVjdG9yKGUsbil7dGhpcy5yZWFzb249ZSx0aGlzLmV4cGxhbmF0aW9uPW59dG9NZXNzYWdlKCl7cmV0dXJuIHRoaXMuZXhwbGFuYXRpb24/YCR7dGhpcy5yZWFzb259OiAke3RoaXMuZXhwbGFuYXRpb259YDp0aGlzLnJlYXNvbn19Y29uc3QganI9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF0sVXI9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV07ZnVuY3Rpb24gVyh0LGUpe3JldHVybiBuZXcgWigidW5pdCBvdXQgb2YgcmFuZ2UiLGB5b3Ugc3BlY2lmaWVkICR7ZX0gKG9mIHR5cGUgJHt0eXBlb2YgZX0pIGFzIGEgJHt0fSwgd2hpY2ggaXMgaW52YWxpZGApfWZ1bmN0aW9uIG9uKHQsZSxuKXtjb25zdCByPW5ldyBEYXRlKERhdGUuVVRDKHQsZS0xLG4pKTt0PDEwMCYmdD49MCYmci5zZXRVVENGdWxsWWVhcihyLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCk7Y29uc3Qgcz1yLmdldFVUQ0RheSgpO3JldHVybiBzPT09MD83OnN9ZnVuY3Rpb24gSHIodCxlLG4pe3JldHVybiBuKyhqZSh0KT9VcjpqcilbZS0xXX1mdW5jdGlvbiBxcih0LGUpe2NvbnN0IG49amUodCk/VXI6anIscj1uLmZpbmRJbmRleChpPT5pPGUpLHM9ZS1uW3JdO3JldHVybnttb250aDpyKzEsZGF5OnN9fWZ1bmN0aW9uIHVuKHQsZSl7cmV0dXJuKHQtZSs3KSU3KzF9ZnVuY3Rpb24gT3QodCxlPTQsbj0xKXtjb25zdHt5ZWFyOnIsbW9udGg6cyxkYXk6aX09dCxhPUhyKHIscyxpKSxvPXVuKG9uKHIscyxpKSxuKTtsZXQgdT1NYXRoLmZsb29yKChhLW8rMTQtZSkvNyksbDtyZXR1cm4gdTwxPyhsPXItMSx1PVVlKGwsZSxuKSk6dT5VZShyLGUsbik/KGw9cisxLHU9MSk6bD1yLHt3ZWVrWWVhcjpsLHdlZWtOdW1iZXI6dSx3ZWVrZGF5Om8sLi4uRXQodCl9fWZ1bmN0aW9uIFlyKHQsZT00LG49MSl7Y29uc3R7d2Vla1llYXI6cix3ZWVrTnVtYmVyOnMsd2Vla2RheTppfT10LGE9dW4ob24ociwxLGUpLG4pLG89a2Uocik7bGV0IHU9cyo3K2ktYS03K2UsbDt1PDE/KGw9ci0xLHUrPWtlKGwpKTp1Pm8/KGw9cisxLHUtPWtlKHIpKTpsPXI7Y29uc3R7bW9udGg6YyxkYXk6ZH09cXIobCx1KTtyZXR1cm57eWVhcjpsLG1vbnRoOmMsZGF5OmQsLi4uRXQodCl9fWZ1bmN0aW9uIGxuKHQpe2NvbnN0e3llYXI6ZSxtb250aDpuLGRheTpyfT10LHM9SHIoZSxuLHIpO3JldHVybnt5ZWFyOmUsb3JkaW5hbDpzLC4uLkV0KHQpfX1mdW5jdGlvbiBHcih0KXtjb25zdHt5ZWFyOmUsb3JkaW5hbDpufT10LHttb250aDpyLGRheTpzfT1xcihlLG4pO3JldHVybnt5ZWFyOmUsbW9udGg6cixkYXk6cywuLi5FdCh0KX19ZnVuY3Rpb24gSnIodCxlKXtpZighZyh0LmxvY2FsV2Vla2RheSl8fCFnKHQubG9jYWxXZWVrTnVtYmVyKXx8IWcodC5sb2NhbFdlZWtZZWFyKSl7aWYoIWcodC53ZWVrZGF5KXx8IWcodC53ZWVrTnVtYmVyKXx8IWcodC53ZWVrWWVhcikpdGhyb3cgbmV3IFNlKCJDYW5ub3QgbWl4IGxvY2FsZS1iYXNlZCB3ZWVrIGZpZWxkcyB3aXRoIElTTy1iYXNlZCB3ZWVrIGZpZWxkcyIpO3JldHVybiBnKHQubG9jYWxXZWVrZGF5KXx8KHQud2Vla2RheT10LmxvY2FsV2Vla2RheSksZyh0LmxvY2FsV2Vla051bWJlcil8fCh0LndlZWtOdW1iZXI9dC5sb2NhbFdlZWtOdW1iZXIpLGcodC5sb2NhbFdlZWtZZWFyKXx8KHQud2Vla1llYXI9dC5sb2NhbFdlZWtZZWFyKSxkZWxldGUgdC5sb2NhbFdlZWtkYXksZGVsZXRlIHQubG9jYWxXZWVrTnVtYmVyLGRlbGV0ZSB0LmxvY2FsV2Vla1llYXIse21pbkRheXNJbkZpcnN0V2VlazplLmdldE1pbkRheXNJbkZpcnN0V2VlaygpLHN0YXJ0T2ZXZWVrOmUuZ2V0U3RhcnRPZldlZWsoKX19ZWxzZSByZXR1cm57bWluRGF5c0luRmlyc3RXZWVrOjQsc3RhcnRPZldlZWs6MX19ZnVuY3Rpb24gQmwodCxlPTQsbj0xKXtjb25zdCByPVR0KHQud2Vla1llYXIpLHM9JCh0LndlZWtOdW1iZXIsMSxVZSh0LndlZWtZZWFyLGUsbikpLGk9JCh0LndlZWtkYXksMSw3KTtyZXR1cm4gcj9zP2k/ITE6Vygid2Vla2RheSIsdC53ZWVrZGF5KTpXKCJ3ZWVrIix0LndlZWtOdW1iZXIpOlcoIndlZWtZZWFyIix0LndlZWtZZWFyKX1mdW5jdGlvbiBRbCh0KXtjb25zdCBlPVR0KHQueWVhciksbj0kKHQub3JkaW5hbCwxLGtlKHQueWVhcikpO3JldHVybiBlP24/ITE6Vygib3JkaW5hbCIsdC5vcmRpbmFsKTpXKCJ5ZWFyIix0LnllYXIpfWZ1bmN0aW9uIEJyKHQpe2NvbnN0IGU9VHQodC55ZWFyKSxuPSQodC5tb250aCwxLDEyKSxyPSQodC5kYXksMSxTdCh0LnllYXIsdC5tb250aCkpO3JldHVybiBlP24/cj8hMTpXKCJkYXkiLHQuZGF5KTpXKCJtb250aCIsdC5tb250aCk6VygieWVhciIsdC55ZWFyKX1mdW5jdGlvbiBRcih0KXtjb25zdHtob3VyOmUsbWludXRlOm4sc2Vjb25kOnIsbWlsbGlzZWNvbmQ6c309dCxpPSQoZSwwLDIzKXx8ZT09PTI0JiZuPT09MCYmcj09PTAmJnM9PT0wLGE9JChuLDAsNTkpLG89JChyLDAsNTkpLHU9JChzLDAsOTk5KTtyZXR1cm4gaT9hP28/dT8hMTpXKCJtaWxsaXNlY29uZCIscyk6Vygic2Vjb25kIixyKTpXKCJtaW51dGUiLG4pOlcoImhvdXIiLGUpfWZ1bmN0aW9uIGcodCl7cmV0dXJuIHR5cGVvZiB0PiJ1In1mdW5jdGlvbiBjZSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIifWZ1bmN0aW9uIFR0KHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciImJnQlMT09PTB9ZnVuY3Rpb24gS2wodCl7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIn1mdW5jdGlvbiBYbCh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIEtyKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXR9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIFhyKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5Mb2NhbGUmJigid2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlfHwiZ2V0V2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlKX1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gZWModCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19ZnVuY3Rpb24gZXModCxlLG4pe2lmKHQubGVuZ3RoIT09MClyZXR1cm4gdC5yZWR1Y2UoKHIscyk9Pntjb25zdCBpPVtlKHMpLHNdO3JldHVybiByJiZuKHJbMF0saVswXSk9PT1yWzBdP3I6aX0sbnVsbClbMV19ZnVuY3Rpb24gdGModCxlKXtyZXR1cm4gZS5yZWR1Y2UoKG4scik9PihuW3JdPXRbcl0sbikse30pfWZ1bmN0aW9uIGJlKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIGNuKHQpe2lmKHQ9PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIHQhPSJvYmplY3QiKXRocm93IG5ldyBfKCJXZWVrIHNldHRpbmdzIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYoISQodC5maXJzdERheSwxLDcpfHwhJCh0Lm1pbmltYWxEYXlzLDEsNyl8fCFBcnJheS5pc0FycmF5KHQud2Vla2VuZCl8fHQud2Vla2VuZC5zb21lKGU9PiEkKGUsMSw3KSkpdGhyb3cgbmV3IF8oIkludmFsaWQgd2VlayBzZXR0aW5ncyIpO3JldHVybntmaXJzdERheTp0LmZpcnN0RGF5LG1pbmltYWxEYXlzOnQubWluaW1hbERheXMsd2Vla2VuZDpBcnJheS5mcm9tKHQud2Vla2VuZCl9fWZ1bmN0aW9uICQodCxlLG4pe3JldHVybiBUdCh0KSYmdD49ZSYmdDw9bn1mdW5jdGlvbiBuYyh0LGUpe3JldHVybiB0LWUqTWF0aC5mbG9vcih0L2UpfWZ1bmN0aW9uIEUodCxlPTIpe2NvbnN0IG49dDwwO2xldCByO3JldHVybiBuP3I9Ii0iKygiIistdCkucGFkU3RhcnQoZSwiMCIpOnI9KCIiK3QpLnBhZFN0YXJ0KGUsIjAiKSxyfWZ1bmN0aW9uIHJlKHQpe2lmKCEoZyh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlSW50KHQsMTApfWZ1bmN0aW9uIGZlKHQpe2lmKCEoZyh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlRmxvYXQodCl9ZnVuY3Rpb24gZm4odCl7aWYoIShnKHQpfHx0PT09bnVsbHx8dD09PSIiKSl7Y29uc3QgZT1wYXJzZUZsb2F0KCIwLiIrdCkqMWUzO3JldHVybiBNYXRoLmZsb29yKGUpfX1mdW5jdGlvbiBkbih0LGUsbj0hMSl7Y29uc3Qgcj0xMCoqZTtyZXR1cm4obj9NYXRoLnRydW5jOk1hdGgucm91bmQpKHQqcikvcn1mdW5jdGlvbiBqZSh0KXtyZXR1cm4gdCU0PT09MCYmKHQlMTAwIT09MHx8dCU0MDA9PT0wKX1mdW5jdGlvbiBrZSh0KXtyZXR1cm4gamUodCk/MzY2OjM2NX1mdW5jdGlvbiBTdCh0LGUpe2NvbnN0IG49bmMoZS0xLDEyKSsxLHI9dCsoZS1uKS8xMjtyZXR1cm4gbj09PTI/amUocik/Mjk6Mjg6WzMxLG51bGwsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdW24tMV19ZnVuY3Rpb24gYnQodCl7bGV0IGU9RGF0ZS5VVEModC55ZWFyLHQubW9udGgtMSx0LmRheSx0LmhvdXIsdC5taW51dGUsdC5zZWNvbmQsdC5taWxsaXNlY29uZCk7cmV0dXJuIHQueWVhcjwxMDAmJnQueWVhcj49MCYmKGU9bmV3IERhdGUoZSksZS5zZXRVVENGdWxsWWVhcih0LnllYXIsdC5tb250aC0xLHQuZGF5KSksK2V9ZnVuY3Rpb24gdHModCxlLG4pe3JldHVybi11bihvbih0LDEsZSksbikrZS0xfWZ1bmN0aW9uIFVlKHQsZT00LG49MSl7Y29uc3Qgcj10cyh0LGUsbikscz10cyh0KzEsZSxuKTtyZXR1cm4oa2UodCktcitzKS83fWZ1bmN0aW9uIGhuKHQpe3JldHVybiB0Pjk5P3Q6dD5JLnR3b0RpZ2l0Q3V0b2ZmWWVhcj8xOTAwK3Q6MmUzK3R9ZnVuY3Rpb24gbnModCxlLG4scj1udWxsKXtjb25zdCBzPW5ldyBEYXRlKHQpLGk9e2hvdXJDeWNsZToiaDIzIix5ZWFyOiJudW1lcmljIixtb250aDoiMi1kaWdpdCIsZGF5OiIyLWRpZ2l0Iixob3VyOiIyLWRpZ2l0IixtaW51dGU6IjItZGlnaXQifTtyJiYoaS50aW1lWm9uZT1yKTtjb25zdCBhPXt0aW1lWm9uZU5hbWU6ZSwuLi5pfSxvPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KG4sYSkuZm9ybWF0VG9QYXJ0cyhzKS5maW5kKHU9PnUudHlwZS50b0xvd2VyQ2FzZSgpPT09InRpbWV6b25lbmFtZSIpO3JldHVybiBvP28udmFsdWU6bnVsbH1mdW5jdGlvbiBrdCh0LGUpe2xldCBuPXBhcnNlSW50KHQsMTApO051bWJlci5pc05hTihuKSYmKG49MCk7Y29uc3Qgcj1wYXJzZUludChlLDEwKXx8MCxzPW48MHx8T2JqZWN0LmlzKG4sLTApPy1yOnI7cmV0dXJuIG4qNjArc31mdW5jdGlvbiBycyh0KXtjb25zdCBlPU51bWJlcih0KTtpZih0eXBlb2YgdD09ImJvb2xlYW4ifHx0PT09IiJ8fE51bWJlci5pc05hTihlKSl0aHJvdyBuZXcgXyhgSW52YWxpZCB1bml0IHZhbHVlICR7dH1gKTtyZXR1cm4gZX1mdW5jdGlvbiBJdCh0LGUpe2NvbnN0IG49e307Zm9yKGNvbnN0IHIgaW4gdClpZihiZSh0LHIpKXtjb25zdCBzPXRbcl07aWYocz09bnVsbCljb250aW51ZTtuW2UocildPXJzKHMpfXJldHVybiBufWZ1bmN0aW9uIEhlKHQsZSl7Y29uc3Qgbj1NYXRoLnRydW5jKE1hdGguYWJzKHQvNjApKSxyPU1hdGgudHJ1bmMoTWF0aC5hYnModCU2MCkpLHM9dD49MD8iKyI6Ii0iO3N3aXRjaChlKXtjYXNlInNob3J0IjpyZXR1cm5gJHtzfSR7RShuLDIpfToke0UociwyKX1gO2Nhc2UibmFycm93IjpyZXR1cm5gJHtzfSR7bn0ke3I+MD9gOiR7cn1gOiIifWA7Y2FzZSJ0ZWNoaWUiOnJldHVybmAke3N9JHtFKG4sMil9JHtFKHIsMil9YDtkZWZhdWx0OnRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSBmb3JtYXQgJHtlfSBpcyBvdXQgb2YgcmFuZ2UgZm9yIHByb3BlcnR5IGZvcm1hdGApfX1mdW5jdGlvbiBFdCh0KXtyZXR1cm4gdGModCxbImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdKX1jb25zdCByYz1bIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc3M9WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxzYz1bIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdO2Z1bmN0aW9uIGlzKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLnNjXTtjYXNlInNob3J0IjpyZXR1cm5bLi4uc3NdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLnJjXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl07Y2FzZSIyLWRpZ2l0IjpyZXR1cm5bIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjEwIiwiMTEiLCIxMiJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IGFzPVsiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiLCJTdW5kYXkiXSxvcz1bIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCIsIlN1biJdLGljPVsiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIiwiUyJdO2Z1bmN0aW9uIHVzKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLmljXTtjYXNlInNob3J0IjpyZXR1cm5bLi4ub3NdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLmFzXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IGxzPVsiQU0iLCJQTSJdLGFjPVsiQmVmb3JlIENocmlzdCIsIkFubm8gRG9taW5pIl0sb2M9WyJCQyIsIkFEIl0sdWM9WyJCIiwiQSJdO2Z1bmN0aW9uIGNzKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLnVjXTtjYXNlInNob3J0IjpyZXR1cm5bLi4ub2NdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLmFjXTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBsYyh0KXtyZXR1cm4gbHNbdC5ob3VyPDEyPzA6MV19ZnVuY3Rpb24gY2ModCxlKXtyZXR1cm4gdXMoZSlbdC53ZWVrZGF5LTFdfWZ1bmN0aW9uIGZjKHQsZSl7cmV0dXJuIGlzKGUpW3QubW9udGgtMV19ZnVuY3Rpb24gZGModCxlKXtyZXR1cm4gY3MoZSlbdC55ZWFyPDA/MDoxXX1mdW5jdGlvbiBoYyh0LGUsbj0iYWx3YXlzIixyPSExKXtjb25zdCBzPXt5ZWFyczpbInllYXIiLCJ5ci4iXSxxdWFydGVyczpbInF1YXJ0ZXIiLCJxdHIuIl0sbW9udGhzOlsibW9udGgiLCJtby4iXSx3ZWVrczpbIndlZWsiLCJ3ay4iXSxkYXlzOlsiZGF5IiwiZGF5IiwiZGF5cyJdLGhvdXJzOlsiaG91ciIsImhyLiJdLG1pbnV0ZXM6WyJtaW51dGUiLCJtaW4uIl0sc2Vjb25kczpbInNlY29uZCIsInNlYy4iXX0saT1bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiXS5pbmRleE9mKHQpPT09LTE7aWYobj09PSJhdXRvIiYmaSl7Y29uc3QgZD10PT09ImRheXMiO3N3aXRjaChlKXtjYXNlIDE6cmV0dXJuIGQ/InRvbW9ycm93IjpgbmV4dCAke3NbdF1bMF19YDtjYXNlLTE6cmV0dXJuIGQ/Inllc3RlcmRheSI6YGxhc3QgJHtzW3RdWzBdfWA7Y2FzZSAwOnJldHVybiBkPyJ0b2RheSI6YHRoaXMgJHtzW3RdWzBdfWB9fWNvbnN0IGE9T2JqZWN0LmlzKGUsLTApfHxlPDAsbz1NYXRoLmFicyhlKSx1PW89PT0xLGw9c1t0XSxjPXI/dT9sWzFdOmxbMl18fGxbMV06dT9zW3RdWzBdOnQ7cmV0dXJuIGE/YCR7b30gJHtjfSBhZ29gOmBpbiAke299ICR7Y31gfWZ1bmN0aW9uIGZzKHQsZSl7bGV0IG49IiI7Zm9yKGNvbnN0IHIgb2YgdClyLmxpdGVyYWw/bis9ci52YWw6bis9ZShyLnZhbCk7cmV0dXJuIG59Y29uc3QgbWM9e0Q6eXQsREQ6bXIsREREOnlyLEREREQ6Z3IsdDpwcix0dDp3cix0dHQ6dnIsdHR0dDpPcixUOlRyLFRUOlNyLFRUVDpicixUVFRUOmtyLGY6SXIsZmY6TnIsZmZmOk1yLGZmZmY6RHIsRjpFcixGRjp4cixGRkY6Q3IsRkZGRjpfcn07Y2xhc3MgeHtzdGF0aWMgY3JlYXRlKGUsbj17fSl7cmV0dXJuIG5ldyB4KGUsbil9c3RhdGljIHBhcnNlRm9ybWF0KGUpe2xldCBuPW51bGwscj0iIixzPSExO2NvbnN0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2NvbnN0IG89ZS5jaGFyQXQoYSk7bz09PSInIj8oci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLG49bnVsbCxyPSIiLHM9IXMpOnN8fG89PT1uP3IrPW86KHIubGVuZ3RoPjAmJmkucHVzaCh7bGl0ZXJhbDovXlxzKyQvLnRlc3QociksdmFsOnJ9KSxyPW8sbj1vKX1yZXR1cm4gci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLGl9c3RhdGljIG1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoZSl7cmV0dXJuIG1jW2VdfWNvbnN0cnVjdG9yKGUsbil7dGhpcy5vcHRzPW4sdGhpcy5sb2M9ZSx0aGlzLnN5c3RlbUxvYz1udWxsfWZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGUsbil7cmV0dXJuIHRoaXMuc3lzdGVtTG9jPT09bnVsbCYmKHRoaXMuc3lzdGVtTG9jPXRoaXMubG9jLnJlZGVmYXVsdFRvU3lzdGVtKCkpLHRoaXMuc3lzdGVtTG9jLmR0Rm9ybWF0dGVyKGUsey4uLnRoaXMub3B0cywuLi5ufSkuZm9ybWF0KCl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZSx7Li4udGhpcy5vcHRzLC4uLm59KX1mb3JtYXREYXRlVGltZShlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0KCl9Zm9ybWF0RGF0ZVRpbWVQYXJ0cyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0VG9QYXJ0cygpfWZvcm1hdEludGVydmFsKGUsbil7cmV0dXJuIHRoaXMuZHRGb3JtYXR0ZXIoZS5zdGFydCxuKS5kdGYuZm9ybWF0UmFuZ2UoZS5zdGFydC50b0pTRGF0ZSgpLGUuZW5kLnRvSlNEYXRlKCkpfXJlc29sdmVkT3B0aW9ucyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikucmVzb2x2ZWRPcHRpb25zKCl9bnVtKGUsbj0wKXtpZih0aGlzLm9wdHMuZm9yY2VTaW1wbGUpcmV0dXJuIEUoZSxuKTtjb25zdCByPXsuLi50aGlzLm9wdHN9O3JldHVybiBuPjAmJihyLnBhZFRvPW4pLHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihyKS5mb3JtYXQoZSl9Zm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj10aGlzLmxvYy5saXN0aW5nTW9kZSgpPT09ImVuIixzPXRoaXMubG9jLm91dHB1dENhbGVuZGFyJiZ0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciE9PSJncmVnb3J5IixpPShoLFMpPT50aGlzLmxvYy5leHRyYWN0KGUsaCxTKSxhPWg9PmUuaXNPZmZzZXRGaXhlZCYmZS5vZmZzZXQ9PT0wJiZoLmFsbG93Wj8iWiI6ZS5pc1ZhbGlkP2Uuem9uZS5mb3JtYXRPZmZzZXQoZS50cyxoLmZvcm1hdCk6IiIsbz0oKT0+cj9sYyhlKTppKHtob3VyOiJudW1lcmljIixob3VyQ3ljbGU6ImgxMiJ9LCJkYXlwZXJpb2QiKSx1PShoLFMpPT5yP2ZjKGUsaCk6aShTP3ttb250aDpofTp7bW9udGg6aCxkYXk6Im51bWVyaWMifSwibW9udGgiKSxsPShoLFMpPT5yP2NjKGUsaCk6aShTP3t3ZWVrZGF5Omh9Ont3ZWVrZGF5OmgsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9LCJ3ZWVrZGF5IiksYz1oPT57Y29uc3QgUz14Lm1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoaCk7cmV0dXJuIFM/dGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChlLFMpOmh9LGQ9aD0+cj9kYyhlLGgpOmkoe2VyYTpofSwiZXJhIikseT1oPT57c3dpdGNoKGgpe2Nhc2UiUyI6cmV0dXJuIHRoaXMubnVtKGUubWlsbGlzZWNvbmQpO2Nhc2UidSI6Y2FzZSJTU1MiOnJldHVybiB0aGlzLm51bShlLm1pbGxpc2Vjb25kLDMpO2Nhc2UicyI6cmV0dXJuIHRoaXMubnVtKGUuc2Vjb25kKTtjYXNlInNzIjpyZXR1cm4gdGhpcy5udW0oZS5zZWNvbmQsMik7Y2FzZSJ1dSI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS5taWxsaXNlY29uZC8xMCksMik7Y2FzZSJ1dXUiOnJldHVybiB0aGlzLm51bShNYXRoLmZsb29yKGUubWlsbGlzZWNvbmQvMTAwKSk7Y2FzZSJtIjpyZXR1cm4gdGhpcy5udW0oZS5taW51dGUpO2Nhc2UibW0iOnJldHVybiB0aGlzLm51bShlLm1pbnV0ZSwyKTtjYXNlImgiOnJldHVybiB0aGlzLm51bShlLmhvdXIlMTI9PT0wPzEyOmUuaG91ciUxMik7Y2FzZSJoaCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciUxMj09PTA/MTI6ZS5ob3VyJTEyLDIpO2Nhc2UiSCI6cmV0dXJuIHRoaXMubnVtKGUuaG91cik7Y2FzZSJISCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciwyKTtjYXNlIloiOnJldHVybiBhKHtmb3JtYXQ6Im5hcnJvdyIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaIjpyZXR1cm4gYSh7Zm9ybWF0OiJzaG9ydCIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaWiI6cmV0dXJuIGEoe2Zvcm1hdDoidGVjaGllIixhbGxvd1o6dGhpcy5vcHRzLmFsbG93Wn0pO2Nhc2UiWlpaWiI6cmV0dXJuIGUuem9uZS5vZmZzZXROYW1lKGUudHMse2Zvcm1hdDoic2hvcnQiLGxvY2FsZTp0aGlzLmxvYy5sb2NhbGV9KTtjYXNlIlpaWlpaIjpyZXR1cm4gZS56b25lLm9mZnNldE5hbWUoZS50cyx7Zm9ybWF0OiJsb25nIixsb2NhbGU6dGhpcy5sb2MubG9jYWxlfSk7Y2FzZSJ6IjpyZXR1cm4gZS56b25lTmFtZTtjYXNlImEiOnJldHVybiBvKCk7Y2FzZSJkIjpyZXR1cm4gcz9pKHtkYXk6Im51bWVyaWMifSwiZGF5Iik6dGhpcy5udW0oZS5kYXkpO2Nhc2UiZGQiOnJldHVybiBzP2koe2RheToiMi1kaWdpdCJ9LCJkYXkiKTp0aGlzLm51bShlLmRheSwyKTtjYXNlImMiOnJldHVybiB0aGlzLm51bShlLndlZWtkYXkpO2Nhc2UiY2NjIjpyZXR1cm4gbCgic2hvcnQiLCEwKTtjYXNlImNjY2MiOnJldHVybiBsKCJsb25nIiwhMCk7Y2FzZSJjY2NjYyI6cmV0dXJuIGwoIm5hcnJvdyIsITApO2Nhc2UiRSI6cmV0dXJuIHRoaXMubnVtKGUud2Vla2RheSk7Y2FzZSJFRUUiOnJldHVybiBsKCJzaG9ydCIsITEpO2Nhc2UiRUVFRSI6cmV0dXJuIGwoImxvbmciLCExKTtjYXNlIkVFRUVFIjpyZXR1cm4gbCgibmFycm93IiwhMSk7Y2FzZSJMIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyIsZGF5OiJudW1lcmljIn0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCk7Y2FzZSJMTCI6cmV0dXJuIHM/aSh7bW9udGg6IjItZGlnaXQiLGRheToibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgsMik7Y2FzZSJMTEwiOnJldHVybiB1KCJzaG9ydCIsITApO2Nhc2UiTExMTCI6cmV0dXJuIHUoImxvbmciLCEwKTtjYXNlIkxMTExMIjpyZXR1cm4gdSgibmFycm93IiwhMCk7Y2FzZSJNIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgpO2Nhc2UiTU0iOnJldHVybiBzP2koe21vbnRoOiIyLWRpZ2l0In0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCwyKTtjYXNlIk1NTSI6cmV0dXJuIHUoInNob3J0IiwhMSk7Y2FzZSJNTU1NIjpyZXR1cm4gdSgibG9uZyIsITEpO2Nhc2UiTU1NTU0iOnJldHVybiB1KCJuYXJyb3ciLCExKTtjYXNlInkiOnJldHVybiBzP2koe3llYXI6Im51bWVyaWMifSwieWVhciIpOnRoaXMubnVtKGUueWVhcik7Y2FzZSJ5eSI6cmV0dXJuIHM/aSh7eWVhcjoiMi1kaWdpdCJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLDIpO2Nhc2UieXl5eSI6cmV0dXJuIHM/aSh7eWVhcjoibnVtZXJpYyJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLDQpO2Nhc2UieXl5eXl5IjpyZXR1cm4gcz9pKHt5ZWFyOiJudW1lcmljIn0sInllYXIiKTp0aGlzLm51bShlLnllYXIsNik7Y2FzZSJHIjpyZXR1cm4gZCgic2hvcnQiKTtjYXNlIkdHIjpyZXR1cm4gZCgibG9uZyIpO2Nhc2UiR0dHR0ciOnJldHVybiBkKCJuYXJyb3ciKTtjYXNlImtrIjpyZXR1cm4gdGhpcy5udW0oZS53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwyKTtjYXNlImtra2siOnJldHVybiB0aGlzLm51bShlLndlZWtZZWFyLDQpO2Nhc2UiVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlcik7Y2FzZSJXVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlciwyKTtjYXNlIm4iOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla051bWJlcik7Y2FzZSJubiI6cmV0dXJuIHRoaXMubnVtKGUubG9jYWxXZWVrTnVtYmVyLDIpO2Nhc2UiaWkiOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla1llYXIudG9TdHJpbmcoKS5zbGljZSgtMiksMik7Y2FzZSJpaWlpIjpyZXR1cm4gdGhpcy5udW0oZS5sb2NhbFdlZWtZZWFyLDQpO2Nhc2UibyI6cmV0dXJuIHRoaXMubnVtKGUub3JkaW5hbCk7Y2FzZSJvb28iOnJldHVybiB0aGlzLm51bShlLm9yZGluYWwsMyk7Y2FzZSJxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyKTtjYXNlInFxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyLDIpO2Nhc2UiWCI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS50cy8xZTMpKTtjYXNlIngiOnJldHVybiB0aGlzLm51bShlLnRzKTtkZWZhdWx0OnJldHVybiBjKGgpfX07cmV0dXJuIGZzKHgucGFyc2VGb3JtYXQobikseSl9Zm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj11PT57c3dpdGNoKHVbMF0pe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpyZXR1cm4iaG91ciI7Y2FzZSJkIjpyZXR1cm4iZGF5IjtjYXNlInciOnJldHVybiJ3ZWVrIjtjYXNlIk0iOnJldHVybiJtb250aCI7Y2FzZSJ5IjpyZXR1cm4ieWVhciI7ZGVmYXVsdDpyZXR1cm4gbnVsbH19LHM9dT0+bD0+e2NvbnN0IGM9cihsKTtyZXR1cm4gYz90aGlzLm51bSh1LmdldChjKSxsLmxlbmd0aCk6bH0saT14LnBhcnNlRm9ybWF0KG4pLGE9aS5yZWR1Y2UoKHUse2xpdGVyYWw6bCx2YWw6Y30pPT5sP3U6dS5jb25jYXQoYyksW10pLG89ZS5zaGlmdFRvKC4uLmEubWFwKHIpLmZpbHRlcih1PT51KSk7cmV0dXJuIGZzKGkscyhvKSl9fWNvbnN0IGRzPS9bQS1aYS16XystXXsxLDI1Nn0oPzo6P1wvW0EtWmEtejAtOV8rLV17MSwyNTZ9KD86XC9bQS1aYS16MC05XystXXsxLDI1Nn0pPyk/LztmdW5jdGlvbiBJZSguLi50KXtjb25zdCBlPXQucmVkdWNlKChuLHIpPT5uK3Iuc291cmNlLCIiKTtyZXR1cm4gUmVnRXhwKGBeJHtlfSRgKX1mdW5jdGlvbiBFZSguLi50KXtyZXR1cm4gZT0+dC5yZWR1Y2UoKFtuLHIsc10saSk9Pntjb25zdFthLG8sdV09aShlLHMpO3JldHVyblt7Li4ubiwuLi5hfSxvfHxyLHVdfSxbe30sbnVsbCwxXSkuc2xpY2UoMCwyKX1mdW5jdGlvbiBOZSh0LC4uLmUpe2lmKHQ9PW51bGwpcmV0dXJuW251bGwsbnVsbF07Zm9yKGNvbnN0W24scl1vZiBlKXtjb25zdCBzPW4uZXhlYyh0KTtpZihzKXJldHVybiByKHMpfXJldHVybltudWxsLG51bGxdfWZ1bmN0aW9uIGhzKC4uLnQpe3JldHVybihlLG4pPT57Y29uc3Qgcj17fTtsZXQgcztmb3Iocz0wO3M8dC5sZW5ndGg7cysrKXJbdFtzXV09cmUoZVtuK3NdKTtyZXR1cm5bcixudWxsLG4rc119fWNvbnN0IG1zPS8oPzooWil8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8pLyx5Yz1gKD86JHttcy5zb3VyY2V9Pyg/OlxcWygke2RzLnNvdXJjZX0pXFxdKT8pP2AsbW49LyhcZFxkKSg/Ojo/KFxkXGQpKD86Oj8oXGRcZCkoPzpbLixdKFxkezEsMzB9KSk/KT8pPy8seXM9UmVnRXhwKGAke21uLnNvdXJjZX0ke3ljfWApLHluPVJlZ0V4cChgKD86VCR7eXMuc291cmNlfSk/YCksZ2M9LyhbKy1dXGR7Nn18XGR7NH0pKD86LT8oXGRcZCkoPzotPyhcZFxkKSk/KT8vLHBjPS8oXGR7NH0pLT9XKFxkXGQpKD86LT8oXGQpKT8vLHdjPS8oXGR7NH0pLT8oXGR7M30pLyx2Yz1ocygid2Vla1llYXIiLCJ3ZWVrTnVtYmVyIiwid2Vla0RheSIpLE9jPWhzKCJ5ZWFyIiwib3JkaW5hbCIpLFRjPS8oXGR7NH0pLShcZFxkKS0oXGRcZCkvLGdzPVJlZ0V4cChgJHttbi5zb3VyY2V9ID8oPzoke21zLnNvdXJjZX18KCR7ZHMuc291cmNlfSkpP2ApLFNjPVJlZ0V4cChgKD86ICR7Z3Muc291cmNlfSk/YCk7ZnVuY3Rpb24geGUodCxlLG4pe2NvbnN0IHI9dFtlXTtyZXR1cm4gZyhyKT9uOnJlKHIpfWZ1bmN0aW9uIGJjKHQsZSl7cmV0dXJuW3t5ZWFyOnhlKHQsZSksbW9udGg6eGUodCxlKzEsMSksZGF5OnhlKHQsZSsyLDEpfSxudWxsLGUrM119ZnVuY3Rpb24gTWUodCxlKXtyZXR1cm5be2hvdXJzOnhlKHQsZSwwKSxtaW51dGVzOnhlKHQsZSsxLDApLHNlY29uZHM6eGUodCxlKzIsMCksbWlsbGlzZWNvbmRzOmZuKHRbZSszXSl9LG51bGwsZSs0XX1mdW5jdGlvbiBxZSh0LGUpe2NvbnN0IG49IXRbZV0mJiF0W2UrMV0scj1rdCh0W2UrMV0sdFtlKzJdKSxzPW4/bnVsbDpELmluc3RhbmNlKHIpO3JldHVyblt7fSxzLGUrM119ZnVuY3Rpb24gWWUodCxlKXtjb25zdCBuPXRbZV0/Si5jcmVhdGUodFtlXSk6bnVsbDtyZXR1cm5be30sbixlKzFdfWNvbnN0IGtjPVJlZ0V4cChgXlQ/JHttbi5zb3VyY2V9JGApLEljPS9eLT9QKD86KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pWSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pTSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pVyk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pRCk/KD86VCg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KUgpPyg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KU0pPyg/OigtP1xkezEsMjB9KSg/OlsuLF0oLT9cZHsxLDIwfSkpP1MpPyk/KSQvO2Z1bmN0aW9uIEVjKHQpe2NvbnN0W2UsbixyLHMsaSxhLG8sdSxsXT10LGM9ZVswXT09PSItIixkPXUmJnVbMF09PT0iLSIseT0oaCxTPSExKT0+aCE9PXZvaWQgMCYmKFN8fGgmJmMpPy1oOmg7cmV0dXJuW3t5ZWFyczp5KGZlKG4pKSxtb250aHM6eShmZShyKSksd2Vla3M6eShmZShzKSksZGF5czp5KGZlKGkpKSxob3Vyczp5KGZlKGEpKSxtaW51dGVzOnkoZmUobykpLHNlY29uZHM6eShmZSh1KSx1PT09Ii0wIiksbWlsbGlzZWNvbmRzOnkoZm4obCksZCl9XX1jb25zdCBOYz17R01UOjAsRURUOi00KjYwLEVTVDotNSo2MCxDRFQ6LTUqNjAsQ1NUOi02KjYwLE1EVDotNio2MCxNU1Q6LTcqNjAsUERUOi03KjYwLFBTVDotOCo2MH07ZnVuY3Rpb24gZ24odCxlLG4scixzLGksYSl7Y29uc3Qgbz17eWVhcjplLmxlbmd0aD09PTI/aG4ocmUoZSkpOnJlKGUpLG1vbnRoOnNzLmluZGV4T2YobikrMSxkYXk6cmUociksaG91cjpyZShzKSxtaW51dGU6cmUoaSl9O3JldHVybiBhJiYoby5zZWNvbmQ9cmUoYSkpLHQmJihvLndlZWtkYXk9dC5sZW5ndGg+Mz9hcy5pbmRleE9mKHQpKzE6b3MuaW5kZXhPZih0KSsxKSxvfWNvbnN0IHhjPS9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksXHMpPyhcZHsxLDJ9KVxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxzKFxkezIsNH0pXHMoXGRcZCk6KFxkXGQpKD86OihcZFxkKSk/XHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KD86KFsrLV1cZFxkKShcZFxkKSkpJC87ZnVuY3Rpb24gTWModCl7Y29uc3RbLGUsbixyLHMsaSxhLG8sdSxsLGMsZF09dCx5PWduKGUscyxyLG4saSxhLG8pO2xldCBoO3JldHVybiB1P2g9TmNbdV06bD9oPTA6aD1rdChjLGQpLFt5LG5ldyBEKGgpXX1mdW5jdGlvbiBDYyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9cKFteKCldKlwpfFtcblx0XS9nLCIgIikucmVwbGFjZSgvKFxzXHMrKS9nLCIgIikudHJpbSgpfWNvbnN0IERjPS9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksIChcZFxkKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpIChcZHs0fSkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sX2M9L14oTW9uZGF5fFR1ZXNkYXl8V2VkbmVzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheXxTdW5kYXkpLCAoXGRcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sRmM9L14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXGR8XGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgKFxkezR9KSQvO2Z1bmN0aW9uIHBzKHQpe2NvbnN0WyxlLG4scixzLGksYSxvXT10O3JldHVybltnbihlLHMscixuLGksYSxvKSxELnV0Y0luc3RhbmNlXX1mdW5jdGlvbiBBYyh0KXtjb25zdFssZSxuLHIscyxpLGEsb109dDtyZXR1cm5bZ24oZSxvLG4scixzLGksYSksRC51dGNJbnN0YW5jZV19Y29uc3QgVmM9SWUoZ2MseW4pLFdjPUllKHBjLHluKSwkYz1JZSh3Yyx5biksTGM9SWUoeXMpLHdzPUVlKGJjLE1lLHFlLFllKSx6Yz1FZSh2YyxNZSxxZSxZZSksWmM9RWUoT2MsTWUscWUsWWUpLFJjPUVlKE1lLHFlLFllKTtmdW5jdGlvbiBQYyh0KXtyZXR1cm4gTmUodCxbVmMsd3NdLFtXYyx6Y10sWyRjLFpjXSxbTGMsUmNdKX1mdW5jdGlvbiBqYyh0KXtyZXR1cm4gTmUoQ2ModCksW3hjLE1jXSl9ZnVuY3Rpb24gVWModCl7cmV0dXJuIE5lKHQsW0RjLHBzXSxbX2MscHNdLFtGYyxBY10pfWZ1bmN0aW9uIEhjKHQpe3JldHVybiBOZSh0LFtJYyxFY10pfWNvbnN0IHFjPUVlKE1lKTtmdW5jdGlvbiBZYyh0KXtyZXR1cm4gTmUodCxba2MscWNdKX1jb25zdCBHYz1JZShUYyxTYyksSmM9SWUoZ3MpLEJjPUVlKE1lLHFlLFllKTtmdW5jdGlvbiBRYyh0KXtyZXR1cm4gTmUodCxbR2Msd3NdLFtKYyxCY10pfWNvbnN0IHZzPSJJbnZhbGlkIER1cmF0aW9uIixPcz17d2Vla3M6e2RheXM6Nyxob3Vyczo3KjI0LG1pbnV0ZXM6NyoyNCo2MCxzZWNvbmRzOjcqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOjcqMjQqNjAqNjAqMWUzfSxkYXlzOntob3VyczoyNCxtaW51dGVzOjI0KjYwLHNlY29uZHM6MjQqNjAqNjAsbWlsbGlzZWNvbmRzOjI0KjYwKjYwKjFlM30saG91cnM6e21pbnV0ZXM6NjAsc2Vjb25kczo2MCo2MCxtaWxsaXNlY29uZHM6NjAqNjAqMWUzfSxtaW51dGVzOntzZWNvbmRzOjYwLG1pbGxpc2Vjb25kczo2MCoxZTN9LHNlY29uZHM6e21pbGxpc2Vjb25kczoxZTN9fSxLYz17eWVhcnM6e3F1YXJ0ZXJzOjQsbW9udGhzOjEyLHdlZWtzOjUyLGRheXM6MzY1LGhvdXJzOjM2NSoyNCxtaW51dGVzOjM2NSoyNCo2MCxzZWNvbmRzOjM2NSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzY1KjI0KjYwKjYwKjFlM30scXVhcnRlcnM6e21vbnRoczozLHdlZWtzOjEzLGRheXM6OTEsaG91cnM6OTEqMjQsbWludXRlczo5MSoyNCo2MCxzZWNvbmRzOjkxKjI0KjYwKjYwLG1pbGxpc2Vjb25kczo5MSoyNCo2MCo2MCoxZTN9LG1vbnRoczp7d2Vla3M6NCxkYXlzOjMwLGhvdXJzOjMwKjI0LG1pbnV0ZXM6MzAqMjQqNjAsc2Vjb25kczozMCoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzAqMjQqNjAqNjAqMWUzfSwuLi5Pc30sTD0xNDYwOTcvNDAwLENlPTE0NjA5Ny80ODAwLFhjPXt5ZWFyczp7cXVhcnRlcnM6NCxtb250aHM6MTIsd2Vla3M6TC83LGRheXM6TCxob3VyczpMKjI0LG1pbnV0ZXM6TCoyNCo2MCxzZWNvbmRzOkwqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzfSxxdWFydGVyczp7bW9udGhzOjMsd2Vla3M6TC8yOCxkYXlzOkwvNCxob3VyczpMKjI0LzQsbWludXRlczpMKjI0KjYwLzQsc2Vjb25kczpMKjI0KjYwKjYwLzQsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzLzR9LG1vbnRoczp7d2Vla3M6Q2UvNyxkYXlzOkNlLGhvdXJzOkNlKjI0LG1pbnV0ZXM6Q2UqMjQqNjAsc2Vjb25kczpDZSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6Q2UqMjQqNjAqNjAqMWUzfSwuLi5Pc30sZGU9WyJ5ZWFycyIsInF1YXJ0ZXJzIiwibW9udGhzIiwid2Vla3MiLCJkYXlzIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsIm1pbGxpc2Vjb25kcyJdLGVmPWRlLnNsaWNlKDApLnJldmVyc2UoKTtmdW5jdGlvbiBzZSh0LGUsbj0hMSl7Y29uc3Qgcj17dmFsdWVzOm4/ZS52YWx1ZXM6ey4uLnQudmFsdWVzLC4uLmUudmFsdWVzfHx7fX0sbG9jOnQubG9jLmNsb25lKGUubG9jKSxjb252ZXJzaW9uQWNjdXJhY3k6ZS5jb252ZXJzaW9uQWNjdXJhY3l8fHQuY29udmVyc2lvbkFjY3VyYWN5LG1hdHJpeDplLm1hdHJpeHx8dC5tYXRyaXh9O3JldHVybiBuZXcgdihyKX1mdW5jdGlvbiBUcyh0LGUpe2xldCBuPWUubWlsbGlzZWNvbmRzPz8wO2Zvcihjb25zdCByIG9mIGVmLnNsaWNlKDEpKWVbcl0mJihuKz1lW3JdKnRbcl0ubWlsbGlzZWNvbmRzKTtyZXR1cm4gbn1mdW5jdGlvbiBTcyh0LGUpe2NvbnN0IG49VHModCxlKTwwPy0xOjE7ZGUucmVkdWNlUmlnaHQoKHIscyk9PntpZihnKGVbc10pKXJldHVybiByO2lmKHIpe2NvbnN0IGk9ZVtyXSpuLGE9dFtzXVtyXSxvPU1hdGguZmxvb3IoaS9hKTtlW3NdKz1vKm4sZVtyXS09byphKm59cmV0dXJuIHN9LG51bGwpLGRlLnJlZHVjZSgocixzKT0+e2lmKGcoZVtzXSkpcmV0dXJuIHI7aWYocil7Y29uc3QgaT1lW3JdJTE7ZVtyXS09aSxlW3NdKz1pKnRbcl1bc119cmV0dXJuIHN9LG51bGwpfWZ1bmN0aW9uIHRmKHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyh0KSlyIT09MCYmKGVbbl09cik7cmV0dXJuIGV9Y2xhc3Mgdntjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuY29udmVyc2lvbkFjY3VyYWN5PT09Imxvbmd0ZXJtInx8ITE7bGV0IHI9bj9YYzpLYztlLm1hdHJpeCYmKHI9ZS5tYXRyaXgpLHRoaXMudmFsdWVzPWUudmFsdWVzLHRoaXMubG9jPWUubG9jfHxULmNyZWF0ZSgpLHRoaXMuY29udmVyc2lvbkFjY3VyYWN5PW4/Imxvbmd0ZXJtIjoiY2FzdWFsIix0aGlzLmludmFsaWQ9ZS5pbnZhbGlkfHxudWxsLHRoaXMubWF0cml4PXIsdGhpcy5pc0x1eG9uRHVyYXRpb249ITB9c3RhdGljIGZyb21NaWxsaXMoZSxuKXtyZXR1cm4gdi5mcm9tT2JqZWN0KHttaWxsaXNlY29uZHM6ZX0sbil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtpZihlPT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IF8oYER1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290ICR7ZT09PW51bGw/Im51bGwiOnR5cGVvZiBlfWApO3JldHVybiBuZXcgdih7dmFsdWVzOkl0KGUsdi5ub3JtYWxpemVVbml0KSxsb2M6VC5mcm9tT2JqZWN0KG4pLGNvbnZlcnNpb25BY2N1cmFjeTpuLmNvbnZlcnNpb25BY2N1cmFjeSxtYXRyaXg6bi5tYXRyaXh9KX1zdGF0aWMgZnJvbUR1cmF0aW9uTGlrZShlKXtpZihjZShlKSlyZXR1cm4gdi5mcm9tTWlsbGlzKGUpO2lmKHYuaXNEdXJhdGlvbihlKSlyZXR1cm4gZTtpZih0eXBlb2YgZT09Im9iamVjdCIpcmV0dXJuIHYuZnJvbU9iamVjdChlKTt0aHJvdyBuZXcgXyhgVW5rbm93biBkdXJhdGlvbiBhcmd1bWVudCAke2V9IG9mIHR5cGUgJHt0eXBlb2YgZX1gKX1zdGF0aWMgZnJvbUlTTyhlLG4pe2NvbnN0W3JdPUhjKGUpO3JldHVybiByP3YuZnJvbU9iamVjdChyLG4pOnYuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGZyb21JU09UaW1lKGUsbil7Y29uc3Rbcl09WWMoZSk7cmV0dXJuIHI/di5mcm9tT2JqZWN0KHIsbik6di5pbnZhbGlkKCJ1bnBhcnNhYmxlIixgdGhlIGlucHV0ICIke2V9IiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKX1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IF8oIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIFo/ZTpuZXcgWihlLG4pO2lmKEkudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IHhsKHIpO3JldHVybiBuZXcgdih7aW52YWxpZDpyfSl9c3RhdGljIG5vcm1hbGl6ZVVuaXQoZSl7Y29uc3Qgbj17eWVhcjoieWVhcnMiLHllYXJzOiJ5ZWFycyIscXVhcnRlcjoicXVhcnRlcnMiLHF1YXJ0ZXJzOiJxdWFydGVycyIsbW9udGg6Im1vbnRocyIsbW9udGhzOiJtb250aHMiLHdlZWs6IndlZWtzIix3ZWVrczoid2Vla3MiLGRheToiZGF5cyIsZGF5czoiZGF5cyIsaG91cjoiaG91cnMiLGhvdXJzOiJob3VycyIsbWludXRlOiJtaW51dGVzIixtaW51dGVzOiJtaW51dGVzIixzZWNvbmQ6InNlY29uZHMiLHNlY29uZHM6InNlY29uZHMiLG1pbGxpc2Vjb25kOiJtaWxsaXNlY29uZHMiLG1pbGxpc2Vjb25kczoibWlsbGlzZWNvbmRzIn1bZSYmZS50b0xvd2VyQ2FzZSgpXTtpZighbil0aHJvdyBuZXcgaHIoZSk7cmV0dXJuIG59c3RhdGljIGlzRHVyYXRpb24oZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkR1cmF0aW9ufHwhMX1nZXQgbG9jYWxlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5sb2NhbGU6bnVsbH1nZXQgbnVtYmVyaW5nU3lzdGVtKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW06bnVsbH10b0Zvcm1hdChlLG49e30pe2NvbnN0IHI9ey4uLm4sZmxvb3I6bi5yb3VuZCE9PSExJiZuLmZsb29yIT09ITF9O3JldHVybiB0aGlzLmlzVmFsaWQ/eC5jcmVhdGUodGhpcy5sb2MscikuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsZSk6dnN9dG9IdW1hbihlPXt9KXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB2cztjb25zdCBuPWRlLm1hcChyPT57Y29uc3Qgcz10aGlzLnZhbHVlc1tyXTtyZXR1cm4gZyhzKT9udWxsOnRoaXMubG9jLm51bWJlckZvcm1hdHRlcih7c3R5bGU6InVuaXQiLHVuaXREaXNwbGF5OiJsb25nIiwuLi5lLHVuaXQ6ci5zbGljZSgwLC0xKX0pLmZvcm1hdChzKX0pLmZpbHRlcihyPT5yKTtyZXR1cm4gdGhpcy5sb2MubGlzdEZvcm1hdHRlcih7dHlwZToiY29uanVuY3Rpb24iLHN0eWxlOmUubGlzdFN0eWxlfHwibmFycm93IiwuLi5lfSkuZm9ybWF0KG4pfXRvT2JqZWN0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD97Li4udGhpcy52YWx1ZXN9Ont9fXRvSVNPKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtsZXQgZT0iUCI7cmV0dXJuIHRoaXMueWVhcnMhPT0wJiYoZSs9dGhpcy55ZWFycysiWSIpLCh0aGlzLm1vbnRocyE9PTB8fHRoaXMucXVhcnRlcnMhPT0wKSYmKGUrPXRoaXMubW9udGhzK3RoaXMucXVhcnRlcnMqMysiTSIpLHRoaXMud2Vla3MhPT0wJiYoZSs9dGhpcy53ZWVrcysiVyIpLHRoaXMuZGF5cyE9PTAmJihlKz10aGlzLmRheXMrIkQiKSwodGhpcy5ob3VycyE9PTB8fHRoaXMubWludXRlcyE9PTB8fHRoaXMuc2Vjb25kcyE9PTB8fHRoaXMubWlsbGlzZWNvbmRzIT09MCkmJihlKz0iVCIpLHRoaXMuaG91cnMhPT0wJiYoZSs9dGhpcy5ob3VycysiSCIpLHRoaXMubWludXRlcyE9PTAmJihlKz10aGlzLm1pbnV0ZXMrIk0iKSwodGhpcy5zZWNvbmRzIT09MHx8dGhpcy5taWxsaXNlY29uZHMhPT0wKSYmKGUrPWRuKHRoaXMuc2Vjb25kcyt0aGlzLm1pbGxpc2Vjb25kcy8xZTMsMykrIlMiKSxlPT09IlAiJiYoZSs9IlQwUyIpLGV9dG9JU09UaW1lKGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3Qgbj10aGlzLnRvTWlsbGlzKCk7cmV0dXJuIG48MHx8bj49ODY0ZTU/bnVsbDooZT17c3VwcHJlc3NNaWxsaXNlY29uZHM6ITEsc3VwcHJlc3NTZWNvbmRzOiExLGluY2x1ZGVQcmVmaXg6ITEsZm9ybWF0OiJleHRlbmRlZCIsLi4uZSxpbmNsdWRlT2Zmc2V0OiExfSxwLmZyb21NaWxsaXMobix7em9uZToiVVRDIn0pLnRvSVNPVGltZShlKSl9dG9KU09OKCl7cmV0dXJuIHRoaXMudG9JU08oKX10b1N0cmluZygpe3JldHVybiB0aGlzLnRvSVNPKCl9W1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gRHVyYXRpb24geyB2YWx1ZXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZXMpfSB9YDpgRHVyYXRpb24geyBJbnZhbGlkLCByZWFzb246ICR7dGhpcy5pbnZhbGlkUmVhc29ufSB9YH10b01pbGxpcygpe3JldHVybiB0aGlzLmlzVmFsaWQ/VHModGhpcy5tYXRyaXgsdGhpcy52YWx1ZXMpOk5hTn12YWx1ZU9mKCl7cmV0dXJuIHRoaXMudG9NaWxsaXMoKX1wbHVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj12LmZyb21EdXJhdGlvbkxpa2UoZSkscj17fTtmb3IoY29uc3QgcyBvZiBkZSkoYmUobi52YWx1ZXMscyl8fGJlKHRoaXMudmFsdWVzLHMpKSYmKHJbc109bi5nZXQocykrdGhpcy5nZXQocykpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6cn0sITApfW1pbnVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj12LmZyb21EdXJhdGlvbkxpa2UoZSk7cmV0dXJuIHRoaXMucGx1cyhuLm5lZ2F0ZSgpKX1tYXBVbml0cyhlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49e307Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmtleXModGhpcy52YWx1ZXMpKW5bcl09cnMoZSh0aGlzLnZhbHVlc1tyXSxyKSk7cmV0dXJuIHNlKHRoaXMse3ZhbHVlczpufSwhMCl9Z2V0KGUpe3JldHVybiB0aGlzW3Yubm9ybWFsaXplVW5pdChlKV19c2V0KGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj17Li4udGhpcy52YWx1ZXMsLi4uSXQoZSx2Lm5vcm1hbGl6ZVVuaXQpfTtyZXR1cm4gc2UodGhpcyx7dmFsdWVzOm59KX1yZWNvbmZpZ3VyZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sY29udmVyc2lvbkFjY3VyYWN5OnIsbWF0cml4OnN9PXt9KXtjb25zdCBhPXtsb2M6dGhpcy5sb2MuY2xvbmUoe2xvY2FsZTplLG51bWJlcmluZ1N5c3RlbTpufSksbWF0cml4OnMsY29udmVyc2lvbkFjY3VyYWN5OnJ9O3JldHVybiBzZSh0aGlzLGEpfWFzKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKGUpLmdldChlKTpOYU59bm9ybWFsaXplKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPXRoaXMudG9PYmplY3QoKTtyZXR1cm4gU3ModGhpcy5tYXRyaXgsZSksc2UodGhpcyx7dmFsdWVzOmV9LCEwKX1yZXNjYWxlKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPXRmKHRoaXMubm9ybWFsaXplKCkuc2hpZnRUb0FsbCgpLnRvT2JqZWN0KCkpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6ZX0sITApfXNoaWZ0VG8oLi4uZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztpZihlLmxlbmd0aD09PTApcmV0dXJuIHRoaXM7ZT1lLm1hcChhPT52Lm5vcm1hbGl6ZVVuaXQoYSkpO2NvbnN0IG49e30scj17fSxzPXRoaXMudG9PYmplY3QoKTtsZXQgaTtmb3IoY29uc3QgYSBvZiBkZSlpZihlLmluZGV4T2YoYSk+PTApe2k9YTtsZXQgbz0wO2Zvcihjb25zdCBsIGluIHIpbys9dGhpcy5tYXRyaXhbbF1bYV0qcltsXSxyW2xdPTA7Y2Uoc1thXSkmJihvKz1zW2FdKTtjb25zdCB1PU1hdGgudHJ1bmMobyk7blthXT11LHJbYV09KG8qMWUzLXUqMWUzKS8xZTN9ZWxzZSBjZShzW2FdKSYmKHJbYV09c1thXSk7Zm9yKGNvbnN0IGEgaW4gcilyW2FdIT09MCYmKG5baV0rPWE9PT1pP3JbYV06clthXS90aGlzLm1hdHJpeFtpXVthXSk7cmV0dXJuIFNzKHRoaXMubWF0cml4LG4pLHNlKHRoaXMse3ZhbHVlczpufSwhMCl9c2hpZnRUb0FsbCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKCJ5ZWFycyIsIm1vbnRocyIsIndlZWtzIiwiZGF5cyIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiKTp0aGlzfW5lZ2F0ZSgpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3QgZT17fTtmb3IoY29uc3QgbiBvZiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykpZVtuXT10aGlzLnZhbHVlc1tuXT09PTA/MDotdGhpcy52YWx1ZXNbbl07cmV0dXJuIHNlKHRoaXMse3ZhbHVlczplfSwhMCl9Z2V0IHllYXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy55ZWFyc3x8MDpOYU59Z2V0IHF1YXJ0ZXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5xdWFydGVyc3x8MDpOYU59Z2V0IG1vbnRocygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMubW9udGhzfHwwOk5hTn1nZXQgd2Vla3MoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLndlZWtzfHwwOk5hTn1nZXQgZGF5cygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMuZGF5c3x8MDpOYU59Z2V0IGhvdXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5ob3Vyc3x8MDpOYU59Z2V0IG1pbnV0ZXMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLm1pbnV0ZXN8fDA6TmFOfWdldCBzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5zZWNvbmRzfHwwOk5hTn1nZXQgbWlsbGlzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5taWxsaXNlY29uZHN8fDA6TmFOfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZD09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1lcXVhbHMoZSl7aWYoIXRoaXMuaXNWYWxpZHx8IWUuaXNWYWxpZHx8IXRoaXMubG9jLmVxdWFscyhlLmxvYykpcmV0dXJuITE7ZnVuY3Rpb24gbihyLHMpe3JldHVybiByPT09dm9pZCAwfHxyPT09MD9zPT09dm9pZCAwfHxzPT09MDpyPT09c31mb3IoY29uc3QgciBvZiBkZSlpZighbih0aGlzLnZhbHVlc1tyXSxlLnZhbHVlc1tyXSkpcmV0dXJuITE7cmV0dXJuITB9fWNvbnN0IERlPSJJbnZhbGlkIEludGVydmFsIjtmdW5jdGlvbiBuZih0LGUpe3JldHVybiF0fHwhdC5pc1ZhbGlkP2suaW52YWxpZCgibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0Iik6IWV8fCFlLmlzVmFsaWQ/ay5pbnZhbGlkKCJtaXNzaW5nIG9yIGludmFsaWQgZW5kIik6ZTx0P2suaW52YWxpZCgiZW5kIGJlZm9yZSBzdGFydCIsYFRoZSBlbmQgb2YgYW4gaW50ZXJ2YWwgbXVzdCBiZSBhZnRlciBpdHMgc3RhcnQsIGJ1dCB5b3UgaGFkIHN0YXJ0PSR7dC50b0lTTygpfSBhbmQgZW5kPSR7ZS50b0lTTygpfWApOm51bGx9Y2xhc3Mga3tjb25zdHJ1Y3RvcihlKXt0aGlzLnM9ZS5zdGFydCx0aGlzLmU9ZS5lbmQsdGhpcy5pbnZhbGlkPWUuaW52YWxpZHx8bnVsbCx0aGlzLmlzTHV4b25JbnRlcnZhbD0hMH1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IF8oIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgSW50ZXJ2YWwgaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIFo/ZTpuZXcgWihlLG4pO2lmKEkudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IE5sKHIpO3JldHVybiBuZXcgayh7aW52YWxpZDpyfSl9c3RhdGljIGZyb21EYXRlVGltZXMoZSxuKXtjb25zdCByPUplKGUpLHM9SmUobiksaT1uZihyLHMpO3JldHVybiBpPz9uZXcgayh7c3RhcnQ6cixlbmQ6c30pfXN0YXRpYyBhZnRlcihlLG4pe2NvbnN0IHI9di5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SmUoZSk7cmV0dXJuIGsuZnJvbURhdGVUaW1lcyhzLHMucGx1cyhyKSl9c3RhdGljIGJlZm9yZShlLG4pe2NvbnN0IHI9di5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SmUoZSk7cmV0dXJuIGsuZnJvbURhdGVUaW1lcyhzLm1pbnVzKHIpLHMpfXN0YXRpYyBmcm9tSVNPKGUsbil7Y29uc3RbcixzXT0oZXx8IiIpLnNwbGl0KCIvIiwyKTtpZihyJiZzKXtsZXQgaSxhO3RyeXtpPXAuZnJvbUlTTyhyLG4pLGE9aS5pc1ZhbGlkfWNhdGNoe2E9ITF9bGV0IG8sdTt0cnl7bz1wLmZyb21JU08ocyxuKSx1PW8uaXNWYWxpZH1jYXRjaHt1PSExfWlmKGEmJnUpcmV0dXJuIGsuZnJvbURhdGVUaW1lcyhpLG8pO2lmKGEpe2NvbnN0IGw9di5mcm9tSVNPKHMsbik7aWYobC5pc1ZhbGlkKXJldHVybiBrLmFmdGVyKGksbCl9ZWxzZSBpZih1KXtjb25zdCBsPXYuZnJvbUlTTyhyLG4pO2lmKGwuaXNWYWxpZClyZXR1cm4gay5iZWZvcmUobyxsKX19cmV0dXJuIGsuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGlzSW50ZXJ2YWwoZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkludGVydmFsfHwhMX1nZXQgc3RhcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczpudWxsfWdldCBlbmQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTpudWxsfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZFJlYXNvbj09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1sZW5ndGgoZT0ibWlsbGlzZWNvbmRzIil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnRvRHVyYXRpb24oZSkuZ2V0KGUpOk5hTn1jb3VudChlPSJtaWxsaXNlY29uZHMiLG4pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIE5hTjtjb25zdCByPXRoaXMuc3RhcnQuc3RhcnRPZihlLG4pO2xldCBzO3JldHVybiBuIT1udWxsJiZuLnVzZUxvY2FsZVdlZWtzP3M9dGhpcy5lbmQucmVjb25maWd1cmUoe2xvY2FsZTpyLmxvY2FsZX0pOnM9dGhpcy5lbmQscz1zLnN0YXJ0T2YoZSxuKSxNYXRoLmZsb29yKHMuZGlmZihyLGUpLmdldChlKSkrKHMudmFsdWVPZigpIT09dGhpcy5lbmQudmFsdWVPZigpKX1oYXNTYW1lKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5pc0VtcHR5KCl8fHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucyxlKTohMX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMucy52YWx1ZU9mKCk9PT10aGlzLmUudmFsdWVPZigpfWlzQWZ0ZXIoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM+ZTohMX1pc0JlZm9yZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTw9ZTohMX1jb250YWlucyhlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczw9ZSYmdGhpcy5lPmU6ITF9c2V0KHtzdGFydDplLGVuZDpufT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9rLmZyb21EYXRlVGltZXMoZXx8dGhpcy5zLG58fHRoaXMuZSk6dGhpc31zcGxpdEF0KC4uLmUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuW107Y29uc3Qgbj1lLm1hcChKZSkuZmlsdGVyKGE9PnRoaXMuY29udGFpbnMoYSkpLnNvcnQoKGEsbyk9PmEudG9NaWxsaXMoKS1vLnRvTWlsbGlzKCkpLHI9W107bGV0e3N9PXRoaXMsaT0wO2Zvcig7czx0aGlzLmU7KXtjb25zdCBhPW5baV18fHRoaXMuZSxvPSthPit0aGlzLmU/dGhpcy5lOmE7ci5wdXNoKGsuZnJvbURhdGVUaW1lcyhzLG8pKSxzPW8saSs9MX1yZXR1cm4gcn1zcGxpdEJ5KGUpe2NvbnN0IG49di5mcm9tRHVyYXRpb25MaWtlKGUpO2lmKCF0aGlzLmlzVmFsaWR8fCFuLmlzVmFsaWR8fG4uYXMoIm1pbGxpc2Vjb25kcyIpPT09MClyZXR1cm5bXTtsZXR7czpyfT10aGlzLHM9MSxpO2NvbnN0IGE9W107Zm9yKDtyPHRoaXMuZTspe2NvbnN0IG89dGhpcy5zdGFydC5wbHVzKG4ubWFwVW5pdHModT0+dSpzKSk7aT0rbz4rdGhpcy5lP3RoaXMuZTpvLGEucHVzaChrLmZyb21EYXRlVGltZXMocixpKSkscj1pLHMrPTF9cmV0dXJuIGF9ZGl2aWRlRXF1YWxseShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpL2UpLnNsaWNlKDAsZSk6W119b3ZlcmxhcHMoZSl7cmV0dXJuIHRoaXMuZT5lLnMmJnRoaXMuczxlLmV9YWJ1dHNTdGFydChlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkPyt0aGlzLmU9PStlLnM6ITF9YWJ1dHNFbmQoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD8rZS5lPT0rdGhpcy5zOiExfWVuZ3VsZnMoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM8PWUucyYmdGhpcy5lPj1lLmU6ITF9ZXF1YWxzKGUpe3JldHVybiF0aGlzLmlzVmFsaWR8fCFlLmlzVmFsaWQ/ITE6dGhpcy5zLmVxdWFscyhlLnMpJiZ0aGlzLmUuZXF1YWxzKGUuZSl9aW50ZXJzZWN0aW9uKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj10aGlzLnM+ZS5zP3RoaXMuczplLnMscj10aGlzLmU8ZS5lP3RoaXMuZTplLmU7cmV0dXJuIG4+PXI/bnVsbDprLmZyb21EYXRlVGltZXMobixyKX11bmlvbihlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49dGhpcy5zPGUucz90aGlzLnM6ZS5zLHI9dGhpcy5lPmUuZT90aGlzLmU6ZS5lO3JldHVybiBrLmZyb21EYXRlVGltZXMobixyKX1zdGF0aWMgbWVyZ2UoZSl7Y29uc3RbbixyXT1lLnNvcnQoKHMsaSk9PnMucy1pLnMpLnJlZHVjZSgoW3MsaV0sYSk9Pmk/aS5vdmVybGFwcyhhKXx8aS5hYnV0c1N0YXJ0KGEpP1tzLGkudW5pb24oYSldOltzLmNvbmNhdChbaV0pLGFdOltzLGFdLFtbXSxudWxsXSk7cmV0dXJuIHImJm4ucHVzaChyKSxufXN0YXRpYyB4b3IoZSl7bGV0IG49bnVsbCxyPTA7Y29uc3Qgcz1bXSxpPWUubWFwKHU9Plt7dGltZTp1LnMsdHlwZToicyJ9LHt0aW1lOnUuZSx0eXBlOiJlIn1dKSxhPUFycmF5LnByb3RvdHlwZS5jb25jYXQoLi4uaSksbz1hLnNvcnQoKHUsbCk9PnUudGltZS1sLnRpbWUpO2Zvcihjb25zdCB1IG9mIG8pcis9dS50eXBlPT09InMiPzE6LTEscj09PTE/bj11LnRpbWU6KG4mJituIT0rdS50aW1lJiZzLnB1c2goay5mcm9tRGF0ZVRpbWVzKG4sdS50aW1lKSksbj1udWxsKTtyZXR1cm4gay5tZXJnZShzKX1kaWZmZXJlbmNlKC4uLmUpe3JldHVybiBrLnhvcihbdGhpc10uY29uY2F0KGUpKS5tYXAobj0+dGhpcy5pbnRlcnNlY3Rpb24obikpLmZpbHRlcihuPT5uJiYhbi5pc0VtcHR5KCkpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gWyR7dGhpcy5zLnRvSVNPKCl9IOKAkyAke3RoaXMuZS50b0lTTygpfSlgOkRlfVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YEludGVydmFsIHsgc3RhcnQ6ICR7dGhpcy5zLnRvSVNPKCl9LCBlbmQ6ICR7dGhpcy5lLnRvSVNPKCl9IH1gOmBJbnRlcnZhbCB7IEludmFsaWQsIHJlYXNvbjogJHt0aGlzLmludmFsaWRSZWFzb259IH1gfXRvTG9jYWxlU3RyaW5nKGU9eXQsbj17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD94LmNyZWF0ZSh0aGlzLnMubG9jLmNsb25lKG4pLGUpLmZvcm1hdEludGVydmFsKHRoaXMpOkRlfXRvSVNPKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPKGUpfS8ke3RoaXMuZS50b0lTTyhlKX1gOkRlfXRvSVNPRGF0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPRGF0ZSgpfS8ke3RoaXMuZS50b0lTT0RhdGUoKX1gOkRlfXRvSVNPVGltZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0lTT1RpbWUoZSl9LyR7dGhpcy5lLnRvSVNPVGltZShlKX1gOkRlfXRvRm9ybWF0KGUse3NlcGFyYXRvcjpuPSIg4oCTICJ9PXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0Zvcm1hdChlKX0ke259JHt0aGlzLmUudG9Gb3JtYXQoZSl9YDpEZX10b0R1cmF0aW9uKGUsbil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmUuZGlmZih0aGlzLnMsZSxuKTp2LmludmFsaWQodGhpcy5pbnZhbGlkUmVhc29uKX1tYXBFbmRwb2ludHMoZSl7cmV0dXJuIGsuZnJvbURhdGVUaW1lcyhlKHRoaXMucyksZSh0aGlzLmUpKX19Y2xhc3MgTnR7c3RhdGljIGhhc0RTVChlPUkuZGVmYXVsdFpvbmUpe2NvbnN0IG49cC5ub3coKS5zZXRab25lKGUpLnNldCh7bW9udGg6MTJ9KTtyZXR1cm4hZS5pc1VuaXZlcnNhbCYmbi5vZmZzZXQhPT1uLnNldCh7bW9udGg6Nn0pLm9mZnNldH1zdGF0aWMgaXNWYWxpZElBTkFab25lKGUpe3JldHVybiBKLmlzVmFsaWRab25lKGUpfXN0YXRpYyBub3JtYWxpemVab25lKGUpe3JldHVybiBuZShlLEkuZGVmYXVsdFpvbmUpfXN0YXRpYyBnZXRTdGFydE9mV2Vlayh7bG9jYWxlOmU9bnVsbCxsb2NPYmo6bj1udWxsfT17fSl7cmV0dXJuKG58fFQuY3JlYXRlKGUpKS5nZXRTdGFydE9mV2VlaygpfXN0YXRpYyBnZXRNaW5pbXVtRGF5c0luRmlyc3RXZWVrKHtsb2NhbGU6ZT1udWxsLGxvY09iajpuPW51bGx9PXt9KXtyZXR1cm4obnx8VC5jcmVhdGUoZSkpLmdldE1pbkRheXNJbkZpcnN0V2VlaygpfXN0YXRpYyBnZXRXZWVrZW5kV2Vla2RheXMoe2xvY2FsZTplPW51bGwsbG9jT2JqOm49bnVsbH09e30pe3JldHVybihufHxULmNyZWF0ZShlKSkuZ2V0V2Vla2VuZERheXMoKS5zbGljZSgpfXN0YXRpYyBtb250aHMoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fFQuY3JlYXRlKG4scixpKSkubW9udGhzKGUpfXN0YXRpYyBtb250aHNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fFQuY3JlYXRlKG4scixpKSkubW9udGhzKGUsITApfXN0YXRpYyB3ZWVrZGF5cyhlPSJsb25nIix7bG9jYWxlOm49bnVsbCxudW1iZXJpbmdTeXN0ZW06cj1udWxsLGxvY09iajpzPW51bGx9PXt9KXtyZXR1cm4oc3x8VC5jcmVhdGUobixyLG51bGwpKS53ZWVrZGF5cyhlKX1zdGF0aWMgd2Vla2RheXNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsfT17fSl7cmV0dXJuKHN8fFQuY3JlYXRlKG4scixudWxsKSkud2Vla2RheXMoZSwhMCl9c3RhdGljIG1lcmlkaWVtcyh7bG9jYWxlOmU9bnVsbH09e30pe3JldHVybiBULmNyZWF0ZShlKS5tZXJpZGllbXMoKX1zdGF0aWMgZXJhcyhlPSJzaG9ydCIse2xvY2FsZTpuPW51bGx9PXt9KXtyZXR1cm4gVC5jcmVhdGUobixudWxsLCJncmVnb3J5IikuZXJhcyhlKX1zdGF0aWMgZmVhdHVyZXMoKXtyZXR1cm57cmVsYXRpdmU6S3IoKSxsb2NhbGVXZWVrOlhyKCl9fX1mdW5jdGlvbiBicyh0LGUpe2NvbnN0IG49cz0+cy50b1VUQygwLHtrZWVwTG9jYWxUaW1lOiEwfSkuc3RhcnRPZigiZGF5IikudmFsdWVPZigpLHI9bihlKS1uKHQpO3JldHVybiBNYXRoLmZsb29yKHYuZnJvbU1pbGxpcyhyKS5hcygiZGF5cyIpKX1mdW5jdGlvbiByZih0LGUsbil7Y29uc3Qgcj1bWyJ5ZWFycyIsKHUsbCk9PmwueWVhci11LnllYXJdLFsicXVhcnRlcnMiLCh1LGwpPT5sLnF1YXJ0ZXItdS5xdWFydGVyKyhsLnllYXItdS55ZWFyKSo0XSxbIm1vbnRocyIsKHUsbCk9PmwubW9udGgtdS5tb250aCsobC55ZWFyLXUueWVhcikqMTJdLFsid2Vla3MiLCh1LGwpPT57Y29uc3QgYz1icyh1LGwpO3JldHVybihjLWMlNykvN31dLFsiZGF5cyIsYnNdXSxzPXt9LGk9dDtsZXQgYSxvO2Zvcihjb25zdFt1LGxdb2YgciluLmluZGV4T2YodSk+PTAmJihhPXUsc1t1XT1sKHQsZSksbz1pLnBsdXMocyksbz5lPyhzW3VdLS0sdD1pLnBsdXMocyksdD5lJiYobz10LHNbdV0tLSx0PWkucGx1cyhzKSkpOnQ9byk7cmV0dXJuW3QscyxvLGFdfWZ1bmN0aW9uIHNmKHQsZSxuLHIpe2xldFtzLGksYSxvXT1yZih0LGUsbik7Y29uc3QgdT1lLXMsbD1uLmZpbHRlcihkPT5bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiXS5pbmRleE9mKGQpPj0wKTtsLmxlbmd0aD09PTAmJihhPGUmJihhPXMucGx1cyh7W29dOjF9KSksYSE9PXMmJihpW29dPShpW29dfHwwKSt1LyhhLXMpKSk7Y29uc3QgYz12LmZyb21PYmplY3QoaSxyKTtyZXR1cm4gbC5sZW5ndGg+MD92LmZyb21NaWxsaXModSxyKS5zaGlmdFRvKC4uLmwpLnBsdXMoYyk6Y31jb25zdCBwbj17YXJhYjoiW9mgLdmpXSIsYXJhYmV4dDoiW9uwLdu5XSIsYmFsaToiW+GtkC3hrZldIixiZW5nOiJb4KemLeCnr10iLGRldmE6IlvgpaYt4KWvXSIsZnVsbHdpZGU6IlvvvJAt77yZXSIsZ3VqcjoiW+Crpi3gq69dIixoYW5pZGVjOiJb44CHfOS4gHzkuox85LiJfOWbm3zkupR85YWtfOS4g3zlhat85LmdXSIsa2htcjoiW+GfoC3hn6ldIixrbmRhOiJb4LOmLeCzr10iLGxhb286Ilvgu5At4LuZXSIsbGltYjoiW+Glhi3hpY9dIixtbHltOiJb4LWmLeC1r10iLG1vbmc6IlvhoJAt4aCZXSIsbXltcjoiW+GBgC3hgYldIixvcnlhOiJb4K2mLeCtr10iLHRhbWxkZWM6Ilvgr6Yt4K+vXSIsdGVsdToiW+Cxpi3gsa9dIix0aGFpOiJb4LmQLeC5mV0iLHRpYnQ6IlvgvKAt4LypXSIsbGF0bjoiXFxkIn0sa3M9e2FyYWI6WzE2MzIsMTY0MV0sYXJhYmV4dDpbMTc3NiwxNzg1XSxiYWxpOls2OTkyLDcwMDFdLGJlbmc6WzI1MzQsMjU0M10sZGV2YTpbMjQwNiwyNDE1XSxmdWxsd2lkZTpbNjUyOTYsNjUzMDNdLGd1anI6WzI3OTAsMjc5OV0sa2htcjpbNjExMiw2MTIxXSxrbmRhOlszMzAyLDMzMTFdLGxhb286WzM3OTIsMzgwMV0sbGltYjpbNjQ3MCw2NDc5XSxtbHltOlszNDMwLDM0MzldLG1vbmc6WzYxNjAsNjE2OV0sbXltcjpbNDE2MCw0MTY5XSxvcnlhOlsyOTE4LDI5MjddLHRhbWxkZWM6WzMwNDYsMzA1NV0sdGVsdTpbMzE3NCwzMTgzXSx0aGFpOlszNjY0LDM2NzNdLHRpYnQ6WzM4NzIsMzg4MV19LGFmPXBuLmhhbmlkZWMucmVwbGFjZSgvW1xbfFxdXS9nLCIiKS5zcGxpdCgiIik7ZnVuY3Rpb24gb2YodCl7bGV0IGU9cGFyc2VJbnQodCwxMCk7aWYoaXNOYU4oZSkpe2U9IiI7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dC5jaGFyQ29kZUF0KG4pO2lmKHRbbl0uc2VhcmNoKHBuLmhhbmlkZWMpIT09LTEpZSs9YWYuaW5kZXhPZih0W25dKTtlbHNlIGZvcihjb25zdCBzIGluIGtzKXtjb25zdFtpLGFdPWtzW3NdO3I+PWkmJnI8PWEmJihlKz1yLWkpfX1yZXR1cm4gcGFyc2VJbnQoZSwxMCl9ZWxzZSByZXR1cm4gZX1mdW5jdGlvbiBSKHtudW1iZXJpbmdTeXN0ZW06dH0sZT0iIil7cmV0dXJuIG5ldyBSZWdFeHAoYCR7cG5bdHx8ImxhdG4iXX0ke2V9YCl9Y29uc3QgdWY9Im1pc3NpbmcgSW50bC5EYXRlVGltZUZvcm1hdC5mb3JtYXRUb1BhcnRzIHN1cHBvcnQiO2Z1bmN0aW9uIE8odCxlPW49Pm4pe3JldHVybntyZWdleDp0LGRlc2VyOihbbl0pPT5lKG9mKG4pKX19Y29uc3QgSXM9IlsgwqBdIixFcz1uZXcgUmVnRXhwKElzLCJnIik7ZnVuY3Rpb24gbGYodCl7cmV0dXJuIHQucmVwbGFjZSgvXC4vZywiXFwuPyIpLnJlcGxhY2UoRXMsSXMpfWZ1bmN0aW9uIE5zKHQpe3JldHVybiB0LnJlcGxhY2UoL1wuL2csIiIpLnJlcGxhY2UoRXMsIiAiKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIFAodCxlKXtyZXR1cm4gdD09PW51bGw/bnVsbDp7cmVnZXg6UmVnRXhwKHQubWFwKGxmKS5qb2luKCJ8IikpLGRlc2VyOihbbl0pPT50LmZpbmRJbmRleChyPT5OcyhuKT09PU5zKHIpKStlfX1mdW5jdGlvbiB4cyh0LGUpe3JldHVybntyZWdleDp0LGRlc2VyOihbLG4scl0pPT5rdChuLHIpLGdyb3VwczplfX1mdW5jdGlvbiB4dCh0KXtyZXR1cm57cmVnZXg6dCxkZXNlcjooW2VdKT0+ZX19ZnVuY3Rpb24gY2YodCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfWZ1bmN0aW9uIGZmKHQsZSl7Y29uc3Qgbj1SKGUpLHI9UihlLCJ7Mn0iKSxzPVIoZSwiezN9IiksaT1SKGUsIns0fSIpLGE9UihlLCJ7Nn0iKSxvPVIoZSwiezEsMn0iKSx1PVIoZSwiezEsM30iKSxsPVIoZSwiezEsNn0iKSxjPVIoZSwiezEsOX0iKSxkPVIoZSwiezIsNH0iKSx5PVIoZSwiezQsNn0iKSxoPU09Pih7cmVnZXg6UmVnRXhwKGNmKE0udmFsKSksZGVzZXI6KFtxXSk9PnEsbGl0ZXJhbDohMH0pLGo9KE09PntpZih0LmxpdGVyYWwpcmV0dXJuIGgoTSk7c3dpdGNoKE0udmFsKXtjYXNlIkciOnJldHVybiBQKGUuZXJhcygic2hvcnQiKSwwKTtjYXNlIkdHIjpyZXR1cm4gUChlLmVyYXMoImxvbmciKSwwKTtjYXNlInkiOnJldHVybiBPKGwpO2Nhc2UieXkiOnJldHVybiBPKGQsaG4pO2Nhc2UieXl5eSI6cmV0dXJuIE8oaSk7Y2FzZSJ5eXl5eSI6cmV0dXJuIE8oeSk7Y2FzZSJ5eXl5eXkiOnJldHVybiBPKGEpO2Nhc2UiTSI6cmV0dXJuIE8obyk7Y2FzZSJNTSI6cmV0dXJuIE8ocik7Y2FzZSJNTU0iOnJldHVybiBQKGUubW9udGhzKCJzaG9ydCIsITApLDEpO2Nhc2UiTU1NTSI6cmV0dXJuIFAoZS5tb250aHMoImxvbmciLCEwKSwxKTtjYXNlIkwiOnJldHVybiBPKG8pO2Nhc2UiTEwiOnJldHVybiBPKHIpO2Nhc2UiTExMIjpyZXR1cm4gUChlLm1vbnRocygic2hvcnQiLCExKSwxKTtjYXNlIkxMTEwiOnJldHVybiBQKGUubW9udGhzKCJsb25nIiwhMSksMSk7Y2FzZSJkIjpyZXR1cm4gTyhvKTtjYXNlImRkIjpyZXR1cm4gTyhyKTtjYXNlIm8iOnJldHVybiBPKHUpO2Nhc2Uib29vIjpyZXR1cm4gTyhzKTtjYXNlIkhIIjpyZXR1cm4gTyhyKTtjYXNlIkgiOnJldHVybiBPKG8pO2Nhc2UiaGgiOnJldHVybiBPKHIpO2Nhc2UiaCI6cmV0dXJuIE8obyk7Y2FzZSJtbSI6cmV0dXJuIE8ocik7Y2FzZSJtIjpyZXR1cm4gTyhvKTtjYXNlInEiOnJldHVybiBPKG8pO2Nhc2UicXEiOnJldHVybiBPKHIpO2Nhc2UicyI6cmV0dXJuIE8obyk7Y2FzZSJzcyI6cmV0dXJuIE8ocik7Y2FzZSJTIjpyZXR1cm4gTyh1KTtjYXNlIlNTUyI6cmV0dXJuIE8ocyk7Y2FzZSJ1IjpyZXR1cm4geHQoYyk7Y2FzZSJ1dSI6cmV0dXJuIHh0KG8pO2Nhc2UidXV1IjpyZXR1cm4gTyhuKTtjYXNlImEiOnJldHVybiBQKGUubWVyaWRpZW1zKCksMCk7Y2FzZSJra2trIjpyZXR1cm4gTyhpKTtjYXNlImtrIjpyZXR1cm4gTyhkLGhuKTtjYXNlIlciOnJldHVybiBPKG8pO2Nhc2UiV1ciOnJldHVybiBPKHIpO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4gTyhuKTtjYXNlIkVFRSI6cmV0dXJuIFAoZS53ZWVrZGF5cygic2hvcnQiLCExKSwxKTtjYXNlIkVFRUUiOnJldHVybiBQKGUud2Vla2RheXMoImxvbmciLCExKSwxKTtjYXNlImNjYyI6cmV0dXJuIFAoZS53ZWVrZGF5cygic2hvcnQiLCEwKSwxKTtjYXNlImNjY2MiOnJldHVybiBQKGUud2Vla2RheXMoImxvbmciLCEwKSwxKTtjYXNlIloiOmNhc2UiWloiOnJldHVybiB4cyhuZXcgUmVnRXhwKGAoWystXSR7by5zb3VyY2V9KSg/OjooJHtyLnNvdXJjZX0pKT9gKSwyKTtjYXNlIlpaWiI6cmV0dXJuIHhzKG5ldyBSZWdFeHAoYChbKy1dJHtvLnNvdXJjZX0pKCR7ci5zb3VyY2V9KT9gKSwyKTtjYXNlInoiOnJldHVybiB4dCgvW2Etel8rLS9dezEsMjU2fT8vaSk7Y2FzZSIgIjpyZXR1cm4geHQoL1teXFNcblxyXS8pO2RlZmF1bHQ6cmV0dXJuIGgoTSl9fSkodCl8fHtpbnZhbGlkUmVhc29uOnVmfTtyZXR1cm4gai50b2tlbj10LGp9Y29uc3QgZGY9e3llYXI6eyIyLWRpZ2l0IjoieXkiLG51bWVyaWM6Inl5eXl5In0sbW9udGg6e251bWVyaWM6Ik0iLCIyLWRpZ2l0IjoiTU0iLHNob3J0OiJNTU0iLGxvbmc6Ik1NTU0ifSxkYXk6e251bWVyaWM6ImQiLCIyLWRpZ2l0IjoiZGQifSx3ZWVrZGF5OntzaG9ydDoiRUVFIixsb25nOiJFRUVFIn0sZGF5cGVyaW9kOiJhIixkYXlQZXJpb2Q6ImEiLGhvdXIxMjp7bnVtZXJpYzoiaCIsIjItZGlnaXQiOiJoaCJ9LGhvdXIyNDp7bnVtZXJpYzoiSCIsIjItZGlnaXQiOiJISCJ9LG1pbnV0ZTp7bnVtZXJpYzoibSIsIjItZGlnaXQiOiJtbSJ9LHNlY29uZDp7bnVtZXJpYzoicyIsIjItZGlnaXQiOiJzcyJ9LHRpbWVab25lTmFtZTp7bG9uZzoiWlpaWloiLHNob3J0OiJaWloifX07ZnVuY3Rpb24gaGYodCxlLG4pe2NvbnN0e3R5cGU6cix2YWx1ZTpzfT10O2lmKHI9PT0ibGl0ZXJhbCIpe2NvbnN0IHU9L15ccyskLy50ZXN0KHMpO3JldHVybntsaXRlcmFsOiF1LHZhbDp1PyIgIjpzfX1jb25zdCBpPWVbcl07bGV0IGE9cjtyPT09ImhvdXIiJiYoZS5ob3VyMTIhPW51bGw/YT1lLmhvdXIxMj8iaG91cjEyIjoiaG91cjI0IjplLmhvdXJDeWNsZSE9bnVsbD9lLmhvdXJDeWNsZT09PSJoMTEifHxlLmhvdXJDeWNsZT09PSJoMTIiP2E9ImhvdXIxMiI6YT0iaG91cjI0IjphPW4uaG91cjEyPyJob3VyMTIiOiJob3VyMjQiKTtsZXQgbz1kZlthXTtpZih0eXBlb2Ygbz09Im9iamVjdCImJihvPW9baV0pLG8pcmV0dXJue2xpdGVyYWw6ITEsdmFsOm99fWZ1bmN0aW9uIG1mKHQpe3JldHVybltgXiR7dC5tYXAobj0+bi5yZWdleCkucmVkdWNlKChuLHIpPT5gJHtufSgke3Iuc291cmNlfSlgLCIiKX0kYCx0XX1mdW5jdGlvbiB5Zih0LGUsbil7Y29uc3Qgcj10Lm1hdGNoKGUpO2lmKHIpe2NvbnN0IHM9e307bGV0IGk9MTtmb3IoY29uc3QgYSBpbiBuKWlmKGJlKG4sYSkpe2NvbnN0IG89blthXSx1PW8uZ3JvdXBzP28uZ3JvdXBzKzE6MTshby5saXRlcmFsJiZvLnRva2VuJiYoc1tvLnRva2VuLnZhbFswXV09by5kZXNlcihyLnNsaWNlKGksaSt1KSkpLGkrPXV9cmV0dXJuW3Isc119ZWxzZSByZXR1cm5bcix7fV19ZnVuY3Rpb24gZ2YodCl7Y29uc3QgZT1pPT57c3dpdGNoKGkpe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpjYXNlIkgiOnJldHVybiJob3VyIjtjYXNlImQiOnJldHVybiJkYXkiO2Nhc2UibyI6cmV0dXJuIm9yZGluYWwiO2Nhc2UiTCI6Y2FzZSJNIjpyZXR1cm4ibW9udGgiO2Nhc2UieSI6cmV0dXJuInllYXIiO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4id2Vla2RheSI7Y2FzZSJXIjpyZXR1cm4id2Vla051bWJlciI7Y2FzZSJrIjpyZXR1cm4id2Vla1llYXIiO2Nhc2UicSI6cmV0dXJuInF1YXJ0ZXIiO2RlZmF1bHQ6cmV0dXJuIG51bGx9fTtsZXQgbj1udWxsLHI7cmV0dXJuIGcodC56KXx8KG49Si5jcmVhdGUodC56KSksZyh0LlopfHwobnx8KG49bmV3IEQodC5aKSkscj10LlopLGcodC5xKXx8KHQuTT0odC5xLTEpKjMrMSksZyh0LmgpfHwodC5oPDEyJiZ0LmE9PT0xP3QuaCs9MTI6dC5oPT09MTImJnQuYT09PTAmJih0Lmg9MCkpLHQuRz09PTAmJnQueSYmKHQueT0tdC55KSxnKHQudSl8fCh0LlM9Zm4odC51KSksW09iamVjdC5rZXlzKHQpLnJlZHVjZSgoaSxhKT0+e2NvbnN0IG89ZShhKTtyZXR1cm4gbyYmKGlbb109dFthXSksaX0se30pLG4scl19bGV0IHduPW51bGw7ZnVuY3Rpb24gcGYoKXtyZXR1cm4gd258fCh3bj1wLmZyb21NaWxsaXMoMTU1NTU1NTU1NTU1NSkpLHdufWZ1bmN0aW9uIHdmKHQsZSl7aWYodC5saXRlcmFsKXJldHVybiB0O2NvbnN0IG49eC5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHQudmFsKSxyPURzKG4sZSk7cmV0dXJuIHI9PW51bGx8fHIuaW5jbHVkZXModm9pZCAwKT90OnJ9ZnVuY3Rpb24gTXModCxlKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi50Lm1hcChuPT53ZihuLGUpKSl9ZnVuY3Rpb24gQ3ModCxlLG4pe2NvbnN0IHI9TXMoeC5wYXJzZUZvcm1hdChuKSx0KSxzPXIubWFwKGE9PmZmKGEsdCkpLGk9cy5maW5kKGE9PmEuaW52YWxpZFJlYXNvbik7aWYoaSlyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixpbnZhbGlkUmVhc29uOmkuaW52YWxpZFJlYXNvbn07e2NvbnN0W2Esb109bWYocyksdT1SZWdFeHAoYSwiaSIpLFtsLGNdPXlmKGUsdSxvKSxbZCx5LGhdPWM/Z2YoYyk6W251bGwsbnVsbCx2b2lkIDBdO2lmKGJlKGMsImEiKSYmYmUoYywiSCIpKXRocm93IG5ldyBTZSgiQ2FuJ3QgaW5jbHVkZSBtZXJpZGllbSB3aGVuIHNwZWNpZnlpbmcgMjQtaG91ciBmb3JtYXQiKTtyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixyZWdleDp1LHJhd01hdGNoZXM6bCxtYXRjaGVzOmMscmVzdWx0OmQsem9uZTp5LHNwZWNpZmljT2Zmc2V0Omh9fX1mdW5jdGlvbiB2Zih0LGUsbil7Y29uc3R7cmVzdWx0OnIsem9uZTpzLHNwZWNpZmljT2Zmc2V0OmksaW52YWxpZFJlYXNvbjphfT1Dcyh0LGUsbik7cmV0dXJuW3IscyxpLGFdfWZ1bmN0aW9uIERzKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7Y29uc3Qgcj14LmNyZWF0ZShlLHQpLmR0Rm9ybWF0dGVyKHBmKCkpLHM9ci5mb3JtYXRUb1BhcnRzKCksaT1yLnJlc29sdmVkT3B0aW9ucygpO3JldHVybiBzLm1hcChhPT5oZihhLHQsaSkpfWNvbnN0IHZuPSJJbnZhbGlkIERhdGVUaW1lIixfcz04NjRlMTM7ZnVuY3Rpb24gTXQodCl7cmV0dXJuIG5ldyBaKCJ1bnN1cHBvcnRlZCB6b25lIixgdGhlIHpvbmUgIiR7dC5uYW1lfSIgaXMgbm90IHN1cHBvcnRlZGApfWZ1bmN0aW9uIE9uKHQpe3JldHVybiB0LndlZWtEYXRhPT09bnVsbCYmKHQud2Vla0RhdGE9T3QodC5jKSksdC53ZWVrRGF0YX1mdW5jdGlvbiBUbih0KXtyZXR1cm4gdC5sb2NhbFdlZWtEYXRhPT09bnVsbCYmKHQubG9jYWxXZWVrRGF0YT1PdCh0LmMsdC5sb2MuZ2V0TWluRGF5c0luRmlyc3RXZWVrKCksdC5sb2MuZ2V0U3RhcnRPZldlZWsoKSkpLHQubG9jYWxXZWVrRGF0YX1mdW5jdGlvbiBoZSh0LGUpe2NvbnN0IG49e3RzOnQudHMsem9uZTp0LnpvbmUsYzp0LmMsbzp0Lm8sbG9jOnQubG9jLGludmFsaWQ6dC5pbnZhbGlkfTtyZXR1cm4gbmV3IHAoey4uLm4sLi4uZSxvbGQ6bn0pfWZ1bmN0aW9uIEZzKHQsZSxuKXtsZXQgcj10LWUqNjAqMWUzO2NvbnN0IHM9bi5vZmZzZXQocik7aWYoZT09PXMpcmV0dXJuW3IsZV07ci09KHMtZSkqNjAqMWUzO2NvbnN0IGk9bi5vZmZzZXQocik7cmV0dXJuIHM9PT1pP1tyLHNdOlt0LU1hdGgubWluKHMsaSkqNjAqMWUzLE1hdGgubWF4KHMsaSldfWZ1bmN0aW9uIEN0KHQsZSl7dCs9ZSo2MCoxZTM7Y29uc3Qgbj1uZXcgRGF0ZSh0KTtyZXR1cm57eWVhcjpuLmdldFVUQ0Z1bGxZZWFyKCksbW9udGg6bi5nZXRVVENNb250aCgpKzEsZGF5Om4uZ2V0VVRDRGF0ZSgpLGhvdXI6bi5nZXRVVENIb3VycygpLG1pbnV0ZTpuLmdldFVUQ01pbnV0ZXMoKSxzZWNvbmQ6bi5nZXRVVENTZWNvbmRzKCksbWlsbGlzZWNvbmQ6bi5nZXRVVENNaWxsaXNlY29uZHMoKX19ZnVuY3Rpb24gRHQodCxlLG4pe3JldHVybiBGcyhidCh0KSxlLG4pfWZ1bmN0aW9uIEFzKHQsZSl7Y29uc3Qgbj10Lm8scj10LmMueWVhcitNYXRoLnRydW5jKGUueWVhcnMpLHM9dC5jLm1vbnRoK01hdGgudHJ1bmMoZS5tb250aHMpK01hdGgudHJ1bmMoZS5xdWFydGVycykqMyxpPXsuLi50LmMseWVhcjpyLG1vbnRoOnMsZGF5Ok1hdGgubWluKHQuYy5kYXksU3QocixzKSkrTWF0aC50cnVuYyhlLmRheXMpK01hdGgudHJ1bmMoZS53ZWVrcykqN30sYT12LmZyb21PYmplY3Qoe3llYXJzOmUueWVhcnMtTWF0aC50cnVuYyhlLnllYXJzKSxxdWFydGVyczplLnF1YXJ0ZXJzLU1hdGgudHJ1bmMoZS5xdWFydGVycyksbW9udGhzOmUubW9udGhzLU1hdGgudHJ1bmMoZS5tb250aHMpLHdlZWtzOmUud2Vla3MtTWF0aC50cnVuYyhlLndlZWtzKSxkYXlzOmUuZGF5cy1NYXRoLnRydW5jKGUuZGF5cyksaG91cnM6ZS5ob3VycyxtaW51dGVzOmUubWludXRlcyxzZWNvbmRzOmUuc2Vjb25kcyxtaWxsaXNlY29uZHM6ZS5taWxsaXNlY29uZHN9KS5hcygibWlsbGlzZWNvbmRzIiksbz1idChpKTtsZXRbdSxsXT1GcyhvLG4sdC56b25lKTtyZXR1cm4gYSE9PTAmJih1Kz1hLGw9dC56b25lLm9mZnNldCh1KSkse3RzOnUsbzpsfX1mdW5jdGlvbiBHZSh0LGUsbixyLHMsaSl7Y29uc3R7c2V0Wm9uZTphLHpvbmU6b309bjtpZih0JiZPYmplY3Qua2V5cyh0KS5sZW5ndGghPT0wfHxlKXtjb25zdCB1PWV8fG8sbD1wLmZyb21PYmplY3QodCx7Li4ubix6b25lOnUsc3BlY2lmaWNPZmZzZXQ6aX0pO3JldHVybiBhP2w6bC5zZXRab25lKG8pfWVsc2UgcmV0dXJuIHAuaW52YWxpZChuZXcgWigidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtzfSIgY2FuJ3QgYmUgcGFyc2VkIGFzICR7cn1gKSl9ZnVuY3Rpb24gX3QodCxlLG49ITApe3JldHVybiB0LmlzVmFsaWQ/eC5jcmVhdGUoVC5jcmVhdGUoImVuLVVTIikse2FsbG93WjpuLGZvcmNlU2ltcGxlOiEwfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHQsZSk6bnVsbH1mdW5jdGlvbiBTbih0LGUpe2NvbnN0IG49dC5jLnllYXI+OTk5OXx8dC5jLnllYXI8MDtsZXQgcj0iIjtyZXR1cm4gbiYmdC5jLnllYXI+PTAmJihyKz0iKyIpLHIrPUUodC5jLnllYXIsbj82OjQpLGU/KHIrPSItIixyKz1FKHQuYy5tb250aCkscis9Ii0iLHIrPUUodC5jLmRheSkpOihyKz1FKHQuYy5tb250aCkscis9RSh0LmMuZGF5KSkscn1mdW5jdGlvbiBWcyh0LGUsbixyLHMsaSl7bGV0IGE9RSh0LmMuaG91cik7cmV0dXJuIGU/KGErPSI6IixhKz1FKHQuYy5taW51dGUpLCh0LmMubWlsbGlzZWNvbmQhPT0wfHx0LmMuc2Vjb25kIT09MHx8IW4pJiYoYSs9IjoiKSk6YSs9RSh0LmMubWludXRlKSwodC5jLm1pbGxpc2Vjb25kIT09MHx8dC5jLnNlY29uZCE9PTB8fCFuKSYmKGErPUUodC5jLnNlY29uZCksKHQuYy5taWxsaXNlY29uZCE9PTB8fCFyKSYmKGErPSIuIixhKz1FKHQuYy5taWxsaXNlY29uZCwzKSkpLHMmJih0LmlzT2Zmc2V0Rml4ZWQmJnQub2Zmc2V0PT09MCYmIWk/YSs9IloiOnQubzwwPyhhKz0iLSIsYSs9RShNYXRoLnRydW5jKC10Lm8vNjApKSxhKz0iOiIsYSs9RShNYXRoLnRydW5jKC10Lm8lNjApKSk6KGErPSIrIixhKz1FKE1hdGgudHJ1bmModC5vLzYwKSksYSs9IjoiLGErPUUoTWF0aC50cnVuYyh0Lm8lNjApKSkpLGkmJihhKz0iWyIrdC56b25lLmlhbmFOYW1lKyJdIiksYX1jb25zdCBXcz17bW9udGg6MSxkYXk6MSxob3VyOjAsbWludXRlOjAsc2Vjb25kOjAsbWlsbGlzZWNvbmQ6MH0sT2Y9e3dlZWtOdW1iZXI6MSx3ZWVrZGF5OjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LFRmPXtvcmRpbmFsOjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LCRzPVsieWVhciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sU2Y9WyJ3ZWVrWWVhciIsIndlZWtOdW1iZXIiLCJ3ZWVrZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sYmY9WyJ5ZWFyIiwib3JkaW5hbCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdO2Z1bmN0aW9uIGtmKHQpe2NvbnN0IGU9e3llYXI6InllYXIiLHllYXJzOiJ5ZWFyIixtb250aDoibW9udGgiLG1vbnRoczoibW9udGgiLGRheToiZGF5IixkYXlzOiJkYXkiLGhvdXI6ImhvdXIiLGhvdXJzOiJob3VyIixtaW51dGU6Im1pbnV0ZSIsbWludXRlczoibWludXRlIixxdWFydGVyOiJxdWFydGVyIixxdWFydGVyczoicXVhcnRlciIsc2Vjb25kOiJzZWNvbmQiLHNlY29uZHM6InNlY29uZCIsbWlsbGlzZWNvbmQ6Im1pbGxpc2Vjb25kIixtaWxsaXNlY29uZHM6Im1pbGxpc2Vjb25kIix3ZWVrZGF5OiJ3ZWVrZGF5Iix3ZWVrZGF5czoid2Vla2RheSIsd2Vla251bWJlcjoid2Vla051bWJlciIsd2Vla3NudW1iZXI6IndlZWtOdW1iZXIiLHdlZWtudW1iZXJzOiJ3ZWVrTnVtYmVyIix3ZWVreWVhcjoid2Vla1llYXIiLHdlZWt5ZWFyczoid2Vla1llYXIiLG9yZGluYWw6Im9yZGluYWwifVt0LnRvTG93ZXJDYXNlKCldO2lmKCFlKXRocm93IG5ldyBocih0KTtyZXR1cm4gZX1mdW5jdGlvbiBMcyh0KXtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlImxvY2Fsd2Vla2RheSI6Y2FzZSJsb2NhbHdlZWtkYXlzIjpyZXR1cm4ibG9jYWxXZWVrZGF5IjtjYXNlImxvY2Fsd2Vla251bWJlciI6Y2FzZSJsb2NhbHdlZWtudW1iZXJzIjpyZXR1cm4ibG9jYWxXZWVrTnVtYmVyIjtjYXNlImxvY2Fsd2Vla3llYXIiOmNhc2UibG9jYWx3ZWVreWVhcnMiOnJldHVybiJsb2NhbFdlZWtZZWFyIjtkZWZhdWx0OnJldHVybiBrZih0KX19ZnVuY3Rpb24genModCxlKXtjb25zdCBuPW5lKGUuem9uZSxJLmRlZmF1bHRab25lKSxyPVQuZnJvbU9iamVjdChlKSxzPUkubm93KCk7bGV0IGksYTtpZihnKHQueWVhcikpaT1zO2Vsc2V7Zm9yKGNvbnN0IGwgb2YgJHMpZyh0W2xdKSYmKHRbbF09V3NbbF0pO2NvbnN0IG89QnIodCl8fFFyKHQpO2lmKG8pcmV0dXJuIHAuaW52YWxpZChvKTtjb25zdCB1PW4ub2Zmc2V0KHMpO1tpLGFdPUR0KHQsdSxuKX1yZXR1cm4gbmV3IHAoe3RzOmksem9uZTpuLGxvYzpyLG86YX0pfWZ1bmN0aW9uIFpzKHQsZSxuKXtjb25zdCByPWcobi5yb3VuZCk/ITA6bi5yb3VuZCxzPShhLG8pPT4oYT1kbihhLHJ8fG4uY2FsZW5kYXJ5PzA6MiwhMCksZS5sb2MuY2xvbmUobikucmVsRm9ybWF0dGVyKG4pLmZvcm1hdChhLG8pKSxpPWE9Pm4uY2FsZW5kYXJ5P2UuaGFzU2FtZSh0LGEpPzA6ZS5zdGFydE9mKGEpLmRpZmYodC5zdGFydE9mKGEpLGEpLmdldChhKTplLmRpZmYodCxhKS5nZXQoYSk7aWYobi51bml0KXJldHVybiBzKGkobi51bml0KSxuLnVuaXQpO2Zvcihjb25zdCBhIG9mIG4udW5pdHMpe2NvbnN0IG89aShhKTtpZihNYXRoLmFicyhvKT49MSlyZXR1cm4gcyhvLGEpfXJldHVybiBzKHQ+ZT8tMDowLG4udW5pdHNbbi51bml0cy5sZW5ndGgtMV0pfWZ1bmN0aW9uIFJzKHQpe2xldCBlPXt9LG47cmV0dXJuIHQubGVuZ3RoPjAmJnR5cGVvZiB0W3QubGVuZ3RoLTFdPT0ib2JqZWN0Ij8oZT10W3QubGVuZ3RoLTFdLG49QXJyYXkuZnJvbSh0KS5zbGljZSgwLHQubGVuZ3RoLTEpKTpuPUFycmF5LmZyb20odCksW2Usbl19Y2xhc3MgcHtjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuem9uZXx8SS5kZWZhdWx0Wm9uZTtsZXQgcj1lLmludmFsaWR8fChOdW1iZXIuaXNOYU4oZS50cyk/bmV3IFooImludmFsaWQgaW5wdXQiKTpudWxsKXx8KG4uaXNWYWxpZD9udWxsOk10KG4pKTt0aGlzLnRzPWcoZS50cyk/SS5ub3coKTplLnRzO2xldCBzPW51bGwsaT1udWxsO2lmKCFyKWlmKGUub2xkJiZlLm9sZC50cz09PXRoaXMudHMmJmUub2xkLnpvbmUuZXF1YWxzKG4pKVtzLGldPVtlLm9sZC5jLGUub2xkLm9dO2Vsc2V7Y29uc3Qgbz1uLm9mZnNldCh0aGlzLnRzKTtzPUN0KHRoaXMudHMsbykscj1OdW1iZXIuaXNOYU4ocy55ZWFyKT9uZXcgWigiaW52YWxpZCBpbnB1dCIpOm51bGwscz1yP251bGw6cyxpPXI/bnVsbDpvfXRoaXMuX3pvbmU9bix0aGlzLmxvYz1lLmxvY3x8VC5jcmVhdGUoKSx0aGlzLmludmFsaWQ9cix0aGlzLndlZWtEYXRhPW51bGwsdGhpcy5sb2NhbFdlZWtEYXRhPW51bGwsdGhpcy5jPXMsdGhpcy5vPWksdGhpcy5pc0x1eG9uRGF0ZVRpbWU9ITB9c3RhdGljIG5vdygpe3JldHVybiBuZXcgcCh7fSl9c3RhdGljIGxvY2FsKCl7Y29uc3RbZSxuXT1Scyhhcmd1bWVudHMpLFtyLHMsaSxhLG8sdSxsXT1uO3JldHVybiB6cyh7eWVhcjpyLG1vbnRoOnMsZGF5OmksaG91cjphLG1pbnV0ZTpvLHNlY29uZDp1LG1pbGxpc2Vjb25kOmx9LGUpfXN0YXRpYyB1dGMoKXtjb25zdFtlLG5dPVJzKGFyZ3VtZW50cyksW3IscyxpLGEsbyx1LGxdPW47cmV0dXJuIGUuem9uZT1ELnV0Y0luc3RhbmNlLHpzKHt5ZWFyOnIsbW9udGg6cyxkYXk6aSxob3VyOmEsbWludXRlOm8sc2Vjb25kOnUsbWlsbGlzZWNvbmQ6bH0sZSl9c3RhdGljIGZyb21KU0RhdGUoZSxuPXt9KXtjb25zdCByPVhsKGUpP2UudmFsdWVPZigpOk5hTjtpZihOdW1iZXIuaXNOYU4ocikpcmV0dXJuIHAuaW52YWxpZCgiaW52YWxpZCBpbnB1dCIpO2NvbnN0IHM9bmUobi56b25lLEkuZGVmYXVsdFpvbmUpO3JldHVybiBzLmlzVmFsaWQ/bmV3IHAoe3RzOnIsem9uZTpzLGxvYzpULmZyb21PYmplY3Qobil9KTpwLmludmFsaWQoTXQocykpfXN0YXRpYyBmcm9tTWlsbGlzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIGU8LV9zfHxlPl9zP3AuaW52YWxpZCgiVGltZXN0YW1wIG91dCBvZiByYW5nZSIpOm5ldyBwKHt0czplLHpvbmU6bmUobi56b25lLEkuZGVmYXVsdFpvbmUpLGxvYzpULmZyb21PYmplY3Qobil9KTt0aHJvdyBuZXcgXyhgZnJvbU1pbGxpcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dCwgYnV0IHJlY2VpdmVkIGEgJHt0eXBlb2YgZX0gd2l0aCB2YWx1ZSAke2V9YCl9c3RhdGljIGZyb21TZWNvbmRzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIG5ldyBwKHt0czplKjFlMyx6b25lOm5lKG4uem9uZSxJLmRlZmF1bHRab25lKSxsb2M6VC5mcm9tT2JqZWN0KG4pfSk7dGhyb3cgbmV3IF8oImZyb21TZWNvbmRzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0Iil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtlPWV8fHt9O2NvbnN0IHI9bmUobi56b25lLEkuZGVmYXVsdFpvbmUpO2lmKCFyLmlzVmFsaWQpcmV0dXJuIHAuaW52YWxpZChNdChyKSk7Y29uc3Qgcz1ULmZyb21PYmplY3QobiksaT1JdChlLExzKSx7bWluRGF5c0luRmlyc3RXZWVrOmEsc3RhcnRPZldlZWs6b309SnIoaSxzKSx1PUkubm93KCksbD1nKG4uc3BlY2lmaWNPZmZzZXQpP3Iub2Zmc2V0KHUpOm4uc3BlY2lmaWNPZmZzZXQsYz0hZyhpLm9yZGluYWwpLGQ9IWcoaS55ZWFyKSx5PSFnKGkubW9udGgpfHwhZyhpLmRheSksaD1kfHx5LFM9aS53ZWVrWWVhcnx8aS53ZWVrTnVtYmVyO2lmKChofHxjKSYmUyl0aHJvdyBuZXcgU2UoIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHMiKTtpZih5JiZjKXRocm93IG5ldyBTZSgiQ2FuJ3QgbWl4IG9yZGluYWwgZGF0ZXMgd2l0aCBtb250aC9kYXkiKTtjb25zdCBqPVN8fGkud2Vla2RheSYmIWg7bGV0IE0scSxCPUN0KHUsbCk7aj8oTT1TZixxPU9mLEI9T3QoQixhLG8pKTpjPyhNPWJmLHE9VGYsQj1sbihCKSk6KE09JHMscT1Xcyk7bGV0IF9lPSExO2Zvcihjb25zdCBtZSBvZiBNKXtjb25zdCBBdD1pW21lXTtnKEF0KT9fZT9pW21lXT1xW21lXTppW21lXT1CW21lXTpfZT0hMH1jb25zdCBGdD1qP0JsKGksYSxvKTpjP1FsKGkpOkJyKGkpLGI9RnR8fFFyKGkpO2lmKGIpcmV0dXJuIHAuaW52YWxpZChiKTtjb25zdCBGZT1qP1lyKGksYSxvKTpjP0dyKGkpOmksW2JuLEJlXT1EdChGZSxsLHIpLEFlPW5ldyBwKHt0czpibix6b25lOnIsbzpCZSxsb2M6c30pO3JldHVybiBpLndlZWtkYXkmJmgmJmUud2Vla2RheSE9PUFlLndlZWtkYXk/cC5pbnZhbGlkKCJtaXNtYXRjaGVkIHdlZWtkYXkiLGB5b3UgY2FuJ3Qgc3BlY2lmeSBib3RoIGEgd2Vla2RheSBvZiAke2kud2Vla2RheX0gYW5kIGEgZGF0ZSBvZiAke0FlLnRvSVNPKCl9YCk6QWV9c3RhdGljIGZyb21JU08oZSxuPXt9KXtjb25zdFtyLHNdPVBjKGUpO3JldHVybiBHZShyLHMsbiwiSVNPIDg2MDEiLGUpfXN0YXRpYyBmcm9tUkZDMjgyMihlLG49e30pe2NvbnN0W3Isc109amMoZSk7cmV0dXJuIEdlKHIscyxuLCJSRkMgMjgyMiIsZSl9c3RhdGljIGZyb21IVFRQKGUsbj17fSl7Y29uc3RbcixzXT1VYyhlKTtyZXR1cm4gR2UocixzLG4sIkhUVFAiLG4pfXN0YXRpYyBmcm9tRm9ybWF0KGUsbixyPXt9KXtpZihnKGUpfHxnKG4pKXRocm93IG5ldyBfKCJmcm9tRm9ybWF0IHJlcXVpcmVzIGFuIGlucHV0IHN0cmluZyBhbmQgYSBmb3JtYXQiKTtjb25zdHtsb2NhbGU6cz1udWxsLG51bWJlcmluZ1N5c3RlbTppPW51bGx9PXIsYT1ULmZyb21PcHRzKHtsb2NhbGU6cyxudW1iZXJpbmdTeXN0ZW06aSxkZWZhdWx0VG9FTjohMH0pLFtvLHUsbCxjXT12ZihhLGUsbik7cmV0dXJuIGM/cC5pbnZhbGlkKGMpOkdlKG8sdSxyLGBmb3JtYXQgJHtufWAsZSxsKX1zdGF0aWMgZnJvbVN0cmluZyhlLG4scj17fSl7cmV0dXJuIHAuZnJvbUZvcm1hdChlLG4scil9c3RhdGljIGZyb21TUUwoZSxuPXt9KXtjb25zdFtyLHNdPVFjKGUpO3JldHVybiBHZShyLHMsbiwiU1FMIixlKX1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IF8oIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRGF0ZVRpbWUgaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIFo/ZTpuZXcgWihlLG4pO2lmKEkudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IEVsKHIpO3JldHVybiBuZXcgcCh7aW52YWxpZDpyfSl9c3RhdGljIGlzRGF0ZVRpbWUoZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkRhdGVUaW1lfHwhMX1zdGF0aWMgcGFyc2VGb3JtYXRGb3JPcHRzKGUsbj17fSl7Y29uc3Qgcj1EcyhlLFQuZnJvbU9iamVjdChuKSk7cmV0dXJuIHI/ci5tYXAocz0+cz9zLnZhbDpudWxsKS5qb2luKCIiKTpudWxsfXN0YXRpYyBleHBhbmRGb3JtYXQoZSxuPXt9KXtyZXR1cm4gTXMoeC5wYXJzZUZvcm1hdChlKSxULmZyb21PYmplY3QobikpLm1hcChzPT5zLnZhbCkuam9pbigiIil9Z2V0KGUpe3JldHVybiB0aGlzW2VdfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZD09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1nZXQgbG9jYWxlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5sb2NhbGU6bnVsbH1nZXQgbnVtYmVyaW5nU3lzdGVtKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW06bnVsbH1nZXQgb3V0cHV0Q2FsZW5kYXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMubG9jLm91dHB1dENhbGVuZGFyOm51bGx9Z2V0IHpvbmUoKXtyZXR1cm4gdGhpcy5fem9uZX1nZXQgem9uZU5hbWUoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuem9uZS5uYW1lOm51bGx9Z2V0IHllYXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy55ZWFyOk5hTn1nZXQgcXVhcnRlcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/TWF0aC5jZWlsKHRoaXMuYy5tb250aC8zKTpOYU59Z2V0IG1vbnRoKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMubW9udGg6TmFOfWdldCBkYXkoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5kYXk6TmFOfWdldCBob3VyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMuaG91cjpOYU59Z2V0IG1pbnV0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLm1pbnV0ZTpOYU59Z2V0IHNlY29uZCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLnNlY29uZDpOYU59Z2V0IG1pbGxpc2Vjb25kKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMubWlsbGlzZWNvbmQ6TmFOfWdldCB3ZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/T24odGhpcykud2Vla1llYXI6TmFOfWdldCB3ZWVrTnVtYmVyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Pbih0aGlzKS53ZWVrTnVtYmVyOk5hTn1nZXQgd2Vla2RheSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/T24odGhpcykud2Vla2RheTpOYU59Z2V0IGlzV2Vla2VuZCgpe3JldHVybiB0aGlzLmlzVmFsaWQmJnRoaXMubG9jLmdldFdlZWtlbmREYXlzKCkuaW5jbHVkZXModGhpcy53ZWVrZGF5KX1nZXQgbG9jYWxXZWVrZGF5KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Ubih0aGlzKS53ZWVrZGF5Ok5hTn1nZXQgbG9jYWxXZWVrTnVtYmVyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Ubih0aGlzKS53ZWVrTnVtYmVyOk5hTn1nZXQgbG9jYWxXZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/VG4odGhpcykud2Vla1llYXI6TmFOfWdldCBvcmRpbmFsKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9sbih0aGlzLmMpLm9yZGluYWw6TmFOfWdldCBtb250aFNob3J0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OdC5tb250aHMoInNob3J0Iix7bG9jT2JqOnRoaXMubG9jfSlbdGhpcy5tb250aC0xXTpudWxsfWdldCBtb250aExvbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP050Lm1vbnRocygibG9uZyIse2xvY09iajp0aGlzLmxvY30pW3RoaXMubW9udGgtMV06bnVsbH1nZXQgd2Vla2RheVNob3J0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OdC53ZWVrZGF5cygic2hvcnQiLHtsb2NPYmo6dGhpcy5sb2N9KVt0aGlzLndlZWtkYXktMV06bnVsbH1nZXQgd2Vla2RheUxvbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP050LndlZWtkYXlzKCJsb25nIix7bG9jT2JqOnRoaXMubG9jfSlbdGhpcy53ZWVrZGF5LTFdOm51bGx9Z2V0IG9mZnNldCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/K3RoaXMubzpOYU59Z2V0IG9mZnNldE5hbWVTaG9ydCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cyx7Zm9ybWF0OiJzaG9ydCIsbG9jYWxlOnRoaXMubG9jYWxlfSk6bnVsbH1nZXQgb2Zmc2V0TmFtZUxvbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuem9uZS5vZmZzZXROYW1lKHRoaXMudHMse2Zvcm1hdDoibG9uZyIsbG9jYWxlOnRoaXMubG9jYWxlfSk6bnVsbH1nZXQgaXNPZmZzZXRGaXhlZCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLmlzVW5pdmVyc2FsOm51bGx9Z2V0IGlzSW5EU1QoKXtyZXR1cm4gdGhpcy5pc09mZnNldEZpeGVkPyExOnRoaXMub2Zmc2V0PnRoaXMuc2V0KHttb250aDoxLGRheToxfSkub2Zmc2V0fHx0aGlzLm9mZnNldD50aGlzLnNldCh7bW9udGg6NX0pLm9mZnNldH1nZXRQb3NzaWJsZU9mZnNldHMoKXtpZighdGhpcy5pc1ZhbGlkfHx0aGlzLmlzT2Zmc2V0Rml4ZWQpcmV0dXJuW3RoaXNdO2NvbnN0IGU9ODY0ZTUsbj02ZTQscj1idCh0aGlzLmMpLHM9dGhpcy56b25lLm9mZnNldChyLWUpLGk9dGhpcy56b25lLm9mZnNldChyK2UpLGE9dGhpcy56b25lLm9mZnNldChyLXMqbiksbz10aGlzLnpvbmUub2Zmc2V0KHItaSpuKTtpZihhPT09bylyZXR1cm5bdGhpc107Y29uc3QgdT1yLWEqbixsPXItbypuLGM9Q3QodSxhKSxkPUN0KGwsbyk7cmV0dXJuIGMuaG91cj09PWQuaG91ciYmYy5taW51dGU9PT1kLm1pbnV0ZSYmYy5zZWNvbmQ9PT1kLnNlY29uZCYmYy5taWxsaXNlY29uZD09PWQubWlsbGlzZWNvbmQ/W2hlKHRoaXMse3RzOnV9KSxoZSh0aGlzLHt0czpsfSldOlt0aGlzXX1nZXQgaXNJbkxlYXBZZWFyKCl7cmV0dXJuIGplKHRoaXMueWVhcil9Z2V0IGRheXNJbk1vbnRoKCl7cmV0dXJuIFN0KHRoaXMueWVhcix0aGlzLm1vbnRoKX1nZXQgZGF5c0luWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/a2UodGhpcy55ZWFyKTpOYU59Z2V0IHdlZWtzSW5XZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/VWUodGhpcy53ZWVrWWVhcik6TmFOfWdldCB3ZWVrc0luTG9jYWxXZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/VWUodGhpcy5sb2NhbFdlZWtZZWFyLHRoaXMubG9jLmdldE1pbkRheXNJbkZpcnN0V2VlaygpLHRoaXMubG9jLmdldFN0YXJ0T2ZXZWVrKCkpOk5hTn1yZXNvbHZlZExvY2FsZU9wdGlvbnMoZT17fSl7Y29uc3R7bG9jYWxlOm4sbnVtYmVyaW5nU3lzdGVtOnIsY2FsZW5kYXI6c309eC5jcmVhdGUodGhpcy5sb2MuY2xvbmUoZSksZSkucmVzb2x2ZWRPcHRpb25zKHRoaXMpO3JldHVybntsb2NhbGU6bixudW1iZXJpbmdTeXN0ZW06cixvdXRwdXRDYWxlbmRhcjpzfX10b1VUQyhlPTAsbj17fSl7cmV0dXJuIHRoaXMuc2V0Wm9uZShELmluc3RhbmNlKGUpLG4pfXRvTG9jYWwoKXtyZXR1cm4gdGhpcy5zZXRab25lKEkuZGVmYXVsdFpvbmUpfXNldFpvbmUoZSx7a2VlcExvY2FsVGltZTpuPSExLGtlZXBDYWxlbmRhclRpbWU6cj0hMX09e30pe2lmKGU9bmUoZSxJLmRlZmF1bHRab25lKSxlLmVxdWFscyh0aGlzLnpvbmUpKXJldHVybiB0aGlzO2lmKGUuaXNWYWxpZCl7bGV0IHM9dGhpcy50cztpZihufHxyKXtjb25zdCBpPWUub2Zmc2V0KHRoaXMudHMpLGE9dGhpcy50b09iamVjdCgpO1tzXT1EdChhLGksZSl9cmV0dXJuIGhlKHRoaXMse3RzOnMsem9uZTplfSl9ZWxzZSByZXR1cm4gcC5pbnZhbGlkKE10KGUpKX1yZWNvbmZpZ3VyZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sb3V0cHV0Q2FsZW5kYXI6cn09e30pe2NvbnN0IHM9dGhpcy5sb2MuY2xvbmUoe2xvY2FsZTplLG51bWJlcmluZ1N5c3RlbTpuLG91dHB1dENhbGVuZGFyOnJ9KTtyZXR1cm4gaGUodGhpcyx7bG9jOnN9KX1zZXRMb2NhbGUoZSl7cmV0dXJuIHRoaXMucmVjb25maWd1cmUoe2xvY2FsZTplfSl9c2V0KGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1JdChlLExzKSx7bWluRGF5c0luRmlyc3RXZWVrOnIsc3RhcnRPZldlZWs6c309SnIobix0aGlzLmxvYyksaT0hZyhuLndlZWtZZWFyKXx8IWcobi53ZWVrTnVtYmVyKXx8IWcobi53ZWVrZGF5KSxhPSFnKG4ub3JkaW5hbCksbz0hZyhuLnllYXIpLHU9IWcobi5tb250aCl8fCFnKG4uZGF5KSxsPW98fHUsYz1uLndlZWtZZWFyfHxuLndlZWtOdW1iZXI7aWYoKGx8fGEpJiZjKXRocm93IG5ldyBTZSgiQ2FuJ3QgbWl4IHdlZWtZZWFyL3dlZWtOdW1iZXIgdW5pdHMgd2l0aCB5ZWFyL21vbnRoL2RheSBvciBvcmRpbmFscyIpO2lmKHUmJmEpdGhyb3cgbmV3IFNlKCJDYW4ndCBtaXggb3JkaW5hbCBkYXRlcyB3aXRoIG1vbnRoL2RheSIpO2xldCBkO2k/ZD1Zcih7Li4uT3QodGhpcy5jLHIscyksLi4ubn0scixzKTpnKG4ub3JkaW5hbCk/KGQ9ey4uLnRoaXMudG9PYmplY3QoKSwuLi5ufSxnKG4uZGF5KSYmKGQuZGF5PU1hdGgubWluKFN0KGQueWVhcixkLm1vbnRoKSxkLmRheSkpKTpkPUdyKHsuLi5sbih0aGlzLmMpLC4uLm59KTtjb25zdFt5LGhdPUR0KGQsdGhpcy5vLHRoaXMuem9uZSk7cmV0dXJuIGhlKHRoaXMse3RzOnksbzpofSl9cGx1cyhlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49di5mcm9tRHVyYXRpb25MaWtlKGUpO3JldHVybiBoZSh0aGlzLEFzKHRoaXMsbikpfW1pbnVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj12LmZyb21EdXJhdGlvbkxpa2UoZSkubmVnYXRlKCk7cmV0dXJuIGhlKHRoaXMsQXModGhpcyxuKSl9c3RhcnRPZihlLHt1c2VMb2NhbGVXZWVrczpuPSExfT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCByPXt9LHM9di5ub3JtYWxpemVVbml0KGUpO3N3aXRjaChzKXtjYXNlInllYXJzIjpyLm1vbnRoPTE7Y2FzZSJxdWFydGVycyI6Y2FzZSJtb250aHMiOnIuZGF5PTE7Y2FzZSJ3ZWVrcyI6Y2FzZSJkYXlzIjpyLmhvdXI9MDtjYXNlImhvdXJzIjpyLm1pbnV0ZT0wO2Nhc2UibWludXRlcyI6ci5zZWNvbmQ9MDtjYXNlInNlY29uZHMiOnIubWlsbGlzZWNvbmQ9MDticmVha31pZihzPT09IndlZWtzIilpZihuKXtjb25zdCBpPXRoaXMubG9jLmdldFN0YXJ0T2ZXZWVrKCkse3dlZWtkYXk6YX09dGhpczthPGkmJihyLndlZWtOdW1iZXI9dGhpcy53ZWVrTnVtYmVyLTEpLHIud2Vla2RheT1pfWVsc2Ugci53ZWVrZGF5PTE7aWYocz09PSJxdWFydGVycyIpe2NvbnN0IGk9TWF0aC5jZWlsKHRoaXMubW9udGgvMyk7ci5tb250aD0oaS0xKSozKzF9cmV0dXJuIHRoaXMuc2V0KHIpfWVuZE9mKGUsbil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnBsdXMoe1tlXToxfSkuc3RhcnRPZihlLG4pLm1pbnVzKDEpOnRoaXN9dG9Gb3JtYXQoZSxuPXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3guY3JlYXRlKHRoaXMubG9jLnJlZGVmYXVsdFRvRU4obikpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLGUpOnZufXRvTG9jYWxlU3RyaW5nKGU9eXQsbj17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD94LmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShuKSxlKS5mb3JtYXREYXRlVGltZSh0aGlzKTp2bn10b0xvY2FsZVBhcnRzKGU9e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/eC5jcmVhdGUodGhpcy5sb2MuY2xvbmUoZSksZSkuZm9ybWF0RGF0ZVRpbWVQYXJ0cyh0aGlzKTpbXX10b0lTTyh7Zm9ybWF0OmU9ImV4dGVuZGVkIixzdXBwcmVzc1NlY29uZHM6bj0hMSxzdXBwcmVzc01pbGxpc2Vjb25kczpyPSExLGluY2x1ZGVPZmZzZXQ6cz0hMCxleHRlbmRlZFpvbmU6aT0hMX09e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3QgYT1lPT09ImV4dGVuZGVkIjtsZXQgbz1Tbih0aGlzLGEpO3JldHVybiBvKz0iVCIsbys9VnModGhpcyxhLG4scixzLGkpLG99dG9JU09EYXRlKHtmb3JtYXQ6ZT0iZXh0ZW5kZWQifT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Tbih0aGlzLGU9PT0iZXh0ZW5kZWQiKTpudWxsfXRvSVNPV2Vla0RhdGUoKXtyZXR1cm4gX3QodGhpcywia2tray0nVydXVy1jIil9dG9JU09UaW1lKHtzdXBwcmVzc01pbGxpc2Vjb25kczplPSExLHN1cHByZXNzU2Vjb25kczpuPSExLGluY2x1ZGVPZmZzZXQ6cj0hMCxpbmNsdWRlUHJlZml4OnM9ITEsZXh0ZW5kZWRab25lOmk9ITEsZm9ybWF0OmE9ImV4dGVuZGVkIn09e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/KHM/IlQiOiIiKStWcyh0aGlzLGE9PT0iZXh0ZW5kZWQiLG4sZSxyLGkpOm51bGx9dG9SRkMyODIyKCl7cmV0dXJuIF90KHRoaXMsIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgWlpaIiwhMSl9dG9IVFRQKCl7cmV0dXJuIF90KHRoaXMudG9VVEMoKSwiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyAnR01UJyIpfXRvU1FMRGF0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/U24odGhpcywhMCk6bnVsbH10b1NRTFRpbWUoe2luY2x1ZGVPZmZzZXQ6ZT0hMCxpbmNsdWRlWm9uZTpuPSExLGluY2x1ZGVPZmZzZXRTcGFjZTpyPSEwfT17fSl7bGV0IHM9IkhIOm1tOnNzLlNTUyI7cmV0dXJuKG58fGUpJiYociYmKHMrPSIgIiksbj9zKz0ieiI6ZSYmKHMrPSJaWiIpKSxfdCh0aGlzLHMsITApfXRvU1FMKGU9e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy50b1NRTERhdGUoKX0gJHt0aGlzLnRvU1FMVGltZShlKX1gOm51bGx9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudG9JU08oKTp2bn1bU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV0oKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2BEYXRlVGltZSB7IHRzOiAke3RoaXMudG9JU08oKX0sIHpvbmU6ICR7dGhpcy56b25lLm5hbWV9LCBsb2NhbGU6ICR7dGhpcy5sb2NhbGV9IH1gOmBEYXRlVGltZSB7IEludmFsaWQsIHJlYXNvbjogJHt0aGlzLmludmFsaWRSZWFzb259IH1gfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy50b01pbGxpcygpfXRvTWlsbGlzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnRzOk5hTn10b1NlY29uZHMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudHMvMWUzOk5hTn10b1VuaXhJbnRlZ2VyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9NYXRoLmZsb29yKHRoaXMudHMvMWUzKTpOYU59dG9KU09OKCl7cmV0dXJuIHRoaXMudG9JU08oKX10b0JTT04oKXtyZXR1cm4gdGhpcy50b0pTRGF0ZSgpfXRvT2JqZWN0KGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJue307Y29uc3Qgbj17Li4udGhpcy5jfTtyZXR1cm4gZS5pbmNsdWRlQ29uZmlnJiYobi5vdXRwdXRDYWxlbmRhcj10aGlzLm91dHB1dENhbGVuZGFyLG4ubnVtYmVyaW5nU3lzdGVtPXRoaXMubG9jLm51bWJlcmluZ1N5c3RlbSxuLmxvY2FsZT10aGlzLmxvYy5sb2NhbGUpLG59dG9KU0RhdGUoKXtyZXR1cm4gbmV3IERhdGUodGhpcy5pc1ZhbGlkP3RoaXMudHM6TmFOKX1kaWZmKGUsbj0ibWlsbGlzZWNvbmRzIixyPXt9KXtpZighdGhpcy5pc1ZhbGlkfHwhZS5pc1ZhbGlkKXJldHVybiB2LmludmFsaWQoImNyZWF0ZWQgYnkgZGlmZmluZyBhbiBpbnZhbGlkIERhdGVUaW1lIik7Y29uc3Qgcz17bG9jYWxlOnRoaXMubG9jYWxlLG51bWJlcmluZ1N5c3RlbTp0aGlzLm51bWJlcmluZ1N5c3RlbSwuLi5yfSxpPWVjKG4pLm1hcCh2Lm5vcm1hbGl6ZVVuaXQpLGE9ZS52YWx1ZU9mKCk+dGhpcy52YWx1ZU9mKCksbz1hP3RoaXM6ZSx1PWE/ZTp0aGlzLGw9c2Yobyx1LGkscyk7cmV0dXJuIGE/bC5uZWdhdGUoKTpsfWRpZmZOb3coZT0ibWlsbGlzZWNvbmRzIixuPXt9KXtyZXR1cm4gdGhpcy5kaWZmKHAubm93KCksZSxuKX11bnRpbChlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2suZnJvbURhdGVUaW1lcyh0aGlzLGUpOnRoaXN9aGFzU2FtZShlLG4scil7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4hMTtjb25zdCBzPWUudmFsdWVPZigpLGk9dGhpcy5zZXRab25lKGUuem9uZSx7a2VlcExvY2FsVGltZTohMH0pO3JldHVybiBpLnN0YXJ0T2YobixyKTw9cyYmczw9aS5lbmRPZihuLHIpfWVxdWFscyhlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkJiZlLmlzVmFsaWQmJnRoaXMudmFsdWVPZigpPT09ZS52YWx1ZU9mKCkmJnRoaXMuem9uZS5lcXVhbHMoZS56b25lKSYmdGhpcy5sb2MuZXF1YWxzKGUubG9jKX10b1JlbGF0aXZlKGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3Qgbj1lLmJhc2V8fHAuZnJvbU9iamVjdCh7fSx7em9uZTp0aGlzLnpvbmV9KSxyPWUucGFkZGluZz90aGlzPG4/LWUucGFkZGluZzplLnBhZGRpbmc6MDtsZXQgcz1bInllYXJzIiwibW9udGhzIiwiZGF5cyIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiXSxpPWUudW5pdDtyZXR1cm4gQXJyYXkuaXNBcnJheShlLnVuaXQpJiYocz1lLnVuaXQsaT12b2lkIDApLFpzKG4sdGhpcy5wbHVzKHIpLHsuLi5lLG51bWVyaWM6ImFsd2F5cyIsdW5pdHM6cyx1bml0Oml9KX10b1JlbGF0aXZlQ2FsZW5kYXIoZT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9acyhlLmJhc2V8fHAuZnJvbU9iamVjdCh7fSx7em9uZTp0aGlzLnpvbmV9KSx0aGlzLHsuLi5lLG51bWVyaWM6ImF1dG8iLHVuaXRzOlsieWVhcnMiLCJtb250aHMiLCJkYXlzIl0sY2FsZW5kYXJ5OiEwfSk6bnVsbH1zdGF0aWMgbWluKC4uLmUpe2lmKCFlLmV2ZXJ5KHAuaXNEYXRlVGltZSkpdGhyb3cgbmV3IF8oIm1pbiByZXF1aXJlcyBhbGwgYXJndW1lbnRzIGJlIERhdGVUaW1lcyIpO3JldHVybiBlcyhlLG49Pm4udmFsdWVPZigpLE1hdGgubWluKX1zdGF0aWMgbWF4KC4uLmUpe2lmKCFlLmV2ZXJ5KHAuaXNEYXRlVGltZSkpdGhyb3cgbmV3IF8oIm1heCByZXF1aXJlcyBhbGwgYXJndW1lbnRzIGJlIERhdGVUaW1lcyIpO3JldHVybiBlcyhlLG49Pm4udmFsdWVPZigpLE1hdGgubWF4KX1zdGF0aWMgZnJvbUZvcm1hdEV4cGxhaW4oZSxuLHI9e30pe2NvbnN0e2xvY2FsZTpzPW51bGwsbnVtYmVyaW5nU3lzdGVtOmk9bnVsbH09cixhPVQuZnJvbU9wdHMoe2xvY2FsZTpzLG51bWJlcmluZ1N5c3RlbTppLGRlZmF1bHRUb0VOOiEwfSk7cmV0dXJuIENzKGEsZSxuKX1zdGF0aWMgZnJvbVN0cmluZ0V4cGxhaW4oZSxuLHI9e30pe3JldHVybiBwLmZyb21Gb3JtYXRFeHBsYWluKGUsbixyKX1zdGF0aWMgZ2V0IERBVEVfU0hPUlQoKXtyZXR1cm4geXR9c3RhdGljIGdldCBEQVRFX01FRCgpe3JldHVybiBtcn1zdGF0aWMgZ2V0IERBVEVfTUVEX1dJVEhfV0VFS0RBWSgpe3JldHVybiBNbH1zdGF0aWMgZ2V0IERBVEVfRlVMTCgpe3JldHVybiB5cn1zdGF0aWMgZ2V0IERBVEVfSFVHRSgpe3JldHVybiBncn1zdGF0aWMgZ2V0IFRJTUVfU0lNUExFKCl7cmV0dXJuIHByfXN0YXRpYyBnZXQgVElNRV9XSVRIX1NFQ09ORFMoKXtyZXR1cm4gd3J9c3RhdGljIGdldCBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKCl7cmV0dXJuIHZyfXN0YXRpYyBnZXQgVElNRV9XSVRIX0xPTkdfT0ZGU0VUKCl7cmV0dXJuIE9yfXN0YXRpYyBnZXQgVElNRV8yNF9TSU1QTEUoKXtyZXR1cm4gVHJ9c3RhdGljIGdldCBUSU1FXzI0X1dJVEhfU0VDT05EUygpe3JldHVybiBTcn1zdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQoKXtyZXR1cm4gYnJ9c3RhdGljIGdldCBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQoKXtyZXR1cm4ga3J9c3RhdGljIGdldCBEQVRFVElNRV9TSE9SVCgpe3JldHVybiBJcn1zdGF0aWMgZ2V0IERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUygpe3JldHVybiBFcn1zdGF0aWMgZ2V0IERBVEVUSU1FX01FRCgpe3JldHVybiBOcn1zdGF0aWMgZ2V0IERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMoKXtyZXR1cm4geHJ9c3RhdGljIGdldCBEQVRFVElNRV9NRURfV0lUSF9XRUVLREFZKCl7cmV0dXJuIENsfXN0YXRpYyBnZXQgREFURVRJTUVfRlVMTCgpe3JldHVybiBNcn1zdGF0aWMgZ2V0IERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIENyfXN0YXRpYyBnZXQgREFURVRJTUVfSFVHRSgpe3JldHVybiBEcn1zdGF0aWMgZ2V0IERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIF9yfX1mdW5jdGlvbiBKZSh0KXtpZihwLmlzRGF0ZVRpbWUodCkpcmV0dXJuIHQ7aWYodCYmdC52YWx1ZU9mJiZjZSh0LnZhbHVlT2YoKSkpcmV0dXJuIHAuZnJvbUpTRGF0ZSh0KTtpZih0JiZ0eXBlb2YgdD09Im9iamVjdCIpcmV0dXJuIHAuZnJvbU9iamVjdCh0KTt0aHJvdyBuZXcgXyhgVW5rbm93biBkYXRldGltZSBhcmd1bWVudDogJHt0fSwgb2YgdHlwZSAke3R5cGVvZiB0fWApfWZ1bmN0aW9uIElmKHtjb2xsZWN0aW9uczp0LGx3dzplfSx7dGFibGVJZHM6bix0YWJsZUNvbHVtbklkczpyLHJlbGF0aW9uc2hpcElkczpzLGluZGV4SWRzOmksaW5kZXhDb2x1bW5JZHM6YSxtZW1vSWRzOm99KXtWKHQpLmNvbGxlY3Rpb24oInRhYmxlRW50aXRpZXMiKS5yZW1vdmVNYW55KG4pLFYodCkuY29sbGVjdGlvbigidGFibGVDb2x1bW5FbnRpdGllcyIpLnJlbW92ZU1hbnkociksVih0KS5jb2xsZWN0aW9uKCJyZWxhdGlvbnNoaXBFbnRpdGllcyIpLnJlbW92ZU1hbnkocyksVih0KS5jb2xsZWN0aW9uKCJpbmRleEVudGl0aWVzIikucmVtb3ZlTWFueShpKSxWKHQpLmNvbGxlY3Rpb24oImluZGV4Q29sdW1uRW50aXRpZXMiKS5yZW1vdmVNYW55KGEpLFYodCkuY29sbGVjdGlvbigibWVtb0VudGl0aWVzIikucmVtb3ZlTWFueShvKSxbLi4ubiwuLi5yLC4uLnMsLi4uaSwuLi5hLC4uLm9dLmZvckVhY2godT0+UmVmbGVjdC5kZWxldGVQcm9wZXJ0eShlLHUpKX1jb25zdCBFZj0zMCxOZj1DKFsidGFibGVFbnRpdGllcyIsInRhYmxlQ29sdW1uRW50aXRpZXMiLCJyZWxhdGlvbnNoaXBFbnRpdGllcyIsImluZGV4RW50aXRpZXMiLCJpbmRleENvbHVtbkVudGl0aWVzIiwibWVtb0VudGl0aWVzIl0pO2NsYXNzIHhme2FzeW5jIHJ1bihlKXtjb25zdCBuPUpTT04ucGFyc2UoZSkscj1KbyhuKSx7ZG9jOnt0YWJsZUlkczpzLG1lbW9JZHM6aSxpbmRleElkczphLHJlbGF0aW9uc2hpcElkczpvfSxjb2xsZWN0aW9uczp1LGx3dzpsfT1yLGM9QyhzKSxkPUMoaSkseT1DKGEpLGg9QyhvKSxTPU1mKHAubm93KCkpLGo9Vih1KS5jb2xsZWN0aW9uKCJ0YWJsZUVudGl0aWVzIiksTT1WKHUpLmNvbGxlY3Rpb24oInRhYmxlQ29sdW1uRW50aXRpZXMiKSxxPVYodSkuY29sbGVjdGlvbigiaW5kZXhFbnRpdGllcyIpLEI9Vih1KS5jb2xsZWN0aW9uKCJpbmRleENvbHVtbkVudGl0aWVzIiksX2U9Vih1KS5jb2xsZWN0aW9uKCJyZWxhdGlvbnNoaXBFbnRpdGllcyIpLEZ0PVYodSkuY29sbGVjdGlvbigibWVtb0VudGl0aWVzIiksYj17dGFibGVJZHM6Wy4uLmouc2VsZWN0QWxsKCkuZmlsdGVyKFMoYykpLm1hcCgoe2lkOm19KT0+bSldLHRhYmxlQ29sdW1uSWRzOltdLHJlbGF0aW9uc2hpcElkczpbLi4uX2Uuc2VsZWN0QWxsKCkuZmlsdGVyKFMoaCkpLm1hcCgoe2lkOm19KT0+bSldLGluZGV4SWRzOlsuLi5xLnNlbGVjdEFsbCgpLmZpbHRlcihTKHkpKS5tYXAoKHtpZDptfSk9Pm0pXSxpbmRleENvbHVtbklkczpbXSxtZW1vSWRzOlsuLi5GdC5zZWxlY3RBbGwoKS5maWx0ZXIoUyhkKSkubWFwKCh7aWQ6bX0pPT5tKV19LEZlPUMoYi50YWJsZUlkcyksYm49QyhiLnJlbGF0aW9uc2hpcElkcyk7bGV0IEJlPUMoYi5pbmRleElkcyk7Yi50YWJsZUNvbHVtbklkcy5wdXNoKC4uLk0uc2VsZWN0QWxsKCkuZmlsdGVyKCh7dGFibGVJZDptfSk9PkZlKG0pKS5tYXAoKHtpZDptfSk9Pm0pKSxiLnJlbGF0aW9uc2hpcElkcy5wdXNoKC4uLl9lLnNlbGVjdEFsbCgpLmZpbHRlcigoe2lkOm0sc3RhcnQ6WSxlbmQ6UWV9KT0+IWJuKG0pJiYoRmUoWS50YWJsZUlkKXx8RmUoUWUudGFibGVJZCkpKS5tYXAoKHtpZDptfSk9Pm0pKSxiLmluZGV4SWRzLnB1c2goLi4ucS5zZWxlY3RBbGwoKS5maWx0ZXIoKHtpZDptLHRhYmxlSWQ6WX0pPT4hQmUobSkmJkZlKFkpKS5tYXAoKHtpZDptfSk9Pm0pKSxCZT1DKGIuaW5kZXhJZHMpLGIuaW5kZXhDb2x1bW5JZHMucHVzaCguLi5CLnNlbGVjdEFsbCgpLmZpbHRlcigoe2luZGV4SWQ6bX0pPT5CZShtKSkubWFwKCh7aWQ6bX0pPT5tKSksSWYocixiKTtjb25zdCBBZT1DKGouc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksbWU9QyhNLnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpLEF0PUMocS5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxEZj1DKEIuc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksX2Y9QyhfZS5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxGZj1DKEZ0LnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpO3JldHVybiBiLnRhYmxlQ29sdW1uSWRzLnB1c2goLi4uTS5zZWxlY3RBbGwoKS5maWx0ZXIoKHt0YWJsZUlkOm0saWQ6WSxtZXRhOlFlfSk9PiFBZShtKSYmUygoKT0+ITEpKHtpZDpZLG1ldGE6UWV9KSkubWFwKCh7aWQ6bX0pPT5tKSksYi5pbmRleENvbHVtbklkcy5wdXNoKC4uLkIuc2VsZWN0QWxsKCkuZmlsdGVyKCh7aW5kZXhJZDptLGlkOlksbWV0YTpRZX0pPT4hQXQobSkmJlMoKCk9PiExKSh7aWQ6WSxtZXRhOlFlfSkpLm1hcCgoe2lkOm19KT0+bSkpLE9iamVjdC5lbnRyaWVzKGwpLmZvckVhY2goKFttLFtZXV0pPT57aWYoTmYoWSkpc3dpdGNoKFkpe2Nhc2UidGFibGVFbnRpdGllcyI6IUFlKG0pJiZiLnRhYmxlSWRzLnB1c2gobSk7YnJlYWs7Y2FzZSJ0YWJsZUNvbHVtbkVudGl0aWVzIjohbWUobSkmJmIudGFibGVDb2x1bW5JZHMucHVzaChtKTticmVhaztjYXNlInJlbGF0aW9uc2hpcEVudGl0aWVzIjohX2YobSkmJmIucmVsYXRpb25zaGlwSWRzLnB1c2gobSk7YnJlYWs7Y2FzZSJpbmRleEVudGl0aWVzIjohQXQobSkmJmIuaW5kZXhJZHMucHVzaChtKTticmVhaztjYXNlImluZGV4Q29sdW1uRW50aXRpZXMiOiFEZihtKSYmYi5pbmRleENvbHVtbklkcy5wdXNoKG0pO2JyZWFrO2Nhc2UibWVtb0VudGl0aWVzIjohRmYobSkmJmIubWVtb0lkcy5wdXNoKG0pO2JyZWFrfX0pLHt0YWJsZUlkczpUZShiLnRhYmxlSWRzKSx0YWJsZUNvbHVtbklkczpUZShiLnRhYmxlQ29sdW1uSWRzKSxyZWxhdGlvbnNoaXBJZHM6VGUoYi5yZWxhdGlvbnNoaXBJZHMpLGluZGV4SWRzOlRlKGIuaW5kZXhJZHMpLGluZGV4Q29sdW1uSWRzOlRlKGIuaW5kZXhDb2x1bW5JZHMpLG1lbW9JZHM6VGUoYi5tZW1vSWRzKX19fWNvbnN0IE1mPXQ9PmU9Pih7aWQ6bixtZXRhOnJ9KT0+e2lmKGUobikpcmV0dXJuITE7Y29uc3Qgcz1NYXRoLmZsb29yKHQuZGlmZihwLmZyb21NaWxsaXMoci51cGRhdGVBdCksImRheXMiKS50b09iamVjdCgpLmRheXM/PzApO3JldHVybiBFZjxzfSxDZj1uZXcgeGY7V3QoQ2YpfSkoKTsK",ok=typeof window<"u"&&window.Blob&&new Blob([atob(ik)],{type:"text/javascript;charset=utf-8"});function Joe(e){let t;try{if(t=ok&&(window.URL||window.webkitURL).createObjectURL(ok),!t)throw"";const n=new Worker(t,{name:e==null?void 0:e.name});return n.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker("data:application/javascript;base64,"+ik,{name:e==null?void 0:e.name})}finally{t&&(window.URL||window.webkitURL).revokeObjectURL(t)}}function rk({collections:e,lww:t},{tableIds:n,tableColumnIds:i,relationshipIds:o,indexIds:r,indexColumnIds:a,memoIds:l}){S(e).collection("tableEntities").removeMany(n),S(e).collection("tableColumnEntities").removeMany(i),S(e).collection("relationshipEntities").removeMany(o),S(e).collection("indexEntities").removeMany(r),S(e).collection("indexColumnEntities").removeMany(a),S(e).collection("memoEntities").removeMany(l),[...n,...i,...o,...r,...a,...l].forEach(u=>Reflect.deleteProperty(t,u))}const $oe=30,Foe=se(["tableEntities","tableColumnEntities","relationshipEntities","indexEntities","indexColumnEntities","memoEntities"]);class Eoe{async run(t){const n=JSON.parse(t),i=Zr(n),{doc:{tableIds:o,memoIds:r,indexIds:a,relationshipIds:l},collections:u,lww:d}=i,h=se(o),y=se(r),f=se(a),g=se(l),Z=Ooe(Ze.now()),x=S(u).collection("tableEntities"),X=S(u).collection("tableColumnEntities"),W=S(u).collection("indexEntities"),R=S(u).collection("indexColumnEntities"),T=S(u).collection("relationshipEntities"),V=S(u).collection("memoEntities"),z={tableIds:[...x.selectAll().filter(Z(h)).map(({id:re})=>re)],tableColumnIds:[],relationshipIds:[...T.selectAll().filter(Z(g)).map(({id:re})=>re)],indexIds:[...W.selectAll().filter(Z(f)).map(({id:re})=>re)],indexColumnIds:[],memoIds:[...V.selectAll().filter(Z(y)).map(({id:re})=>re)]},H=se(z.tableIds),N=se(z.relationshipIds);let w=se(z.indexIds);z.tableColumnIds.push(...X.selectAll().filter(({tableId:re})=>H(re)).map(({id:re})=>re)),z.relationshipIds.push(...T.selectAll().filter(({id:re,start:Ge,end:Ot})=>!N(re)&&(H(Ge.tableId)||H(Ot.tableId))).map(({id:re})=>re)),z.indexIds.push(...W.selectAll().filter(({id:re,tableId:Ge})=>!w(re)&&H(Ge)).map(({id:re})=>re)),w=se(z.indexIds),z.indexColumnIds.push(...R.selectAll().filter(({indexId:re})=>w(re)).map(({id:re})=>re)),rk(i,z);const F=se(x.selectAll().map(({id:re})=>re)),E=se(X.selectAll().map(({id:re})=>re)),O=se(W.selectAll().map(({id:re})=>re)),A=se(R.selectAll().map(({id:re})=>re)),P=se(T.selectAll().map(({id:re})=>re)),Ve=se(V.selectAll().map(({id:re})=>re));return z.tableColumnIds.push(...X.selectAll().filter(({tableId:re,id:Ge,meta:Ot})=>!F(re)&&Z(()=>!1)({id:Ge,meta:Ot})).map(({id:re})=>re)),z.indexColumnIds.push(...R.selectAll().filter(({indexId:re,id:Ge,meta:Ot})=>!O(re)&&Z(()=>!1)({id:Ge,meta:Ot})).map(({id:re})=>re)),Object.entries(d).forEach(([re,[Ge]])=>{if(Foe(Ge))switch(Ge){case"tableEntities":!F(re)&&z.tableIds.push(re);break;case"tableColumnEntities":!E(re)&&z.tableColumnIds.push(re);break;case"relationshipEntities":!P(re)&&z.relationshipIds.push(re);break;case"indexEntities":!O(re)&&z.indexIds.push(re);break;case"indexColumnEntities":!A(re)&&z.indexColumnIds.push(re);break;case"memoEntities":!Ve(re)&&z.memoIds.push(re);break}}),{tableIds:Ao(z.tableIds),tableColumnIds:Ao(z.tableColumnIds),relationshipIds:Ao(z.relationshipIds),indexIds:Ao(z.indexIds),indexColumnIds:Ao(z.indexColumnIds),memoIds:Ao(z.memoIds)}}}const Ooe=e=>t=>({id:n,meta:i})=>{if(t(n))return!1;const o=Math.floor(e.diff(Ze.fromMillis(i.updateAt),"days").toObject().days??0);return $oe<o},ak="@dineug/erd-editor-schema-gc-worker?v3.0.2";let rs=null;function Uoe(){if(rs)return rs;try{const e=new zoe({name:ak});rs=M1(e.port)}catch{try{const t=new Joe({name:ak});rs=M1(t)}catch{rs=new Eoe}}return rs}let Qh=null,as;const Poe=2,joe=J`
|
|
7062
|
+
*/const B5=Symbol("Comlink.proxy"),koe=Symbol("Comlink.endpoint"),Voe=Symbol("Comlink.releaseProxy"),H1=Symbol("Comlink.finalizer"),Uh=Symbol("Comlink.thrown"),Q5=e=>typeof e=="object"&&e!==null||typeof e=="function",Coe={canHandle:e=>Q5(e)&&e[B5],serialize(e){const{port1:t,port2:n}=new MessageChannel;return _5(e,t),[n,[n]]},deserialize(e){return e.start(),M1(e)}},Soe={canHandle:e=>Q5(e)&&Uh in e,serialize({value:e}){let t;return e instanceof Error?t={isError:!0,value:{message:e.message,name:e.name,stack:e.stack}}:t={isError:!1,value:e},[t,[]]},deserialize(e){throw e.isError?Object.assign(new Error(e.value.message),e.value):e.value}},D5=new Map([["proxy",Coe],["throw",Soe]]);function Roe(e,t){for(const n of e)if(t===n||n==="*"||n instanceof RegExp&&n.test(t))return!0;return!1}function _5(e,t=globalThis,n=["*"]){t.addEventListener("message",function i(o){if(!o||!o.data)return;if(!Roe(n,o.origin)){console.warn(`Invalid origin '${o.origin}' for comlink proxy`);return}const{id:r,type:a,path:l}=Object.assign({path:[]},o.data),u=(o.data.argumentList||[]).map(ka);let d;try{const h=l.slice(0,-1).reduce((f,g)=>f[g],e),y=l.reduce((f,g)=>f[g],e);switch(a){case"GET":d=y;break;case"SET":h[l.slice(-1)[0]]=ka(o.data.value),d=!0;break;case"APPLY":d=y.apply(h,u);break;case"CONSTRUCT":{const f=new y(...u);d=Koe(f)}break;case"ENDPOINT":{const{port1:f,port2:g}=new MessageChannel;_5(e,g),d=Noe(f,[f])}break;case"RELEASE":d=void 0;break;default:return}}catch(h){d={value:h,[Uh]:0}}Promise.resolve(d).catch(h=>({value:h,[Uh]:0})).then(h=>{const[y,f]=Bh(h);t.postMessage(Object.assign(Object.assign({},y),{id:r}),f),a==="RELEASE"&&(t.removeEventListener("message",i),q5(t),H1 in e&&typeof e[H1]=="function"&&e[H1]())}).catch(h=>{const[y,f]=Bh({value:new TypeError("Unserializable return value"),[Uh]:0});t.postMessage(Object.assign(Object.assign({},y),{id:r}),f)})}),t.start&&t.start()}function Toe(e){return e.constructor.name==="MessagePort"}function q5(e){Toe(e)&&e.close()}function M1(e,t){return z1(e,[],t)}function Ph(e){if(e)throw new Error("Proxy has been released and is not useable")}function ek(e){return os(e,{type:"RELEASE"}).then(()=>{q5(e)})}const jh=new WeakMap,Ah="FinalizationRegistry"in globalThis&&new FinalizationRegistry(e=>{const t=(jh.get(e)||0)-1;jh.set(e,t),t===0&&ek(e)});function Loe(e,t){const n=(jh.get(t)||0)+1;jh.set(t,n),Ah&&Ah.register(e,t,e)}function Yoe(e){Ah&&Ah.unregister(e)}function z1(e,t=[],n=function(){}){let i=!1;const o=new Proxy(n,{get(r,a){if(Ph(i),a===Voe)return()=>{Yoe(o),ek(e),i=!0};if(a==="then"){if(t.length===0)return{then:()=>o};const l=os(e,{type:"GET",path:t.map(u=>u.toString())}).then(ka);return l.then.bind(l)}return z1(e,[...t,a])},set(r,a,l){Ph(i);const[u,d]=Bh(l);return os(e,{type:"SET",path:[...t,a].map(h=>h.toString()),value:u},d).then(ka)},apply(r,a,l){Ph(i);const u=t[t.length-1];if(u===koe)return os(e,{type:"ENDPOINT"}).then(ka);if(u==="bind")return z1(e,t.slice(0,-1));const[d,h]=tk(l);return os(e,{type:"APPLY",path:t.map(y=>y.toString()),argumentList:d},h).then(ka)},construct(r,a){Ph(i);const[l,u]=tk(a);return os(e,{type:"CONSTRUCT",path:t.map(d=>d.toString()),argumentList:l},u).then(ka)}});return Loe(o,e),o}function woe(e){return Array.prototype.concat.apply([],e)}function tk(e){const t=e.map(Bh);return[t.map(n=>n[0]),woe(t.map(n=>n[1]))]}const nk=new WeakMap;function Noe(e,t){return nk.set(e,t),e}function Koe(e){return Object.assign(e,{[B5]:!0})}function Bh(e){for(const[t,n]of D5)if(n.canHandle(e)){const[i,o]=n.serialize(e);return[{type:"HANDLER",name:t,value:i},o]}return[{type:"RAW",value:e},nk.get(e)||[]]}function ka(e){switch(e.type){case"HANDLER":return D5.get(e.name).deserialize(e.value);case"RAW":return e.value}}function os(e,t,n){return new Promise(i=>{const o=Hoe();e.addEventListener("message",function r(a){!a.data||!a.data.id||a.data.id!==o||(e.removeEventListener("message",r),i(a.data))}),e.start&&e.start(),e.postMessage(Object.assign({id:o},t),n)})}function Hoe(){return new Array(4).fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-")}const Moe="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiOy8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiAqL2NvbnN0IGtuPVN5bWJvbCgiQ29tbGluay5wcm94eSIpLFBzPVN5bWJvbCgiQ29tbGluay5lbmRwb2ludCIpLGpzPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxWdD1TeW1ib2woIkNvbWxpbmsuZmluYWxpemVyIiksS2U9U3ltYm9sKCJDb21saW5rLnRocm93biIpLEluPXQ9PnR5cGVvZiB0PT0ib2JqZWN0IiYmdCE9PW51bGx8fHR5cGVvZiB0PT0iZnVuY3Rpb24iLFVzPXtjYW5IYW5kbGU6dD0+SW4odCkmJnRba25dLHNlcmlhbGl6ZSh0KXtjb25zdHtwb3J0MTplLHBvcnQyOm59PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gV3QodCxlKSxbbixbbl1dfSxkZXNlcmlhbGl6ZSh0KXtyZXR1cm4gdC5zdGFydCgpLEdzKHQpfX0sSHM9e2NhbkhhbmRsZTp0PT5Jbih0KSYmS2UgaW4gdCxzZXJpYWxpemUoe3ZhbHVlOnR9KXtsZXQgZTtyZXR1cm4gdCBpbnN0YW5jZW9mIEVycm9yP2U9e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2t9fTplPXtpc0Vycm9yOiExLHZhbHVlOnR9LFtlLFtdXX0sZGVzZXJpYWxpemUodCl7dGhyb3cgdC5pc0Vycm9yP09iamVjdC5hc3NpZ24obmV3IEVycm9yKHQudmFsdWUubWVzc2FnZSksdC52YWx1ZSk6dC52YWx1ZX19LEVuPW5ldyBNYXAoW1sicHJveHkiLFVzXSxbInRocm93IixIc11dKTtmdW5jdGlvbiBxcyh0LGUpe2Zvcihjb25zdCBuIG9mIHQpaWYoZT09PW58fG49PT0iKiJ8fG4gaW5zdGFuY2VvZiBSZWdFeHAmJm4udGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBXdCh0LGU9Z2xvYmFsVGhpcyxuPVsiKiJdKXtlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIHIocyl7aWYoIXN8fCFzLmRhdGEpcmV0dXJuO2lmKCFxcyhuLHMub3JpZ2luKSl7Y29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtzLm9yaWdpbn0nIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWNvbnN0e2lkOmksdHlwZTphLHBhdGg6b309T2JqZWN0LmFzc2lnbih7cGF0aDpbXX0scy5kYXRhKSx1PShzLmRhdGEuYXJndW1lbnRMaXN0fHxbXSkubWFwKGllKTtsZXQgbDt0cnl7Y29uc3QgYz1vLnNsaWNlKDAsLTEpLnJlZHVjZSgoeSxoKT0+eVtoXSx0KSxkPW8ucmVkdWNlKCh5LGgpPT55W2hdLHQpO3N3aXRjaChhKXtjYXNlIkdFVCI6bD1kO2JyZWFrO2Nhc2UiU0VUIjpjW28uc2xpY2UoLTEpWzBdXT1pZShzLmRhdGEudmFsdWUpLGw9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6bD1kLmFwcGx5KGMsdSk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntjb25zdCB5PW5ldyBkKC4uLnUpO2w9WHMoeSl9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2NvbnN0e3BvcnQxOnkscG9ydDI6aH09bmV3IE1lc3NhZ2VDaGFubmVsO1d0KHQsaCksbD1Lcyh5LFt5XSl9YnJlYWs7Y2FzZSJSRUxFQVNFIjpsPXZvaWQgMDticmVhaztkZWZhdWx0OnJldHVybn19Y2F0Y2goYyl7bD17dmFsdWU6YyxbS2VdOjB9fVByb21pc2UucmVzb2x2ZShsKS5jYXRjaChjPT4oe3ZhbHVlOmMsW0tlXTowfSkpLnRoZW4oYz0+e2NvbnN0W2QseV09bnQoYyk7ZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCkse2lkOml9KSx5KSxhPT09IlJFTEVBU0UiJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyKSxObihlKSxWdCBpbiB0JiZ0eXBlb2YgdFtWdF09PSJmdW5jdGlvbiImJnRbVnRdKCkpfSkuY2F0Y2goYz0+e2NvbnN0W2QseV09bnQoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFtLZV06MH0pO2UucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLHtpZDppfSkseSl9KX0pLGUuc3RhcnQmJmUuc3RhcnQoKX1mdW5jdGlvbiBZcyh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBObih0KXtZcyh0KSYmdC5jbG9zZSgpfWZ1bmN0aW9uIEdzKHQsZSl7cmV0dXJuICR0KHQsW10sZSl9ZnVuY3Rpb24gWGUodCl7aWYodCl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIHhuKHQpe3JldHVybiB5ZSh0LHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9PntObih0KX0pfWNvbnN0IGV0PW5ldyBXZWFrTWFwLHR0PSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkodD0+e2NvbnN0IGU9KGV0LmdldCh0KXx8MCktMTtldC5zZXQodCxlKSxlPT09MCYmeG4odCl9KTtmdW5jdGlvbiBKcyh0LGUpe2NvbnN0IG49KGV0LmdldChlKXx8MCkrMTtldC5zZXQoZSxuKSx0dCYmdHQucmVnaXN0ZXIodCxlLHQpfWZ1bmN0aW9uIEJzKHQpe3R0JiZ0dC51bnJlZ2lzdGVyKHQpfWZ1bmN0aW9uICR0KHQsZT1bXSxuPWZ1bmN0aW9uKCl7fSl7bGV0IHI9ITE7Y29uc3Qgcz1uZXcgUHJveHkobix7Z2V0KGksYSl7aWYoWGUociksYT09PWpzKXJldHVybigpPT57QnMocykseG4odCkscj0hMH07aWYoYT09PSJ0aGVuIil7aWYoZS5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5zfTtjb25zdCBvPXllKHQse3R5cGU6IkdFVCIscGF0aDplLm1hcCh1PT51LnRvU3RyaW5nKCkpfSkudGhlbihpZSk7cmV0dXJuIG8udGhlbi5iaW5kKG8pfXJldHVybiAkdCh0LFsuLi5lLGFdKX0sc2V0KGksYSxvKXtYZShyKTtjb25zdFt1LGxdPW50KG8pO3JldHVybiB5ZSh0LHt0eXBlOiJTRVQiLHBhdGg6Wy4uLmUsYV0ubWFwKGM9PmMudG9TdHJpbmcoKSksdmFsdWU6dX0sbCkudGhlbihpZSl9LGFwcGx5KGksYSxvKXtYZShyKTtjb25zdCB1PWVbZS5sZW5ndGgtMV07aWYodT09PVBzKXJldHVybiB5ZSh0LHt0eXBlOiJFTkRQT0lOVCJ9KS50aGVuKGllKTtpZih1PT09ImJpbmQiKXJldHVybiAkdCh0LGUuc2xpY2UoMCwtMSkpO2NvbnN0W2wsY109TW4obyk7cmV0dXJuIHllKHQse3R5cGU6IkFQUExZIixwYXRoOmUubWFwKGQ9PmQudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0Omx9LGMpLnRoZW4oaWUpfSxjb25zdHJ1Y3QoaSxhKXtYZShyKTtjb25zdFtvLHVdPU1uKGEpO3JldHVybiB5ZSh0LHt0eXBlOiJDT05TVFJVQ1QiLHBhdGg6ZS5tYXAobD0+bC50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6b30sdSkudGhlbihpZSl9fSk7cmV0dXJuIEpzKHMsdCksc31mdW5jdGlvbiBRcyh0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSx0KX1mdW5jdGlvbiBNbih0KXtjb25zdCBlPXQubWFwKG50KTtyZXR1cm5bZS5tYXAobj0+blswXSksUXMoZS5tYXAobj0+blsxXSkpXX1jb25zdCBDbj1uZXcgV2Vha01hcDtmdW5jdGlvbiBLcyh0LGUpe3JldHVybiBDbi5zZXQodCxlKSx0fWZ1bmN0aW9uIFhzKHQpe3JldHVybiBPYmplY3QuYXNzaWduKHQse1trbl06ITB9KX1mdW5jdGlvbiBudCh0KXtmb3IoY29uc3RbZSxuXW9mIEVuKWlmKG4uY2FuSGFuZGxlKHQpKXtjb25zdFtyLHNdPW4uc2VyaWFsaXplKHQpO3JldHVyblt7dHlwZToiSEFORExFUiIsbmFtZTplLHZhbHVlOnJ9LHNdfXJldHVyblt7dHlwZToiUkFXIix2YWx1ZTp0fSxDbi5nZXQodCl8fFtdXX1mdW5jdGlvbiBpZSh0KXtzd2l0Y2godC50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiBFbi5nZXQodC5uYW1lKS5kZXNlcmlhbGl6ZSh0LnZhbHVlKTtjYXNlIlJBVyI6cmV0dXJuIHQudmFsdWV9fWZ1bmN0aW9uIHllKHQsZSxuKXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2NvbnN0IHM9ZWkoKTt0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGkoYSl7IWEuZGF0YXx8IWEuZGF0YS5pZHx8YS5kYXRhLmlkIT09c3x8KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsaSkscihhLmRhdGEpKX0pLHQuc3RhcnQmJnQuc3RhcnQoKSx0LnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkOnN9LGUpLG4pfSl9ZnVuY3Rpb24gZWkoKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfS8qIQogKiBAZGluZXVnL2VyZC1lZGl0b3Itc2NoZW1hCiAqIEB2ZXJzaW9uIDAuMS4wIHwgU2F0IERlYyAyMyAyMDIzCiAqIEBhdXRob3IgU2V1bmdId2FuLUxlZSA8ZGluZXVnMkBnbWFpbC5jb20+CiAqIEBsaWNlbnNlIE1JVAogKi92YXIgdGk9dHlwZW9mIGdsb2JhbD09Im9iamVjdCImJmdsb2JhbCYmZ2xvYmFsLk9iamVjdD09PU9iamVjdCYmZ2xvYmFsO2NvbnN0IG5pPXRpO3ZhciByaT10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLHNpPW5pfHxyaXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTtjb25zdCBMdD1zaTt2YXIgaWk9THQuU3ltYm9sO2NvbnN0IFE9aWk7dmFyIERuPU9iamVjdC5wcm90b3R5cGUsYWk9RG4uaGFzT3duUHJvcGVydHksb2k9RG4udG9TdHJpbmcsVmU9UT9RLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiB1aSh0KXt2YXIgZT1haS5jYWxsKHQsVmUpLG49dFtWZV07dHJ5e3RbVmVdPXZvaWQgMDt2YXIgcj0hMH1jYXRjaHt9dmFyIHM9b2kuY2FsbCh0KTtyZXR1cm4gciYmKGU/dFtWZV09bjpkZWxldGUgdFtWZV0pLHN9dmFyIGxpPU9iamVjdC5wcm90b3R5cGUsY2k9bGkudG9TdHJpbmc7ZnVuY3Rpb24gZmkodCl7cmV0dXJuIGNpLmNhbGwodCl9dmFyIGRpPSJbb2JqZWN0IE51bGxdIixoaT0iW29iamVjdCBVbmRlZmluZWRdIixfbj1RP1EudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIHp0KHQpe3JldHVybiB0PT1udWxsP3Q9PT12b2lkIDA/aGk6ZGk6X24mJl9uIGluIE9iamVjdCh0KT91aSh0KTpmaSh0KX1mdW5jdGlvbiBydCh0KXtyZXR1cm4gdCE9bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QifXZhciBtaT0iW29iamVjdCBTeW1ib2xdIjtmdW5jdGlvbiBadCh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wifHxydCh0KSYmenQodCk9PW1pfWZ1bmN0aW9uIEZuKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLHM9QXJyYXkocik7KytuPHI7KXNbbl09ZSh0W25dLG4sdCk7cmV0dXJuIHN9dmFyIHlpPUFycmF5LmlzQXJyYXk7Y29uc3QgV2U9eWk7dmFyIGdpPTEvMCxBbj1RP1EucHJvdG90eXBlOnZvaWQgMCxWbj1Bbj9Bbi50b1N0cmluZzp2b2lkIDA7ZnVuY3Rpb24gV24odCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0O2lmKFdlKHQpKXJldHVybiBGbih0LFduKSsiIjtpZihadCh0KSlyZXR1cm4gVm4/Vm4uY2FsbCh0KToiIjt2YXIgZT10KyIiO3JldHVybiBlPT0iMCImJjEvdD09LWdpPyItMCI6ZX1mdW5jdGlvbiBzdCh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gdCE9bnVsbCYmKGU9PSJvYmplY3QifHxlPT0iZnVuY3Rpb24iKX1mdW5jdGlvbiAkbih0KXtyZXR1cm4gdH12YXIgcGk9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLHdpPSJbb2JqZWN0IEZ1bmN0aW9uXSIsdmk9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixPaT0iW29iamVjdCBQcm94eV0iO2Z1bmN0aW9uIExuKHQpe2lmKCFzdCh0KSlyZXR1cm4hMTt2YXIgZT16dCh0KTtyZXR1cm4gZT09d2l8fGU9PXZpfHxlPT1waXx8ZT09T2l9dmFyIFRpPUx0WyJfX2NvcmUtanNfc2hhcmVkX18iXTtjb25zdCBSdD1UaTt2YXIgem49ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKFJ0JiZSdC5rZXlzJiZSdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIFNpKHQpe3JldHVybiEhem4mJnpuIGluIHR9dmFyIGJpPUZ1bmN0aW9uLnByb3RvdHlwZSxraT1iaS50b1N0cmluZztmdW5jdGlvbiBJaSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIGtpLmNhbGwodCl9Y2F0Y2h7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaHt9fXJldHVybiIifXZhciBFaT0vW1xcXiQuKis/KClbXF17fXxdL2csTmk9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8seGk9RnVuY3Rpb24ucHJvdG90eXBlLE1pPU9iamVjdC5wcm90b3R5cGUsQ2k9eGkudG9TdHJpbmcsRGk9TWkuaGFzT3duUHJvcGVydHksX2k9UmVnRXhwKCJeIitDaS5jYWxsKERpKS5yZXBsYWNlKEVpLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIEZpKHQpe2lmKCFzdCh0KXx8U2kodCkpcmV0dXJuITE7dmFyIGU9TG4odCk/X2k6Tmk7cmV0dXJuIGUudGVzdChJaSh0KSl9ZnVuY3Rpb24gQWkodCxlKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtlXX1mdW5jdGlvbiBQdCh0LGUpe3ZhciBuPUFpKHQsZSk7cmV0dXJuIEZpKG4pP246dm9pZCAwfWZ1bmN0aW9uIFZpKHQsZSxuKXtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gdC5jYWxsKGUpO2Nhc2UgMTpyZXR1cm4gdC5jYWxsKGUsblswXSk7Y2FzZSAyOnJldHVybiB0LmNhbGwoZSxuWzBdLG5bMV0pO2Nhc2UgMzpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdLG5bMl0pfXJldHVybiB0LmFwcGx5KGUsbil9dmFyIFdpPTgwMCwkaT0xNixMaT1EYXRlLm5vdztmdW5jdGlvbiB6aSh0KXt2YXIgZT0wLG49MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1MaSgpLHM9JGktKHItbik7aWYobj1yLHM+MCl7aWYoKytlPj1XaSlyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX1mdW5jdGlvbiBaaSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIFJpPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PVB0KE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaHt9fSgpO2NvbnN0IGl0PVJpO3ZhciBQaT1pdD9mdW5jdGlvbih0LGUpe3JldHVybiBpdCh0LCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOlppKGUpLHdyaXRhYmxlOiEwfSl9OiRuLGppPXppKFBpKTtjb25zdCBabj1qaTtmdW5jdGlvbiBVaSh0LGUsbixyKXtmb3IodmFyIHM9dC5sZW5ndGgsaT1uKyhyPzE6LTEpO3I/aS0tOisraTxzOylpZihlKHRbaV0saSx0KSlyZXR1cm4gaTtyZXR1cm4tMX1mdW5jdGlvbiBIaSh0KXtyZXR1cm4gdCE9PXR9ZnVuY3Rpb24gcWkodCxlLG4pe2Zvcih2YXIgcj1uLTEscz10Lmxlbmd0aDsrK3I8czspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gWWkodCxlLG4pe3JldHVybiBlPT09ZT9xaSh0LGUsbik6VWkodCxIaSxuKX1mdW5jdGlvbiBHaSh0LGUpe3ZhciBuPXQ9PW51bGw/MDp0Lmxlbmd0aDtyZXR1cm4hIW4mJllpKHQsZSwwKT4tMX12YXIgSmk9OTAwNzE5OTI1NDc0MDk5MSxCaT0vXig/OjB8WzEtOV1cZCopJC87ZnVuY3Rpb24gUm4odCxlKXt2YXIgbj10eXBlb2YgdDtyZXR1cm4gZT1lPz9KaSwhIWUmJihuPT0ibnVtYmVyInx8biE9InN5bWJvbCImJkJpLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX1mdW5jdGlvbiBRaSh0LGUsbil7ZT09Il9fcHJvdG9fXyImJml0P2l0KHQsZSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH0pOnRbZV09bn1mdW5jdGlvbiBQbih0LGUpe3JldHVybiB0PT09ZXx8dCE9PXQmJmUhPT1lfXZhciBLaT1PYmplY3QucHJvdG90eXBlLFhpPUtpLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGVhKHQsZSxuKXt2YXIgcj10W2VdOyghKFhpLmNhbGwodCxlKSYmUG4ocixuKSl8fG49PT12b2lkIDAmJiEoZSBpbiB0KSkmJlFpKHQsZSxuKX12YXIgam49TWF0aC5tYXg7ZnVuY3Rpb24gVW4odCxlLG4pe3JldHVybiBlPWpuKGU9PT12b2lkIDA/dC5sZW5ndGgtMTplLDApLGZ1bmN0aW9uKCl7Zm9yKHZhciByPWFyZ3VtZW50cyxzPS0xLGk9am4oci5sZW5ndGgtZSwwKSxhPUFycmF5KGkpOysrczxpOylhW3NdPXJbZStzXTtzPS0xO2Zvcih2YXIgbz1BcnJheShlKzEpOysrczxlOylvW3NdPXJbc107cmV0dXJuIG9bZV09bihhKSxWaSh0LHRoaXMsbyl9fWZ1bmN0aW9uIHRhKHQsZSl7cmV0dXJuIFpuKFVuKHQsZSwkbiksdCsiIil9dmFyIG5hPTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gSG4odCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIiYmdD4tMSYmdCUxPT0wJiZ0PD1uYX1mdW5jdGlvbiByYSh0KXtyZXR1cm4gdCE9bnVsbCYmSG4odC5sZW5ndGgpJiYhTG4odCl9dmFyIHNhPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIHFuKHQpe3JldHVybiBydCh0KSYmenQodCk9PXNhfXZhciBZbj1PYmplY3QucHJvdG90eXBlLGlhPVluLmhhc093blByb3BlcnR5LGFhPVluLnByb3BlcnR5SXNFbnVtZXJhYmxlLG9hPXFuKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/cW46ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KHQpJiZpYS5jYWxsKHQsImNhbGxlZSIpJiYhYWEuY2FsbCh0LCJjYWxsZWUiKX07Y29uc3QgR249b2E7ZnVuY3Rpb24gdWEodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX12YXIgbGE9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sY2E9L15cdyokLztmdW5jdGlvbiBmYSh0LGUpe2lmKFdlKHQpKXJldHVybiExO3ZhciBuPXR5cGVvZiB0O3JldHVybiBuPT0ibnVtYmVyInx8bj09InN5bWJvbCJ8fG49PSJib29sZWFuInx8dD09bnVsbHx8WnQodCk/ITA6Y2EudGVzdCh0KXx8IWxhLnRlc3QodCl8fGUhPW51bGwmJnQgaW4gT2JqZWN0KGUpfXZhciBkYT1QdChPYmplY3QsImNyZWF0ZSIpO2NvbnN0ICRlPWRhO2Z1bmN0aW9uIGhhKCl7dGhpcy5fX2RhdGFfXz0kZT8kZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBtYSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX12YXIgeWE9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLGdhPU9iamVjdC5wcm90b3R5cGUscGE9Z2EuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gd2EodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZigkZSl7dmFyIG49ZVt0XTtyZXR1cm4gbj09PXlhP3ZvaWQgMDpufXJldHVybiBwYS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9dmFyIHZhPU9iamVjdC5wcm90b3R5cGUsT2E9dmEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gVGEodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gJGU/ZVt0XSE9PXZvaWQgMDpPYS5jYWxsKGUsdCl9dmFyIFNhPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBiYSh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09JGUmJmU9PT12b2lkIDA/U2E6ZSx0aGlzfWZ1bmN0aW9uIGFlKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWFlLnByb3RvdHlwZS5jbGVhcj1oYSxhZS5wcm90b3R5cGUuZGVsZXRlPW1hLGFlLnByb3RvdHlwZS5nZXQ9d2EsYWUucHJvdG90eXBlLmhhcz1UYSxhZS5wcm90b3R5cGUuc2V0PWJhO2Z1bmN0aW9uIGthKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBhdCh0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKFBuKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9dmFyIElhPUFycmF5LnByb3RvdHlwZSxFYT1JYS5zcGxpY2U7ZnVuY3Rpb24gTmEodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWF0KGUsdCk7aWYobjwwKXJldHVybiExO3ZhciByPWUubGVuZ3RoLTE7cmV0dXJuIG49PXI/ZS5wb3AoKTpFYS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiB4YSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49YXQoZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfWZ1bmN0aW9uIE1hKHQpe3JldHVybiBhdCh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIENhKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPWF0KG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9ZnVuY3Rpb24gZ2UodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19Z2UucHJvdG90eXBlLmNsZWFyPWthLGdlLnByb3RvdHlwZS5kZWxldGU9TmEsZ2UucHJvdG90eXBlLmdldD14YSxnZS5wcm90b3R5cGUuaGFzPU1hLGdlLnByb3RvdHlwZS5zZXQ9Q2E7dmFyIERhPVB0KEx0LCJNYXAiKTtjb25zdCBfYT1EYTtmdW5jdGlvbiBGYSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGFlLG1hcDpuZXcoX2F8fGdlKSxzdHJpbmc6bmV3IGFlfX1mdW5jdGlvbiBBYSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09InN0cmluZyJ8fGU9PSJudW1iZXIifHxlPT0ic3ltYm9sInx8ZT09ImJvb2xlYW4iP3QhPT0iX19wcm90b19fIjp0PT09bnVsbH1mdW5jdGlvbiBvdCh0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIEFhKGUpP25bdHlwZW9mIGU9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gVmEodCl7dmFyIGU9b3QodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX1mdW5jdGlvbiBXYSh0KXtyZXR1cm4gb3QodGhpcyx0KS5nZXQodCl9ZnVuY3Rpb24gJGEodCl7cmV0dXJuIG90KHRoaXMsdCkuaGFzKHQpfWZ1bmN0aW9uIExhKHQsZSl7dmFyIG49b3QodGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc31mdW5jdGlvbiBLKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fUsucHJvdG90eXBlLmNsZWFyPUZhLEsucHJvdG90eXBlLmRlbGV0ZT1WYSxLLnByb3RvdHlwZS5nZXQ9V2EsSy5wcm90b3R5cGUuaGFzPSRhLEsucHJvdG90eXBlLnNldD1MYTt2YXIgemE9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIGp0KHQsZSl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiJ8fGUhPW51bGwmJnR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoemEpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLHM9ZT9lLmFwcGx5KHRoaXMscik6clswXSxpPW4uY2FjaGU7aWYoaS5oYXMocykpcmV0dXJuIGkuZ2V0KHMpO3ZhciBhPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1pLnNldChzLGEpfHxpLGF9O3JldHVybiBuLmNhY2hlPW5ldyhqdC5DYWNoZXx8Syksbn1qdC5DYWNoZT1LO3ZhciBaYT01MDA7ZnVuY3Rpb24gUmEodCl7dmFyIGU9anQodCxmdW5jdGlvbihyKXtyZXR1cm4gbi5zaXplPT09WmEmJm4uY2xlYXIoKSxyfSksbj1lLmNhY2hlO3JldHVybiBlfXZhciBQYT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxqYT0vXFwoXFwpPy9nLFVhPVJhKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB0LmNoYXJDb2RlQXQoMCk9PT00NiYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoUGEsZnVuY3Rpb24obixyLHMsaSl7ZS5wdXNoKHM/aS5yZXBsYWNlKGphLCIkMSIpOnJ8fG4pfSksZX0pO2NvbnN0IEhhPVVhO2Z1bmN0aW9uIHFhKHQpe3JldHVybiB0PT1udWxsPyIiOlduKHQpfWZ1bmN0aW9uIHV0KHQsZSl7cmV0dXJuIFdlKHQpP3Q6ZmEodCxlKT9bdF06SGEocWEodCkpfXZhciBZYT0xLzA7ZnVuY3Rpb24gVXQodCl7aWYodHlwZW9mIHQ9PSJzdHJpbmcifHxadCh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiBlPT0iMCImJjEvdD09LVlhPyItMCI6ZX1mdW5jdGlvbiBHYSh0LGUpe2U9dXQoZSx0KTtmb3IodmFyIG49MCxyPWUubGVuZ3RoO3QhPW51bGwmJm48cjspdD10W1V0KGVbbisrXSldO3JldHVybiBuJiZuPT1yP3Q6dm9pZCAwfWZ1bmN0aW9uIEphKHQsZSl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgscz10Lmxlbmd0aDsrK248cjspdFtzK25dPWVbbl07cmV0dXJuIHR9dmFyIEpuPVE/US5pc0NvbmNhdFNwcmVhZGFibGU6dm9pZCAwO2Z1bmN0aW9uIEJhKHQpe3JldHVybiBXZSh0KXx8R24odCl8fCEhKEpuJiZ0JiZ0W0puXSl9ZnVuY3Rpb24gSHQodCxlLG4scixzKXt2YXIgaT0tMSxhPXQubGVuZ3RoO2ZvcihufHwobj1CYSksc3x8KHM9W10pOysraTxhOyl7dmFyIG89dFtpXTtlPjAmJm4obyk/ZT4xP0h0KG8sZS0xLG4scixzKTpKYShzLG8pOnJ8fChzW3MubGVuZ3RoXT1vKX1yZXR1cm4gc31mdW5jdGlvbiBRYSh0KXt2YXIgZT10PT1udWxsPzA6dC5sZW5ndGg7cmV0dXJuIGU/SHQodCwxKTpbXX1mdW5jdGlvbiBLYSh0KXtyZXR1cm4gWm4oVW4odCx2b2lkIDAsUWEpLHQrIiIpfXZhciBYYT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gZW8odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsWGEpLHRoaXN9ZnVuY3Rpb24gdG8odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfWZ1bmN0aW9uIGx0KHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBLOysrZTxuOyl0aGlzLmFkZCh0W2VdKX1sdC5wcm90b3R5cGUuYWRkPWx0LnByb3RvdHlwZS5wdXNoPWVvLGx0LnByb3RvdHlwZS5oYXM9dG87ZnVuY3Rpb24gbm8odCxlKXtyZXR1cm4gdC5oYXMoZSl9ZnVuY3Rpb24gcm8odCxlKXtyZXR1cm4gdCE9bnVsbCYmZSBpbiBPYmplY3QodCl9ZnVuY3Rpb24gc28odCxlLG4pe2U9dXQoZSx0KTtmb3IodmFyIHI9LTEscz1lLmxlbmd0aCxpPSExOysrcjxzOyl7dmFyIGE9VXQoZVtyXSk7aWYoIShpPXQhPW51bGwmJm4odCxhKSkpYnJlYWs7dD10W2FdfXJldHVybiBpfHwrK3IhPXM/aToocz10PT1udWxsPzA6dC5sZW5ndGgsISFzJiZIbihzKSYmUm4oYSxzKSYmKFdlKHQpfHxHbih0KSkpfWZ1bmN0aW9uIGlvKHQsZSl7cmV0dXJuIHQhPW51bGwmJnNvKHQsZSxybyl9ZnVuY3Rpb24gQm4odCl7cmV0dXJuIHJ0KHQpJiZyYSh0KX1mdW5jdGlvbiBhbyh0LGUsbil7Zm9yKHZhciByPS0xLHM9dD09bnVsbD8wOnQubGVuZ3RoOysrcjxzOylpZihuKGUsdFtyXSkpcmV0dXJuITA7cmV0dXJuITF9dmFyIG9vPTIwMDtmdW5jdGlvbiB1byh0LGUsbixyKXt2YXIgcz0tMSxpPUdpLGE9ITAsbz10Lmxlbmd0aCx1PVtdLGw9ZS5sZW5ndGg7aWYoIW8pcmV0dXJuIHU7biYmKGU9Rm4oZSx1YShuKSkpLHI/KGk9YW8sYT0hMSk6ZS5sZW5ndGg+PW9vJiYoaT1ubyxhPSExLGU9bmV3IGx0KGUpKTtlOmZvcig7KytzPG87KXt2YXIgYz10W3NdLGQ9bj09bnVsbD9jOm4oYyk7aWYoYz1yfHxjIT09MD9jOjAsYSYmZD09PWQpe2Zvcih2YXIgeT1sO3ktLTspaWYoZVt5XT09PWQpY29udGludWUgZTt1LnB1c2goYyl9ZWxzZSBpKGUsZCxyKXx8dS5wdXNoKGMpfXJldHVybiB1fXZhciBsbz10YShmdW5jdGlvbih0LGUpe3JldHVybiBCbih0KT91byh0LEh0KGUsMSxCbiwhMCkpOltdfSk7Y29uc3QgY289bG87ZnVuY3Rpb24gZm8odCxlLG4scil7aWYoIXN0KHQpKXJldHVybiB0O2U9dXQoZSx0KTtmb3IodmFyIHM9LTEsaT1lLmxlbmd0aCxhPWktMSxvPXQ7byE9bnVsbCYmKytzPGk7KXt2YXIgdT1VdChlW3NdKSxsPW47aWYodT09PSJfX3Byb3RvX18ifHx1PT09ImNvbnN0cnVjdG9yInx8dT09PSJwcm90b3R5cGUiKXJldHVybiB0O2lmKHMhPWEpe3ZhciBjPW9bdV07bD1yP3IoYyx1LG8pOnZvaWQgMCxsPT09dm9pZCAwJiYobD1zdChjKT9jOlJuKGVbcysxXSk/W106e30pfWVhKG8sdSxsKSxvPW9bdV19cmV0dXJuIHR9ZnVuY3Rpb24gaG8odCxlLG4pe2Zvcih2YXIgcj0tMSxzPWUubGVuZ3RoLGk9e307KytyPHM7KXt2YXIgYT1lW3JdLG89R2EodCxhKTtuKG8sYSkmJmZvKGksdXQoYSx0KSxvKX1yZXR1cm4gaX1mdW5jdGlvbiBtbyh0LGUpe3JldHVybiBobyh0LGUsZnVuY3Rpb24obixyKXtyZXR1cm4gaW8odCxyKX0pfUthKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PW51bGw/e306bW8odCxlKX0pO2NvbnN0IExlPXQ9PmU9PnR5cGVvZiBlPT09dCx5bz1MZSgib2JqZWN0IikscXQ9TGUoImJvb2xlYW4iKSxOPUxlKCJudW1iZXIiKSxBPUxlKCJzdHJpbmciKSxnbz1MZSgidW5kZWZpbmVkIiksUW49dD0+dD09PW51bGwsRz10PT5Rbih0KXx8Z28odCkse2lzQXJyYXk6WH09QXJyYXksVT10PT55byh0KSYmIVFuKHQpJiYhWCh0KSxZdD0odCxlKT0+bj0+TWF0aC5taW4oTWF0aC5tYXgobix0KSxlKTtmdW5jdGlvbiB3KHQsZSxuKXtyZXR1cm4gcj0+e2lmKCFuKXJldHVybjtjb25zdCBzPW5bcl07dChzKSYmKGVbcl09cyl9fWZ1bmN0aW9uIEgodCl7cmV0dXJuIGU9Pk4oZSkmJnQuaW5jbHVkZXMoZSl9ZnVuY3Rpb24gcGUoKXtjb25zdCB0PURhdGUubm93KCk7cmV0dXJue3VwZGF0ZUF0OnQsY3JlYXRlQXQ6dH19ZnVuY3Rpb24gd2UodCxlKXtjb25zdCBuPXcoTix0LGUpO24oInVwZGF0ZUF0IiksbigiY3JlYXRlQXQiKX1jb25zdCBwbz0oKT0+KHt0YWJsZUlkczpbXSxyZWxhdGlvbnNoaXBJZHM6W10saW5kZXhJZHM6W10sbWVtb0lkczpbXX0pO2Z1bmN0aW9uIHdvKHQpe2NvbnN0IGU9cG8oKTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtjb25zdCBuPXcoWCxlLHQpO3JldHVybiBuKCJ0YWJsZUlkcyIpLG4oInJlbGF0aW9uc2hpcElkcyIpLG4oImluZGV4SWRzIiksbigibWVtb0lkcyIpLGV9Y29uc3Qgdm89KCk9Pih7aWQ6IiIsbmFtZToiIix0YWJsZUlkOiIiLGluZGV4Q29sdW1uSWRzOltdLHNlcUluZGV4Q29sdW1uSWRzOltdLHVuaXF1ZTohMSxtZXRhOnBlKCl9KTtmdW5jdGlvbiBPbyh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9dm8oKSxzPXcoQSxyLG4pLGk9dyhxdCxyLG4pLGE9dyhYLHIsbik7cygiaWQiKSxzKCJuYW1lIikscygidGFibGVJZCIpLGkoInVuaXF1ZSIpLGEoImluZGV4Q29sdW1uSWRzIiksYSgic2VxSW5kZXhDb2x1bW5JZHMiKSx3ZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBLbj17QVNDOjEsREVTQzoyfSxUbz1PYmplY3QudmFsdWVzKEtuKSxTbz0oKT0+KHtpZDoiIixpbmRleElkOiIiLGNvbHVtbklkOiIiLG9yZGVyVHlwZTpLbi5BU0MsbWV0YTpwZSgpfSk7ZnVuY3Rpb24gYm8odCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPVNvKCkscz13KEEscixuKTtzKCJpZCIpLHMoImluZGV4SWQiKSxzKCJjb2x1bW5JZCIpLHcoSChUbykscixuKSgib3JkZXJUeXBlIiksd2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3Qga289KCk9Pih7fSk7ZnVuY3Rpb24gSW8odCl7Y29uc3QgZT1rbygpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdFtuLHJdb2YgT2JqZWN0LmVudHJpZXModCkpe2lmKCFYKHIpfHxyLmxlbmd0aCE9PTQpY29udGludWU7Y29uc3RbcyxpLGEsb109cjtpZihBKHMpJiZOKGkpJiZOKGEpJiZVKG8pKXtjb25zdCB1PXt9LGw9dyhOLHUsbyk7T2JqZWN0LmtleXMobykuZm9yRWFjaChsKSxlW25dPVtzLGksYSx1XX19cmV0dXJuIGV9Y29uc3QgRW89KCk9Pih7aWQ6IiIsdmFsdWU6IiIsdWk6e3g6MjAwLHk6MTAwLHpJbmRleDoyLHdpZHRoOjExNixoZWlnaHQ6MTAwLGNvbG9yOiIifSxtZXRhOnBlKCl9KTtmdW5jdGlvbiBObyh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9RW8oKSxzPXcoQSxyLG4pLGk9dyhOLHIudWksbi51aSksYT13KEEsci51aSxuLnVpKTtzKCJpZCIpLHMoInZhbHVlIiksYSgiY29sb3IiKSxpKCJ4IiksaSgieSIpLGkoInpJbmRleCIpLGkoIndpZHRoIiksaSgiaGVpZ2h0Iiksd2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3QgWG49e1plcm9PbmU6MixaZXJvTjo0LE9uZU9ubHk6OCxPbmVOOjE2fSx4bz1PYmplY3QudmFsdWVzKFhuKSxlcj17cmluZzoxLGRhc2g6Mn0sTW89T2JqZWN0LnZhbHVlcyhlciksR3Q9e2xlZnQ6MSxyaWdodDoyLHRvcDo0LGJvdHRvbTo4fSx0cj1PYmplY3QudmFsdWVzKEd0KSxDbz0oKT0+KHtpZDoiIixpZGVudGlmaWNhdGlvbjohMSxyZWxhdGlvbnNoaXBUeXBlOlhuLlplcm9OLHN0YXJ0UmVsYXRpb25zaGlwVHlwZTplci5kYXNoLHN0YXJ0Ont0YWJsZUlkOiIiLGNvbHVtbklkczpbXSx4OjAseTowLGRpcmVjdGlvbjpHdC5ib3R0b219LGVuZDp7dGFibGVJZDoiIixjb2x1bW5JZHM6W10seDowLHk6MCxkaXJlY3Rpb246R3QuYm90dG9tfSxtZXRhOnBlKCl9KTtmdW5jdGlvbiBEbyh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9Q28oKSxzPXcoQSxyLG4pLGk9dyhxdCxyLG4pLGE9dyhOLHIuc3RhcnQsbi5zdGFydCksbz13KEEsci5zdGFydCxuLnN0YXJ0KSx1PXcoTixyLmVuZCxuLmVuZCksbD13KEEsci5lbmQsbi5lbmQpO3MoImlkIiksaSgiaWRlbnRpZmljYXRpb24iKSx3KEgoeG8pLHIsbikoInJlbGF0aW9uc2hpcFR5cGUiKSx3KEgoTW8pLHIsbikoInN0YXJ0UmVsYXRpb25zaGlwVHlwZSIpLG8oInRhYmxlSWQiKSxhKCJ4IiksYSgieSIpLHcoSCh0ciksci5zdGFydCxuLnN0YXJ0KSgiZGlyZWN0aW9uIiksdyhYLHIuc3RhcnQsbi5zdGFydCkoImNvbHVtbklkcyIpLGwoInRhYmxlSWQiKSx1KCJ4IiksdSgieSIpLHcoSCh0ciksci5lbmQsbi5lbmQpKCJkaXJlY3Rpb24iKSx3KFgsci5lbmQsbi5lbmQpKCJjb2x1bW5JZHMiKSx3ZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBfbz17RVJEOiJFUkQiLHZpc3VhbGl6YXRpb246IkBkaW5ldWcvZXJkLWVkaXRvci9idWlsdGluLXZpc3VhbGl6YXRpb24iLHNjaGVtYVNRTDoiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tc2NoZW1hLXNxbCIsZ2VuZXJhdG9yQ29kZToiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tZ2VuZXJhdG9yLWNvZGUiLHNldHRpbmdzOiJzZXR0aW5ncyJ9LG9lPXt0YWJsZUNvbW1lbnQ6MSxjb2x1bW5Db21tZW50OjIsY29sdW1uRGF0YVR5cGU6NCxjb2x1bW5EZWZhdWx0OjgsY29sdW1uQXV0b0luY3JlbWVudDoxNixjb2x1bW5QcmltYXJ5S2V5OjMyLGNvbHVtblVuaXF1ZTo2NCxjb2x1bW5Ob3ROdWxsOjEyOCxyZWxhdGlvbnNoaXA6MjU2fSxlZT17Y29sdW1uTmFtZToxLGNvbHVtbkRhdGFUeXBlOjIsY29sdW1uTm90TnVsbDo0LGNvbHVtblVuaXF1ZTo4LGNvbHVtbkF1dG9JbmNyZW1lbnQ6MTYsY29sdW1uRGVmYXVsdDozMixjb2x1bW5Db21tZW50OjY0fSxucj1PYmplY3QudmFsdWVzKGVlKSxycj17TWFyaWFEQjoxLE1TU1FMOjIsTXlTUUw6NCxPcmFjbGU6OCxQb3N0Z3JlU1FMOjE2LFNRTGl0ZTozMn0sRm89T2JqZWN0LnZhbHVlcyhyciksc3I9e0dyYXBoUUw6MSxjc2hhcnA6MixKYXZhOjQsS290bGluOjgsVHlwZVNjcmlwdDoxNixKUEE6MzIsU2NhbGE6NjR9LEFvPU9iamVjdC52YWx1ZXMoc3IpLEp0PXtub25lOjEsY2FtZWxDYXNlOjIscGFzY2FsQ2FzZTo0LHNuYWtlQ2FzZTo4fSxpcj1PYmplY3QudmFsdWVzKEp0KSxhcj17bm9uZToxLGRvdWJsZVF1b3RlOjIsc2luZ2xlUXVvdGU6NCxiYWNrdGljazo4fSxWbz1PYmplY3QudmFsdWVzKGFyKSxXbz0uMSwkbz0xLExvPTJlMyx6bz0yZTQsWm89b2UudGFibGVDb21tZW50fG9lLmNvbHVtbkNvbW1lbnR8b2UuY29sdW1uRGF0YVR5cGV8b2UuY29sdW1uRGVmYXVsdHxvZS5jb2x1bW5QcmltYXJ5S2V5fG9lLmNvbHVtbk5vdE51bGx8b2UucmVsYXRpb25zaGlwLFJvPSgpPT4oe3dpZHRoOjJlMyxoZWlnaHQ6MmUzLHNjcm9sbFRvcDowLHNjcm9sbExlZnQ6MCx6b29tTGV2ZWw6MSxzaG93OlpvLGRhdGFiYXNlOnJyLk15U1FMLGRhdGFiYXNlTmFtZToiIixjYW52YXNUeXBlOl9vLkVSRCxsYW5ndWFnZTpzci5HcmFwaFFMLHRhYmxlTmFtZUNhc2U6SnQucGFzY2FsQ2FzZSxjb2x1bW5OYW1lQ2FzZTpKdC5jYW1lbENhc2UsYnJhY2tldFR5cGU6YXIubm9uZSxyZWxhdGlvbnNoaXBEYXRhVHlwZVN5bmM6ITAscmVsYXRpb25zaGlwT3B0aW1pemF0aW9uOiExLGNvbHVtbk9yZGVyOltlZS5jb2x1bW5OYW1lLGVlLmNvbHVtbkRhdGFUeXBlLGVlLmNvbHVtbk5vdE51bGwsZWUuY29sdW1uVW5pcXVlLGVlLmNvbHVtbkF1dG9JbmNyZW1lbnQsZWUuY29sdW1uRGVmYXVsdCxlZS5jb2x1bW5Db21tZW50XSxtYXhXaWR0aENvbW1lbnQ6LTF9KSxvcj1ZdChMbyx6byksUG89WXQoV28sJG8pLGpvPVl0KDYwLDIwMCk7ZnVuY3Rpb24gVW8odCl7Y29uc3QgZT1SbygpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2NvbnN0IG49dyhOLGUsdCkscj13KEEsZSx0KSxzPXcocXQsZSx0KTtyZXR1cm4gTih0LndpZHRoKSYmKGUud2lkdGg9b3IodC53aWR0aCkpLE4odC5oZWlnaHQpJiYoZS5oZWlnaHQ9b3IodC5oZWlnaHQpKSxOKHQuem9vbUxldmVsKSYmKGUuem9vbUxldmVsPVBvKHQuem9vbUxldmVsKSksTih0Lm1heFdpZHRoQ29tbWVudCkmJnQubWF4V2lkdGhDb21tZW50IT09LTEmJihlLm1heFdpZHRoQ29tbWVudD1qbyh0Lm1heFdpZHRoQ29tbWVudCkpLG4oInNjcm9sbFRvcCIpLG4oInNjcm9sbExlZnQiKSxuKCJzaG93IikscigiZGF0YWJhc2VOYW1lIikscigiY2FudmFzVHlwZSIpLHMoInJlbGF0aW9uc2hpcERhdGFUeXBlU3luYyIpLHMoInJlbGF0aW9uc2hpcE9wdGltaXphdGlvbiIpLHcoSChGbyksZSx0KSgiZGF0YWJhc2UiKSx3KEgoQW8pLGUsdCkoImxhbmd1YWdlIiksdyhIKGlyKSxlLHQpKCJ0YWJsZU5hbWVDYXNlIiksdyhIKGlyKSxlLHQpKCJjb2x1bW5OYW1lQ2FzZSIpLHcoSChWbyksZSx0KSgiYnJhY2tldFR5cGUiKSxYKHQuY29sdW1uT3JkZXIpJiZuci5sZW5ndGg9PT10LmNvbHVtbk9yZGVyLmxlbmd0aCYmY28obnIsdC5jb2x1bW5PcmRlcikubGVuZ3RoPT09MCYmKGUuY29sdW1uT3JkZXI9dC5jb2x1bW5PcmRlciksZX1jb25zdCBIbz0oKT0+KHtpZDoiIixuYW1lOiIiLGNvbW1lbnQ6IiIsY29sdW1uSWRzOltdLHNlcUNvbHVtbklkczpbXSx1aTp7eDoyMDAseToxMDAsekluZGV4OjIsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCxjb2xvcjoiIn0sbWV0YTpwZSgpfSk7ZnVuY3Rpb24gcW8odCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPUhvKCkscz13KEEscixuKSxpPXcoWCxyLG4pLGE9dyhOLHIudWksbi51aSksbz13KEEsci51aSxuLnVpKTtzKCJpZCIpLHMoIm5hbWUiKSxzKCJjb21tZW50IiksaSgiY29sdW1uSWRzIiksaSgic2VxQ29sdW1uSWRzIiksbygiY29sb3IiKSxhKCJ4IiksYSgieSIpLGEoInpJbmRleCIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLHdlKHIubWV0YSxuLm1ldGEpLHIuaWQmJihlW3IuaWRdPXIpfXJldHVybiBlfWNvbnN0IFlvPSgpPT4oe2lkOiIiLHRhYmxlSWQ6IiIsbmFtZToiIixjb21tZW50OiIiLGRhdGFUeXBlOiIiLGRlZmF1bHQ6IiIsb3B0aW9uczowLHVpOntrZXlzOjAsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCx3aWR0aERhdGFUeXBlOjYwLHdpZHRoRGVmYXVsdDo2MH0sbWV0YTpwZSgpfSk7ZnVuY3Rpb24gR28odCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPVlvKCkscz13KEEscixuKSxpPXcoTixyLG4pLGE9dyhOLHIudWksbi51aSk7cygiaWQiKSxzKCJ0YWJsZUlkIikscygibmFtZSIpLHMoImNvbW1lbnQiKSxzKCJkYXRhVHlwZSIpLHMoImRlZmF1bHQiKSxpKCJvcHRpb25zIiksYSgia2V5cyIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLGEoIndpZHRoRGF0YVR5cGUiKSxhKCJ3aWR0aERlZmF1bHQiKSx3ZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1mdW5jdGlvbiBKbyh0KXt2YXIgZSxuLHIscyxpLGE7Y29uc3Qgbz10LHU9VW8oby5zZXR0aW5ncyksbD13byhvLmRvYyksYz1JbyhvLmx3dyksZD1xbygoZT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6ZS50YWJsZUVudGl0aWVzKSx5PUdvKChuPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDpuLnRhYmxlQ29sdW1uRW50aXRpZXMpLGg9RG8oKHI9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnIucmVsYXRpb25zaGlwRW50aXRpZXMpLFM9T28oKHM9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnMuaW5kZXhFbnRpdGllcyksaj1ibygoaT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6aS5pbmRleENvbHVtbkVudGl0aWVzKSxNPU5vKChhPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDphLm1lbW9FbnRpdGllcyk7cmV0dXJue3ZlcnNpb246IjMuMC4wIixzZXR0aW5nczp1LGRvYzpsLGNvbGxlY3Rpb25zOnt0YWJsZUVudGl0aWVzOmQsdGFibGVDb2x1bW5FbnRpdGllczp5LHJlbGF0aW9uc2hpcEVudGl0aWVzOmgsaW5kZXhFbnRpdGllczpTLGluZGV4Q29sdW1uRW50aXRpZXM6aixtZW1vRW50aXRpZXM6TX0sbHd3OmN9fWZ1bmN0aW9uIEJvKHQpe3JldHVyblt0LC0xLC0xLHt9XX1mdW5jdGlvbiBCdCh0LGUsbil7cmV0dXJuIHRbZV18fCh0W2VdPUJvKG4pLHRbZV0pfWZ1bmN0aW9uIFFvKHQsZSxuLHIscyl7Y29uc3QgaT1CdCh0LG4sciksYT1pWzFdLG89aVsyXTthPGUmJihpWzFdPWUpLG88ZSYmcygpfWZ1bmN0aW9uIEtvKHQsZSxuLHIscyl7Y29uc3QgaT1CdCh0LG4sciksYT1pWzJdLG89aVsxXTthPGUmJihpWzJdPWUpLG88PWUmJnMoKX1mdW5jdGlvbiBYbyh0LGUsbixyLHMsaSl7Y29uc3QgYT1CdCh0LG4scik7KGFbM11bc10/Py0xKTw9ZSYmKGFbM11bc109ZSxpKCkpfWNsYXNzIGV1e2NvbnN0cnVjdG9yKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjb2xsZWN0aW9ucyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX1jb2xsZWN0aW9uKGUpe3JldHVybiBuZXcgdHUodGhpcy5jb2xsZWN0aW9uc1tlXSxlKX19Y2xhc3MgdHV7Y29uc3RydWN0b3IoZSxuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29sbGVjdGlvbiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29sbGVjdGlvbktleSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm59KX1zZWxlY3RCeUlkKGUpe3JldHVybiB0aGlzLmNvbGxlY3Rpb25bZV19c2VsZWN0QnlJZHMoZSl7cmV0dXJuIGUubGVuZ3RoLGUubWFwKG49PnRoaXMuc2VsZWN0QnlJZChuKSkuZmlsdGVyKEJvb2xlYW4pfXNlbGVjdEVudGl0aWVzKCl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbn1zZWxlY3RBbGwoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmNvbGxlY3Rpb24pfXNldE9uZShlKXtyZXR1cm4gdGhpcy5jb2xsZWN0aW9uW2UuaWRdPWUsdGhpc31zZXRNYW55KGUpe3JldHVybiBlLmZvckVhY2gobj0+dGhpcy5zZXRPbmUobikpLHRoaXN9c2V0QWxsKGUpe3JldHVybiB0aGlzLnJlbW92ZUFsbCgpLHRoaXMuc2V0TWFueShlKSx0aGlzfWFkZE9uZShlKXtyZXR1cm4gdGhpcy5zZWxlY3RCeUlkKGUuaWQpP3RoaXM6KHRoaXMuc2V0T25lKGUpLHRoaXMpfWFkZE1hbnkoZSl7cmV0dXJuIGUuZm9yRWFjaChuPT50aGlzLmFkZE9uZShuKSksdGhpc31yZW1vdmVPbmUoZSl7cmV0dXJuIHRoaXMuc2VsZWN0QnlJZChlKSYmUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0aGlzLmNvbGxlY3Rpb24sZSksdGhpc31yZW1vdmVNYW55KGUpe3JldHVybiBlLmZvckVhY2gobj0+dGhpcy5yZW1vdmVPbmUobikpLHRoaXN9cmVtb3ZlQWxsKCl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbj17fSx0aGlzfXVwZGF0ZU9uZShlLG4pe2NvbnN0IHI9dGhpcy5zZWxlY3RCeUlkKGUpO3JldHVybiByJiYobihyKSxyLm1ldGEudXBkYXRlQXQ9RGF0ZS5ub3coKSksdGhpc311cGRhdGVNYW55KGUsbil7cmV0dXJuIGUuZm9yRWFjaChyPT50aGlzLnVwZGF0ZU9uZShyLG4pKSx0aGlzfWdldE9yQ3JlYXRlKGUsbil7Y29uc3Qgcj10aGlzLnNlbGVjdEJ5SWQoZSk7aWYocilyZXR1cm4gcjtjb25zdCBzPW4oZSk7cmV0dXJuIHRoaXMuc2V0T25lKHMpLHRoaXMuc2VsZWN0QnlJZChlKX1hZGRPcGVyYXRvcihlLG4scixzKXtyZXR1cm4gUW8oZSxuLHIsdGhpcy5jb2xsZWN0aW9uS2V5LHMpLHRoaXN9cmVtb3ZlT3BlcmF0b3IoZSxuLHIscyl7cmV0dXJuIEtvKGUsbixyLHRoaXMuY29sbGVjdGlvbktleSxzKSx0aGlzfXJlcGxhY2VPcGVyYXRvcihlLG4scixzLGkpe3JldHVybiBYbyhlLG4scix0aGlzLmNvbGxlY3Rpb25LZXkscyxpKSx0aGlzfX1jb25zdCBWPXQ9Pm5ldyBldSh0KTtmdW5jdGlvbiBDKHQpe2NvbnN0IGU9bmV3IFNldCh0KTtyZXR1cm4gbj0+ZS5oYXMobil9dmFyIG51PXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxydT1udSxzdT10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGl1PXJ1fHxzdXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxjdD1pdSxhdT1jdC5TeW1ib2wsZnQ9YXUsdXI9T2JqZWN0LnByb3RvdHlwZSxvdT11ci5oYXNPd25Qcm9wZXJ0eSx1dT11ci50b1N0cmluZyx6ZT1mdD9mdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gbHUodCl7dmFyIGU9b3UuY2FsbCh0LHplKSxuPXRbemVdO3RyeXt0W3plXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2h7fXZhciBzPXV1LmNhbGwodCk7cmV0dXJuIHImJihlP3RbemVdPW46ZGVsZXRlIHRbemVdKSxzfXZhciBjdT1PYmplY3QucHJvdG90eXBlLGZ1PWN1LnRvU3RyaW5nO2Z1bmN0aW9uIGR1KHQpe3JldHVybiBmdS5jYWxsKHQpfXZhciBodT0iW29iamVjdCBOdWxsXSIsbXU9IltvYmplY3QgVW5kZWZpbmVkXSIsbHI9ZnQ/ZnQudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIHl1KHQpe3JldHVybiB0PT1udWxsP3Q9PT12b2lkIDA/bXU6aHU6bHImJmxyIGluIE9iamVjdCh0KT9sdSh0KTpkdSh0KX1mdW5jdGlvbiBjcih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gdCE9bnVsbCYmKGU9PSJvYmplY3QifHxlPT0iZnVuY3Rpb24iKX12YXIgZ3U9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLHB1PSJbb2JqZWN0IEZ1bmN0aW9uXSIsd3U9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIix2dT0iW29iamVjdCBQcm94eV0iO2Z1bmN0aW9uIE91KHQpe2lmKCFjcih0KSlyZXR1cm4hMTt2YXIgZT15dSh0KTtyZXR1cm4gZT09cHV8fGU9PXd1fHxlPT1ndXx8ZT09dnV9dmFyIFR1PWN0WyJfX2NvcmUtanNfc2hhcmVkX18iXSxRdD1UdSxmcj1mdW5jdGlvbigpe3ZhciB0PS9bXi5dKyQvLmV4ZWMoUXQmJlF0LmtleXMmJlF0LmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdD8iU3ltYm9sKHNyYylfMS4iK3Q6IiJ9KCk7ZnVuY3Rpb24gU3UodCl7cmV0dXJuISFmciYmZnIgaW4gdH12YXIgYnU9RnVuY3Rpb24ucHJvdG90eXBlLGt1PWJ1LnRvU3RyaW5nO2Z1bmN0aW9uIEl1KHQpe2lmKHQhPW51bGwpe3RyeXtyZXR1cm4ga3UuY2FsbCh0KX1jYXRjaHt9dHJ5e3JldHVybiB0KyIifWNhdGNoe319cmV0dXJuIiJ9dmFyIEV1PS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxOdT0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyx4dT1GdW5jdGlvbi5wcm90b3R5cGUsTXU9T2JqZWN0LnByb3RvdHlwZSxDdT14dS50b1N0cmluZyxEdT1NdS5oYXNPd25Qcm9wZXJ0eSxfdT1SZWdFeHAoIl4iK0N1LmNhbGwoRHUpLnJlcGxhY2UoRXUsIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7ZnVuY3Rpb24gRnUodCl7aWYoIWNyKHQpfHxTdSh0KSlyZXR1cm4hMTt2YXIgZT1PdSh0KT9fdTpOdTtyZXR1cm4gZS50ZXN0KEl1KHQpKX1mdW5jdGlvbiBBdSh0LGUpe3JldHVybiB0PT1udWxsP3ZvaWQgMDp0W2VdfWZ1bmN0aW9uIEt0KHQsZSl7dmFyIG49QXUodCxlKTtyZXR1cm4gRnUobik/bjp2b2lkIDB9ZnVuY3Rpb24gVnUoKXt9ZnVuY3Rpb24gV3UodCxlLG4scil7Zm9yKHZhciBzPXQubGVuZ3RoLGk9bisocj8xOi0xKTtyP2ktLTorK2k8czspaWYoZSh0W2ldLGksdCkpcmV0dXJuIGk7cmV0dXJuLTF9ZnVuY3Rpb24gJHUodCl7cmV0dXJuIHQhPT10fWZ1bmN0aW9uIEx1KHQsZSxuKXtmb3IodmFyIHI9bi0xLHM9dC5sZW5ndGg7KytyPHM7KWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIHp1KHQsZSxuKXtyZXR1cm4gZT09PWU/THUodCxlLG4pOld1KHQsJHUsbil9ZnVuY3Rpb24gWnUodCxlKXt2YXIgbj10PT1udWxsPzA6dC5sZW5ndGg7cmV0dXJuISFuJiZ6dSh0LGUsMCk+LTF9ZnVuY3Rpb24gUnUodCxlKXtyZXR1cm4gdD09PWV8fHQhPT10JiZlIT09ZX12YXIgUHU9S3QoT2JqZWN0LCJjcmVhdGUiKSxaZT1QdTtmdW5jdGlvbiBqdSgpe3RoaXMuX19kYXRhX189WmU/WmUobnVsbCk6e30sdGhpcy5zaXplPTB9ZnVuY3Rpb24gVXUodCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9dmFyIEh1PSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIixxdT1PYmplY3QucHJvdG90eXBlLFl1PXF1Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIEd1KHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoWmUpe3ZhciBuPWVbdF07cmV0dXJuIG49PT1IdT92b2lkIDA6bn1yZXR1cm4gWXUuY2FsbChlLHQpP2VbdF06dm9pZCAwfXZhciBKdT1PYmplY3QucHJvdG90eXBlLEJ1PUp1Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFF1KHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIFplP2VbdF0hPT12b2lkIDA6QnUuY2FsbChlLHQpfXZhciBLdT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gWHUodCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxuW3RdPVplJiZlPT09dm9pZCAwP0t1OmUsdGhpc31mdW5jdGlvbiB1ZSh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX11ZS5wcm90b3R5cGUuY2xlYXI9anUsdWUucHJvdG90eXBlLmRlbGV0ZT1VdSx1ZS5wcm90b3R5cGUuZ2V0PUd1LHVlLnByb3RvdHlwZS5oYXM9UXUsdWUucHJvdG90eXBlLnNldD1YdTtmdW5jdGlvbiBlbCgpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9ZnVuY3Rpb24gZHQodCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihSdSh0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfXZhciB0bD1BcnJheS5wcm90b3R5cGUsbmw9dGwuc3BsaWNlO2Z1bmN0aW9uIHJsKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1kdChlLHQpO2lmKG48MClyZXR1cm4hMTt2YXIgcj1lLmxlbmd0aC0xO3JldHVybiBuPT1yP2UucG9wKCk6bmwuY2FsbChlLG4sMSksLS10aGlzLnNpemUsITB9ZnVuY3Rpb24gc2wodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWR0KGUsdCk7cmV0dXJuIG48MD92b2lkIDA6ZVtuXVsxXX1mdW5jdGlvbiBpbCh0KXtyZXR1cm4gZHQodGhpcy5fX2RhdGFfXyx0KT4tMX1mdW5jdGlvbiBhbCh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj1kdChuLHQpO3JldHVybiByPDA/KCsrdGhpcy5zaXplLG4ucHVzaChbdCxlXSkpOm5bcl1bMV09ZSx0aGlzfWZ1bmN0aW9uIHZlKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fXZlLnByb3RvdHlwZS5jbGVhcj1lbCx2ZS5wcm90b3R5cGUuZGVsZXRlPXJsLHZlLnByb3RvdHlwZS5nZXQ9c2wsdmUucHJvdG90eXBlLmhhcz1pbCx2ZS5wcm90b3R5cGUuc2V0PWFsO3ZhciBvbD1LdChjdCwiTWFwIiksdWw9b2w7ZnVuY3Rpb24gbGwoKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyB1ZSxtYXA6bmV3KHVsfHx2ZSksc3RyaW5nOm5ldyB1ZX19ZnVuY3Rpb24gY2wodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIGU9PSJzdHJpbmcifHxlPT0ibnVtYmVyInx8ZT09InN5bWJvbCJ8fGU9PSJib29sZWFuIj90IT09Il9fcHJvdG9fXyI6dD09PW51bGx9ZnVuY3Rpb24gaHQodCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybiBjbChlKT9uW3R5cGVvZiBlPT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIGZsKHQpe3ZhciBlPWh0KHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9ZnVuY3Rpb24gZGwodCl7cmV0dXJuIGh0KHRoaXMsdCkuZ2V0KHQpfWZ1bmN0aW9uIGhsKHQpe3JldHVybiBodCh0aGlzLHQpLmhhcyh0KX1mdW5jdGlvbiBtbCh0LGUpe3ZhciBuPWh0KHRoaXMsdCkscj1uLnNpemU7cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplKz1uLnNpemU9PXI/MDoxLHRoaXN9ZnVuY3Rpb24gT2UodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19T2UucHJvdG90eXBlLmNsZWFyPWxsLE9lLnByb3RvdHlwZS5kZWxldGU9ZmwsT2UucHJvdG90eXBlLmdldD1kbCxPZS5wcm90b3R5cGUuaGFzPWhsLE9lLnByb3RvdHlwZS5zZXQ9bWw7dmFyIHlsPUt0KGN0LCJTZXQiKSxYdD15bCxnbD0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gcGwodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsZ2wpLHRoaXN9ZnVuY3Rpb24gd2wodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfWZ1bmN0aW9uIG10KHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBPZTsrK2U8bjspdGhpcy5hZGQodFtlXSl9bXQucHJvdG90eXBlLmFkZD1tdC5wcm90b3R5cGUucHVzaD1wbCxtdC5wcm90b3R5cGUuaGFzPXdsO2Z1bmN0aW9uIHZsKHQsZSl7cmV0dXJuIHQuaGFzKGUpfWZ1bmN0aW9uIGRyKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHIpe25bKytlXT1yfSksbn1mdW5jdGlvbiBPbCh0LGUsbil7Zm9yKHZhciByPS0xLHM9dD09bnVsbD8wOnQubGVuZ3RoOysrcjxzOylpZihuKGUsdFtyXSkpcmV0dXJuITA7cmV0dXJuITF9dmFyIFRsPTEvMCxTbD1YdCYmMS9kcihuZXcgWHQoWywtMF0pKVsxXT09VGw/ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBYdCh0KX06VnUsYmw9U2wsa2w9MjAwO2Z1bmN0aW9uIElsKHQsZSxuKXt2YXIgcj0tMSxzPVp1LGk9dC5sZW5ndGgsYT0hMCxvPVtdLHU9bztpZihuKWE9ITEscz1PbDtlbHNlIGlmKGk+PWtsKXt2YXIgbD1lP251bGw6YmwodCk7aWYobClyZXR1cm4gZHIobCk7YT0hMSxzPXZsLHU9bmV3IG10fWVsc2UgdT1lP1tdOm87ZTpmb3IoOysrcjxpOyl7dmFyIGM9dFtyXSxkPWU/ZShjKTpjO2lmKGM9bnx8YyE9PTA/YzowLGEmJmQ9PT1kKXtmb3IodmFyIHk9dS5sZW5ndGg7eS0tOylpZih1W3ldPT09ZCljb250aW51ZSBlO2UmJnUucHVzaChkKSxvLnB1c2goYyl9ZWxzZSBzKHUsZCxuKXx8KHUhPT1vJiZ1LnB1c2goZCksby5wdXNoKGMpKX1yZXR1cm4gb31mdW5jdGlvbiBUZSh0KXtyZXR1cm4gdCYmdC5sZW5ndGg/SWwodCk6W119Y2xhc3MgbGUgZXh0ZW5kcyBFcnJvcnt9Y2xhc3MgRWwgZXh0ZW5kcyBsZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCBEYXRlVGltZTogJHtlLnRvTWVzc2FnZSgpfWApfX1jbGFzcyBObCBleHRlbmRzIGxle2NvbnN0cnVjdG9yKGUpe3N1cGVyKGBJbnZhbGlkIEludGVydmFsOiAke2UudG9NZXNzYWdlKCl9YCl9fWNsYXNzIHhsIGV4dGVuZHMgbGV7Y29uc3RydWN0b3IoZSl7c3VwZXIoYEludmFsaWQgRHVyYXRpb246ICR7ZS50b01lc3NhZ2UoKX1gKX19Y2xhc3MgU2UgZXh0ZW5kcyBsZXt9Y2xhc3MgaHIgZXh0ZW5kcyBsZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCB1bml0ICR7ZX1gKX19Y2xhc3MgXyBleHRlbmRzIGxle31jbGFzcyB0ZSBleHRlbmRzIGxle2NvbnN0cnVjdG9yKCl7c3VwZXIoIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3MiKX19Y29uc3QgZj0ibnVtZXJpYyIsej0ic2hvcnQiLEY9ImxvbmciLHl0PXt5ZWFyOmYsbW9udGg6ZixkYXk6Zn0sbXI9e3llYXI6Zixtb250aDp6LGRheTpmfSxNbD17eWVhcjpmLG1vbnRoOnosZGF5OmYsd2Vla2RheTp6fSx5cj17eWVhcjpmLG1vbnRoOkYsZGF5OmZ9LGdyPXt5ZWFyOmYsbW9udGg6RixkYXk6Zix3ZWVrZGF5OkZ9LHByPXtob3VyOmYsbWludXRlOmZ9LHdyPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmZ9LHZyPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOnp9LE9yPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOkZ9LFRyPXtob3VyOmYsbWludXRlOmYsaG91ckN5Y2xlOiJoMjMifSxTcj17aG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLGhvdXJDeWNsZToiaDIzIn0sYnI9e2hvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zixob3VyQ3ljbGU6ImgyMyIsdGltZVpvbmVOYW1lOnp9LGtyPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsaG91ckN5Y2xlOiJoMjMiLHRpbWVab25lTmFtZTpGfSxJcj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSxFcj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxOcj17eWVhcjpmLG1vbnRoOnosZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSx4cj17eWVhcjpmLG1vbnRoOnosZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxDbD17eWVhcjpmLG1vbnRoOnosZGF5OmYsd2Vla2RheTp6LGhvdXI6ZixtaW51dGU6Zn0sTXI9e3llYXI6Zixtb250aDpGLGRheTpmLGhvdXI6ZixtaW51dGU6Zix0aW1lWm9uZU5hbWU6en0sQ3I9e3llYXI6Zixtb250aDpGLGRheTpmLGhvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zix0aW1lWm9uZU5hbWU6en0sRHI9e3llYXI6Zixtb250aDpGLGRheTpmLHdlZWtkYXk6Rixob3VyOmYsbWludXRlOmYsdGltZVpvbmVOYW1lOkZ9LF9yPXt5ZWFyOmYsbW9udGg6RixkYXk6Zix3ZWVrZGF5OkYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLHRpbWVab25lTmFtZTpGfTtjbGFzcyBSZXtnZXQgdHlwZSgpe3Rocm93IG5ldyB0ZX1nZXQgbmFtZSgpe3Rocm93IG5ldyB0ZX1nZXQgaWFuYU5hbWUoKXtyZXR1cm4gdGhpcy5uYW1lfWdldCBpc1VuaXZlcnNhbCgpe3Rocm93IG5ldyB0ZX1vZmZzZXROYW1lKGUsbil7dGhyb3cgbmV3IHRlfWZvcm1hdE9mZnNldChlLG4pe3Rocm93IG5ldyB0ZX1vZmZzZXQoZSl7dGhyb3cgbmV3IHRlfWVxdWFscyhlKXt0aHJvdyBuZXcgdGV9Z2V0IGlzVmFsaWQoKXt0aHJvdyBuZXcgdGV9fWxldCBlbj1udWxsO2NsYXNzIGd0IGV4dGVuZHMgUmV7c3RhdGljIGdldCBpbnN0YW5jZSgpe3JldHVybiBlbj09PW51bGwmJihlbj1uZXcgZ3QpLGVufWdldCB0eXBlKCl7cmV0dXJuInN5c3RlbSJ9Z2V0IG5hbWUoKXtyZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZX1nZXQgaXNVbml2ZXJzYWwoKXtyZXR1cm4hMX1vZmZzZXROYW1lKGUse2Zvcm1hdDpuLGxvY2FsZTpyfSl7cmV0dXJuIG5zKGUsbixyKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gSGUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe3JldHVybi1uZXcgRGF0ZShlKS5nZXRUaW1lem9uZU9mZnNldCgpfWVxdWFscyhlKXtyZXR1cm4gZS50eXBlPT09InN5c3RlbSJ9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMH19bGV0IHB0PXt9O2Z1bmN0aW9uIERsKHQpe3JldHVybiBwdFt0XXx8KHB0W3RdPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCJlbi1VUyIse2hvdXIxMjohMSx0aW1lWm9uZTp0LHllYXI6Im51bWVyaWMiLG1vbnRoOiIyLWRpZ2l0IixkYXk6IjItZGlnaXQiLGhvdXI6IjItZGlnaXQiLG1pbnV0ZToiMi1kaWdpdCIsc2Vjb25kOiIyLWRpZ2l0IixlcmE6InNob3J0In0pKSxwdFt0XX1jb25zdCBfbD17eWVhcjowLG1vbnRoOjEsZGF5OjIsZXJhOjMsaG91cjo0LG1pbnV0ZTo1LHNlY29uZDo2fTtmdW5jdGlvbiBGbCh0LGUpe2NvbnN0IG49dC5mb3JtYXQoZSkucmVwbGFjZSgvXHUyMDBFL2csIiIpLHI9LyhcZCspXC8oXGQrKVwvKFxkKykgKEFEfEJDKSw/IChcZCspOihcZCspOihcZCspLy5leGVjKG4pLFsscyxpLGEsbyx1LGwsY109cjtyZXR1cm5bYSxzLGksbyx1LGwsY119ZnVuY3Rpb24gQWwodCxlKXtjb25zdCBuPXQuZm9ybWF0VG9QYXJ0cyhlKSxyPVtdO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cysrKXtjb25zdHt0eXBlOmksdmFsdWU6YX09bltzXSxvPV9sW2ldO2k9PT0iZXJhIj9yW29dPWE6ZyhvKXx8KHJbb109cGFyc2VJbnQoYSwxMCkpfXJldHVybiByfWxldCB3dD17fTtjbGFzcyBKIGV4dGVuZHMgUmV7c3RhdGljIGNyZWF0ZShlKXtyZXR1cm4gd3RbZV18fCh3dFtlXT1uZXcgSihlKSksd3RbZV19c3RhdGljIHJlc2V0Q2FjaGUoKXt3dD17fSxwdD17fX1zdGF0aWMgaXNWYWxpZFNwZWNpZmllcihlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkWm9uZShlKX1zdGF0aWMgaXNWYWxpZFpvbmUoZSl7aWYoIWUpcmV0dXJuITE7dHJ5e3JldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tVVMiLHt0aW1lWm9uZTplfSkuZm9ybWF0KCksITB9Y2F0Y2h7cmV0dXJuITF9fWNvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lLHRoaXMudmFsaWQ9Si5pc1ZhbGlkWm9uZShlKX1nZXQgdHlwZSgpe3JldHVybiJpYW5hIn1nZXQgbmFtZSgpe3JldHVybiB0aGlzLnpvbmVOYW1lfWdldCBpc1VuaXZlcnNhbCgpe3JldHVybiExfW9mZnNldE5hbWUoZSx7Zm9ybWF0Om4sbG9jYWxlOnJ9KXtyZXR1cm4gbnMoZSxuLHIsdGhpcy5uYW1lKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gSGUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe2NvbnN0IG49bmV3IERhdGUoZSk7aWYoaXNOYU4obikpcmV0dXJuIE5hTjtjb25zdCByPURsKHRoaXMubmFtZSk7bGV0W3MsaSxhLG8sdSxsLGNdPXIuZm9ybWF0VG9QYXJ0cz9BbChyLG4pOkZsKHIsbik7bz09PSJCQyImJihzPS1NYXRoLmFicyhzKSsxKTtjb25zdCB5PWJ0KHt5ZWFyOnMsbW9udGg6aSxkYXk6YSxob3VyOnU9PT0yND8wOnUsbWludXRlOmwsc2Vjb25kOmMsbWlsbGlzZWNvbmQ6MH0pO2xldCBoPStuO2NvbnN0IFM9aCUxZTM7cmV0dXJuIGgtPVM+PTA/UzoxZTMrUywoeS1oKS8oNjAqMWUzKX1lcXVhbHMoZSl7cmV0dXJuIGUudHlwZT09PSJpYW5hIiYmZS5uYW1lPT09dGhpcy5uYW1lfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMudmFsaWR9fWxldCBGcj17fTtmdW5jdGlvbiBWbCh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPUZyW25dO3JldHVybiByfHwocj1uZXcgSW50bC5MaXN0Rm9ybWF0KHQsZSksRnJbbl09cikscn1sZXQgdG49e307ZnVuY3Rpb24gbm4odCxlPXt9KXtjb25zdCBuPUpTT04uc3RyaW5naWZ5KFt0LGVdKTtsZXQgcj10bltuXTtyZXR1cm4gcnx8KHI9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodCxlKSx0bltuXT1yKSxyfWxldCBybj17fTtmdW5jdGlvbiBXbCh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPXJuW25dO3JldHVybiByfHwocj1uZXcgSW50bC5OdW1iZXJGb3JtYXQodCxlKSxybltuXT1yKSxyfWxldCBzbj17fTtmdW5jdGlvbiAkbCh0LGU9e30pe2NvbnN0e2Jhc2U6biwuLi5yfT1lLHM9SlNPTi5zdHJpbmdpZnkoW3Qscl0pO2xldCBpPXNuW3NdO3JldHVybiBpfHwoaT1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodCxlKSxzbltzXT1pKSxpfWxldCBQZT1udWxsO2Z1bmN0aW9uIExsKCl7cmV0dXJuIFBlfHwoUGU9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUsUGUpfWxldCBBcj17fTtmdW5jdGlvbiB6bCh0KXtsZXQgZT1Bclt0XTtpZighZSl7Y29uc3Qgbj1uZXcgSW50bC5Mb2NhbGUodCk7ZT0iZ2V0V2Vla0luZm8iaW4gbj9uLmdldFdlZWtJbmZvKCk6bi53ZWVrSW5mbyxBclt0XT1lfXJldHVybiBlfWZ1bmN0aW9uIFpsKHQpe2NvbnN0IGU9dC5pbmRleE9mKCIteC0iKTtlIT09LTEmJih0PXQuc3Vic3RyaW5nKDAsZSkpO2NvbnN0IG49dC5pbmRleE9mKCItdS0iKTtpZihuPT09LTEpcmV0dXJuW3RdO3tsZXQgcixzO3RyeXtyPW5uKHQpLnJlc29sdmVkT3B0aW9ucygpLHM9dH1jYXRjaHtjb25zdCB1PXQuc3Vic3RyaW5nKDAsbik7cj1ubih1KS5yZXNvbHZlZE9wdGlvbnMoKSxzPXV9Y29uc3R7bnVtYmVyaW5nU3lzdGVtOmksY2FsZW5kYXI6YX09cjtyZXR1cm5bcyxpLGFdfX1mdW5jdGlvbiBSbCh0LGUsbil7cmV0dXJuKG58fGUpJiYodC5pbmNsdWRlcygiLXUtIil8fCh0Kz0iLXUiKSxuJiYodCs9YC1jYS0ke259YCksZSYmKHQrPWAtbnUtJHtlfWApKSx0fWZ1bmN0aW9uIFBsKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTE7bjw9MTI7bisrKXtjb25zdCByPXAudXRjKDIwMDksbiwxKTtlLnB1c2godChyKSl9cmV0dXJuIGV9ZnVuY3Rpb24gamwodCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MTtuPD03O24rKyl7Y29uc3Qgcj1wLnV0YygyMDE2LDExLDEzK24pO2UucHVzaCh0KHIpKX1yZXR1cm4gZX1mdW5jdGlvbiB2dCh0LGUsbixyKXtjb25zdCBzPXQubGlzdGluZ01vZGUoKTtyZXR1cm4gcz09PSJlcnJvciI/bnVsbDpzPT09ImVuIj9uKGUpOnIoZSl9ZnVuY3Rpb24gVWwodCl7cmV0dXJuIHQubnVtYmVyaW5nU3lzdGVtJiZ0Lm51bWJlcmluZ1N5c3RlbSE9PSJsYXRuIj8hMTp0Lm51bWJlcmluZ1N5c3RlbT09PSJsYXRuInx8IXQubG9jYWxlfHx0LmxvY2FsZS5zdGFydHNXaXRoKCJlbiIpfHxuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0LmludGwpLnJlc29sdmVkT3B0aW9ucygpLm51bWJlcmluZ1N5c3RlbT09PSJsYXRuIn1jbGFzcyBIbHtjb25zdHJ1Y3RvcihlLG4scil7dGhpcy5wYWRUbz1yLnBhZFRvfHwwLHRoaXMuZmxvb3I9ci5mbG9vcnx8ITE7Y29uc3R7cGFkVG86cyxmbG9vcjppLC4uLmF9PXI7aWYoIW58fE9iamVjdC5rZXlzKGEpLmxlbmd0aD4wKXtjb25zdCBvPXt1c2VHcm91cGluZzohMSwuLi5yfTtyLnBhZFRvPjAmJihvLm1pbmltdW1JbnRlZ2VyRGlnaXRzPXIucGFkVG8pLHRoaXMuaW5mPVdsKGUsbyl9fWZvcm1hdChlKXtpZih0aGlzLmluZil7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6ZTtyZXR1cm4gdGhpcy5pbmYuZm9ybWF0KG4pfWVsc2V7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6ZG4oZSwzKTtyZXR1cm4gRShuLHRoaXMucGFkVG8pfX19Y2xhc3MgcWx7Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz1yLHRoaXMub3JpZ2luYWxab25lPXZvaWQgMDtsZXQgcztpZih0aGlzLm9wdHMudGltZVpvbmUpdGhpcy5kdD1lO2Vsc2UgaWYoZS56b25lLnR5cGU9PT0iZml4ZWQiKXtjb25zdCBhPS0xKihlLm9mZnNldC82MCksbz1hPj0wP2BFdGMvR01UKyR7YX1gOmBFdGMvR01UJHthfWA7ZS5vZmZzZXQhPT0wJiZKLmNyZWF0ZShvKS52YWxpZD8ocz1vLHRoaXMuZHQ9ZSk6KHM9IlVUQyIsdGhpcy5kdD1lLm9mZnNldD09PTA/ZTplLnNldFpvbmUoIlVUQyIpLnBsdXMoe21pbnV0ZXM6ZS5vZmZzZXR9KSx0aGlzLm9yaWdpbmFsWm9uZT1lLnpvbmUpfWVsc2UgZS56b25lLnR5cGU9PT0ic3lzdGVtIj90aGlzLmR0PWU6ZS56b25lLnR5cGU9PT0iaWFuYSI/KHRoaXMuZHQ9ZSxzPWUuem9uZS5uYW1lKToocz0iVVRDIix0aGlzLmR0PWUuc2V0Wm9uZSgiVVRDIikucGx1cyh7bWludXRlczplLm9mZnNldH0pLHRoaXMub3JpZ2luYWxab25lPWUuem9uZSk7Y29uc3QgaT17Li4udGhpcy5vcHRzfTtpLnRpbWVab25lPWkudGltZVpvbmV8fHMsdGhpcy5kdGY9bm4obixpKX1mb3JtYXQoKXtyZXR1cm4gdGhpcy5vcmlnaW5hbFpvbmU/dGhpcy5mb3JtYXRUb1BhcnRzKCkubWFwKCh7dmFsdWU6ZX0pPT5lKS5qb2luKCIiKTp0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKX1mb3JtYXRUb1BhcnRzKCl7Y29uc3QgZT10aGlzLmR0Zi5mb3JtYXRUb1BhcnRzKHRoaXMuZHQudG9KU0RhdGUoKSk7cmV0dXJuIHRoaXMub3JpZ2luYWxab25lP2UubWFwKG49PntpZihuLnR5cGU9PT0idGltZVpvbmVOYW1lIil7Y29uc3Qgcj10aGlzLm9yaWdpbmFsWm9uZS5vZmZzZXROYW1lKHRoaXMuZHQudHMse2xvY2FsZTp0aGlzLmR0LmxvY2FsZSxmb3JtYXQ6dGhpcy5vcHRzLnRpbWVab25lTmFtZX0pO3JldHVybnsuLi5uLHZhbHVlOnJ9fWVsc2UgcmV0dXJuIG59KTplfXJlc29sdmVkT3B0aW9ucygpe3JldHVybiB0aGlzLmR0Zi5yZXNvbHZlZE9wdGlvbnMoKX19Y2xhc3MgWWx7Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz17c3R5bGU6ImxvbmciLC4uLnJ9LCFuJiZLcigpJiYodGhpcy5ydGY9JGwoZSxyKSl9Zm9ybWF0KGUsbil7cmV0dXJuIHRoaXMucnRmP3RoaXMucnRmLmZvcm1hdChlLG4pOmhjKG4sZSx0aGlzLm9wdHMubnVtZXJpYyx0aGlzLm9wdHMuc3R5bGUhPT0ibG9uZyIpfWZvcm1hdFRvUGFydHMoZSxuKXtyZXR1cm4gdGhpcy5ydGY/dGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhlLG4pOltdfX1jb25zdCBHbD17Zmlyc3REYXk6MSxtaW5pbWFsRGF5czo0LHdlZWtlbmQ6WzYsN119O2NsYXNzIFR7c3RhdGljIGZyb21PcHRzKGUpe3JldHVybiBULmNyZWF0ZShlLmxvY2FsZSxlLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyLGUud2Vla1NldHRpbmdzLGUuZGVmYXVsdFRvRU4pfXN0YXRpYyBjcmVhdGUoZSxuLHIscyxpPSExKXtjb25zdCBhPWV8fEkuZGVmYXVsdExvY2FsZSxvPWF8fChpPyJlbi1VUyI6TGwoKSksdT1ufHxJLmRlZmF1bHROdW1iZXJpbmdTeXN0ZW0sbD1yfHxJLmRlZmF1bHRPdXRwdXRDYWxlbmRhcixjPWNuKHMpfHxJLmRlZmF1bHRXZWVrU2V0dGluZ3M7cmV0dXJuIG5ldyBUKG8sdSxsLGMsYSl9c3RhdGljIHJlc2V0Q2FjaGUoKXtQZT1udWxsLHRuPXt9LHJuPXt9LHNuPXt9fXN0YXRpYyBmcm9tT2JqZWN0KHtsb2NhbGU6ZSxudW1iZXJpbmdTeXN0ZW06bixvdXRwdXRDYWxlbmRhcjpyLHdlZWtTZXR0aW5nczpzfT17fSl7cmV0dXJuIFQuY3JlYXRlKGUsbixyLHMpfWNvbnN0cnVjdG9yKGUsbixyLHMsaSl7Y29uc3RbYSxvLHVdPVpsKGUpO3RoaXMubG9jYWxlPWEsdGhpcy5udW1iZXJpbmdTeXN0ZW09bnx8b3x8bnVsbCx0aGlzLm91dHB1dENhbGVuZGFyPXJ8fHV8fG51bGwsdGhpcy53ZWVrU2V0dGluZ3M9cyx0aGlzLmludGw9UmwodGhpcy5sb2NhbGUsdGhpcy5udW1iZXJpbmdTeXN0ZW0sdGhpcy5vdXRwdXRDYWxlbmRhciksdGhpcy53ZWVrZGF5c0NhY2hlPXtmb3JtYXQ6e30sc3RhbmRhbG9uZTp7fX0sdGhpcy5tb250aHNDYWNoZT17Zm9ybWF0Ont9LHN0YW5kYWxvbmU6e319LHRoaXMubWVyaWRpZW1DYWNoZT1udWxsLHRoaXMuZXJhQ2FjaGU9e30sdGhpcy5zcGVjaWZpZWRMb2NhbGU9aSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPW51bGx9Z2V0IGZhc3ROdW1iZXJzKCl7cmV0dXJuIHRoaXMuZmFzdE51bWJlcnNDYWNoZWQ9PW51bGwmJih0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPVVsKHRoaXMpKSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkfWxpc3RpbmdNb2RlKCl7Y29uc3QgZT10aGlzLmlzRW5nbGlzaCgpLG49KHRoaXMubnVtYmVyaW5nU3lzdGVtPT09bnVsbHx8dGhpcy5udW1iZXJpbmdTeXN0ZW09PT0ibGF0biIpJiYodGhpcy5vdXRwdXRDYWxlbmRhcj09PW51bGx8fHRoaXMub3V0cHV0Q2FsZW5kYXI9PT0iZ3JlZ29yeSIpO3JldHVybiBlJiZuPyJlbiI6ImludGwifWNsb25lKGUpe3JldHVybiFlfHxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5sZW5ndGg9PT0wP3RoaXM6VC5jcmVhdGUoZS5sb2NhbGV8fHRoaXMuc3BlY2lmaWVkTG9jYWxlLGUubnVtYmVyaW5nU3lzdGVtfHx0aGlzLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyfHx0aGlzLm91dHB1dENhbGVuZGFyLGNuKGUud2Vla1NldHRpbmdzKXx8dGhpcy53ZWVrU2V0dGluZ3MsZS5kZWZhdWx0VG9FTnx8ITEpfXJlZGVmYXVsdFRvRU4oZT17fSl7cmV0dXJuIHRoaXMuY2xvbmUoey4uLmUsZGVmYXVsdFRvRU46ITB9KX1yZWRlZmF1bHRUb1N5c3RlbShlPXt9KXtyZXR1cm4gdGhpcy5jbG9uZSh7Li4uZSxkZWZhdWx0VG9FTjohMX0pfW1vbnRocyhlLG49ITEpe3JldHVybiB2dCh0aGlzLGUsaXMsKCk9Pntjb25zdCByPW4/e21vbnRoOmUsZGF5OiJudW1lcmljIn06e21vbnRoOmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMubW9udGhzQ2FjaGVbc11bZV18fCh0aGlzLm1vbnRoc0NhY2hlW3NdW2VdPVBsKGk9PnRoaXMuZXh0cmFjdChpLHIsIm1vbnRoIikpKSx0aGlzLm1vbnRoc0NhY2hlW3NdW2VdfSl9d2Vla2RheXMoZSxuPSExKXtyZXR1cm4gdnQodGhpcyxlLHVzLCgpPT57Y29uc3Qgcj1uP3t3ZWVrZGF5OmUseWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9Ont3ZWVrZGF5OmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXXx8KHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXT1qbChpPT50aGlzLmV4dHJhY3QoaSxyLCJ3ZWVrZGF5IikpKSx0aGlzLndlZWtkYXlzQ2FjaGVbc11bZV19KX1tZXJpZGllbXMoKXtyZXR1cm4gdnQodGhpcyx2b2lkIDAsKCk9PmxzLCgpPT57aWYoIXRoaXMubWVyaWRpZW1DYWNoZSl7Y29uc3QgZT17aG91cjoibnVtZXJpYyIsaG91ckN5Y2xlOiJoMTIifTt0aGlzLm1lcmlkaWVtQ2FjaGU9W3AudXRjKDIwMTYsMTEsMTMsOSkscC51dGMoMjAxNiwxMSwxMywxOSldLm1hcChuPT50aGlzLmV4dHJhY3QobixlLCJkYXlwZXJpb2QiKSl9cmV0dXJuIHRoaXMubWVyaWRpZW1DYWNoZX0pfWVyYXMoZSl7cmV0dXJuIHZ0KHRoaXMsZSxjcywoKT0+e2NvbnN0IG49e2VyYTplfTtyZXR1cm4gdGhpcy5lcmFDYWNoZVtlXXx8KHRoaXMuZXJhQ2FjaGVbZV09W3AudXRjKC00MCwxLDEpLHAudXRjKDIwMTcsMSwxKV0ubWFwKHI9PnRoaXMuZXh0cmFjdChyLG4sImVyYSIpKSksdGhpcy5lcmFDYWNoZVtlXX0pfWV4dHJhY3QoZSxuLHIpe2NvbnN0IHM9dGhpcy5kdEZvcm1hdHRlcihlLG4pLGk9cy5mb3JtYXRUb1BhcnRzKCksYT1pLmZpbmQobz0+by50eXBlLnRvTG93ZXJDYXNlKCk9PT1yKTtyZXR1cm4gYT9hLnZhbHVlOm51bGx9bnVtYmVyRm9ybWF0dGVyKGU9e30pe3JldHVybiBuZXcgSGwodGhpcy5pbnRsLGUuZm9yY2VTaW1wbGV8fHRoaXMuZmFzdE51bWJlcnMsZSl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gbmV3IHFsKGUsdGhpcy5pbnRsLG4pfXJlbEZvcm1hdHRlcihlPXt9KXtyZXR1cm4gbmV3IFlsKHRoaXMuaW50bCx0aGlzLmlzRW5nbGlzaCgpLGUpfWxpc3RGb3JtYXR0ZXIoZT17fSl7cmV0dXJuIFZsKHRoaXMuaW50bCxlKX1pc0VuZ2xpc2goKXtyZXR1cm4gdGhpcy5sb2NhbGU9PT0iZW4ifHx0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpPT09ImVuLXVzInx8bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUuc3RhcnRzV2l0aCgiZW4tdXMiKX1nZXRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gdGhpcy53ZWVrU2V0dGluZ3M/dGhpcy53ZWVrU2V0dGluZ3M6WHIoKT96bCh0aGlzLmxvY2FsZSk6R2x9Z2V0U3RhcnRPZldlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5maXJzdERheX1nZXRNaW5EYXlzSW5GaXJzdFdlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5taW5pbWFsRGF5c31nZXRXZWVrZW5kRGF5cygpe3JldHVybiB0aGlzLmdldFdlZWtTZXR0aW5ncygpLndlZWtlbmR9ZXF1YWxzKGUpe3JldHVybiB0aGlzLmxvY2FsZT09PWUubG9jYWxlJiZ0aGlzLm51bWJlcmluZ1N5c3RlbT09PWUubnVtYmVyaW5nU3lzdGVtJiZ0aGlzLm91dHB1dENhbGVuZGFyPT09ZS5vdXRwdXRDYWxlbmRhcn19bGV0IGFuPW51bGw7Y2xhc3MgRCBleHRlbmRzIFJle3N0YXRpYyBnZXQgdXRjSW5zdGFuY2UoKXtyZXR1cm4gYW49PT1udWxsJiYoYW49bmV3IEQoMCkpLGFufXN0YXRpYyBpbnN0YW5jZShlKXtyZXR1cm4gZT09PTA/RC51dGNJbnN0YW5jZTpuZXcgRChlKX1zdGF0aWMgcGFyc2VTcGVjaWZpZXIoZSl7aWYoZSl7Y29uc3Qgbj1lLm1hdGNoKC9edXRjKD86KFsrLV1cZHsxLDJ9KSg/OjooXGR7Mn0pKT8pPyQvaSk7aWYobilyZXR1cm4gbmV3IEQoa3QoblsxXSxuWzJdKSl9cmV0dXJuIG51bGx9Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmZpeGVkPWV9Z2V0IHR5cGUoKXtyZXR1cm4iZml4ZWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJVVEMiOmBVVEMke0hlKHRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9Z2V0IGlhbmFOYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJFdGMvVVRDIjpgRXRjL0dNVCR7SGUoLXRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9b2Zmc2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9Zm9ybWF0T2Zmc2V0KGUsbil7cmV0dXJuIEhlKHRoaXMuZml4ZWQsbil9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITB9b2Zmc2V0KCl7cmV0dXJuIHRoaXMuZml4ZWR9ZXF1YWxzKGUpe3JldHVybiBlLnR5cGU9PT0iZml4ZWQiJiZlLmZpeGVkPT09dGhpcy5maXhlZH1nZXQgaXNWYWxpZCgpe3JldHVybiEwfX1jbGFzcyBKbCBleHRlbmRzIFJle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lfWdldCB0eXBlKCl7cmV0dXJuImludmFsaWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuem9uZU5hbWV9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITF9b2Zmc2V0TmFtZSgpe3JldHVybiBudWxsfWZvcm1hdE9mZnNldCgpe3JldHVybiIifW9mZnNldCgpe3JldHVybiBOYU59ZXF1YWxzKCl7cmV0dXJuITF9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMX19ZnVuY3Rpb24gbmUodCxlKXtpZihnKHQpfHx0PT09bnVsbClyZXR1cm4gZTtpZih0IGluc3RhbmNlb2YgUmUpcmV0dXJuIHQ7aWYoS2wodCkpe2NvbnN0IG49dC50b0xvd2VyQ2FzZSgpO3JldHVybiBuPT09ImRlZmF1bHQiP2U6bj09PSJsb2NhbCJ8fG49PT0ic3lzdGVtIj9ndC5pbnN0YW5jZTpuPT09InV0YyJ8fG49PT0iZ210Ij9ELnV0Y0luc3RhbmNlOkQucGFyc2VTcGVjaWZpZXIobil8fEouY3JlYXRlKHQpfWVsc2UgcmV0dXJuIGNlKHQpP0QuaW5zdGFuY2UodCk6dHlwZW9mIHQ9PSJvYmplY3QiJiYib2Zmc2V0ImluIHQmJnR5cGVvZiB0Lm9mZnNldD09ImZ1bmN0aW9uIj90Om5ldyBKbCh0KX1sZXQgVnI9KCk9PkRhdGUubm93KCksV3I9InN5c3RlbSIsJHI9bnVsbCxMcj1udWxsLHpyPW51bGwsWnI9NjAsUnIsUHI9bnVsbDtjbGFzcyBJe3N0YXRpYyBnZXQgbm93KCl7cmV0dXJuIFZyfXN0YXRpYyBzZXQgbm93KGUpe1ZyPWV9c3RhdGljIHNldCBkZWZhdWx0Wm9uZShlKXtXcj1lfXN0YXRpYyBnZXQgZGVmYXVsdFpvbmUoKXtyZXR1cm4gbmUoV3IsZ3QuaW5zdGFuY2UpfXN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpe3JldHVybiAkcn1zdGF0aWMgc2V0IGRlZmF1bHRMb2NhbGUoZSl7JHI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0oKXtyZXR1cm4gTHJ9c3RhdGljIHNldCBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtKGUpe0xyPWV9c3RhdGljIGdldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoKXtyZXR1cm4genJ9c3RhdGljIHNldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoZSl7enI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gUHJ9c3RhdGljIHNldCBkZWZhdWx0V2Vla1NldHRpbmdzKGUpe1ByPWNuKGUpfXN0YXRpYyBnZXQgdHdvRGlnaXRDdXRvZmZZZWFyKCl7cmV0dXJuIFpyfXN0YXRpYyBzZXQgdHdvRGlnaXRDdXRvZmZZZWFyKGUpe1pyPWUlMTAwfXN0YXRpYyBnZXQgdGhyb3dPbkludmFsaWQoKXtyZXR1cm4gUnJ9c3RhdGljIHNldCB0aHJvd09uSW52YWxpZChlKXtScj1lfXN0YXRpYyByZXNldENhY2hlcygpe1QucmVzZXRDYWNoZSgpLEoucmVzZXRDYWNoZSgpfX1jbGFzcyBae2NvbnN0cnVjdG9yKGUsbil7dGhpcy5yZWFzb249ZSx0aGlzLmV4cGxhbmF0aW9uPW59dG9NZXNzYWdlKCl7cmV0dXJuIHRoaXMuZXhwbGFuYXRpb24/YCR7dGhpcy5yZWFzb259OiAke3RoaXMuZXhwbGFuYXRpb259YDp0aGlzLnJlYXNvbn19Y29uc3QganI9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF0sVXI9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV07ZnVuY3Rpb24gVyh0LGUpe3JldHVybiBuZXcgWigidW5pdCBvdXQgb2YgcmFuZ2UiLGB5b3Ugc3BlY2lmaWVkICR7ZX0gKG9mIHR5cGUgJHt0eXBlb2YgZX0pIGFzIGEgJHt0fSwgd2hpY2ggaXMgaW52YWxpZGApfWZ1bmN0aW9uIG9uKHQsZSxuKXtjb25zdCByPW5ldyBEYXRlKERhdGUuVVRDKHQsZS0xLG4pKTt0PDEwMCYmdD49MCYmci5zZXRVVENGdWxsWWVhcihyLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCk7Y29uc3Qgcz1yLmdldFVUQ0RheSgpO3JldHVybiBzPT09MD83OnN9ZnVuY3Rpb24gSHIodCxlLG4pe3JldHVybiBuKyhqZSh0KT9VcjpqcilbZS0xXX1mdW5jdGlvbiBxcih0LGUpe2NvbnN0IG49amUodCk/VXI6anIscj1uLmZpbmRJbmRleChpPT5pPGUpLHM9ZS1uW3JdO3JldHVybnttb250aDpyKzEsZGF5OnN9fWZ1bmN0aW9uIHVuKHQsZSl7cmV0dXJuKHQtZSs3KSU3KzF9ZnVuY3Rpb24gT3QodCxlPTQsbj0xKXtjb25zdHt5ZWFyOnIsbW9udGg6cyxkYXk6aX09dCxhPUhyKHIscyxpKSxvPXVuKG9uKHIscyxpKSxuKTtsZXQgdT1NYXRoLmZsb29yKChhLW8rMTQtZSkvNyksbDtyZXR1cm4gdTwxPyhsPXItMSx1PVVlKGwsZSxuKSk6dT5VZShyLGUsbik/KGw9cisxLHU9MSk6bD1yLHt3ZWVrWWVhcjpsLHdlZWtOdW1iZXI6dSx3ZWVrZGF5Om8sLi4uRXQodCl9fWZ1bmN0aW9uIFlyKHQsZT00LG49MSl7Y29uc3R7d2Vla1llYXI6cix3ZWVrTnVtYmVyOnMsd2Vla2RheTppfT10LGE9dW4ob24ociwxLGUpLG4pLG89a2Uocik7bGV0IHU9cyo3K2ktYS03K2UsbDt1PDE/KGw9ci0xLHUrPWtlKGwpKTp1Pm8/KGw9cisxLHUtPWtlKHIpKTpsPXI7Y29uc3R7bW9udGg6YyxkYXk6ZH09cXIobCx1KTtyZXR1cm57eWVhcjpsLG1vbnRoOmMsZGF5OmQsLi4uRXQodCl9fWZ1bmN0aW9uIGxuKHQpe2NvbnN0e3llYXI6ZSxtb250aDpuLGRheTpyfT10LHM9SHIoZSxuLHIpO3JldHVybnt5ZWFyOmUsb3JkaW5hbDpzLC4uLkV0KHQpfX1mdW5jdGlvbiBHcih0KXtjb25zdHt5ZWFyOmUsb3JkaW5hbDpufT10LHttb250aDpyLGRheTpzfT1xcihlLG4pO3JldHVybnt5ZWFyOmUsbW9udGg6cixkYXk6cywuLi5FdCh0KX19ZnVuY3Rpb24gSnIodCxlKXtpZighZyh0LmxvY2FsV2Vla2RheSl8fCFnKHQubG9jYWxXZWVrTnVtYmVyKXx8IWcodC5sb2NhbFdlZWtZZWFyKSl7aWYoIWcodC53ZWVrZGF5KXx8IWcodC53ZWVrTnVtYmVyKXx8IWcodC53ZWVrWWVhcikpdGhyb3cgbmV3IFNlKCJDYW5ub3QgbWl4IGxvY2FsZS1iYXNlZCB3ZWVrIGZpZWxkcyB3aXRoIElTTy1iYXNlZCB3ZWVrIGZpZWxkcyIpO3JldHVybiBnKHQubG9jYWxXZWVrZGF5KXx8KHQud2Vla2RheT10LmxvY2FsV2Vla2RheSksZyh0LmxvY2FsV2Vla051bWJlcil8fCh0LndlZWtOdW1iZXI9dC5sb2NhbFdlZWtOdW1iZXIpLGcodC5sb2NhbFdlZWtZZWFyKXx8KHQud2Vla1llYXI9dC5sb2NhbFdlZWtZZWFyKSxkZWxldGUgdC5sb2NhbFdlZWtkYXksZGVsZXRlIHQubG9jYWxXZWVrTnVtYmVyLGRlbGV0ZSB0LmxvY2FsV2Vla1llYXIse21pbkRheXNJbkZpcnN0V2VlazplLmdldE1pbkRheXNJbkZpcnN0V2VlaygpLHN0YXJ0T2ZXZWVrOmUuZ2V0U3RhcnRPZldlZWsoKX19ZWxzZSByZXR1cm57bWluRGF5c0luRmlyc3RXZWVrOjQsc3RhcnRPZldlZWs6MX19ZnVuY3Rpb24gQmwodCxlPTQsbj0xKXtjb25zdCByPVR0KHQud2Vla1llYXIpLHM9JCh0LndlZWtOdW1iZXIsMSxVZSh0LndlZWtZZWFyLGUsbikpLGk9JCh0LndlZWtkYXksMSw3KTtyZXR1cm4gcj9zP2k/ITE6Vygid2Vla2RheSIsdC53ZWVrZGF5KTpXKCJ3ZWVrIix0LndlZWtOdW1iZXIpOlcoIndlZWtZZWFyIix0LndlZWtZZWFyKX1mdW5jdGlvbiBRbCh0KXtjb25zdCBlPVR0KHQueWVhciksbj0kKHQub3JkaW5hbCwxLGtlKHQueWVhcikpO3JldHVybiBlP24/ITE6Vygib3JkaW5hbCIsdC5vcmRpbmFsKTpXKCJ5ZWFyIix0LnllYXIpfWZ1bmN0aW9uIEJyKHQpe2NvbnN0IGU9VHQodC55ZWFyKSxuPSQodC5tb250aCwxLDEyKSxyPSQodC5kYXksMSxTdCh0LnllYXIsdC5tb250aCkpO3JldHVybiBlP24/cj8hMTpXKCJkYXkiLHQuZGF5KTpXKCJtb250aCIsdC5tb250aCk6VygieWVhciIsdC55ZWFyKX1mdW5jdGlvbiBRcih0KXtjb25zdHtob3VyOmUsbWludXRlOm4sc2Vjb25kOnIsbWlsbGlzZWNvbmQ6c309dCxpPSQoZSwwLDIzKXx8ZT09PTI0JiZuPT09MCYmcj09PTAmJnM9PT0wLGE9JChuLDAsNTkpLG89JChyLDAsNTkpLHU9JChzLDAsOTk5KTtyZXR1cm4gaT9hP28/dT8hMTpXKCJtaWxsaXNlY29uZCIscyk6Vygic2Vjb25kIixyKTpXKCJtaW51dGUiLG4pOlcoImhvdXIiLGUpfWZ1bmN0aW9uIGcodCl7cmV0dXJuIHR5cGVvZiB0PiJ1In1mdW5jdGlvbiBjZSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIifWZ1bmN0aW9uIFR0KHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciImJnQlMT09PTB9ZnVuY3Rpb24gS2wodCl7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIn1mdW5jdGlvbiBYbCh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIEtyKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXR9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIFhyKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5Mb2NhbGUmJigid2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlfHwiZ2V0V2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlKX1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gZWModCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19ZnVuY3Rpb24gZXModCxlLG4pe2lmKHQubGVuZ3RoIT09MClyZXR1cm4gdC5yZWR1Y2UoKHIscyk9Pntjb25zdCBpPVtlKHMpLHNdO3JldHVybiByJiZuKHJbMF0saVswXSk9PT1yWzBdP3I6aX0sbnVsbClbMV19ZnVuY3Rpb24gdGModCxlKXtyZXR1cm4gZS5yZWR1Y2UoKG4scik9PihuW3JdPXRbcl0sbikse30pfWZ1bmN0aW9uIGJlKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIGNuKHQpe2lmKHQ9PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIHQhPSJvYmplY3QiKXRocm93IG5ldyBfKCJXZWVrIHNldHRpbmdzIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYoISQodC5maXJzdERheSwxLDcpfHwhJCh0Lm1pbmltYWxEYXlzLDEsNyl8fCFBcnJheS5pc0FycmF5KHQud2Vla2VuZCl8fHQud2Vla2VuZC5zb21lKGU9PiEkKGUsMSw3KSkpdGhyb3cgbmV3IF8oIkludmFsaWQgd2VlayBzZXR0aW5ncyIpO3JldHVybntmaXJzdERheTp0LmZpcnN0RGF5LG1pbmltYWxEYXlzOnQubWluaW1hbERheXMsd2Vla2VuZDpBcnJheS5mcm9tKHQud2Vla2VuZCl9fWZ1bmN0aW9uICQodCxlLG4pe3JldHVybiBUdCh0KSYmdD49ZSYmdDw9bn1mdW5jdGlvbiBuYyh0LGUpe3JldHVybiB0LWUqTWF0aC5mbG9vcih0L2UpfWZ1bmN0aW9uIEUodCxlPTIpe2NvbnN0IG49dDwwO2xldCByO3JldHVybiBuP3I9Ii0iKygiIistdCkucGFkU3RhcnQoZSwiMCIpOnI9KCIiK3QpLnBhZFN0YXJ0KGUsIjAiKSxyfWZ1bmN0aW9uIHJlKHQpe2lmKCEoZyh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlSW50KHQsMTApfWZ1bmN0aW9uIGZlKHQpe2lmKCEoZyh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlRmxvYXQodCl9ZnVuY3Rpb24gZm4odCl7aWYoIShnKHQpfHx0PT09bnVsbHx8dD09PSIiKSl7Y29uc3QgZT1wYXJzZUZsb2F0KCIwLiIrdCkqMWUzO3JldHVybiBNYXRoLmZsb29yKGUpfX1mdW5jdGlvbiBkbih0LGUsbj0hMSl7Y29uc3Qgcj0xMCoqZTtyZXR1cm4obj9NYXRoLnRydW5jOk1hdGgucm91bmQpKHQqcikvcn1mdW5jdGlvbiBqZSh0KXtyZXR1cm4gdCU0PT09MCYmKHQlMTAwIT09MHx8dCU0MDA9PT0wKX1mdW5jdGlvbiBrZSh0KXtyZXR1cm4gamUodCk/MzY2OjM2NX1mdW5jdGlvbiBTdCh0LGUpe2NvbnN0IG49bmMoZS0xLDEyKSsxLHI9dCsoZS1uKS8xMjtyZXR1cm4gbj09PTI/amUocik/Mjk6Mjg6WzMxLG51bGwsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdW24tMV19ZnVuY3Rpb24gYnQodCl7bGV0IGU9RGF0ZS5VVEModC55ZWFyLHQubW9udGgtMSx0LmRheSx0LmhvdXIsdC5taW51dGUsdC5zZWNvbmQsdC5taWxsaXNlY29uZCk7cmV0dXJuIHQueWVhcjwxMDAmJnQueWVhcj49MCYmKGU9bmV3IERhdGUoZSksZS5zZXRVVENGdWxsWWVhcih0LnllYXIsdC5tb250aC0xLHQuZGF5KSksK2V9ZnVuY3Rpb24gdHModCxlLG4pe3JldHVybi11bihvbih0LDEsZSksbikrZS0xfWZ1bmN0aW9uIFVlKHQsZT00LG49MSl7Y29uc3Qgcj10cyh0LGUsbikscz10cyh0KzEsZSxuKTtyZXR1cm4oa2UodCktcitzKS83fWZ1bmN0aW9uIGhuKHQpe3JldHVybiB0Pjk5P3Q6dD5JLnR3b0RpZ2l0Q3V0b2ZmWWVhcj8xOTAwK3Q6MmUzK3R9ZnVuY3Rpb24gbnModCxlLG4scj1udWxsKXtjb25zdCBzPW5ldyBEYXRlKHQpLGk9e2hvdXJDeWNsZToiaDIzIix5ZWFyOiJudW1lcmljIixtb250aDoiMi1kaWdpdCIsZGF5OiIyLWRpZ2l0Iixob3VyOiIyLWRpZ2l0IixtaW51dGU6IjItZGlnaXQifTtyJiYoaS50aW1lWm9uZT1yKTtjb25zdCBhPXt0aW1lWm9uZU5hbWU6ZSwuLi5pfSxvPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KG4sYSkuZm9ybWF0VG9QYXJ0cyhzKS5maW5kKHU9PnUudHlwZS50b0xvd2VyQ2FzZSgpPT09InRpbWV6b25lbmFtZSIpO3JldHVybiBvP28udmFsdWU6bnVsbH1mdW5jdGlvbiBrdCh0LGUpe2xldCBuPXBhcnNlSW50KHQsMTApO051bWJlci5pc05hTihuKSYmKG49MCk7Y29uc3Qgcj1wYXJzZUludChlLDEwKXx8MCxzPW48MHx8T2JqZWN0LmlzKG4sLTApPy1yOnI7cmV0dXJuIG4qNjArc31mdW5jdGlvbiBycyh0KXtjb25zdCBlPU51bWJlcih0KTtpZih0eXBlb2YgdD09ImJvb2xlYW4ifHx0PT09IiJ8fE51bWJlci5pc05hTihlKSl0aHJvdyBuZXcgXyhgSW52YWxpZCB1bml0IHZhbHVlICR7dH1gKTtyZXR1cm4gZX1mdW5jdGlvbiBJdCh0LGUpe2NvbnN0IG49e307Zm9yKGNvbnN0IHIgaW4gdClpZihiZSh0LHIpKXtjb25zdCBzPXRbcl07aWYocz09bnVsbCljb250aW51ZTtuW2UocildPXJzKHMpfXJldHVybiBufWZ1bmN0aW9uIEhlKHQsZSl7Y29uc3Qgbj1NYXRoLnRydW5jKE1hdGguYWJzKHQvNjApKSxyPU1hdGgudHJ1bmMoTWF0aC5hYnModCU2MCkpLHM9dD49MD8iKyI6Ii0iO3N3aXRjaChlKXtjYXNlInNob3J0IjpyZXR1cm5gJHtzfSR7RShuLDIpfToke0UociwyKX1gO2Nhc2UibmFycm93IjpyZXR1cm5gJHtzfSR7bn0ke3I+MD9gOiR7cn1gOiIifWA7Y2FzZSJ0ZWNoaWUiOnJldHVybmAke3N9JHtFKG4sMil9JHtFKHIsMil9YDtkZWZhdWx0OnRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSBmb3JtYXQgJHtlfSBpcyBvdXQgb2YgcmFuZ2UgZm9yIHByb3BlcnR5IGZvcm1hdGApfX1mdW5jdGlvbiBFdCh0KXtyZXR1cm4gdGModCxbImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdKX1jb25zdCByYz1bIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc3M9WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxzYz1bIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdO2Z1bmN0aW9uIGlzKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLnNjXTtjYXNlInNob3J0IjpyZXR1cm5bLi4uc3NdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLnJjXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl07Y2FzZSIyLWRpZ2l0IjpyZXR1cm5bIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjEwIiwiMTEiLCIxMiJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IGFzPVsiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiLCJTdW5kYXkiXSxvcz1bIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCIsIlN1biJdLGljPVsiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIiwiUyJdO2Z1bmN0aW9uIHVzKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLmljXTtjYXNlInNob3J0IjpyZXR1cm5bLi4ub3NdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLmFzXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IGxzPVsiQU0iLCJQTSJdLGFjPVsiQmVmb3JlIENocmlzdCIsIkFubm8gRG9taW5pIl0sb2M9WyJCQyIsIkFEIl0sdWM9WyJCIiwiQSJdO2Z1bmN0aW9uIGNzKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLnVjXTtjYXNlInNob3J0IjpyZXR1cm5bLi4ub2NdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLmFjXTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBsYyh0KXtyZXR1cm4gbHNbdC5ob3VyPDEyPzA6MV19ZnVuY3Rpb24gY2ModCxlKXtyZXR1cm4gdXMoZSlbdC53ZWVrZGF5LTFdfWZ1bmN0aW9uIGZjKHQsZSl7cmV0dXJuIGlzKGUpW3QubW9udGgtMV19ZnVuY3Rpb24gZGModCxlKXtyZXR1cm4gY3MoZSlbdC55ZWFyPDA/MDoxXX1mdW5jdGlvbiBoYyh0LGUsbj0iYWx3YXlzIixyPSExKXtjb25zdCBzPXt5ZWFyczpbInllYXIiLCJ5ci4iXSxxdWFydGVyczpbInF1YXJ0ZXIiLCJxdHIuIl0sbW9udGhzOlsibW9udGgiLCJtby4iXSx3ZWVrczpbIndlZWsiLCJ3ay4iXSxkYXlzOlsiZGF5IiwiZGF5IiwiZGF5cyJdLGhvdXJzOlsiaG91ciIsImhyLiJdLG1pbnV0ZXM6WyJtaW51dGUiLCJtaW4uIl0sc2Vjb25kczpbInNlY29uZCIsInNlYy4iXX0saT1bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiXS5pbmRleE9mKHQpPT09LTE7aWYobj09PSJhdXRvIiYmaSl7Y29uc3QgZD10PT09ImRheXMiO3N3aXRjaChlKXtjYXNlIDE6cmV0dXJuIGQ/InRvbW9ycm93IjpgbmV4dCAke3NbdF1bMF19YDtjYXNlLTE6cmV0dXJuIGQ/Inllc3RlcmRheSI6YGxhc3QgJHtzW3RdWzBdfWA7Y2FzZSAwOnJldHVybiBkPyJ0b2RheSI6YHRoaXMgJHtzW3RdWzBdfWB9fWNvbnN0IGE9T2JqZWN0LmlzKGUsLTApfHxlPDAsbz1NYXRoLmFicyhlKSx1PW89PT0xLGw9c1t0XSxjPXI/dT9sWzFdOmxbMl18fGxbMV06dT9zW3RdWzBdOnQ7cmV0dXJuIGE/YCR7b30gJHtjfSBhZ29gOmBpbiAke299ICR7Y31gfWZ1bmN0aW9uIGZzKHQsZSl7bGV0IG49IiI7Zm9yKGNvbnN0IHIgb2YgdClyLmxpdGVyYWw/bis9ci52YWw6bis9ZShyLnZhbCk7cmV0dXJuIG59Y29uc3QgbWM9e0Q6eXQsREQ6bXIsREREOnlyLEREREQ6Z3IsdDpwcix0dDp3cix0dHQ6dnIsdHR0dDpPcixUOlRyLFRUOlNyLFRUVDpicixUVFRUOmtyLGY6SXIsZmY6TnIsZmZmOk1yLGZmZmY6RHIsRjpFcixGRjp4cixGRkY6Q3IsRkZGRjpfcn07Y2xhc3MgeHtzdGF0aWMgY3JlYXRlKGUsbj17fSl7cmV0dXJuIG5ldyB4KGUsbil9c3RhdGljIHBhcnNlRm9ybWF0KGUpe2xldCBuPW51bGwscj0iIixzPSExO2NvbnN0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2NvbnN0IG89ZS5jaGFyQXQoYSk7bz09PSInIj8oci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLG49bnVsbCxyPSIiLHM9IXMpOnN8fG89PT1uP3IrPW86KHIubGVuZ3RoPjAmJmkucHVzaCh7bGl0ZXJhbDovXlxzKyQvLnRlc3QociksdmFsOnJ9KSxyPW8sbj1vKX1yZXR1cm4gci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLGl9c3RhdGljIG1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoZSl7cmV0dXJuIG1jW2VdfWNvbnN0cnVjdG9yKGUsbil7dGhpcy5vcHRzPW4sdGhpcy5sb2M9ZSx0aGlzLnN5c3RlbUxvYz1udWxsfWZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGUsbil7cmV0dXJuIHRoaXMuc3lzdGVtTG9jPT09bnVsbCYmKHRoaXMuc3lzdGVtTG9jPXRoaXMubG9jLnJlZGVmYXVsdFRvU3lzdGVtKCkpLHRoaXMuc3lzdGVtTG9jLmR0Rm9ybWF0dGVyKGUsey4uLnRoaXMub3B0cywuLi5ufSkuZm9ybWF0KCl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZSx7Li4udGhpcy5vcHRzLC4uLm59KX1mb3JtYXREYXRlVGltZShlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0KCl9Zm9ybWF0RGF0ZVRpbWVQYXJ0cyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0VG9QYXJ0cygpfWZvcm1hdEludGVydmFsKGUsbil7cmV0dXJuIHRoaXMuZHRGb3JtYXR0ZXIoZS5zdGFydCxuKS5kdGYuZm9ybWF0UmFuZ2UoZS5zdGFydC50b0pTRGF0ZSgpLGUuZW5kLnRvSlNEYXRlKCkpfXJlc29sdmVkT3B0aW9ucyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikucmVzb2x2ZWRPcHRpb25zKCl9bnVtKGUsbj0wKXtpZih0aGlzLm9wdHMuZm9yY2VTaW1wbGUpcmV0dXJuIEUoZSxuKTtjb25zdCByPXsuLi50aGlzLm9wdHN9O3JldHVybiBuPjAmJihyLnBhZFRvPW4pLHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihyKS5mb3JtYXQoZSl9Zm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj10aGlzLmxvYy5saXN0aW5nTW9kZSgpPT09ImVuIixzPXRoaXMubG9jLm91dHB1dENhbGVuZGFyJiZ0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciE9PSJncmVnb3J5IixpPShoLFMpPT50aGlzLmxvYy5leHRyYWN0KGUsaCxTKSxhPWg9PmUuaXNPZmZzZXRGaXhlZCYmZS5vZmZzZXQ9PT0wJiZoLmFsbG93Wj8iWiI6ZS5pc1ZhbGlkP2Uuem9uZS5mb3JtYXRPZmZzZXQoZS50cyxoLmZvcm1hdCk6IiIsbz0oKT0+cj9sYyhlKTppKHtob3VyOiJudW1lcmljIixob3VyQ3ljbGU6ImgxMiJ9LCJkYXlwZXJpb2QiKSx1PShoLFMpPT5yP2ZjKGUsaCk6aShTP3ttb250aDpofTp7bW9udGg6aCxkYXk6Im51bWVyaWMifSwibW9udGgiKSxsPShoLFMpPT5yP2NjKGUsaCk6aShTP3t3ZWVrZGF5Omh9Ont3ZWVrZGF5OmgsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9LCJ3ZWVrZGF5IiksYz1oPT57Y29uc3QgUz14Lm1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoaCk7cmV0dXJuIFM/dGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChlLFMpOmh9LGQ9aD0+cj9kYyhlLGgpOmkoe2VyYTpofSwiZXJhIikseT1oPT57c3dpdGNoKGgpe2Nhc2UiUyI6cmV0dXJuIHRoaXMubnVtKGUubWlsbGlzZWNvbmQpO2Nhc2UidSI6Y2FzZSJTU1MiOnJldHVybiB0aGlzLm51bShlLm1pbGxpc2Vjb25kLDMpO2Nhc2UicyI6cmV0dXJuIHRoaXMubnVtKGUuc2Vjb25kKTtjYXNlInNzIjpyZXR1cm4gdGhpcy5udW0oZS5zZWNvbmQsMik7Y2FzZSJ1dSI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS5taWxsaXNlY29uZC8xMCksMik7Y2FzZSJ1dXUiOnJldHVybiB0aGlzLm51bShNYXRoLmZsb29yKGUubWlsbGlzZWNvbmQvMTAwKSk7Y2FzZSJtIjpyZXR1cm4gdGhpcy5udW0oZS5taW51dGUpO2Nhc2UibW0iOnJldHVybiB0aGlzLm51bShlLm1pbnV0ZSwyKTtjYXNlImgiOnJldHVybiB0aGlzLm51bShlLmhvdXIlMTI9PT0wPzEyOmUuaG91ciUxMik7Y2FzZSJoaCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciUxMj09PTA/MTI6ZS5ob3VyJTEyLDIpO2Nhc2UiSCI6cmV0dXJuIHRoaXMubnVtKGUuaG91cik7Y2FzZSJISCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciwyKTtjYXNlIloiOnJldHVybiBhKHtmb3JtYXQ6Im5hcnJvdyIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaIjpyZXR1cm4gYSh7Zm9ybWF0OiJzaG9ydCIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaWiI6cmV0dXJuIGEoe2Zvcm1hdDoidGVjaGllIixhbGxvd1o6dGhpcy5vcHRzLmFsbG93Wn0pO2Nhc2UiWlpaWiI6cmV0dXJuIGUuem9uZS5vZmZzZXROYW1lKGUudHMse2Zvcm1hdDoic2hvcnQiLGxvY2FsZTp0aGlzLmxvYy5sb2NhbGV9KTtjYXNlIlpaWlpaIjpyZXR1cm4gZS56b25lLm9mZnNldE5hbWUoZS50cyx7Zm9ybWF0OiJsb25nIixsb2NhbGU6dGhpcy5sb2MubG9jYWxlfSk7Y2FzZSJ6IjpyZXR1cm4gZS56b25lTmFtZTtjYXNlImEiOnJldHVybiBvKCk7Y2FzZSJkIjpyZXR1cm4gcz9pKHtkYXk6Im51bWVyaWMifSwiZGF5Iik6dGhpcy5udW0oZS5kYXkpO2Nhc2UiZGQiOnJldHVybiBzP2koe2RheToiMi1kaWdpdCJ9LCJkYXkiKTp0aGlzLm51bShlLmRheSwyKTtjYXNlImMiOnJldHVybiB0aGlzLm51bShlLndlZWtkYXkpO2Nhc2UiY2NjIjpyZXR1cm4gbCgic2hvcnQiLCEwKTtjYXNlImNjY2MiOnJldHVybiBsKCJsb25nIiwhMCk7Y2FzZSJjY2NjYyI6cmV0dXJuIGwoIm5hcnJvdyIsITApO2Nhc2UiRSI6cmV0dXJuIHRoaXMubnVtKGUud2Vla2RheSk7Y2FzZSJFRUUiOnJldHVybiBsKCJzaG9ydCIsITEpO2Nhc2UiRUVFRSI6cmV0dXJuIGwoImxvbmciLCExKTtjYXNlIkVFRUVFIjpyZXR1cm4gbCgibmFycm93IiwhMSk7Y2FzZSJMIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyIsZGF5OiJudW1lcmljIn0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCk7Y2FzZSJMTCI6cmV0dXJuIHM/aSh7bW9udGg6IjItZGlnaXQiLGRheToibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgsMik7Y2FzZSJMTEwiOnJldHVybiB1KCJzaG9ydCIsITApO2Nhc2UiTExMTCI6cmV0dXJuIHUoImxvbmciLCEwKTtjYXNlIkxMTExMIjpyZXR1cm4gdSgibmFycm93IiwhMCk7Y2FzZSJNIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgpO2Nhc2UiTU0iOnJldHVybiBzP2koe21vbnRoOiIyLWRpZ2l0In0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCwyKTtjYXNlIk1NTSI6cmV0dXJuIHUoInNob3J0IiwhMSk7Y2FzZSJNTU1NIjpyZXR1cm4gdSgibG9uZyIsITEpO2Nhc2UiTU1NTU0iOnJldHVybiB1KCJuYXJyb3ciLCExKTtjYXNlInkiOnJldHVybiBzP2koe3llYXI6Im51bWVyaWMifSwieWVhciIpOnRoaXMubnVtKGUueWVhcik7Y2FzZSJ5eSI6cmV0dXJuIHM/aSh7eWVhcjoiMi1kaWdpdCJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLDIpO2Nhc2UieXl5eSI6cmV0dXJuIHM/aSh7eWVhcjoibnVtZXJpYyJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLDQpO2Nhc2UieXl5eXl5IjpyZXR1cm4gcz9pKHt5ZWFyOiJudW1lcmljIn0sInllYXIiKTp0aGlzLm51bShlLnllYXIsNik7Y2FzZSJHIjpyZXR1cm4gZCgic2hvcnQiKTtjYXNlIkdHIjpyZXR1cm4gZCgibG9uZyIpO2Nhc2UiR0dHR0ciOnJldHVybiBkKCJuYXJyb3ciKTtjYXNlImtrIjpyZXR1cm4gdGhpcy5udW0oZS53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwyKTtjYXNlImtra2siOnJldHVybiB0aGlzLm51bShlLndlZWtZZWFyLDQpO2Nhc2UiVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlcik7Y2FzZSJXVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlciwyKTtjYXNlIm4iOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla051bWJlcik7Y2FzZSJubiI6cmV0dXJuIHRoaXMubnVtKGUubG9jYWxXZWVrTnVtYmVyLDIpO2Nhc2UiaWkiOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla1llYXIudG9TdHJpbmcoKS5zbGljZSgtMiksMik7Y2FzZSJpaWlpIjpyZXR1cm4gdGhpcy5udW0oZS5sb2NhbFdlZWtZZWFyLDQpO2Nhc2UibyI6cmV0dXJuIHRoaXMubnVtKGUub3JkaW5hbCk7Y2FzZSJvb28iOnJldHVybiB0aGlzLm51bShlLm9yZGluYWwsMyk7Y2FzZSJxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyKTtjYXNlInFxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyLDIpO2Nhc2UiWCI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS50cy8xZTMpKTtjYXNlIngiOnJldHVybiB0aGlzLm51bShlLnRzKTtkZWZhdWx0OnJldHVybiBjKGgpfX07cmV0dXJuIGZzKHgucGFyc2VGb3JtYXQobikseSl9Zm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj11PT57c3dpdGNoKHVbMF0pe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpyZXR1cm4iaG91ciI7Y2FzZSJkIjpyZXR1cm4iZGF5IjtjYXNlInciOnJldHVybiJ3ZWVrIjtjYXNlIk0iOnJldHVybiJtb250aCI7Y2FzZSJ5IjpyZXR1cm4ieWVhciI7ZGVmYXVsdDpyZXR1cm4gbnVsbH19LHM9dT0+bD0+e2NvbnN0IGM9cihsKTtyZXR1cm4gYz90aGlzLm51bSh1LmdldChjKSxsLmxlbmd0aCk6bH0saT14LnBhcnNlRm9ybWF0KG4pLGE9aS5yZWR1Y2UoKHUse2xpdGVyYWw6bCx2YWw6Y30pPT5sP3U6dS5jb25jYXQoYyksW10pLG89ZS5zaGlmdFRvKC4uLmEubWFwKHIpLmZpbHRlcih1PT51KSk7cmV0dXJuIGZzKGkscyhvKSl9fWNvbnN0IGRzPS9bQS1aYS16XystXXsxLDI1Nn0oPzo6P1wvW0EtWmEtejAtOV8rLV17MSwyNTZ9KD86XC9bQS1aYS16MC05XystXXsxLDI1Nn0pPyk/LztmdW5jdGlvbiBJZSguLi50KXtjb25zdCBlPXQucmVkdWNlKChuLHIpPT5uK3Iuc291cmNlLCIiKTtyZXR1cm4gUmVnRXhwKGBeJHtlfSRgKX1mdW5jdGlvbiBFZSguLi50KXtyZXR1cm4gZT0+dC5yZWR1Y2UoKFtuLHIsc10saSk9Pntjb25zdFthLG8sdV09aShlLHMpO3JldHVyblt7Li4ubiwuLi5hfSxvfHxyLHVdfSxbe30sbnVsbCwxXSkuc2xpY2UoMCwyKX1mdW5jdGlvbiBOZSh0LC4uLmUpe2lmKHQ9PW51bGwpcmV0dXJuW251bGwsbnVsbF07Zm9yKGNvbnN0W24scl1vZiBlKXtjb25zdCBzPW4uZXhlYyh0KTtpZihzKXJldHVybiByKHMpfXJldHVybltudWxsLG51bGxdfWZ1bmN0aW9uIGhzKC4uLnQpe3JldHVybihlLG4pPT57Y29uc3Qgcj17fTtsZXQgcztmb3Iocz0wO3M8dC5sZW5ndGg7cysrKXJbdFtzXV09cmUoZVtuK3NdKTtyZXR1cm5bcixudWxsLG4rc119fWNvbnN0IG1zPS8oPzooWil8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8pLyx5Yz1gKD86JHttcy5zb3VyY2V9Pyg/OlxcWygke2RzLnNvdXJjZX0pXFxdKT8pP2AsbW49LyhcZFxkKSg/Ojo/KFxkXGQpKD86Oj8oXGRcZCkoPzpbLixdKFxkezEsMzB9KSk/KT8pPy8seXM9UmVnRXhwKGAke21uLnNvdXJjZX0ke3ljfWApLHluPVJlZ0V4cChgKD86VCR7eXMuc291cmNlfSk/YCksZ2M9LyhbKy1dXGR7Nn18XGR7NH0pKD86LT8oXGRcZCkoPzotPyhcZFxkKSk/KT8vLHBjPS8oXGR7NH0pLT9XKFxkXGQpKD86LT8oXGQpKT8vLHdjPS8oXGR7NH0pLT8oXGR7M30pLyx2Yz1ocygid2Vla1llYXIiLCJ3ZWVrTnVtYmVyIiwid2Vla0RheSIpLE9jPWhzKCJ5ZWFyIiwib3JkaW5hbCIpLFRjPS8oXGR7NH0pLShcZFxkKS0oXGRcZCkvLGdzPVJlZ0V4cChgJHttbi5zb3VyY2V9ID8oPzoke21zLnNvdXJjZX18KCR7ZHMuc291cmNlfSkpP2ApLFNjPVJlZ0V4cChgKD86ICR7Z3Muc291cmNlfSk/YCk7ZnVuY3Rpb24geGUodCxlLG4pe2NvbnN0IHI9dFtlXTtyZXR1cm4gZyhyKT9uOnJlKHIpfWZ1bmN0aW9uIGJjKHQsZSl7cmV0dXJuW3t5ZWFyOnhlKHQsZSksbW9udGg6eGUodCxlKzEsMSksZGF5OnhlKHQsZSsyLDEpfSxudWxsLGUrM119ZnVuY3Rpb24gTWUodCxlKXtyZXR1cm5be2hvdXJzOnhlKHQsZSwwKSxtaW51dGVzOnhlKHQsZSsxLDApLHNlY29uZHM6eGUodCxlKzIsMCksbWlsbGlzZWNvbmRzOmZuKHRbZSszXSl9LG51bGwsZSs0XX1mdW5jdGlvbiBxZSh0LGUpe2NvbnN0IG49IXRbZV0mJiF0W2UrMV0scj1rdCh0W2UrMV0sdFtlKzJdKSxzPW4/bnVsbDpELmluc3RhbmNlKHIpO3JldHVyblt7fSxzLGUrM119ZnVuY3Rpb24gWWUodCxlKXtjb25zdCBuPXRbZV0/Si5jcmVhdGUodFtlXSk6bnVsbDtyZXR1cm5be30sbixlKzFdfWNvbnN0IGtjPVJlZ0V4cChgXlQ/JHttbi5zb3VyY2V9JGApLEljPS9eLT9QKD86KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pWSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pTSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pVyk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pRCk/KD86VCg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KUgpPyg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KU0pPyg/OigtP1xkezEsMjB9KSg/OlsuLF0oLT9cZHsxLDIwfSkpP1MpPyk/KSQvO2Z1bmN0aW9uIEVjKHQpe2NvbnN0W2UsbixyLHMsaSxhLG8sdSxsXT10LGM9ZVswXT09PSItIixkPXUmJnVbMF09PT0iLSIseT0oaCxTPSExKT0+aCE9PXZvaWQgMCYmKFN8fGgmJmMpPy1oOmg7cmV0dXJuW3t5ZWFyczp5KGZlKG4pKSxtb250aHM6eShmZShyKSksd2Vla3M6eShmZShzKSksZGF5czp5KGZlKGkpKSxob3Vyczp5KGZlKGEpKSxtaW51dGVzOnkoZmUobykpLHNlY29uZHM6eShmZSh1KSx1PT09Ii0wIiksbWlsbGlzZWNvbmRzOnkoZm4obCksZCl9XX1jb25zdCBOYz17R01UOjAsRURUOi00KjYwLEVTVDotNSo2MCxDRFQ6LTUqNjAsQ1NUOi02KjYwLE1EVDotNio2MCxNU1Q6LTcqNjAsUERUOi03KjYwLFBTVDotOCo2MH07ZnVuY3Rpb24gZ24odCxlLG4scixzLGksYSl7Y29uc3Qgbz17eWVhcjplLmxlbmd0aD09PTI/aG4ocmUoZSkpOnJlKGUpLG1vbnRoOnNzLmluZGV4T2YobikrMSxkYXk6cmUociksaG91cjpyZShzKSxtaW51dGU6cmUoaSl9O3JldHVybiBhJiYoby5zZWNvbmQ9cmUoYSkpLHQmJihvLndlZWtkYXk9dC5sZW5ndGg+Mz9hcy5pbmRleE9mKHQpKzE6b3MuaW5kZXhPZih0KSsxKSxvfWNvbnN0IHhjPS9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksXHMpPyhcZHsxLDJ9KVxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxzKFxkezIsNH0pXHMoXGRcZCk6KFxkXGQpKD86OihcZFxkKSk/XHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KD86KFsrLV1cZFxkKShcZFxkKSkpJC87ZnVuY3Rpb24gTWModCl7Y29uc3RbLGUsbixyLHMsaSxhLG8sdSxsLGMsZF09dCx5PWduKGUscyxyLG4saSxhLG8pO2xldCBoO3JldHVybiB1P2g9TmNbdV06bD9oPTA6aD1rdChjLGQpLFt5LG5ldyBEKGgpXX1mdW5jdGlvbiBDYyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9cKFteKCldKlwpfFtcblx0XS9nLCIgIikucmVwbGFjZSgvKFxzXHMrKS9nLCIgIikudHJpbSgpfWNvbnN0IERjPS9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksIChcZFxkKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpIChcZHs0fSkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sX2M9L14oTW9uZGF5fFR1ZXNkYXl8V2VkbmVzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheXxTdW5kYXkpLCAoXGRcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sRmM9L14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXGR8XGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgKFxkezR9KSQvO2Z1bmN0aW9uIHBzKHQpe2NvbnN0WyxlLG4scixzLGksYSxvXT10O3JldHVybltnbihlLHMscixuLGksYSxvKSxELnV0Y0luc3RhbmNlXX1mdW5jdGlvbiBBYyh0KXtjb25zdFssZSxuLHIscyxpLGEsb109dDtyZXR1cm5bZ24oZSxvLG4scixzLGksYSksRC51dGNJbnN0YW5jZV19Y29uc3QgVmM9SWUoZ2MseW4pLFdjPUllKHBjLHluKSwkYz1JZSh3Yyx5biksTGM9SWUoeXMpLHdzPUVlKGJjLE1lLHFlLFllKSx6Yz1FZSh2YyxNZSxxZSxZZSksWmM9RWUoT2MsTWUscWUsWWUpLFJjPUVlKE1lLHFlLFllKTtmdW5jdGlvbiBQYyh0KXtyZXR1cm4gTmUodCxbVmMsd3NdLFtXYyx6Y10sWyRjLFpjXSxbTGMsUmNdKX1mdW5jdGlvbiBqYyh0KXtyZXR1cm4gTmUoQ2ModCksW3hjLE1jXSl9ZnVuY3Rpb24gVWModCl7cmV0dXJuIE5lKHQsW0RjLHBzXSxbX2MscHNdLFtGYyxBY10pfWZ1bmN0aW9uIEhjKHQpe3JldHVybiBOZSh0LFtJYyxFY10pfWNvbnN0IHFjPUVlKE1lKTtmdW5jdGlvbiBZYyh0KXtyZXR1cm4gTmUodCxba2MscWNdKX1jb25zdCBHYz1JZShUYyxTYyksSmM9SWUoZ3MpLEJjPUVlKE1lLHFlLFllKTtmdW5jdGlvbiBRYyh0KXtyZXR1cm4gTmUodCxbR2Msd3NdLFtKYyxCY10pfWNvbnN0IHZzPSJJbnZhbGlkIER1cmF0aW9uIixPcz17d2Vla3M6e2RheXM6Nyxob3Vyczo3KjI0LG1pbnV0ZXM6NyoyNCo2MCxzZWNvbmRzOjcqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOjcqMjQqNjAqNjAqMWUzfSxkYXlzOntob3VyczoyNCxtaW51dGVzOjI0KjYwLHNlY29uZHM6MjQqNjAqNjAsbWlsbGlzZWNvbmRzOjI0KjYwKjYwKjFlM30saG91cnM6e21pbnV0ZXM6NjAsc2Vjb25kczo2MCo2MCxtaWxsaXNlY29uZHM6NjAqNjAqMWUzfSxtaW51dGVzOntzZWNvbmRzOjYwLG1pbGxpc2Vjb25kczo2MCoxZTN9LHNlY29uZHM6e21pbGxpc2Vjb25kczoxZTN9fSxLYz17eWVhcnM6e3F1YXJ0ZXJzOjQsbW9udGhzOjEyLHdlZWtzOjUyLGRheXM6MzY1LGhvdXJzOjM2NSoyNCxtaW51dGVzOjM2NSoyNCo2MCxzZWNvbmRzOjM2NSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzY1KjI0KjYwKjYwKjFlM30scXVhcnRlcnM6e21vbnRoczozLHdlZWtzOjEzLGRheXM6OTEsaG91cnM6OTEqMjQsbWludXRlczo5MSoyNCo2MCxzZWNvbmRzOjkxKjI0KjYwKjYwLG1pbGxpc2Vjb25kczo5MSoyNCo2MCo2MCoxZTN9LG1vbnRoczp7d2Vla3M6NCxkYXlzOjMwLGhvdXJzOjMwKjI0LG1pbnV0ZXM6MzAqMjQqNjAsc2Vjb25kczozMCoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzAqMjQqNjAqNjAqMWUzfSwuLi5Pc30sTD0xNDYwOTcvNDAwLENlPTE0NjA5Ny80ODAwLFhjPXt5ZWFyczp7cXVhcnRlcnM6NCxtb250aHM6MTIsd2Vla3M6TC83LGRheXM6TCxob3VyczpMKjI0LG1pbnV0ZXM6TCoyNCo2MCxzZWNvbmRzOkwqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzfSxxdWFydGVyczp7bW9udGhzOjMsd2Vla3M6TC8yOCxkYXlzOkwvNCxob3VyczpMKjI0LzQsbWludXRlczpMKjI0KjYwLzQsc2Vjb25kczpMKjI0KjYwKjYwLzQsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzLzR9LG1vbnRoczp7d2Vla3M6Q2UvNyxkYXlzOkNlLGhvdXJzOkNlKjI0LG1pbnV0ZXM6Q2UqMjQqNjAsc2Vjb25kczpDZSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6Q2UqMjQqNjAqNjAqMWUzfSwuLi5Pc30sZGU9WyJ5ZWFycyIsInF1YXJ0ZXJzIiwibW9udGhzIiwid2Vla3MiLCJkYXlzIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsIm1pbGxpc2Vjb25kcyJdLGVmPWRlLnNsaWNlKDApLnJldmVyc2UoKTtmdW5jdGlvbiBzZSh0LGUsbj0hMSl7Y29uc3Qgcj17dmFsdWVzOm4/ZS52YWx1ZXM6ey4uLnQudmFsdWVzLC4uLmUudmFsdWVzfHx7fX0sbG9jOnQubG9jLmNsb25lKGUubG9jKSxjb252ZXJzaW9uQWNjdXJhY3k6ZS5jb252ZXJzaW9uQWNjdXJhY3l8fHQuY29udmVyc2lvbkFjY3VyYWN5LG1hdHJpeDplLm1hdHJpeHx8dC5tYXRyaXh9O3JldHVybiBuZXcgdihyKX1mdW5jdGlvbiBUcyh0LGUpe2xldCBuPWUubWlsbGlzZWNvbmRzPz8wO2Zvcihjb25zdCByIG9mIGVmLnNsaWNlKDEpKWVbcl0mJihuKz1lW3JdKnRbcl0ubWlsbGlzZWNvbmRzKTtyZXR1cm4gbn1mdW5jdGlvbiBTcyh0LGUpe2NvbnN0IG49VHModCxlKTwwPy0xOjE7ZGUucmVkdWNlUmlnaHQoKHIscyk9PntpZihnKGVbc10pKXJldHVybiByO2lmKHIpe2NvbnN0IGk9ZVtyXSpuLGE9dFtzXVtyXSxvPU1hdGguZmxvb3IoaS9hKTtlW3NdKz1vKm4sZVtyXS09byphKm59cmV0dXJuIHN9LG51bGwpLGRlLnJlZHVjZSgocixzKT0+e2lmKGcoZVtzXSkpcmV0dXJuIHI7aWYocil7Y29uc3QgaT1lW3JdJTE7ZVtyXS09aSxlW3NdKz1pKnRbcl1bc119cmV0dXJuIHN9LG51bGwpfWZ1bmN0aW9uIHRmKHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyh0KSlyIT09MCYmKGVbbl09cik7cmV0dXJuIGV9Y2xhc3Mgdntjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuY29udmVyc2lvbkFjY3VyYWN5PT09Imxvbmd0ZXJtInx8ITE7bGV0IHI9bj9YYzpLYztlLm1hdHJpeCYmKHI9ZS5tYXRyaXgpLHRoaXMudmFsdWVzPWUudmFsdWVzLHRoaXMubG9jPWUubG9jfHxULmNyZWF0ZSgpLHRoaXMuY29udmVyc2lvbkFjY3VyYWN5PW4/Imxvbmd0ZXJtIjoiY2FzdWFsIix0aGlzLmludmFsaWQ9ZS5pbnZhbGlkfHxudWxsLHRoaXMubWF0cml4PXIsdGhpcy5pc0x1eG9uRHVyYXRpb249ITB9c3RhdGljIGZyb21NaWxsaXMoZSxuKXtyZXR1cm4gdi5mcm9tT2JqZWN0KHttaWxsaXNlY29uZHM6ZX0sbil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtpZihlPT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IF8oYER1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290ICR7ZT09PW51bGw/Im51bGwiOnR5cGVvZiBlfWApO3JldHVybiBuZXcgdih7dmFsdWVzOkl0KGUsdi5ub3JtYWxpemVVbml0KSxsb2M6VC5mcm9tT2JqZWN0KG4pLGNvbnZlcnNpb25BY2N1cmFjeTpuLmNvbnZlcnNpb25BY2N1cmFjeSxtYXRyaXg6bi5tYXRyaXh9KX1zdGF0aWMgZnJvbUR1cmF0aW9uTGlrZShlKXtpZihjZShlKSlyZXR1cm4gdi5mcm9tTWlsbGlzKGUpO2lmKHYuaXNEdXJhdGlvbihlKSlyZXR1cm4gZTtpZih0eXBlb2YgZT09Im9iamVjdCIpcmV0dXJuIHYuZnJvbU9iamVjdChlKTt0aHJvdyBuZXcgXyhgVW5rbm93biBkdXJhdGlvbiBhcmd1bWVudCAke2V9IG9mIHR5cGUgJHt0eXBlb2YgZX1gKX1zdGF0aWMgZnJvbUlTTyhlLG4pe2NvbnN0W3JdPUhjKGUpO3JldHVybiByP3YuZnJvbU9iamVjdChyLG4pOnYuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGZyb21JU09UaW1lKGUsbil7Y29uc3Rbcl09WWMoZSk7cmV0dXJuIHI/di5mcm9tT2JqZWN0KHIsbik6di5pbnZhbGlkKCJ1bnBhcnNhYmxlIixgdGhlIGlucHV0ICIke2V9IiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKX1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IF8oIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIFo/ZTpuZXcgWihlLG4pO2lmKEkudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IHhsKHIpO3JldHVybiBuZXcgdih7aW52YWxpZDpyfSl9c3RhdGljIG5vcm1hbGl6ZVVuaXQoZSl7Y29uc3Qgbj17eWVhcjoieWVhcnMiLHllYXJzOiJ5ZWFycyIscXVhcnRlcjoicXVhcnRlcnMiLHF1YXJ0ZXJzOiJxdWFydGVycyIsbW9udGg6Im1vbnRocyIsbW9udGhzOiJtb250aHMiLHdlZWs6IndlZWtzIix3ZWVrczoid2Vla3MiLGRheToiZGF5cyIsZGF5czoiZGF5cyIsaG91cjoiaG91cnMiLGhvdXJzOiJob3VycyIsbWludXRlOiJtaW51dGVzIixtaW51dGVzOiJtaW51dGVzIixzZWNvbmQ6InNlY29uZHMiLHNlY29uZHM6InNlY29uZHMiLG1pbGxpc2Vjb25kOiJtaWxsaXNlY29uZHMiLG1pbGxpc2Vjb25kczoibWlsbGlzZWNvbmRzIn1bZSYmZS50b0xvd2VyQ2FzZSgpXTtpZighbil0aHJvdyBuZXcgaHIoZSk7cmV0dXJuIG59c3RhdGljIGlzRHVyYXRpb24oZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkR1cmF0aW9ufHwhMX1nZXQgbG9jYWxlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5sb2NhbGU6bnVsbH1nZXQgbnVtYmVyaW5nU3lzdGVtKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW06bnVsbH10b0Zvcm1hdChlLG49e30pe2NvbnN0IHI9ey4uLm4sZmxvb3I6bi5yb3VuZCE9PSExJiZuLmZsb29yIT09ITF9O3JldHVybiB0aGlzLmlzVmFsaWQ/eC5jcmVhdGUodGhpcy5sb2MscikuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsZSk6dnN9dG9IdW1hbihlPXt9KXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB2cztjb25zdCBuPWRlLm1hcChyPT57Y29uc3Qgcz10aGlzLnZhbHVlc1tyXTtyZXR1cm4gZyhzKT9udWxsOnRoaXMubG9jLm51bWJlckZvcm1hdHRlcih7c3R5bGU6InVuaXQiLHVuaXREaXNwbGF5OiJsb25nIiwuLi5lLHVuaXQ6ci5zbGljZSgwLC0xKX0pLmZvcm1hdChzKX0pLmZpbHRlcihyPT5yKTtyZXR1cm4gdGhpcy5sb2MubGlzdEZvcm1hdHRlcih7dHlwZToiY29uanVuY3Rpb24iLHN0eWxlOmUubGlzdFN0eWxlfHwibmFycm93IiwuLi5lfSkuZm9ybWF0KG4pfXRvT2JqZWN0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD97Li4udGhpcy52YWx1ZXN9Ont9fXRvSVNPKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtsZXQgZT0iUCI7cmV0dXJuIHRoaXMueWVhcnMhPT0wJiYoZSs9dGhpcy55ZWFycysiWSIpLCh0aGlzLm1vbnRocyE9PTB8fHRoaXMucXVhcnRlcnMhPT0wKSYmKGUrPXRoaXMubW9udGhzK3RoaXMucXVhcnRlcnMqMysiTSIpLHRoaXMud2Vla3MhPT0wJiYoZSs9dGhpcy53ZWVrcysiVyIpLHRoaXMuZGF5cyE9PTAmJihlKz10aGlzLmRheXMrIkQiKSwodGhpcy5ob3VycyE9PTB8fHRoaXMubWludXRlcyE9PTB8fHRoaXMuc2Vjb25kcyE9PTB8fHRoaXMubWlsbGlzZWNvbmRzIT09MCkmJihlKz0iVCIpLHRoaXMuaG91cnMhPT0wJiYoZSs9dGhpcy5ob3VycysiSCIpLHRoaXMubWludXRlcyE9PTAmJihlKz10aGlzLm1pbnV0ZXMrIk0iKSwodGhpcy5zZWNvbmRzIT09MHx8dGhpcy5taWxsaXNlY29uZHMhPT0wKSYmKGUrPWRuKHRoaXMuc2Vjb25kcyt0aGlzLm1pbGxpc2Vjb25kcy8xZTMsMykrIlMiKSxlPT09IlAiJiYoZSs9IlQwUyIpLGV9dG9JU09UaW1lKGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3Qgbj10aGlzLnRvTWlsbGlzKCk7cmV0dXJuIG48MHx8bj49ODY0ZTU/bnVsbDooZT17c3VwcHJlc3NNaWxsaXNlY29uZHM6ITEsc3VwcHJlc3NTZWNvbmRzOiExLGluY2x1ZGVQcmVmaXg6ITEsZm9ybWF0OiJleHRlbmRlZCIsLi4uZSxpbmNsdWRlT2Zmc2V0OiExfSxwLmZyb21NaWxsaXMobix7em9uZToiVVRDIn0pLnRvSVNPVGltZShlKSl9dG9KU09OKCl7cmV0dXJuIHRoaXMudG9JU08oKX10b1N0cmluZygpe3JldHVybiB0aGlzLnRvSVNPKCl9W1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gRHVyYXRpb24geyB2YWx1ZXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZXMpfSB9YDpgRHVyYXRpb24geyBJbnZhbGlkLCByZWFzb246ICR7dGhpcy5pbnZhbGlkUmVhc29ufSB9YH10b01pbGxpcygpe3JldHVybiB0aGlzLmlzVmFsaWQ/VHModGhpcy5tYXRyaXgsdGhpcy52YWx1ZXMpOk5hTn12YWx1ZU9mKCl7cmV0dXJuIHRoaXMudG9NaWxsaXMoKX1wbHVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj12LmZyb21EdXJhdGlvbkxpa2UoZSkscj17fTtmb3IoY29uc3QgcyBvZiBkZSkoYmUobi52YWx1ZXMscyl8fGJlKHRoaXMudmFsdWVzLHMpKSYmKHJbc109bi5nZXQocykrdGhpcy5nZXQocykpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6cn0sITApfW1pbnVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj12LmZyb21EdXJhdGlvbkxpa2UoZSk7cmV0dXJuIHRoaXMucGx1cyhuLm5lZ2F0ZSgpKX1tYXBVbml0cyhlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49e307Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmtleXModGhpcy52YWx1ZXMpKW5bcl09cnMoZSh0aGlzLnZhbHVlc1tyXSxyKSk7cmV0dXJuIHNlKHRoaXMse3ZhbHVlczpufSwhMCl9Z2V0KGUpe3JldHVybiB0aGlzW3Yubm9ybWFsaXplVW5pdChlKV19c2V0KGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj17Li4udGhpcy52YWx1ZXMsLi4uSXQoZSx2Lm5vcm1hbGl6ZVVuaXQpfTtyZXR1cm4gc2UodGhpcyx7dmFsdWVzOm59KX1yZWNvbmZpZ3VyZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sY29udmVyc2lvbkFjY3VyYWN5OnIsbWF0cml4OnN9PXt9KXtjb25zdCBhPXtsb2M6dGhpcy5sb2MuY2xvbmUoe2xvY2FsZTplLG51bWJlcmluZ1N5c3RlbTpufSksbWF0cml4OnMsY29udmVyc2lvbkFjY3VyYWN5OnJ9O3JldHVybiBzZSh0aGlzLGEpfWFzKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKGUpLmdldChlKTpOYU59bm9ybWFsaXplKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPXRoaXMudG9PYmplY3QoKTtyZXR1cm4gU3ModGhpcy5tYXRyaXgsZSksc2UodGhpcyx7dmFsdWVzOmV9LCEwKX1yZXNjYWxlKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPXRmKHRoaXMubm9ybWFsaXplKCkuc2hpZnRUb0FsbCgpLnRvT2JqZWN0KCkpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6ZX0sITApfXNoaWZ0VG8oLi4uZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztpZihlLmxlbmd0aD09PTApcmV0dXJuIHRoaXM7ZT1lLm1hcChhPT52Lm5vcm1hbGl6ZVVuaXQoYSkpO2NvbnN0IG49e30scj17fSxzPXRoaXMudG9PYmplY3QoKTtsZXQgaTtmb3IoY29uc3QgYSBvZiBkZSlpZihlLmluZGV4T2YoYSk+PTApe2k9YTtsZXQgbz0wO2Zvcihjb25zdCBsIGluIHIpbys9dGhpcy5tYXRyaXhbbF1bYV0qcltsXSxyW2xdPTA7Y2Uoc1thXSkmJihvKz1zW2FdKTtjb25zdCB1PU1hdGgudHJ1bmMobyk7blthXT11LHJbYV09KG8qMWUzLXUqMWUzKS8xZTN9ZWxzZSBjZShzW2FdKSYmKHJbYV09c1thXSk7Zm9yKGNvbnN0IGEgaW4gcilyW2FdIT09MCYmKG5baV0rPWE9PT1pP3JbYV06clthXS90aGlzLm1hdHJpeFtpXVthXSk7cmV0dXJuIFNzKHRoaXMubWF0cml4LG4pLHNlKHRoaXMse3ZhbHVlczpufSwhMCl9c2hpZnRUb0FsbCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKCJ5ZWFycyIsIm1vbnRocyIsIndlZWtzIiwiZGF5cyIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiKTp0aGlzfW5lZ2F0ZSgpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3QgZT17fTtmb3IoY29uc3QgbiBvZiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykpZVtuXT10aGlzLnZhbHVlc1tuXT09PTA/MDotdGhpcy52YWx1ZXNbbl07cmV0dXJuIHNlKHRoaXMse3ZhbHVlczplfSwhMCl9Z2V0IHllYXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy55ZWFyc3x8MDpOYU59Z2V0IHF1YXJ0ZXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5xdWFydGVyc3x8MDpOYU59Z2V0IG1vbnRocygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMubW9udGhzfHwwOk5hTn1nZXQgd2Vla3MoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLndlZWtzfHwwOk5hTn1nZXQgZGF5cygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMuZGF5c3x8MDpOYU59Z2V0IGhvdXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5ob3Vyc3x8MDpOYU59Z2V0IG1pbnV0ZXMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLm1pbnV0ZXN8fDA6TmFOfWdldCBzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5zZWNvbmRzfHwwOk5hTn1nZXQgbWlsbGlzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5taWxsaXNlY29uZHN8fDA6TmFOfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZD09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1lcXVhbHMoZSl7aWYoIXRoaXMuaXNWYWxpZHx8IWUuaXNWYWxpZHx8IXRoaXMubG9jLmVxdWFscyhlLmxvYykpcmV0dXJuITE7ZnVuY3Rpb24gbihyLHMpe3JldHVybiByPT09dm9pZCAwfHxyPT09MD9zPT09dm9pZCAwfHxzPT09MDpyPT09c31mb3IoY29uc3QgciBvZiBkZSlpZighbih0aGlzLnZhbHVlc1tyXSxlLnZhbHVlc1tyXSkpcmV0dXJuITE7cmV0dXJuITB9fWNvbnN0IERlPSJJbnZhbGlkIEludGVydmFsIjtmdW5jdGlvbiBuZih0LGUpe3JldHVybiF0fHwhdC5pc1ZhbGlkP2suaW52YWxpZCgibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0Iik6IWV8fCFlLmlzVmFsaWQ/ay5pbnZhbGlkKCJtaXNzaW5nIG9yIGludmFsaWQgZW5kIik6ZTx0P2suaW52YWxpZCgiZW5kIGJlZm9yZSBzdGFydCIsYFRoZSBlbmQgb2YgYW4gaW50ZXJ2YWwgbXVzdCBiZSBhZnRlciBpdHMgc3RhcnQsIGJ1dCB5b3UgaGFkIHN0YXJ0PSR7dC50b0lTTygpfSBhbmQgZW5kPSR7ZS50b0lTTygpfWApOm51bGx9Y2xhc3Mga3tjb25zdHJ1Y3RvcihlKXt0aGlzLnM9ZS5zdGFydCx0aGlzLmU9ZS5lbmQsdGhpcy5pbnZhbGlkPWUuaW52YWxpZHx8bnVsbCx0aGlzLmlzTHV4b25JbnRlcnZhbD0hMH1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IF8oIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgSW50ZXJ2YWwgaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIFo/ZTpuZXcgWihlLG4pO2lmKEkudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IE5sKHIpO3JldHVybiBuZXcgayh7aW52YWxpZDpyfSl9c3RhdGljIGZyb21EYXRlVGltZXMoZSxuKXtjb25zdCByPUplKGUpLHM9SmUobiksaT1uZihyLHMpO3JldHVybiBpPz9uZXcgayh7c3RhcnQ6cixlbmQ6c30pfXN0YXRpYyBhZnRlcihlLG4pe2NvbnN0IHI9di5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SmUoZSk7cmV0dXJuIGsuZnJvbURhdGVUaW1lcyhzLHMucGx1cyhyKSl9c3RhdGljIGJlZm9yZShlLG4pe2NvbnN0IHI9di5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SmUoZSk7cmV0dXJuIGsuZnJvbURhdGVUaW1lcyhzLm1pbnVzKHIpLHMpfXN0YXRpYyBmcm9tSVNPKGUsbil7Y29uc3RbcixzXT0oZXx8IiIpLnNwbGl0KCIvIiwyKTtpZihyJiZzKXtsZXQgaSxhO3RyeXtpPXAuZnJvbUlTTyhyLG4pLGE9aS5pc1ZhbGlkfWNhdGNoe2E9ITF9bGV0IG8sdTt0cnl7bz1wLmZyb21JU08ocyxuKSx1PW8uaXNWYWxpZH1jYXRjaHt1PSExfWlmKGEmJnUpcmV0dXJuIGsuZnJvbURhdGVUaW1lcyhpLG8pO2lmKGEpe2NvbnN0IGw9di5mcm9tSVNPKHMsbik7aWYobC5pc1ZhbGlkKXJldHVybiBrLmFmdGVyKGksbCl9ZWxzZSBpZih1KXtjb25zdCBsPXYuZnJvbUlTTyhyLG4pO2lmKGwuaXNWYWxpZClyZXR1cm4gay5iZWZvcmUobyxsKX19cmV0dXJuIGsuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGlzSW50ZXJ2YWwoZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkludGVydmFsfHwhMX1nZXQgc3RhcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczpudWxsfWdldCBlbmQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTpudWxsfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZFJlYXNvbj09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1sZW5ndGgoZT0ibWlsbGlzZWNvbmRzIil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnRvRHVyYXRpb24oZSkuZ2V0KGUpOk5hTn1jb3VudChlPSJtaWxsaXNlY29uZHMiLG4pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIE5hTjtjb25zdCByPXRoaXMuc3RhcnQuc3RhcnRPZihlLG4pO2xldCBzO3JldHVybiBuIT1udWxsJiZuLnVzZUxvY2FsZVdlZWtzP3M9dGhpcy5lbmQucmVjb25maWd1cmUoe2xvY2FsZTpyLmxvY2FsZX0pOnM9dGhpcy5lbmQscz1zLnN0YXJ0T2YoZSxuKSxNYXRoLmZsb29yKHMuZGlmZihyLGUpLmdldChlKSkrKHMudmFsdWVPZigpIT09dGhpcy5lbmQudmFsdWVPZigpKX1oYXNTYW1lKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5pc0VtcHR5KCl8fHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucyxlKTohMX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMucy52YWx1ZU9mKCk9PT10aGlzLmUudmFsdWVPZigpfWlzQWZ0ZXIoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM+ZTohMX1pc0JlZm9yZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTw9ZTohMX1jb250YWlucyhlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczw9ZSYmdGhpcy5lPmU6ITF9c2V0KHtzdGFydDplLGVuZDpufT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9rLmZyb21EYXRlVGltZXMoZXx8dGhpcy5zLG58fHRoaXMuZSk6dGhpc31zcGxpdEF0KC4uLmUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuW107Y29uc3Qgbj1lLm1hcChKZSkuZmlsdGVyKGE9PnRoaXMuY29udGFpbnMoYSkpLnNvcnQoKGEsbyk9PmEudG9NaWxsaXMoKS1vLnRvTWlsbGlzKCkpLHI9W107bGV0e3N9PXRoaXMsaT0wO2Zvcig7czx0aGlzLmU7KXtjb25zdCBhPW5baV18fHRoaXMuZSxvPSthPit0aGlzLmU/dGhpcy5lOmE7ci5wdXNoKGsuZnJvbURhdGVUaW1lcyhzLG8pKSxzPW8saSs9MX1yZXR1cm4gcn1zcGxpdEJ5KGUpe2NvbnN0IG49di5mcm9tRHVyYXRpb25MaWtlKGUpO2lmKCF0aGlzLmlzVmFsaWR8fCFuLmlzVmFsaWR8fG4uYXMoIm1pbGxpc2Vjb25kcyIpPT09MClyZXR1cm5bXTtsZXR7czpyfT10aGlzLHM9MSxpO2NvbnN0IGE9W107Zm9yKDtyPHRoaXMuZTspe2NvbnN0IG89dGhpcy5zdGFydC5wbHVzKG4ubWFwVW5pdHModT0+dSpzKSk7aT0rbz4rdGhpcy5lP3RoaXMuZTpvLGEucHVzaChrLmZyb21EYXRlVGltZXMocixpKSkscj1pLHMrPTF9cmV0dXJuIGF9ZGl2aWRlRXF1YWxseShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpL2UpLnNsaWNlKDAsZSk6W119b3ZlcmxhcHMoZSl7cmV0dXJuIHRoaXMuZT5lLnMmJnRoaXMuczxlLmV9YWJ1dHNTdGFydChlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkPyt0aGlzLmU9PStlLnM6ITF9YWJ1dHNFbmQoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD8rZS5lPT0rdGhpcy5zOiExfWVuZ3VsZnMoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM8PWUucyYmdGhpcy5lPj1lLmU6ITF9ZXF1YWxzKGUpe3JldHVybiF0aGlzLmlzVmFsaWR8fCFlLmlzVmFsaWQ/ITE6dGhpcy5zLmVxdWFscyhlLnMpJiZ0aGlzLmUuZXF1YWxzKGUuZSl9aW50ZXJzZWN0aW9uKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj10aGlzLnM+ZS5zP3RoaXMuczplLnMscj10aGlzLmU8ZS5lP3RoaXMuZTplLmU7cmV0dXJuIG4+PXI/bnVsbDprLmZyb21EYXRlVGltZXMobixyKX11bmlvbihlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49dGhpcy5zPGUucz90aGlzLnM6ZS5zLHI9dGhpcy5lPmUuZT90aGlzLmU6ZS5lO3JldHVybiBrLmZyb21EYXRlVGltZXMobixyKX1zdGF0aWMgbWVyZ2UoZSl7Y29uc3RbbixyXT1lLnNvcnQoKHMsaSk9PnMucy1pLnMpLnJlZHVjZSgoW3MsaV0sYSk9Pmk/aS5vdmVybGFwcyhhKXx8aS5hYnV0c1N0YXJ0KGEpP1tzLGkudW5pb24oYSldOltzLmNvbmNhdChbaV0pLGFdOltzLGFdLFtbXSxudWxsXSk7cmV0dXJuIHImJm4ucHVzaChyKSxufXN0YXRpYyB4b3IoZSl7bGV0IG49bnVsbCxyPTA7Y29uc3Qgcz1bXSxpPWUubWFwKHU9Plt7dGltZTp1LnMsdHlwZToicyJ9LHt0aW1lOnUuZSx0eXBlOiJlIn1dKSxhPUFycmF5LnByb3RvdHlwZS5jb25jYXQoLi4uaSksbz1hLnNvcnQoKHUsbCk9PnUudGltZS1sLnRpbWUpO2Zvcihjb25zdCB1IG9mIG8pcis9dS50eXBlPT09InMiPzE6LTEscj09PTE/bj11LnRpbWU6KG4mJituIT0rdS50aW1lJiZzLnB1c2goay5mcm9tRGF0ZVRpbWVzKG4sdS50aW1lKSksbj1udWxsKTtyZXR1cm4gay5tZXJnZShzKX1kaWZmZXJlbmNlKC4uLmUpe3JldHVybiBrLnhvcihbdGhpc10uY29uY2F0KGUpKS5tYXAobj0+dGhpcy5pbnRlcnNlY3Rpb24obikpLmZpbHRlcihuPT5uJiYhbi5pc0VtcHR5KCkpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gWyR7dGhpcy5zLnRvSVNPKCl9IOKAkyAke3RoaXMuZS50b0lTTygpfSlgOkRlfVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YEludGVydmFsIHsgc3RhcnQ6ICR7dGhpcy5zLnRvSVNPKCl9LCBlbmQ6ICR7dGhpcy5lLnRvSVNPKCl9IH1gOmBJbnRlcnZhbCB7IEludmFsaWQsIHJlYXNvbjogJHt0aGlzLmludmFsaWRSZWFzb259IH1gfXRvTG9jYWxlU3RyaW5nKGU9eXQsbj17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD94LmNyZWF0ZSh0aGlzLnMubG9jLmNsb25lKG4pLGUpLmZvcm1hdEludGVydmFsKHRoaXMpOkRlfXRvSVNPKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPKGUpfS8ke3RoaXMuZS50b0lTTyhlKX1gOkRlfXRvSVNPRGF0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPRGF0ZSgpfS8ke3RoaXMuZS50b0lTT0RhdGUoKX1gOkRlfXRvSVNPVGltZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0lTT1RpbWUoZSl9LyR7dGhpcy5lLnRvSVNPVGltZShlKX1gOkRlfXRvRm9ybWF0KGUse3NlcGFyYXRvcjpuPSIg4oCTICJ9PXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0Zvcm1hdChlKX0ke259JHt0aGlzLmUudG9Gb3JtYXQoZSl9YDpEZX10b0R1cmF0aW9uKGUsbil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmUuZGlmZih0aGlzLnMsZSxuKTp2LmludmFsaWQodGhpcy5pbnZhbGlkUmVhc29uKX1tYXBFbmRwb2ludHMoZSl7cmV0dXJuIGsuZnJvbURhdGVUaW1lcyhlKHRoaXMucyksZSh0aGlzLmUpKX19Y2xhc3MgTnR7c3RhdGljIGhhc0RTVChlPUkuZGVmYXVsdFpvbmUpe2NvbnN0IG49cC5ub3coKS5zZXRab25lKGUpLnNldCh7bW9udGg6MTJ9KTtyZXR1cm4hZS5pc1VuaXZlcnNhbCYmbi5vZmZzZXQhPT1uLnNldCh7bW9udGg6Nn0pLm9mZnNldH1zdGF0aWMgaXNWYWxpZElBTkFab25lKGUpe3JldHVybiBKLmlzVmFsaWRab25lKGUpfXN0YXRpYyBub3JtYWxpemVab25lKGUpe3JldHVybiBuZShlLEkuZGVmYXVsdFpvbmUpfXN0YXRpYyBnZXRTdGFydE9mV2Vlayh7bG9jYWxlOmU9bnVsbCxsb2NPYmo6bj1udWxsfT17fSl7cmV0dXJuKG58fFQuY3JlYXRlKGUpKS5nZXRTdGFydE9mV2VlaygpfXN0YXRpYyBnZXRNaW5pbXVtRGF5c0luRmlyc3RXZWVrKHtsb2NhbGU6ZT1udWxsLGxvY09iajpuPW51bGx9PXt9KXtyZXR1cm4obnx8VC5jcmVhdGUoZSkpLmdldE1pbkRheXNJbkZpcnN0V2VlaygpfXN0YXRpYyBnZXRXZWVrZW5kV2Vla2RheXMoe2xvY2FsZTplPW51bGwsbG9jT2JqOm49bnVsbH09e30pe3JldHVybihufHxULmNyZWF0ZShlKSkuZ2V0V2Vla2VuZERheXMoKS5zbGljZSgpfXN0YXRpYyBtb250aHMoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fFQuY3JlYXRlKG4scixpKSkubW9udGhzKGUpfXN0YXRpYyBtb250aHNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fFQuY3JlYXRlKG4scixpKSkubW9udGhzKGUsITApfXN0YXRpYyB3ZWVrZGF5cyhlPSJsb25nIix7bG9jYWxlOm49bnVsbCxudW1iZXJpbmdTeXN0ZW06cj1udWxsLGxvY09iajpzPW51bGx9PXt9KXtyZXR1cm4oc3x8VC5jcmVhdGUobixyLG51bGwpKS53ZWVrZGF5cyhlKX1zdGF0aWMgd2Vla2RheXNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsfT17fSl7cmV0dXJuKHN8fFQuY3JlYXRlKG4scixudWxsKSkud2Vla2RheXMoZSwhMCl9c3RhdGljIG1lcmlkaWVtcyh7bG9jYWxlOmU9bnVsbH09e30pe3JldHVybiBULmNyZWF0ZShlKS5tZXJpZGllbXMoKX1zdGF0aWMgZXJhcyhlPSJzaG9ydCIse2xvY2FsZTpuPW51bGx9PXt9KXtyZXR1cm4gVC5jcmVhdGUobixudWxsLCJncmVnb3J5IikuZXJhcyhlKX1zdGF0aWMgZmVhdHVyZXMoKXtyZXR1cm57cmVsYXRpdmU6S3IoKSxsb2NhbGVXZWVrOlhyKCl9fX1mdW5jdGlvbiBicyh0LGUpe2NvbnN0IG49cz0+cy50b1VUQygwLHtrZWVwTG9jYWxUaW1lOiEwfSkuc3RhcnRPZigiZGF5IikudmFsdWVPZigpLHI9bihlKS1uKHQpO3JldHVybiBNYXRoLmZsb29yKHYuZnJvbU1pbGxpcyhyKS5hcygiZGF5cyIpKX1mdW5jdGlvbiByZih0LGUsbil7Y29uc3Qgcj1bWyJ5ZWFycyIsKHUsbCk9PmwueWVhci11LnllYXJdLFsicXVhcnRlcnMiLCh1LGwpPT5sLnF1YXJ0ZXItdS5xdWFydGVyKyhsLnllYXItdS55ZWFyKSo0XSxbIm1vbnRocyIsKHUsbCk9PmwubW9udGgtdS5tb250aCsobC55ZWFyLXUueWVhcikqMTJdLFsid2Vla3MiLCh1LGwpPT57Y29uc3QgYz1icyh1LGwpO3JldHVybihjLWMlNykvN31dLFsiZGF5cyIsYnNdXSxzPXt9LGk9dDtsZXQgYSxvO2Zvcihjb25zdFt1LGxdb2YgciluLmluZGV4T2YodSk+PTAmJihhPXUsc1t1XT1sKHQsZSksbz1pLnBsdXMocyksbz5lPyhzW3VdLS0sdD1pLnBsdXMocyksdD5lJiYobz10LHNbdV0tLSx0PWkucGx1cyhzKSkpOnQ9byk7cmV0dXJuW3QscyxvLGFdfWZ1bmN0aW9uIHNmKHQsZSxuLHIpe2xldFtzLGksYSxvXT1yZih0LGUsbik7Y29uc3QgdT1lLXMsbD1uLmZpbHRlcihkPT5bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiXS5pbmRleE9mKGQpPj0wKTtsLmxlbmd0aD09PTAmJihhPGUmJihhPXMucGx1cyh7W29dOjF9KSksYSE9PXMmJihpW29dPShpW29dfHwwKSt1LyhhLXMpKSk7Y29uc3QgYz12LmZyb21PYmplY3QoaSxyKTtyZXR1cm4gbC5sZW5ndGg+MD92LmZyb21NaWxsaXModSxyKS5zaGlmdFRvKC4uLmwpLnBsdXMoYyk6Y31jb25zdCBwbj17YXJhYjoiW9mgLdmpXSIsYXJhYmV4dDoiW9uwLdu5XSIsYmFsaToiW+GtkC3hrZldIixiZW5nOiJb4KemLeCnr10iLGRldmE6IlvgpaYt4KWvXSIsZnVsbHdpZGU6IlvvvJAt77yZXSIsZ3VqcjoiW+Crpi3gq69dIixoYW5pZGVjOiJb44CHfOS4gHzkuox85LiJfOWbm3zkupR85YWtfOS4g3zlhat85LmdXSIsa2htcjoiW+GfoC3hn6ldIixrbmRhOiJb4LOmLeCzr10iLGxhb286Ilvgu5At4LuZXSIsbGltYjoiW+Glhi3hpY9dIixtbHltOiJb4LWmLeC1r10iLG1vbmc6IlvhoJAt4aCZXSIsbXltcjoiW+GBgC3hgYldIixvcnlhOiJb4K2mLeCtr10iLHRhbWxkZWM6Ilvgr6Yt4K+vXSIsdGVsdToiW+Cxpi3gsa9dIix0aGFpOiJb4LmQLeC5mV0iLHRpYnQ6IlvgvKAt4LypXSIsbGF0bjoiXFxkIn0sa3M9e2FyYWI6WzE2MzIsMTY0MV0sYXJhYmV4dDpbMTc3NiwxNzg1XSxiYWxpOls2OTkyLDcwMDFdLGJlbmc6WzI1MzQsMjU0M10sZGV2YTpbMjQwNiwyNDE1XSxmdWxsd2lkZTpbNjUyOTYsNjUzMDNdLGd1anI6WzI3OTAsMjc5OV0sa2htcjpbNjExMiw2MTIxXSxrbmRhOlszMzAyLDMzMTFdLGxhb286WzM3OTIsMzgwMV0sbGltYjpbNjQ3MCw2NDc5XSxtbHltOlszNDMwLDM0MzldLG1vbmc6WzYxNjAsNjE2OV0sbXltcjpbNDE2MCw0MTY5XSxvcnlhOlsyOTE4LDI5MjddLHRhbWxkZWM6WzMwNDYsMzA1NV0sdGVsdTpbMzE3NCwzMTgzXSx0aGFpOlszNjY0LDM2NzNdLHRpYnQ6WzM4NzIsMzg4MV19LGFmPXBuLmhhbmlkZWMucmVwbGFjZSgvW1xbfFxdXS9nLCIiKS5zcGxpdCgiIik7ZnVuY3Rpb24gb2YodCl7bGV0IGU9cGFyc2VJbnQodCwxMCk7aWYoaXNOYU4oZSkpe2U9IiI7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dC5jaGFyQ29kZUF0KG4pO2lmKHRbbl0uc2VhcmNoKHBuLmhhbmlkZWMpIT09LTEpZSs9YWYuaW5kZXhPZih0W25dKTtlbHNlIGZvcihjb25zdCBzIGluIGtzKXtjb25zdFtpLGFdPWtzW3NdO3I+PWkmJnI8PWEmJihlKz1yLWkpfX1yZXR1cm4gcGFyc2VJbnQoZSwxMCl9ZWxzZSByZXR1cm4gZX1mdW5jdGlvbiBSKHtudW1iZXJpbmdTeXN0ZW06dH0sZT0iIil7cmV0dXJuIG5ldyBSZWdFeHAoYCR7cG5bdHx8ImxhdG4iXX0ke2V9YCl9Y29uc3QgdWY9Im1pc3NpbmcgSW50bC5EYXRlVGltZUZvcm1hdC5mb3JtYXRUb1BhcnRzIHN1cHBvcnQiO2Z1bmN0aW9uIE8odCxlPW49Pm4pe3JldHVybntyZWdleDp0LGRlc2VyOihbbl0pPT5lKG9mKG4pKX19Y29uc3QgSXM9IlsgwqBdIixFcz1uZXcgUmVnRXhwKElzLCJnIik7ZnVuY3Rpb24gbGYodCl7cmV0dXJuIHQucmVwbGFjZSgvXC4vZywiXFwuPyIpLnJlcGxhY2UoRXMsSXMpfWZ1bmN0aW9uIE5zKHQpe3JldHVybiB0LnJlcGxhY2UoL1wuL2csIiIpLnJlcGxhY2UoRXMsIiAiKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIFAodCxlKXtyZXR1cm4gdD09PW51bGw/bnVsbDp7cmVnZXg6UmVnRXhwKHQubWFwKGxmKS5qb2luKCJ8IikpLGRlc2VyOihbbl0pPT50LmZpbmRJbmRleChyPT5OcyhuKT09PU5zKHIpKStlfX1mdW5jdGlvbiB4cyh0LGUpe3JldHVybntyZWdleDp0LGRlc2VyOihbLG4scl0pPT5rdChuLHIpLGdyb3VwczplfX1mdW5jdGlvbiB4dCh0KXtyZXR1cm57cmVnZXg6dCxkZXNlcjooW2VdKT0+ZX19ZnVuY3Rpb24gY2YodCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfWZ1bmN0aW9uIGZmKHQsZSl7Y29uc3Qgbj1SKGUpLHI9UihlLCJ7Mn0iKSxzPVIoZSwiezN9IiksaT1SKGUsIns0fSIpLGE9UihlLCJ7Nn0iKSxvPVIoZSwiezEsMn0iKSx1PVIoZSwiezEsM30iKSxsPVIoZSwiezEsNn0iKSxjPVIoZSwiezEsOX0iKSxkPVIoZSwiezIsNH0iKSx5PVIoZSwiezQsNn0iKSxoPU09Pih7cmVnZXg6UmVnRXhwKGNmKE0udmFsKSksZGVzZXI6KFtxXSk9PnEsbGl0ZXJhbDohMH0pLGo9KE09PntpZih0LmxpdGVyYWwpcmV0dXJuIGgoTSk7c3dpdGNoKE0udmFsKXtjYXNlIkciOnJldHVybiBQKGUuZXJhcygic2hvcnQiKSwwKTtjYXNlIkdHIjpyZXR1cm4gUChlLmVyYXMoImxvbmciKSwwKTtjYXNlInkiOnJldHVybiBPKGwpO2Nhc2UieXkiOnJldHVybiBPKGQsaG4pO2Nhc2UieXl5eSI6cmV0dXJuIE8oaSk7Y2FzZSJ5eXl5eSI6cmV0dXJuIE8oeSk7Y2FzZSJ5eXl5eXkiOnJldHVybiBPKGEpO2Nhc2UiTSI6cmV0dXJuIE8obyk7Y2FzZSJNTSI6cmV0dXJuIE8ocik7Y2FzZSJNTU0iOnJldHVybiBQKGUubW9udGhzKCJzaG9ydCIsITApLDEpO2Nhc2UiTU1NTSI6cmV0dXJuIFAoZS5tb250aHMoImxvbmciLCEwKSwxKTtjYXNlIkwiOnJldHVybiBPKG8pO2Nhc2UiTEwiOnJldHVybiBPKHIpO2Nhc2UiTExMIjpyZXR1cm4gUChlLm1vbnRocygic2hvcnQiLCExKSwxKTtjYXNlIkxMTEwiOnJldHVybiBQKGUubW9udGhzKCJsb25nIiwhMSksMSk7Y2FzZSJkIjpyZXR1cm4gTyhvKTtjYXNlImRkIjpyZXR1cm4gTyhyKTtjYXNlIm8iOnJldHVybiBPKHUpO2Nhc2Uib29vIjpyZXR1cm4gTyhzKTtjYXNlIkhIIjpyZXR1cm4gTyhyKTtjYXNlIkgiOnJldHVybiBPKG8pO2Nhc2UiaGgiOnJldHVybiBPKHIpO2Nhc2UiaCI6cmV0dXJuIE8obyk7Y2FzZSJtbSI6cmV0dXJuIE8ocik7Y2FzZSJtIjpyZXR1cm4gTyhvKTtjYXNlInEiOnJldHVybiBPKG8pO2Nhc2UicXEiOnJldHVybiBPKHIpO2Nhc2UicyI6cmV0dXJuIE8obyk7Y2FzZSJzcyI6cmV0dXJuIE8ocik7Y2FzZSJTIjpyZXR1cm4gTyh1KTtjYXNlIlNTUyI6cmV0dXJuIE8ocyk7Y2FzZSJ1IjpyZXR1cm4geHQoYyk7Y2FzZSJ1dSI6cmV0dXJuIHh0KG8pO2Nhc2UidXV1IjpyZXR1cm4gTyhuKTtjYXNlImEiOnJldHVybiBQKGUubWVyaWRpZW1zKCksMCk7Y2FzZSJra2trIjpyZXR1cm4gTyhpKTtjYXNlImtrIjpyZXR1cm4gTyhkLGhuKTtjYXNlIlciOnJldHVybiBPKG8pO2Nhc2UiV1ciOnJldHVybiBPKHIpO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4gTyhuKTtjYXNlIkVFRSI6cmV0dXJuIFAoZS53ZWVrZGF5cygic2hvcnQiLCExKSwxKTtjYXNlIkVFRUUiOnJldHVybiBQKGUud2Vla2RheXMoImxvbmciLCExKSwxKTtjYXNlImNjYyI6cmV0dXJuIFAoZS53ZWVrZGF5cygic2hvcnQiLCEwKSwxKTtjYXNlImNjY2MiOnJldHVybiBQKGUud2Vla2RheXMoImxvbmciLCEwKSwxKTtjYXNlIloiOmNhc2UiWloiOnJldHVybiB4cyhuZXcgUmVnRXhwKGAoWystXSR7by5zb3VyY2V9KSg/OjooJHtyLnNvdXJjZX0pKT9gKSwyKTtjYXNlIlpaWiI6cmV0dXJuIHhzKG5ldyBSZWdFeHAoYChbKy1dJHtvLnNvdXJjZX0pKCR7ci5zb3VyY2V9KT9gKSwyKTtjYXNlInoiOnJldHVybiB4dCgvW2Etel8rLS9dezEsMjU2fT8vaSk7Y2FzZSIgIjpyZXR1cm4geHQoL1teXFNcblxyXS8pO2RlZmF1bHQ6cmV0dXJuIGgoTSl9fSkodCl8fHtpbnZhbGlkUmVhc29uOnVmfTtyZXR1cm4gai50b2tlbj10LGp9Y29uc3QgZGY9e3llYXI6eyIyLWRpZ2l0IjoieXkiLG51bWVyaWM6Inl5eXl5In0sbW9udGg6e251bWVyaWM6Ik0iLCIyLWRpZ2l0IjoiTU0iLHNob3J0OiJNTU0iLGxvbmc6Ik1NTU0ifSxkYXk6e251bWVyaWM6ImQiLCIyLWRpZ2l0IjoiZGQifSx3ZWVrZGF5OntzaG9ydDoiRUVFIixsb25nOiJFRUVFIn0sZGF5cGVyaW9kOiJhIixkYXlQZXJpb2Q6ImEiLGhvdXIxMjp7bnVtZXJpYzoiaCIsIjItZGlnaXQiOiJoaCJ9LGhvdXIyNDp7bnVtZXJpYzoiSCIsIjItZGlnaXQiOiJISCJ9LG1pbnV0ZTp7bnVtZXJpYzoibSIsIjItZGlnaXQiOiJtbSJ9LHNlY29uZDp7bnVtZXJpYzoicyIsIjItZGlnaXQiOiJzcyJ9LHRpbWVab25lTmFtZTp7bG9uZzoiWlpaWloiLHNob3J0OiJaWloifX07ZnVuY3Rpb24gaGYodCxlLG4pe2NvbnN0e3R5cGU6cix2YWx1ZTpzfT10O2lmKHI9PT0ibGl0ZXJhbCIpe2NvbnN0IHU9L15ccyskLy50ZXN0KHMpO3JldHVybntsaXRlcmFsOiF1LHZhbDp1PyIgIjpzfX1jb25zdCBpPWVbcl07bGV0IGE9cjtyPT09ImhvdXIiJiYoZS5ob3VyMTIhPW51bGw/YT1lLmhvdXIxMj8iaG91cjEyIjoiaG91cjI0IjplLmhvdXJDeWNsZSE9bnVsbD9lLmhvdXJDeWNsZT09PSJoMTEifHxlLmhvdXJDeWNsZT09PSJoMTIiP2E9ImhvdXIxMiI6YT0iaG91cjI0IjphPW4uaG91cjEyPyJob3VyMTIiOiJob3VyMjQiKTtsZXQgbz1kZlthXTtpZih0eXBlb2Ygbz09Im9iamVjdCImJihvPW9baV0pLG8pcmV0dXJue2xpdGVyYWw6ITEsdmFsOm99fWZ1bmN0aW9uIG1mKHQpe3JldHVybltgXiR7dC5tYXAobj0+bi5yZWdleCkucmVkdWNlKChuLHIpPT5gJHtufSgke3Iuc291cmNlfSlgLCIiKX0kYCx0XX1mdW5jdGlvbiB5Zih0LGUsbil7Y29uc3Qgcj10Lm1hdGNoKGUpO2lmKHIpe2NvbnN0IHM9e307bGV0IGk9MTtmb3IoY29uc3QgYSBpbiBuKWlmKGJlKG4sYSkpe2NvbnN0IG89blthXSx1PW8uZ3JvdXBzP28uZ3JvdXBzKzE6MTshby5saXRlcmFsJiZvLnRva2VuJiYoc1tvLnRva2VuLnZhbFswXV09by5kZXNlcihyLnNsaWNlKGksaSt1KSkpLGkrPXV9cmV0dXJuW3Isc119ZWxzZSByZXR1cm5bcix7fV19ZnVuY3Rpb24gZ2YodCl7Y29uc3QgZT1pPT57c3dpdGNoKGkpe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpjYXNlIkgiOnJldHVybiJob3VyIjtjYXNlImQiOnJldHVybiJkYXkiO2Nhc2UibyI6cmV0dXJuIm9yZGluYWwiO2Nhc2UiTCI6Y2FzZSJNIjpyZXR1cm4ibW9udGgiO2Nhc2UieSI6cmV0dXJuInllYXIiO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4id2Vla2RheSI7Y2FzZSJXIjpyZXR1cm4id2Vla051bWJlciI7Y2FzZSJrIjpyZXR1cm4id2Vla1llYXIiO2Nhc2UicSI6cmV0dXJuInF1YXJ0ZXIiO2RlZmF1bHQ6cmV0dXJuIG51bGx9fTtsZXQgbj1udWxsLHI7cmV0dXJuIGcodC56KXx8KG49Si5jcmVhdGUodC56KSksZyh0LlopfHwobnx8KG49bmV3IEQodC5aKSkscj10LlopLGcodC5xKXx8KHQuTT0odC5xLTEpKjMrMSksZyh0LmgpfHwodC5oPDEyJiZ0LmE9PT0xP3QuaCs9MTI6dC5oPT09MTImJnQuYT09PTAmJih0Lmg9MCkpLHQuRz09PTAmJnQueSYmKHQueT0tdC55KSxnKHQudSl8fCh0LlM9Zm4odC51KSksW09iamVjdC5rZXlzKHQpLnJlZHVjZSgoaSxhKT0+e2NvbnN0IG89ZShhKTtyZXR1cm4gbyYmKGlbb109dFthXSksaX0se30pLG4scl19bGV0IHduPW51bGw7ZnVuY3Rpb24gcGYoKXtyZXR1cm4gd258fCh3bj1wLmZyb21NaWxsaXMoMTU1NTU1NTU1NTU1NSkpLHdufWZ1bmN0aW9uIHdmKHQsZSl7aWYodC5saXRlcmFsKXJldHVybiB0O2NvbnN0IG49eC5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHQudmFsKSxyPURzKG4sZSk7cmV0dXJuIHI9PW51bGx8fHIuaW5jbHVkZXModm9pZCAwKT90OnJ9ZnVuY3Rpb24gTXModCxlKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi50Lm1hcChuPT53ZihuLGUpKSl9ZnVuY3Rpb24gQ3ModCxlLG4pe2NvbnN0IHI9TXMoeC5wYXJzZUZvcm1hdChuKSx0KSxzPXIubWFwKGE9PmZmKGEsdCkpLGk9cy5maW5kKGE9PmEuaW52YWxpZFJlYXNvbik7aWYoaSlyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixpbnZhbGlkUmVhc29uOmkuaW52YWxpZFJlYXNvbn07e2NvbnN0W2Esb109bWYocyksdT1SZWdFeHAoYSwiaSIpLFtsLGNdPXlmKGUsdSxvKSxbZCx5LGhdPWM/Z2YoYyk6W251bGwsbnVsbCx2b2lkIDBdO2lmKGJlKGMsImEiKSYmYmUoYywiSCIpKXRocm93IG5ldyBTZSgiQ2FuJ3QgaW5jbHVkZSBtZXJpZGllbSB3aGVuIHNwZWNpZnlpbmcgMjQtaG91ciBmb3JtYXQiKTtyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixyZWdleDp1LHJhd01hdGNoZXM6bCxtYXRjaGVzOmMscmVzdWx0OmQsem9uZTp5LHNwZWNpZmljT2Zmc2V0Omh9fX1mdW5jdGlvbiB2Zih0LGUsbil7Y29uc3R7cmVzdWx0OnIsem9uZTpzLHNwZWNpZmljT2Zmc2V0OmksaW52YWxpZFJlYXNvbjphfT1Dcyh0LGUsbik7cmV0dXJuW3IscyxpLGFdfWZ1bmN0aW9uIERzKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7Y29uc3Qgcj14LmNyZWF0ZShlLHQpLmR0Rm9ybWF0dGVyKHBmKCkpLHM9ci5mb3JtYXRUb1BhcnRzKCksaT1yLnJlc29sdmVkT3B0aW9ucygpO3JldHVybiBzLm1hcChhPT5oZihhLHQsaSkpfWNvbnN0IHZuPSJJbnZhbGlkIERhdGVUaW1lIixfcz04NjRlMTM7ZnVuY3Rpb24gTXQodCl7cmV0dXJuIG5ldyBaKCJ1bnN1cHBvcnRlZCB6b25lIixgdGhlIHpvbmUgIiR7dC5uYW1lfSIgaXMgbm90IHN1cHBvcnRlZGApfWZ1bmN0aW9uIE9uKHQpe3JldHVybiB0LndlZWtEYXRhPT09bnVsbCYmKHQud2Vla0RhdGE9T3QodC5jKSksdC53ZWVrRGF0YX1mdW5jdGlvbiBUbih0KXtyZXR1cm4gdC5sb2NhbFdlZWtEYXRhPT09bnVsbCYmKHQubG9jYWxXZWVrRGF0YT1PdCh0LmMsdC5sb2MuZ2V0TWluRGF5c0luRmlyc3RXZWVrKCksdC5sb2MuZ2V0U3RhcnRPZldlZWsoKSkpLHQubG9jYWxXZWVrRGF0YX1mdW5jdGlvbiBoZSh0LGUpe2NvbnN0IG49e3RzOnQudHMsem9uZTp0LnpvbmUsYzp0LmMsbzp0Lm8sbG9jOnQubG9jLGludmFsaWQ6dC5pbnZhbGlkfTtyZXR1cm4gbmV3IHAoey4uLm4sLi4uZSxvbGQ6bn0pfWZ1bmN0aW9uIEZzKHQsZSxuKXtsZXQgcj10LWUqNjAqMWUzO2NvbnN0IHM9bi5vZmZzZXQocik7aWYoZT09PXMpcmV0dXJuW3IsZV07ci09KHMtZSkqNjAqMWUzO2NvbnN0IGk9bi5vZmZzZXQocik7cmV0dXJuIHM9PT1pP1tyLHNdOlt0LU1hdGgubWluKHMsaSkqNjAqMWUzLE1hdGgubWF4KHMsaSldfWZ1bmN0aW9uIEN0KHQsZSl7dCs9ZSo2MCoxZTM7Y29uc3Qgbj1uZXcgRGF0ZSh0KTtyZXR1cm57eWVhcjpuLmdldFVUQ0Z1bGxZZWFyKCksbW9udGg6bi5nZXRVVENNb250aCgpKzEsZGF5Om4uZ2V0VVRDRGF0ZSgpLGhvdXI6bi5nZXRVVENIb3VycygpLG1pbnV0ZTpuLmdldFVUQ01pbnV0ZXMoKSxzZWNvbmQ6bi5nZXRVVENTZWNvbmRzKCksbWlsbGlzZWNvbmQ6bi5nZXRVVENNaWxsaXNlY29uZHMoKX19ZnVuY3Rpb24gRHQodCxlLG4pe3JldHVybiBGcyhidCh0KSxlLG4pfWZ1bmN0aW9uIEFzKHQsZSl7Y29uc3Qgbj10Lm8scj10LmMueWVhcitNYXRoLnRydW5jKGUueWVhcnMpLHM9dC5jLm1vbnRoK01hdGgudHJ1bmMoZS5tb250aHMpK01hdGgudHJ1bmMoZS5xdWFydGVycykqMyxpPXsuLi50LmMseWVhcjpyLG1vbnRoOnMsZGF5Ok1hdGgubWluKHQuYy5kYXksU3QocixzKSkrTWF0aC50cnVuYyhlLmRheXMpK01hdGgudHJ1bmMoZS53ZWVrcykqN30sYT12LmZyb21PYmplY3Qoe3llYXJzOmUueWVhcnMtTWF0aC50cnVuYyhlLnllYXJzKSxxdWFydGVyczplLnF1YXJ0ZXJzLU1hdGgudHJ1bmMoZS5xdWFydGVycyksbW9udGhzOmUubW9udGhzLU1hdGgudHJ1bmMoZS5tb250aHMpLHdlZWtzOmUud2Vla3MtTWF0aC50cnVuYyhlLndlZWtzKSxkYXlzOmUuZGF5cy1NYXRoLnRydW5jKGUuZGF5cyksaG91cnM6ZS5ob3VycyxtaW51dGVzOmUubWludXRlcyxzZWNvbmRzOmUuc2Vjb25kcyxtaWxsaXNlY29uZHM6ZS5taWxsaXNlY29uZHN9KS5hcygibWlsbGlzZWNvbmRzIiksbz1idChpKTtsZXRbdSxsXT1GcyhvLG4sdC56b25lKTtyZXR1cm4gYSE9PTAmJih1Kz1hLGw9dC56b25lLm9mZnNldCh1KSkse3RzOnUsbzpsfX1mdW5jdGlvbiBHZSh0LGUsbixyLHMsaSl7Y29uc3R7c2V0Wm9uZTphLHpvbmU6b309bjtpZih0JiZPYmplY3Qua2V5cyh0KS5sZW5ndGghPT0wfHxlKXtjb25zdCB1PWV8fG8sbD1wLmZyb21PYmplY3QodCx7Li4ubix6b25lOnUsc3BlY2lmaWNPZmZzZXQ6aX0pO3JldHVybiBhP2w6bC5zZXRab25lKG8pfWVsc2UgcmV0dXJuIHAuaW52YWxpZChuZXcgWigidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtzfSIgY2FuJ3QgYmUgcGFyc2VkIGFzICR7cn1gKSl9ZnVuY3Rpb24gX3QodCxlLG49ITApe3JldHVybiB0LmlzVmFsaWQ/eC5jcmVhdGUoVC5jcmVhdGUoImVuLVVTIikse2FsbG93WjpuLGZvcmNlU2ltcGxlOiEwfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHQsZSk6bnVsbH1mdW5jdGlvbiBTbih0LGUpe2NvbnN0IG49dC5jLnllYXI+OTk5OXx8dC5jLnllYXI8MDtsZXQgcj0iIjtyZXR1cm4gbiYmdC5jLnllYXI+PTAmJihyKz0iKyIpLHIrPUUodC5jLnllYXIsbj82OjQpLGU/KHIrPSItIixyKz1FKHQuYy5tb250aCkscis9Ii0iLHIrPUUodC5jLmRheSkpOihyKz1FKHQuYy5tb250aCkscis9RSh0LmMuZGF5KSkscn1mdW5jdGlvbiBWcyh0LGUsbixyLHMsaSl7bGV0IGE9RSh0LmMuaG91cik7cmV0dXJuIGU/KGErPSI6IixhKz1FKHQuYy5taW51dGUpLCh0LmMubWlsbGlzZWNvbmQhPT0wfHx0LmMuc2Vjb25kIT09MHx8IW4pJiYoYSs9IjoiKSk6YSs9RSh0LmMubWludXRlKSwodC5jLm1pbGxpc2Vjb25kIT09MHx8dC5jLnNlY29uZCE9PTB8fCFuKSYmKGErPUUodC5jLnNlY29uZCksKHQuYy5taWxsaXNlY29uZCE9PTB8fCFyKSYmKGErPSIuIixhKz1FKHQuYy5taWxsaXNlY29uZCwzKSkpLHMmJih0LmlzT2Zmc2V0Rml4ZWQmJnQub2Zmc2V0PT09MCYmIWk/YSs9IloiOnQubzwwPyhhKz0iLSIsYSs9RShNYXRoLnRydW5jKC10Lm8vNjApKSxhKz0iOiIsYSs9RShNYXRoLnRydW5jKC10Lm8lNjApKSk6KGErPSIrIixhKz1FKE1hdGgudHJ1bmModC5vLzYwKSksYSs9IjoiLGErPUUoTWF0aC50cnVuYyh0Lm8lNjApKSkpLGkmJihhKz0iWyIrdC56b25lLmlhbmFOYW1lKyJdIiksYX1jb25zdCBXcz17bW9udGg6MSxkYXk6MSxob3VyOjAsbWludXRlOjAsc2Vjb25kOjAsbWlsbGlzZWNvbmQ6MH0sT2Y9e3dlZWtOdW1iZXI6MSx3ZWVrZGF5OjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LFRmPXtvcmRpbmFsOjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LCRzPVsieWVhciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sU2Y9WyJ3ZWVrWWVhciIsIndlZWtOdW1iZXIiLCJ3ZWVrZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sYmY9WyJ5ZWFyIiwib3JkaW5hbCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdO2Z1bmN0aW9uIGtmKHQpe2NvbnN0IGU9e3llYXI6InllYXIiLHllYXJzOiJ5ZWFyIixtb250aDoibW9udGgiLG1vbnRoczoibW9udGgiLGRheToiZGF5IixkYXlzOiJkYXkiLGhvdXI6ImhvdXIiLGhvdXJzOiJob3VyIixtaW51dGU6Im1pbnV0ZSIsbWludXRlczoibWludXRlIixxdWFydGVyOiJxdWFydGVyIixxdWFydGVyczoicXVhcnRlciIsc2Vjb25kOiJzZWNvbmQiLHNlY29uZHM6InNlY29uZCIsbWlsbGlzZWNvbmQ6Im1pbGxpc2Vjb25kIixtaWxsaXNlY29uZHM6Im1pbGxpc2Vjb25kIix3ZWVrZGF5OiJ3ZWVrZGF5Iix3ZWVrZGF5czoid2Vla2RheSIsd2Vla251bWJlcjoid2Vla051bWJlciIsd2Vla3NudW1iZXI6IndlZWtOdW1iZXIiLHdlZWtudW1iZXJzOiJ3ZWVrTnVtYmVyIix3ZWVreWVhcjoid2Vla1llYXIiLHdlZWt5ZWFyczoid2Vla1llYXIiLG9yZGluYWw6Im9yZGluYWwifVt0LnRvTG93ZXJDYXNlKCldO2lmKCFlKXRocm93IG5ldyBocih0KTtyZXR1cm4gZX1mdW5jdGlvbiBMcyh0KXtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlImxvY2Fsd2Vla2RheSI6Y2FzZSJsb2NhbHdlZWtkYXlzIjpyZXR1cm4ibG9jYWxXZWVrZGF5IjtjYXNlImxvY2Fsd2Vla251bWJlciI6Y2FzZSJsb2NhbHdlZWtudW1iZXJzIjpyZXR1cm4ibG9jYWxXZWVrTnVtYmVyIjtjYXNlImxvY2Fsd2Vla3llYXIiOmNhc2UibG9jYWx3ZWVreWVhcnMiOnJldHVybiJsb2NhbFdlZWtZZWFyIjtkZWZhdWx0OnJldHVybiBrZih0KX19ZnVuY3Rpb24genModCxlKXtjb25zdCBuPW5lKGUuem9uZSxJLmRlZmF1bHRab25lKSxyPVQuZnJvbU9iamVjdChlKSxzPUkubm93KCk7bGV0IGksYTtpZihnKHQueWVhcikpaT1zO2Vsc2V7Zm9yKGNvbnN0IGwgb2YgJHMpZyh0W2xdKSYmKHRbbF09V3NbbF0pO2NvbnN0IG89QnIodCl8fFFyKHQpO2lmKG8pcmV0dXJuIHAuaW52YWxpZChvKTtjb25zdCB1PW4ub2Zmc2V0KHMpO1tpLGFdPUR0KHQsdSxuKX1yZXR1cm4gbmV3IHAoe3RzOmksem9uZTpuLGxvYzpyLG86YX0pfWZ1bmN0aW9uIFpzKHQsZSxuKXtjb25zdCByPWcobi5yb3VuZCk/ITA6bi5yb3VuZCxzPShhLG8pPT4oYT1kbihhLHJ8fG4uY2FsZW5kYXJ5PzA6MiwhMCksZS5sb2MuY2xvbmUobikucmVsRm9ybWF0dGVyKG4pLmZvcm1hdChhLG8pKSxpPWE9Pm4uY2FsZW5kYXJ5P2UuaGFzU2FtZSh0LGEpPzA6ZS5zdGFydE9mKGEpLmRpZmYodC5zdGFydE9mKGEpLGEpLmdldChhKTplLmRpZmYodCxhKS5nZXQoYSk7aWYobi51bml0KXJldHVybiBzKGkobi51bml0KSxuLnVuaXQpO2Zvcihjb25zdCBhIG9mIG4udW5pdHMpe2NvbnN0IG89aShhKTtpZihNYXRoLmFicyhvKT49MSlyZXR1cm4gcyhvLGEpfXJldHVybiBzKHQ+ZT8tMDowLG4udW5pdHNbbi51bml0cy5sZW5ndGgtMV0pfWZ1bmN0aW9uIFJzKHQpe2xldCBlPXt9LG47cmV0dXJuIHQubGVuZ3RoPjAmJnR5cGVvZiB0W3QubGVuZ3RoLTFdPT0ib2JqZWN0Ij8oZT10W3QubGVuZ3RoLTFdLG49QXJyYXkuZnJvbSh0KS5zbGljZSgwLHQubGVuZ3RoLTEpKTpuPUFycmF5LmZyb20odCksW2Usbl19Y2xhc3MgcHtjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuem9uZXx8SS5kZWZhdWx0Wm9uZTtsZXQgcj1lLmludmFsaWR8fChOdW1iZXIuaXNOYU4oZS50cyk/bmV3IFooImludmFsaWQgaW5wdXQiKTpudWxsKXx8KG4uaXNWYWxpZD9udWxsOk10KG4pKTt0aGlzLnRzPWcoZS50cyk/SS5ub3coKTplLnRzO2xldCBzPW51bGwsaT1udWxsO2lmKCFyKWlmKGUub2xkJiZlLm9sZC50cz09PXRoaXMudHMmJmUub2xkLnpvbmUuZXF1YWxzKG4pKVtzLGldPVtlLm9sZC5jLGUub2xkLm9dO2Vsc2V7Y29uc3Qgbz1uLm9mZnNldCh0aGlzLnRzKTtzPUN0KHRoaXMudHMsbykscj1OdW1iZXIuaXNOYU4ocy55ZWFyKT9uZXcgWigiaW52YWxpZCBpbnB1dCIpOm51bGwscz1yP251bGw6cyxpPXI/bnVsbDpvfXRoaXMuX3pvbmU9bix0aGlzLmxvYz1lLmxvY3x8VC5jcmVhdGUoKSx0aGlzLmludmFsaWQ9cix0aGlzLndlZWtEYXRhPW51bGwsdGhpcy5sb2NhbFdlZWtEYXRhPW51bGwsdGhpcy5jPXMsdGhpcy5vPWksdGhpcy5pc0x1eG9uRGF0ZVRpbWU9ITB9c3RhdGljIG5vdygpe3JldHVybiBuZXcgcCh7fSl9c3RhdGljIGxvY2FsKCl7Y29uc3RbZSxuXT1Scyhhcmd1bWVudHMpLFtyLHMsaSxhLG8sdSxsXT1uO3JldHVybiB6cyh7eWVhcjpyLG1vbnRoOnMsZGF5OmksaG91cjphLG1pbnV0ZTpvLHNlY29uZDp1LG1pbGxpc2Vjb25kOmx9LGUpfXN0YXRpYyB1dGMoKXtjb25zdFtlLG5dPVJzKGFyZ3VtZW50cyksW3IscyxpLGEsbyx1LGxdPW47cmV0dXJuIGUuem9uZT1ELnV0Y0luc3RhbmNlLHpzKHt5ZWFyOnIsbW9udGg6cyxkYXk6aSxob3VyOmEsbWludXRlOm8sc2Vjb25kOnUsbWlsbGlzZWNvbmQ6bH0sZSl9c3RhdGljIGZyb21KU0RhdGUoZSxuPXt9KXtjb25zdCByPVhsKGUpP2UudmFsdWVPZigpOk5hTjtpZihOdW1iZXIuaXNOYU4ocikpcmV0dXJuIHAuaW52YWxpZCgiaW52YWxpZCBpbnB1dCIpO2NvbnN0IHM9bmUobi56b25lLEkuZGVmYXVsdFpvbmUpO3JldHVybiBzLmlzVmFsaWQ/bmV3IHAoe3RzOnIsem9uZTpzLGxvYzpULmZyb21PYmplY3Qobil9KTpwLmludmFsaWQoTXQocykpfXN0YXRpYyBmcm9tTWlsbGlzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIGU8LV9zfHxlPl9zP3AuaW52YWxpZCgiVGltZXN0YW1wIG91dCBvZiByYW5nZSIpOm5ldyBwKHt0czplLHpvbmU6bmUobi56b25lLEkuZGVmYXVsdFpvbmUpLGxvYzpULmZyb21PYmplY3Qobil9KTt0aHJvdyBuZXcgXyhgZnJvbU1pbGxpcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dCwgYnV0IHJlY2VpdmVkIGEgJHt0eXBlb2YgZX0gd2l0aCB2YWx1ZSAke2V9YCl9c3RhdGljIGZyb21TZWNvbmRzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIG5ldyBwKHt0czplKjFlMyx6b25lOm5lKG4uem9uZSxJLmRlZmF1bHRab25lKSxsb2M6VC5mcm9tT2JqZWN0KG4pfSk7dGhyb3cgbmV3IF8oImZyb21TZWNvbmRzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0Iil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtlPWV8fHt9O2NvbnN0IHI9bmUobi56b25lLEkuZGVmYXVsdFpvbmUpO2lmKCFyLmlzVmFsaWQpcmV0dXJuIHAuaW52YWxpZChNdChyKSk7Y29uc3Qgcz1ULmZyb21PYmplY3QobiksaT1JdChlLExzKSx7bWluRGF5c0luRmlyc3RXZWVrOmEsc3RhcnRPZldlZWs6b309SnIoaSxzKSx1PUkubm93KCksbD1nKG4uc3BlY2lmaWNPZmZzZXQpP3Iub2Zmc2V0KHUpOm4uc3BlY2lmaWNPZmZzZXQsYz0hZyhpLm9yZGluYWwpLGQ9IWcoaS55ZWFyKSx5PSFnKGkubW9udGgpfHwhZyhpLmRheSksaD1kfHx5LFM9aS53ZWVrWWVhcnx8aS53ZWVrTnVtYmVyO2lmKChofHxjKSYmUyl0aHJvdyBuZXcgU2UoIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHMiKTtpZih5JiZjKXRocm93IG5ldyBTZSgiQ2FuJ3QgbWl4IG9yZGluYWwgZGF0ZXMgd2l0aCBtb250aC9kYXkiKTtjb25zdCBqPVN8fGkud2Vla2RheSYmIWg7bGV0IE0scSxCPUN0KHUsbCk7aj8oTT1TZixxPU9mLEI9T3QoQixhLG8pKTpjPyhNPWJmLHE9VGYsQj1sbihCKSk6KE09JHMscT1Xcyk7bGV0IF9lPSExO2Zvcihjb25zdCBtZSBvZiBNKXtjb25zdCBBdD1pW21lXTtnKEF0KT9fZT9pW21lXT1xW21lXTppW21lXT1CW21lXTpfZT0hMH1jb25zdCBGdD1qP0JsKGksYSxvKTpjP1FsKGkpOkJyKGkpLGI9RnR8fFFyKGkpO2lmKGIpcmV0dXJuIHAuaW52YWxpZChiKTtjb25zdCBGZT1qP1lyKGksYSxvKTpjP0dyKGkpOmksW2JuLEJlXT1EdChGZSxsLHIpLEFlPW5ldyBwKHt0czpibix6b25lOnIsbzpCZSxsb2M6c30pO3JldHVybiBpLndlZWtkYXkmJmgmJmUud2Vla2RheSE9PUFlLndlZWtkYXk/cC5pbnZhbGlkKCJtaXNtYXRjaGVkIHdlZWtkYXkiLGB5b3UgY2FuJ3Qgc3BlY2lmeSBib3RoIGEgd2Vla2RheSBvZiAke2kud2Vla2RheX0gYW5kIGEgZGF0ZSBvZiAke0FlLnRvSVNPKCl9YCk6QWV9c3RhdGljIGZyb21JU08oZSxuPXt9KXtjb25zdFtyLHNdPVBjKGUpO3JldHVybiBHZShyLHMsbiwiSVNPIDg2MDEiLGUpfXN0YXRpYyBmcm9tUkZDMjgyMihlLG49e30pe2NvbnN0W3Isc109amMoZSk7cmV0dXJuIEdlKHIscyxuLCJSRkMgMjgyMiIsZSl9c3RhdGljIGZyb21IVFRQKGUsbj17fSl7Y29uc3RbcixzXT1VYyhlKTtyZXR1cm4gR2UocixzLG4sIkhUVFAiLG4pfXN0YXRpYyBmcm9tRm9ybWF0KGUsbixyPXt9KXtpZihnKGUpfHxnKG4pKXRocm93IG5ldyBfKCJmcm9tRm9ybWF0IHJlcXVpcmVzIGFuIGlucHV0IHN0cmluZyBhbmQgYSBmb3JtYXQiKTtjb25zdHtsb2NhbGU6cz1udWxsLG51bWJlcmluZ1N5c3RlbTppPW51bGx9PXIsYT1ULmZyb21PcHRzKHtsb2NhbGU6cyxudW1iZXJpbmdTeXN0ZW06aSxkZWZhdWx0VG9FTjohMH0pLFtvLHUsbCxjXT12ZihhLGUsbik7cmV0dXJuIGM/cC5pbnZhbGlkKGMpOkdlKG8sdSxyLGBmb3JtYXQgJHtufWAsZSxsKX1zdGF0aWMgZnJvbVN0cmluZyhlLG4scj17fSl7cmV0dXJuIHAuZnJvbUZvcm1hdChlLG4scil9c3RhdGljIGZyb21TUUwoZSxuPXt9KXtjb25zdFtyLHNdPVFjKGUpO3JldHVybiBHZShyLHMsbiwiU1FMIixlKX1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IF8oIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRGF0ZVRpbWUgaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIFo/ZTpuZXcgWihlLG4pO2lmKEkudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IEVsKHIpO3JldHVybiBuZXcgcCh7aW52YWxpZDpyfSl9c3RhdGljIGlzRGF0ZVRpbWUoZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkRhdGVUaW1lfHwhMX1zdGF0aWMgcGFyc2VGb3JtYXRGb3JPcHRzKGUsbj17fSl7Y29uc3Qgcj1EcyhlLFQuZnJvbU9iamVjdChuKSk7cmV0dXJuIHI/ci5tYXAocz0+cz9zLnZhbDpudWxsKS5qb2luKCIiKTpudWxsfXN0YXRpYyBleHBhbmRGb3JtYXQoZSxuPXt9KXtyZXR1cm4gTXMoeC5wYXJzZUZvcm1hdChlKSxULmZyb21PYmplY3QobikpLm1hcChzPT5zLnZhbCkuam9pbigiIil9Z2V0KGUpe3JldHVybiB0aGlzW2VdfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZD09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1nZXQgbG9jYWxlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5sb2NhbGU6bnVsbH1nZXQgbnVtYmVyaW5nU3lzdGVtKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW06bnVsbH1nZXQgb3V0cHV0Q2FsZW5kYXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMubG9jLm91dHB1dENhbGVuZGFyOm51bGx9Z2V0IHpvbmUoKXtyZXR1cm4gdGhpcy5fem9uZX1nZXQgem9uZU5hbWUoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuem9uZS5uYW1lOm51bGx9Z2V0IHllYXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy55ZWFyOk5hTn1nZXQgcXVhcnRlcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/TWF0aC5jZWlsKHRoaXMuYy5tb250aC8zKTpOYU59Z2V0IG1vbnRoKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMubW9udGg6TmFOfWdldCBkYXkoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5kYXk6TmFOfWdldCBob3VyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMuaG91cjpOYU59Z2V0IG1pbnV0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLm1pbnV0ZTpOYU59Z2V0IHNlY29uZCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLnNlY29uZDpOYU59Z2V0IG1pbGxpc2Vjb25kKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMubWlsbGlzZWNvbmQ6TmFOfWdldCB3ZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/T24odGhpcykud2Vla1llYXI6TmFOfWdldCB3ZWVrTnVtYmVyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Pbih0aGlzKS53ZWVrTnVtYmVyOk5hTn1nZXQgd2Vla2RheSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/T24odGhpcykud2Vla2RheTpOYU59Z2V0IGlzV2Vla2VuZCgpe3JldHVybiB0aGlzLmlzVmFsaWQmJnRoaXMubG9jLmdldFdlZWtlbmREYXlzKCkuaW5jbHVkZXModGhpcy53ZWVrZGF5KX1nZXQgbG9jYWxXZWVrZGF5KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Ubih0aGlzKS53ZWVrZGF5Ok5hTn1nZXQgbG9jYWxXZWVrTnVtYmVyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Ubih0aGlzKS53ZWVrTnVtYmVyOk5hTn1nZXQgbG9jYWxXZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/VG4odGhpcykud2Vla1llYXI6TmFOfWdldCBvcmRpbmFsKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9sbih0aGlzLmMpLm9yZGluYWw6TmFOfWdldCBtb250aFNob3J0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OdC5tb250aHMoInNob3J0Iix7bG9jT2JqOnRoaXMubG9jfSlbdGhpcy5tb250aC0xXTpudWxsfWdldCBtb250aExvbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP050Lm1vbnRocygibG9uZyIse2xvY09iajp0aGlzLmxvY30pW3RoaXMubW9udGgtMV06bnVsbH1nZXQgd2Vla2RheVNob3J0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OdC53ZWVrZGF5cygic2hvcnQiLHtsb2NPYmo6dGhpcy5sb2N9KVt0aGlzLndlZWtkYXktMV06bnVsbH1nZXQgd2Vla2RheUxvbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP050LndlZWtkYXlzKCJsb25nIix7bG9jT2JqOnRoaXMubG9jfSlbdGhpcy53ZWVrZGF5LTFdOm51bGx9Z2V0IG9mZnNldCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/K3RoaXMubzpOYU59Z2V0IG9mZnNldE5hbWVTaG9ydCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cyx7Zm9ybWF0OiJzaG9ydCIsbG9jYWxlOnRoaXMubG9jYWxlfSk6bnVsbH1nZXQgb2Zmc2V0TmFtZUxvbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuem9uZS5vZmZzZXROYW1lKHRoaXMudHMse2Zvcm1hdDoibG9uZyIsbG9jYWxlOnRoaXMubG9jYWxlfSk6bnVsbH1nZXQgaXNPZmZzZXRGaXhlZCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLmlzVW5pdmVyc2FsOm51bGx9Z2V0IGlzSW5EU1QoKXtyZXR1cm4gdGhpcy5pc09mZnNldEZpeGVkPyExOnRoaXMub2Zmc2V0PnRoaXMuc2V0KHttb250aDoxLGRheToxfSkub2Zmc2V0fHx0aGlzLm9mZnNldD50aGlzLnNldCh7bW9udGg6NX0pLm9mZnNldH1nZXRQb3NzaWJsZU9mZnNldHMoKXtpZighdGhpcy5pc1ZhbGlkfHx0aGlzLmlzT2Zmc2V0Rml4ZWQpcmV0dXJuW3RoaXNdO2NvbnN0IGU9ODY0ZTUsbj02ZTQscj1idCh0aGlzLmMpLHM9dGhpcy56b25lLm9mZnNldChyLWUpLGk9dGhpcy56b25lLm9mZnNldChyK2UpLGE9dGhpcy56b25lLm9mZnNldChyLXMqbiksbz10aGlzLnpvbmUub2Zmc2V0KHItaSpuKTtpZihhPT09bylyZXR1cm5bdGhpc107Y29uc3QgdT1yLWEqbixsPXItbypuLGM9Q3QodSxhKSxkPUN0KGwsbyk7cmV0dXJuIGMuaG91cj09PWQuaG91ciYmYy5taW51dGU9PT1kLm1pbnV0ZSYmYy5zZWNvbmQ9PT1kLnNlY29uZCYmYy5taWxsaXNlY29uZD09PWQubWlsbGlzZWNvbmQ/W2hlKHRoaXMse3RzOnV9KSxoZSh0aGlzLHt0czpsfSldOlt0aGlzXX1nZXQgaXNJbkxlYXBZZWFyKCl7cmV0dXJuIGplKHRoaXMueWVhcil9Z2V0IGRheXNJbk1vbnRoKCl7cmV0dXJuIFN0KHRoaXMueWVhcix0aGlzLm1vbnRoKX1nZXQgZGF5c0luWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/a2UodGhpcy55ZWFyKTpOYU59Z2V0IHdlZWtzSW5XZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/VWUodGhpcy53ZWVrWWVhcik6TmFOfWdldCB3ZWVrc0luTG9jYWxXZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/VWUodGhpcy5sb2NhbFdlZWtZZWFyLHRoaXMubG9jLmdldE1pbkRheXNJbkZpcnN0V2VlaygpLHRoaXMubG9jLmdldFN0YXJ0T2ZXZWVrKCkpOk5hTn1yZXNvbHZlZExvY2FsZU9wdGlvbnMoZT17fSl7Y29uc3R7bG9jYWxlOm4sbnVtYmVyaW5nU3lzdGVtOnIsY2FsZW5kYXI6c309eC5jcmVhdGUodGhpcy5sb2MuY2xvbmUoZSksZSkucmVzb2x2ZWRPcHRpb25zKHRoaXMpO3JldHVybntsb2NhbGU6bixudW1iZXJpbmdTeXN0ZW06cixvdXRwdXRDYWxlbmRhcjpzfX10b1VUQyhlPTAsbj17fSl7cmV0dXJuIHRoaXMuc2V0Wm9uZShELmluc3RhbmNlKGUpLG4pfXRvTG9jYWwoKXtyZXR1cm4gdGhpcy5zZXRab25lKEkuZGVmYXVsdFpvbmUpfXNldFpvbmUoZSx7a2VlcExvY2FsVGltZTpuPSExLGtlZXBDYWxlbmRhclRpbWU6cj0hMX09e30pe2lmKGU9bmUoZSxJLmRlZmF1bHRab25lKSxlLmVxdWFscyh0aGlzLnpvbmUpKXJldHVybiB0aGlzO2lmKGUuaXNWYWxpZCl7bGV0IHM9dGhpcy50cztpZihufHxyKXtjb25zdCBpPWUub2Zmc2V0KHRoaXMudHMpLGE9dGhpcy50b09iamVjdCgpO1tzXT1EdChhLGksZSl9cmV0dXJuIGhlKHRoaXMse3RzOnMsem9uZTplfSl9ZWxzZSByZXR1cm4gcC5pbnZhbGlkKE10KGUpKX1yZWNvbmZpZ3VyZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sb3V0cHV0Q2FsZW5kYXI6cn09e30pe2NvbnN0IHM9dGhpcy5sb2MuY2xvbmUoe2xvY2FsZTplLG51bWJlcmluZ1N5c3RlbTpuLG91dHB1dENhbGVuZGFyOnJ9KTtyZXR1cm4gaGUodGhpcyx7bG9jOnN9KX1zZXRMb2NhbGUoZSl7cmV0dXJuIHRoaXMucmVjb25maWd1cmUoe2xvY2FsZTplfSl9c2V0KGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1JdChlLExzKSx7bWluRGF5c0luRmlyc3RXZWVrOnIsc3RhcnRPZldlZWs6c309SnIobix0aGlzLmxvYyksaT0hZyhuLndlZWtZZWFyKXx8IWcobi53ZWVrTnVtYmVyKXx8IWcobi53ZWVrZGF5KSxhPSFnKG4ub3JkaW5hbCksbz0hZyhuLnllYXIpLHU9IWcobi5tb250aCl8fCFnKG4uZGF5KSxsPW98fHUsYz1uLndlZWtZZWFyfHxuLndlZWtOdW1iZXI7aWYoKGx8fGEpJiZjKXRocm93IG5ldyBTZSgiQ2FuJ3QgbWl4IHdlZWtZZWFyL3dlZWtOdW1iZXIgdW5pdHMgd2l0aCB5ZWFyL21vbnRoL2RheSBvciBvcmRpbmFscyIpO2lmKHUmJmEpdGhyb3cgbmV3IFNlKCJDYW4ndCBtaXggb3JkaW5hbCBkYXRlcyB3aXRoIG1vbnRoL2RheSIpO2xldCBkO2k/ZD1Zcih7Li4uT3QodGhpcy5jLHIscyksLi4ubn0scixzKTpnKG4ub3JkaW5hbCk/KGQ9ey4uLnRoaXMudG9PYmplY3QoKSwuLi5ufSxnKG4uZGF5KSYmKGQuZGF5PU1hdGgubWluKFN0KGQueWVhcixkLm1vbnRoKSxkLmRheSkpKTpkPUdyKHsuLi5sbih0aGlzLmMpLC4uLm59KTtjb25zdFt5LGhdPUR0KGQsdGhpcy5vLHRoaXMuem9uZSk7cmV0dXJuIGhlKHRoaXMse3RzOnksbzpofSl9cGx1cyhlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49di5mcm9tRHVyYXRpb25MaWtlKGUpO3JldHVybiBoZSh0aGlzLEFzKHRoaXMsbikpfW1pbnVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj12LmZyb21EdXJhdGlvbkxpa2UoZSkubmVnYXRlKCk7cmV0dXJuIGhlKHRoaXMsQXModGhpcyxuKSl9c3RhcnRPZihlLHt1c2VMb2NhbGVXZWVrczpuPSExfT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCByPXt9LHM9di5ub3JtYWxpemVVbml0KGUpO3N3aXRjaChzKXtjYXNlInllYXJzIjpyLm1vbnRoPTE7Y2FzZSJxdWFydGVycyI6Y2FzZSJtb250aHMiOnIuZGF5PTE7Y2FzZSJ3ZWVrcyI6Y2FzZSJkYXlzIjpyLmhvdXI9MDtjYXNlImhvdXJzIjpyLm1pbnV0ZT0wO2Nhc2UibWludXRlcyI6ci5zZWNvbmQ9MDtjYXNlInNlY29uZHMiOnIubWlsbGlzZWNvbmQ9MDticmVha31pZihzPT09IndlZWtzIilpZihuKXtjb25zdCBpPXRoaXMubG9jLmdldFN0YXJ0T2ZXZWVrKCkse3dlZWtkYXk6YX09dGhpczthPGkmJihyLndlZWtOdW1iZXI9dGhpcy53ZWVrTnVtYmVyLTEpLHIud2Vla2RheT1pfWVsc2Ugci53ZWVrZGF5PTE7aWYocz09PSJxdWFydGVycyIpe2NvbnN0IGk9TWF0aC5jZWlsKHRoaXMubW9udGgvMyk7ci5tb250aD0oaS0xKSozKzF9cmV0dXJuIHRoaXMuc2V0KHIpfWVuZE9mKGUsbil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnBsdXMoe1tlXToxfSkuc3RhcnRPZihlLG4pLm1pbnVzKDEpOnRoaXN9dG9Gb3JtYXQoZSxuPXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3guY3JlYXRlKHRoaXMubG9jLnJlZGVmYXVsdFRvRU4obikpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLGUpOnZufXRvTG9jYWxlU3RyaW5nKGU9eXQsbj17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD94LmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShuKSxlKS5mb3JtYXREYXRlVGltZSh0aGlzKTp2bn10b0xvY2FsZVBhcnRzKGU9e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/eC5jcmVhdGUodGhpcy5sb2MuY2xvbmUoZSksZSkuZm9ybWF0RGF0ZVRpbWVQYXJ0cyh0aGlzKTpbXX10b0lTTyh7Zm9ybWF0OmU9ImV4dGVuZGVkIixzdXBwcmVzc1NlY29uZHM6bj0hMSxzdXBwcmVzc01pbGxpc2Vjb25kczpyPSExLGluY2x1ZGVPZmZzZXQ6cz0hMCxleHRlbmRlZFpvbmU6aT0hMX09e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3QgYT1lPT09ImV4dGVuZGVkIjtsZXQgbz1Tbih0aGlzLGEpO3JldHVybiBvKz0iVCIsbys9VnModGhpcyxhLG4scixzLGkpLG99dG9JU09EYXRlKHtmb3JtYXQ6ZT0iZXh0ZW5kZWQifT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Tbih0aGlzLGU9PT0iZXh0ZW5kZWQiKTpudWxsfXRvSVNPV2Vla0RhdGUoKXtyZXR1cm4gX3QodGhpcywia2tray0nVydXVy1jIil9dG9JU09UaW1lKHtzdXBwcmVzc01pbGxpc2Vjb25kczplPSExLHN1cHByZXNzU2Vjb25kczpuPSExLGluY2x1ZGVPZmZzZXQ6cj0hMCxpbmNsdWRlUHJlZml4OnM9ITEsZXh0ZW5kZWRab25lOmk9ITEsZm9ybWF0OmE9ImV4dGVuZGVkIn09e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/KHM/IlQiOiIiKStWcyh0aGlzLGE9PT0iZXh0ZW5kZWQiLG4sZSxyLGkpOm51bGx9dG9SRkMyODIyKCl7cmV0dXJuIF90KHRoaXMsIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgWlpaIiwhMSl9dG9IVFRQKCl7cmV0dXJuIF90KHRoaXMudG9VVEMoKSwiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyAnR01UJyIpfXRvU1FMRGF0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/U24odGhpcywhMCk6bnVsbH10b1NRTFRpbWUoe2luY2x1ZGVPZmZzZXQ6ZT0hMCxpbmNsdWRlWm9uZTpuPSExLGluY2x1ZGVPZmZzZXRTcGFjZTpyPSEwfT17fSl7bGV0IHM9IkhIOm1tOnNzLlNTUyI7cmV0dXJuKG58fGUpJiYociYmKHMrPSIgIiksbj9zKz0ieiI6ZSYmKHMrPSJaWiIpKSxfdCh0aGlzLHMsITApfXRvU1FMKGU9e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy50b1NRTERhdGUoKX0gJHt0aGlzLnRvU1FMVGltZShlKX1gOm51bGx9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudG9JU08oKTp2bn1bU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV0oKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2BEYXRlVGltZSB7IHRzOiAke3RoaXMudG9JU08oKX0sIHpvbmU6ICR7dGhpcy56b25lLm5hbWV9LCBsb2NhbGU6ICR7dGhpcy5sb2NhbGV9IH1gOmBEYXRlVGltZSB7IEludmFsaWQsIHJlYXNvbjogJHt0aGlzLmludmFsaWRSZWFzb259IH1gfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy50b01pbGxpcygpfXRvTWlsbGlzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnRzOk5hTn10b1NlY29uZHMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudHMvMWUzOk5hTn10b1VuaXhJbnRlZ2VyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9NYXRoLmZsb29yKHRoaXMudHMvMWUzKTpOYU59dG9KU09OKCl7cmV0dXJuIHRoaXMudG9JU08oKX10b0JTT04oKXtyZXR1cm4gdGhpcy50b0pTRGF0ZSgpfXRvT2JqZWN0KGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJue307Y29uc3Qgbj17Li4udGhpcy5jfTtyZXR1cm4gZS5pbmNsdWRlQ29uZmlnJiYobi5vdXRwdXRDYWxlbmRhcj10aGlzLm91dHB1dENhbGVuZGFyLG4ubnVtYmVyaW5nU3lzdGVtPXRoaXMubG9jLm51bWJlcmluZ1N5c3RlbSxuLmxvY2FsZT10aGlzLmxvYy5sb2NhbGUpLG59dG9KU0RhdGUoKXtyZXR1cm4gbmV3IERhdGUodGhpcy5pc1ZhbGlkP3RoaXMudHM6TmFOKX1kaWZmKGUsbj0ibWlsbGlzZWNvbmRzIixyPXt9KXtpZighdGhpcy5pc1ZhbGlkfHwhZS5pc1ZhbGlkKXJldHVybiB2LmludmFsaWQoImNyZWF0ZWQgYnkgZGlmZmluZyBhbiBpbnZhbGlkIERhdGVUaW1lIik7Y29uc3Qgcz17bG9jYWxlOnRoaXMubG9jYWxlLG51bWJlcmluZ1N5c3RlbTp0aGlzLm51bWJlcmluZ1N5c3RlbSwuLi5yfSxpPWVjKG4pLm1hcCh2Lm5vcm1hbGl6ZVVuaXQpLGE9ZS52YWx1ZU9mKCk+dGhpcy52YWx1ZU9mKCksbz1hP3RoaXM6ZSx1PWE/ZTp0aGlzLGw9c2Yobyx1LGkscyk7cmV0dXJuIGE/bC5uZWdhdGUoKTpsfWRpZmZOb3coZT0ibWlsbGlzZWNvbmRzIixuPXt9KXtyZXR1cm4gdGhpcy5kaWZmKHAubm93KCksZSxuKX11bnRpbChlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2suZnJvbURhdGVUaW1lcyh0aGlzLGUpOnRoaXN9aGFzU2FtZShlLG4scil7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4hMTtjb25zdCBzPWUudmFsdWVPZigpLGk9dGhpcy5zZXRab25lKGUuem9uZSx7a2VlcExvY2FsVGltZTohMH0pO3JldHVybiBpLnN0YXJ0T2YobixyKTw9cyYmczw9aS5lbmRPZihuLHIpfWVxdWFscyhlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkJiZlLmlzVmFsaWQmJnRoaXMudmFsdWVPZigpPT09ZS52YWx1ZU9mKCkmJnRoaXMuem9uZS5lcXVhbHMoZS56b25lKSYmdGhpcy5sb2MuZXF1YWxzKGUubG9jKX10b1JlbGF0aXZlKGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3Qgbj1lLmJhc2V8fHAuZnJvbU9iamVjdCh7fSx7em9uZTp0aGlzLnpvbmV9KSxyPWUucGFkZGluZz90aGlzPG4/LWUucGFkZGluZzplLnBhZGRpbmc6MDtsZXQgcz1bInllYXJzIiwibW9udGhzIiwiZGF5cyIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiXSxpPWUudW5pdDtyZXR1cm4gQXJyYXkuaXNBcnJheShlLnVuaXQpJiYocz1lLnVuaXQsaT12b2lkIDApLFpzKG4sdGhpcy5wbHVzKHIpLHsuLi5lLG51bWVyaWM6ImFsd2F5cyIsdW5pdHM6cyx1bml0Oml9KX10b1JlbGF0aXZlQ2FsZW5kYXIoZT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9acyhlLmJhc2V8fHAuZnJvbU9iamVjdCh7fSx7em9uZTp0aGlzLnpvbmV9KSx0aGlzLHsuLi5lLG51bWVyaWM6ImF1dG8iLHVuaXRzOlsieWVhcnMiLCJtb250aHMiLCJkYXlzIl0sY2FsZW5kYXJ5OiEwfSk6bnVsbH1zdGF0aWMgbWluKC4uLmUpe2lmKCFlLmV2ZXJ5KHAuaXNEYXRlVGltZSkpdGhyb3cgbmV3IF8oIm1pbiByZXF1aXJlcyBhbGwgYXJndW1lbnRzIGJlIERhdGVUaW1lcyIpO3JldHVybiBlcyhlLG49Pm4udmFsdWVPZigpLE1hdGgubWluKX1zdGF0aWMgbWF4KC4uLmUpe2lmKCFlLmV2ZXJ5KHAuaXNEYXRlVGltZSkpdGhyb3cgbmV3IF8oIm1heCByZXF1aXJlcyBhbGwgYXJndW1lbnRzIGJlIERhdGVUaW1lcyIpO3JldHVybiBlcyhlLG49Pm4udmFsdWVPZigpLE1hdGgubWF4KX1zdGF0aWMgZnJvbUZvcm1hdEV4cGxhaW4oZSxuLHI9e30pe2NvbnN0e2xvY2FsZTpzPW51bGwsbnVtYmVyaW5nU3lzdGVtOmk9bnVsbH09cixhPVQuZnJvbU9wdHMoe2xvY2FsZTpzLG51bWJlcmluZ1N5c3RlbTppLGRlZmF1bHRUb0VOOiEwfSk7cmV0dXJuIENzKGEsZSxuKX1zdGF0aWMgZnJvbVN0cmluZ0V4cGxhaW4oZSxuLHI9e30pe3JldHVybiBwLmZyb21Gb3JtYXRFeHBsYWluKGUsbixyKX1zdGF0aWMgZ2V0IERBVEVfU0hPUlQoKXtyZXR1cm4geXR9c3RhdGljIGdldCBEQVRFX01FRCgpe3JldHVybiBtcn1zdGF0aWMgZ2V0IERBVEVfTUVEX1dJVEhfV0VFS0RBWSgpe3JldHVybiBNbH1zdGF0aWMgZ2V0IERBVEVfRlVMTCgpe3JldHVybiB5cn1zdGF0aWMgZ2V0IERBVEVfSFVHRSgpe3JldHVybiBncn1zdGF0aWMgZ2V0IFRJTUVfU0lNUExFKCl7cmV0dXJuIHByfXN0YXRpYyBnZXQgVElNRV9XSVRIX1NFQ09ORFMoKXtyZXR1cm4gd3J9c3RhdGljIGdldCBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKCl7cmV0dXJuIHZyfXN0YXRpYyBnZXQgVElNRV9XSVRIX0xPTkdfT0ZGU0VUKCl7cmV0dXJuIE9yfXN0YXRpYyBnZXQgVElNRV8yNF9TSU1QTEUoKXtyZXR1cm4gVHJ9c3RhdGljIGdldCBUSU1FXzI0X1dJVEhfU0VDT05EUygpe3JldHVybiBTcn1zdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQoKXtyZXR1cm4gYnJ9c3RhdGljIGdldCBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQoKXtyZXR1cm4ga3J9c3RhdGljIGdldCBEQVRFVElNRV9TSE9SVCgpe3JldHVybiBJcn1zdGF0aWMgZ2V0IERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUygpe3JldHVybiBFcn1zdGF0aWMgZ2V0IERBVEVUSU1FX01FRCgpe3JldHVybiBOcn1zdGF0aWMgZ2V0IERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMoKXtyZXR1cm4geHJ9c3RhdGljIGdldCBEQVRFVElNRV9NRURfV0lUSF9XRUVLREFZKCl7cmV0dXJuIENsfXN0YXRpYyBnZXQgREFURVRJTUVfRlVMTCgpe3JldHVybiBNcn1zdGF0aWMgZ2V0IERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIENyfXN0YXRpYyBnZXQgREFURVRJTUVfSFVHRSgpe3JldHVybiBEcn1zdGF0aWMgZ2V0IERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIF9yfX1mdW5jdGlvbiBKZSh0KXtpZihwLmlzRGF0ZVRpbWUodCkpcmV0dXJuIHQ7aWYodCYmdC52YWx1ZU9mJiZjZSh0LnZhbHVlT2YoKSkpcmV0dXJuIHAuZnJvbUpTRGF0ZSh0KTtpZih0JiZ0eXBlb2YgdD09Im9iamVjdCIpcmV0dXJuIHAuZnJvbU9iamVjdCh0KTt0aHJvdyBuZXcgXyhgVW5rbm93biBkYXRldGltZSBhcmd1bWVudDogJHt0fSwgb2YgdHlwZSAke3R5cGVvZiB0fWApfWZ1bmN0aW9uIElmKHtjb2xsZWN0aW9uczp0LGx3dzplfSx7dGFibGVJZHM6bix0YWJsZUNvbHVtbklkczpyLHJlbGF0aW9uc2hpcElkczpzLGluZGV4SWRzOmksaW5kZXhDb2x1bW5JZHM6YSxtZW1vSWRzOm99KXtWKHQpLmNvbGxlY3Rpb24oInRhYmxlRW50aXRpZXMiKS5yZW1vdmVNYW55KG4pLFYodCkuY29sbGVjdGlvbigidGFibGVDb2x1bW5FbnRpdGllcyIpLnJlbW92ZU1hbnkociksVih0KS5jb2xsZWN0aW9uKCJyZWxhdGlvbnNoaXBFbnRpdGllcyIpLnJlbW92ZU1hbnkocyksVih0KS5jb2xsZWN0aW9uKCJpbmRleEVudGl0aWVzIikucmVtb3ZlTWFueShpKSxWKHQpLmNvbGxlY3Rpb24oImluZGV4Q29sdW1uRW50aXRpZXMiKS5yZW1vdmVNYW55KGEpLFYodCkuY29sbGVjdGlvbigibWVtb0VudGl0aWVzIikucmVtb3ZlTWFueShvKSxbLi4ubiwuLi5yLC4uLnMsLi4uaSwuLi5hLC4uLm9dLmZvckVhY2godT0+UmVmbGVjdC5kZWxldGVQcm9wZXJ0eShlLHUpKX1jb25zdCBFZj0zMCxOZj1DKFsidGFibGVFbnRpdGllcyIsInRhYmxlQ29sdW1uRW50aXRpZXMiLCJyZWxhdGlvbnNoaXBFbnRpdGllcyIsImluZGV4RW50aXRpZXMiLCJpbmRleENvbHVtbkVudGl0aWVzIiwibWVtb0VudGl0aWVzIl0pO2NsYXNzIHhme2FzeW5jIHJ1bihlKXtjb25zdCBuPUpTT04ucGFyc2UoZSkscj1KbyhuKSx7ZG9jOnt0YWJsZUlkczpzLG1lbW9JZHM6aSxpbmRleElkczphLHJlbGF0aW9uc2hpcElkczpvfSxjb2xsZWN0aW9uczp1LGx3dzpsfT1yLGM9QyhzKSxkPUMoaSkseT1DKGEpLGg9QyhvKSxTPU1mKHAubm93KCkpLGo9Vih1KS5jb2xsZWN0aW9uKCJ0YWJsZUVudGl0aWVzIiksTT1WKHUpLmNvbGxlY3Rpb24oInRhYmxlQ29sdW1uRW50aXRpZXMiKSxxPVYodSkuY29sbGVjdGlvbigiaW5kZXhFbnRpdGllcyIpLEI9Vih1KS5jb2xsZWN0aW9uKCJpbmRleENvbHVtbkVudGl0aWVzIiksX2U9Vih1KS5jb2xsZWN0aW9uKCJyZWxhdGlvbnNoaXBFbnRpdGllcyIpLEZ0PVYodSkuY29sbGVjdGlvbigibWVtb0VudGl0aWVzIiksYj17dGFibGVJZHM6Wy4uLmouc2VsZWN0QWxsKCkuZmlsdGVyKFMoYykpLm1hcCgoe2lkOm19KT0+bSldLHRhYmxlQ29sdW1uSWRzOltdLHJlbGF0aW9uc2hpcElkczpbLi4uX2Uuc2VsZWN0QWxsKCkuZmlsdGVyKFMoaCkpLm1hcCgoe2lkOm19KT0+bSldLGluZGV4SWRzOlsuLi5xLnNlbGVjdEFsbCgpLmZpbHRlcihTKHkpKS5tYXAoKHtpZDptfSk9Pm0pXSxpbmRleENvbHVtbklkczpbXSxtZW1vSWRzOlsuLi5GdC5zZWxlY3RBbGwoKS5maWx0ZXIoUyhkKSkubWFwKCh7aWQ6bX0pPT5tKV19LEZlPUMoYi50YWJsZUlkcyksYm49QyhiLnJlbGF0aW9uc2hpcElkcyk7bGV0IEJlPUMoYi5pbmRleElkcyk7Yi50YWJsZUNvbHVtbklkcy5wdXNoKC4uLk0uc2VsZWN0QWxsKCkuZmlsdGVyKCh7dGFibGVJZDptfSk9PkZlKG0pKS5tYXAoKHtpZDptfSk9Pm0pKSxiLnJlbGF0aW9uc2hpcElkcy5wdXNoKC4uLl9lLnNlbGVjdEFsbCgpLmZpbHRlcigoe2lkOm0sc3RhcnQ6WSxlbmQ6UWV9KT0+IWJuKG0pJiYoRmUoWS50YWJsZUlkKXx8RmUoUWUudGFibGVJZCkpKS5tYXAoKHtpZDptfSk9Pm0pKSxiLmluZGV4SWRzLnB1c2goLi4ucS5zZWxlY3RBbGwoKS5maWx0ZXIoKHtpZDptLHRhYmxlSWQ6WX0pPT4hQmUobSkmJkZlKFkpKS5tYXAoKHtpZDptfSk9Pm0pKSxCZT1DKGIuaW5kZXhJZHMpLGIuaW5kZXhDb2x1bW5JZHMucHVzaCguLi5CLnNlbGVjdEFsbCgpLmZpbHRlcigoe2luZGV4SWQ6bX0pPT5CZShtKSkubWFwKCh7aWQ6bX0pPT5tKSksSWYocixiKTtjb25zdCBBZT1DKGouc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksbWU9QyhNLnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpLEF0PUMocS5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxEZj1DKEIuc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksX2Y9QyhfZS5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxGZj1DKEZ0LnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpO3JldHVybiBiLnRhYmxlQ29sdW1uSWRzLnB1c2goLi4uTS5zZWxlY3RBbGwoKS5maWx0ZXIoKHt0YWJsZUlkOm0saWQ6WSxtZXRhOlFlfSk9PiFBZShtKSYmUygoKT0+ITEpKHtpZDpZLG1ldGE6UWV9KSkubWFwKCh7aWQ6bX0pPT5tKSksYi5pbmRleENvbHVtbklkcy5wdXNoKC4uLkIuc2VsZWN0QWxsKCkuZmlsdGVyKCh7aW5kZXhJZDptLGlkOlksbWV0YTpRZX0pPT4hQXQobSkmJlMoKCk9PiExKSh7aWQ6WSxtZXRhOlFlfSkpLm1hcCgoe2lkOm19KT0+bSkpLE9iamVjdC5lbnRyaWVzKGwpLmZvckVhY2goKFttLFtZXV0pPT57aWYoTmYoWSkpc3dpdGNoKFkpe2Nhc2UidGFibGVFbnRpdGllcyI6IUFlKG0pJiZiLnRhYmxlSWRzLnB1c2gobSk7YnJlYWs7Y2FzZSJ0YWJsZUNvbHVtbkVudGl0aWVzIjohbWUobSkmJmIudGFibGVDb2x1bW5JZHMucHVzaChtKTticmVhaztjYXNlInJlbGF0aW9uc2hpcEVudGl0aWVzIjohX2YobSkmJmIucmVsYXRpb25zaGlwSWRzLnB1c2gobSk7YnJlYWs7Y2FzZSJpbmRleEVudGl0aWVzIjohQXQobSkmJmIuaW5kZXhJZHMucHVzaChtKTticmVhaztjYXNlImluZGV4Q29sdW1uRW50aXRpZXMiOiFEZihtKSYmYi5pbmRleENvbHVtbklkcy5wdXNoKG0pO2JyZWFrO2Nhc2UibWVtb0VudGl0aWVzIjohRmYobSkmJmIubWVtb0lkcy5wdXNoKG0pO2JyZWFrfX0pLHt0YWJsZUlkczpUZShiLnRhYmxlSWRzKSx0YWJsZUNvbHVtbklkczpUZShiLnRhYmxlQ29sdW1uSWRzKSxyZWxhdGlvbnNoaXBJZHM6VGUoYi5yZWxhdGlvbnNoaXBJZHMpLGluZGV4SWRzOlRlKGIuaW5kZXhJZHMpLGluZGV4Q29sdW1uSWRzOlRlKGIuaW5kZXhDb2x1bW5JZHMpLG1lbW9JZHM6VGUoYi5tZW1vSWRzKX19fWNvbnN0IE1mPXQ9PmU9Pih7aWQ6bixtZXRhOnJ9KT0+e2lmKGUobikpcmV0dXJuITE7Y29uc3Qgcz1NYXRoLmZsb29yKHQuZGlmZihwLmZyb21NaWxsaXMoci51cGRhdGVBdCksImRheXMiKS50b09iamVjdCgpLmRheXM/PzApO3JldHVybiBFZjxzfSxDZj1uZXcgeGY7c2VsZi5vbmNvbm5lY3Q9dD0+e2NvbnN0IGU9dC5wb3J0c1swXTtXdChDZixlKX19KSgpOwo=";function zoe(e){return new SharedWorker("data:application/javascript;base64,"+Moe,{name:e==null?void 0:e.name})}const ik="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiOy8qKgogKiBAbGljZW5zZQogKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wCiAqL2NvbnN0IGtuPVN5bWJvbCgiQ29tbGluay5wcm94eSIpLFBzPVN5bWJvbCgiQ29tbGluay5lbmRwb2ludCIpLGpzPVN5bWJvbCgiQ29tbGluay5yZWxlYXNlUHJveHkiKSxWdD1TeW1ib2woIkNvbWxpbmsuZmluYWxpemVyIiksS2U9U3ltYm9sKCJDb21saW5rLnRocm93biIpLEluPXQ9PnR5cGVvZiB0PT0ib2JqZWN0IiYmdCE9PW51bGx8fHR5cGVvZiB0PT0iZnVuY3Rpb24iLFVzPXtjYW5IYW5kbGU6dD0+SW4odCkmJnRba25dLHNlcmlhbGl6ZSh0KXtjb25zdHtwb3J0MTplLHBvcnQyOm59PW5ldyBNZXNzYWdlQ2hhbm5lbDtyZXR1cm4gV3QodCxlKSxbbixbbl1dfSxkZXNlcmlhbGl6ZSh0KXtyZXR1cm4gdC5zdGFydCgpLEdzKHQpfX0sSHM9e2NhbkhhbmRsZTp0PT5Jbih0KSYmS2UgaW4gdCxzZXJpYWxpemUoe3ZhbHVlOnR9KXtsZXQgZTtyZXR1cm4gdCBpbnN0YW5jZW9mIEVycm9yP2U9e2lzRXJyb3I6ITAsdmFsdWU6e21lc3NhZ2U6dC5tZXNzYWdlLG5hbWU6dC5uYW1lLHN0YWNrOnQuc3RhY2t9fTplPXtpc0Vycm9yOiExLHZhbHVlOnR9LFtlLFtdXX0sZGVzZXJpYWxpemUodCl7dGhyb3cgdC5pc0Vycm9yP09iamVjdC5hc3NpZ24obmV3IEVycm9yKHQudmFsdWUubWVzc2FnZSksdC52YWx1ZSk6dC52YWx1ZX19LEVuPW5ldyBNYXAoW1sicHJveHkiLFVzXSxbInRocm93IixIc11dKTtmdW5jdGlvbiBxcyh0LGUpe2Zvcihjb25zdCBuIG9mIHQpaWYoZT09PW58fG49PT0iKiJ8fG4gaW5zdGFuY2VvZiBSZWdFeHAmJm4udGVzdChlKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBXdCh0LGU9Z2xvYmFsVGhpcyxuPVsiKiJdKXtlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIHIocyl7aWYoIXN8fCFzLmRhdGEpcmV0dXJuO2lmKCFxcyhuLHMub3JpZ2luKSl7Y29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtzLm9yaWdpbn0nIGZvciBjb21saW5rIHByb3h5YCk7cmV0dXJufWNvbnN0e2lkOmksdHlwZTphLHBhdGg6b309T2JqZWN0LmFzc2lnbih7cGF0aDpbXX0scy5kYXRhKSx1PShzLmRhdGEuYXJndW1lbnRMaXN0fHxbXSkubWFwKGllKTtsZXQgbDt0cnl7Y29uc3QgYz1vLnNsaWNlKDAsLTEpLnJlZHVjZSgoeSxoKT0+eVtoXSx0KSxkPW8ucmVkdWNlKCh5LGgpPT55W2hdLHQpO3N3aXRjaChhKXtjYXNlIkdFVCI6bD1kO2JyZWFrO2Nhc2UiU0VUIjpjW28uc2xpY2UoLTEpWzBdXT1pZShzLmRhdGEudmFsdWUpLGw9ITA7YnJlYWs7Y2FzZSJBUFBMWSI6bD1kLmFwcGx5KGMsdSk7YnJlYWs7Y2FzZSJDT05TVFJVQ1QiOntjb25zdCB5PW5ldyBkKC4uLnUpO2w9WHMoeSl9YnJlYWs7Y2FzZSJFTkRQT0lOVCI6e2NvbnN0e3BvcnQxOnkscG9ydDI6aH09bmV3IE1lc3NhZ2VDaGFubmVsO1d0KHQsaCksbD1Lcyh5LFt5XSl9YnJlYWs7Y2FzZSJSRUxFQVNFIjpsPXZvaWQgMDticmVhaztkZWZhdWx0OnJldHVybn19Y2F0Y2goYyl7bD17dmFsdWU6YyxbS2VdOjB9fVByb21pc2UucmVzb2x2ZShsKS5jYXRjaChjPT4oe3ZhbHVlOmMsW0tlXTowfSkpLnRoZW4oYz0+e2NvbnN0W2QseV09bnQoYyk7ZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZCkse2lkOml9KSx5KSxhPT09IlJFTEVBU0UiJiYoZS5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixyKSxObihlKSxWdCBpbiB0JiZ0eXBlb2YgdFtWdF09PSJmdW5jdGlvbiImJnRbVnRdKCkpfSkuY2F0Y2goYz0+e2NvbnN0W2QseV09bnQoe3ZhbHVlOm5ldyBUeXBlRXJyb3IoIlVuc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSIpLFtLZV06MH0pO2UucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGQpLHtpZDppfSkseSl9KX0pLGUuc3RhcnQmJmUuc3RhcnQoKX1mdW5jdGlvbiBZcyh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvci5uYW1lPT09Ik1lc3NhZ2VQb3J0In1mdW5jdGlvbiBObih0KXtZcyh0KSYmdC5jbG9zZSgpfWZ1bmN0aW9uIEdzKHQsZSl7cmV0dXJuICR0KHQsW10sZSl9ZnVuY3Rpb24gWGUodCl7aWYodCl0aHJvdyBuZXcgRXJyb3IoIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZSIpfWZ1bmN0aW9uIHhuKHQpe3JldHVybiB5ZSh0LHt0eXBlOiJSRUxFQVNFIn0pLnRoZW4oKCk9PntObih0KX0pfWNvbnN0IGV0PW5ldyBXZWFrTWFwLHR0PSJGaW5hbGl6YXRpb25SZWdpc3RyeSJpbiBnbG9iYWxUaGlzJiZuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkodD0+e2NvbnN0IGU9KGV0LmdldCh0KXx8MCktMTtldC5zZXQodCxlKSxlPT09MCYmeG4odCl9KTtmdW5jdGlvbiBKcyh0LGUpe2NvbnN0IG49KGV0LmdldChlKXx8MCkrMTtldC5zZXQoZSxuKSx0dCYmdHQucmVnaXN0ZXIodCxlLHQpfWZ1bmN0aW9uIEJzKHQpe3R0JiZ0dC51bnJlZ2lzdGVyKHQpfWZ1bmN0aW9uICR0KHQsZT1bXSxuPWZ1bmN0aW9uKCl7fSl7bGV0IHI9ITE7Y29uc3Qgcz1uZXcgUHJveHkobix7Z2V0KGksYSl7aWYoWGUociksYT09PWpzKXJldHVybigpPT57QnMocykseG4odCkscj0hMH07aWYoYT09PSJ0aGVuIil7aWYoZS5sZW5ndGg9PT0wKXJldHVybnt0aGVuOigpPT5zfTtjb25zdCBvPXllKHQse3R5cGU6IkdFVCIscGF0aDplLm1hcCh1PT51LnRvU3RyaW5nKCkpfSkudGhlbihpZSk7cmV0dXJuIG8udGhlbi5iaW5kKG8pfXJldHVybiAkdCh0LFsuLi5lLGFdKX0sc2V0KGksYSxvKXtYZShyKTtjb25zdFt1LGxdPW50KG8pO3JldHVybiB5ZSh0LHt0eXBlOiJTRVQiLHBhdGg6Wy4uLmUsYV0ubWFwKGM9PmMudG9TdHJpbmcoKSksdmFsdWU6dX0sbCkudGhlbihpZSl9LGFwcGx5KGksYSxvKXtYZShyKTtjb25zdCB1PWVbZS5sZW5ndGgtMV07aWYodT09PVBzKXJldHVybiB5ZSh0LHt0eXBlOiJFTkRQT0lOVCJ9KS50aGVuKGllKTtpZih1PT09ImJpbmQiKXJldHVybiAkdCh0LGUuc2xpY2UoMCwtMSkpO2NvbnN0W2wsY109TW4obyk7cmV0dXJuIHllKHQse3R5cGU6IkFQUExZIixwYXRoOmUubWFwKGQ9PmQudG9TdHJpbmcoKSksYXJndW1lbnRMaXN0Omx9LGMpLnRoZW4oaWUpfSxjb25zdHJ1Y3QoaSxhKXtYZShyKTtjb25zdFtvLHVdPU1uKGEpO3JldHVybiB5ZSh0LHt0eXBlOiJDT05TVFJVQ1QiLHBhdGg6ZS5tYXAobD0+bC50b1N0cmluZygpKSxhcmd1bWVudExpc3Q6b30sdSkudGhlbihpZSl9fSk7cmV0dXJuIEpzKHMsdCksc31mdW5jdGlvbiBRcyh0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSx0KX1mdW5jdGlvbiBNbih0KXtjb25zdCBlPXQubWFwKG50KTtyZXR1cm5bZS5tYXAobj0+blswXSksUXMoZS5tYXAobj0+blsxXSkpXX1jb25zdCBDbj1uZXcgV2Vha01hcDtmdW5jdGlvbiBLcyh0LGUpe3JldHVybiBDbi5zZXQodCxlKSx0fWZ1bmN0aW9uIFhzKHQpe3JldHVybiBPYmplY3QuYXNzaWduKHQse1trbl06ITB9KX1mdW5jdGlvbiBudCh0KXtmb3IoY29uc3RbZSxuXW9mIEVuKWlmKG4uY2FuSGFuZGxlKHQpKXtjb25zdFtyLHNdPW4uc2VyaWFsaXplKHQpO3JldHVyblt7dHlwZToiSEFORExFUiIsbmFtZTplLHZhbHVlOnJ9LHNdfXJldHVyblt7dHlwZToiUkFXIix2YWx1ZTp0fSxDbi5nZXQodCl8fFtdXX1mdW5jdGlvbiBpZSh0KXtzd2l0Y2godC50eXBlKXtjYXNlIkhBTkRMRVIiOnJldHVybiBFbi5nZXQodC5uYW1lKS5kZXNlcmlhbGl6ZSh0LnZhbHVlKTtjYXNlIlJBVyI6cmV0dXJuIHQudmFsdWV9fWZ1bmN0aW9uIHllKHQsZSxuKXtyZXR1cm4gbmV3IFByb21pc2Uocj0+e2NvbnN0IHM9ZWkoKTt0LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uIGkoYSl7IWEuZGF0YXx8IWEuZGF0YS5pZHx8YS5kYXRhLmlkIT09c3x8KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsaSkscihhLmRhdGEpKX0pLHQuc3RhcnQmJnQuc3RhcnQoKSx0LnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oe2lkOnN9LGUpLG4pfSl9ZnVuY3Rpb24gZWkoKXtyZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpPT5NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLnRvU3RyaW5nKDE2KSkuam9pbigiLSIpfS8qIQogKiBAZGluZXVnL2VyZC1lZGl0b3Itc2NoZW1hCiAqIEB2ZXJzaW9uIDAuMS4wIHwgU2F0IERlYyAyMyAyMDIzCiAqIEBhdXRob3IgU2V1bmdId2FuLUxlZSA8ZGluZXVnMkBnbWFpbC5jb20+CiAqIEBsaWNlbnNlIE1JVAogKi92YXIgdGk9dHlwZW9mIGdsb2JhbD09Im9iamVjdCImJmdsb2JhbCYmZ2xvYmFsLk9iamVjdD09PU9iamVjdCYmZ2xvYmFsO2NvbnN0IG5pPXRpO3ZhciByaT10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLHNpPW5pfHxyaXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTtjb25zdCBMdD1zaTt2YXIgaWk9THQuU3ltYm9sO2NvbnN0IFE9aWk7dmFyIERuPU9iamVjdC5wcm90b3R5cGUsYWk9RG4uaGFzT3duUHJvcGVydHksb2k9RG4udG9TdHJpbmcsVmU9UT9RLnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiB1aSh0KXt2YXIgZT1haS5jYWxsKHQsVmUpLG49dFtWZV07dHJ5e3RbVmVdPXZvaWQgMDt2YXIgcj0hMH1jYXRjaHt9dmFyIHM9b2kuY2FsbCh0KTtyZXR1cm4gciYmKGU/dFtWZV09bjpkZWxldGUgdFtWZV0pLHN9dmFyIGxpPU9iamVjdC5wcm90b3R5cGUsY2k9bGkudG9TdHJpbmc7ZnVuY3Rpb24gZmkodCl7cmV0dXJuIGNpLmNhbGwodCl9dmFyIGRpPSJbb2JqZWN0IE51bGxdIixoaT0iW29iamVjdCBVbmRlZmluZWRdIixfbj1RP1EudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIHp0KHQpe3JldHVybiB0PT1udWxsP3Q9PT12b2lkIDA/aGk6ZGk6X24mJl9uIGluIE9iamVjdCh0KT91aSh0KTpmaSh0KX1mdW5jdGlvbiBydCh0KXtyZXR1cm4gdCE9bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QifXZhciBtaT0iW29iamVjdCBTeW1ib2xdIjtmdW5jdGlvbiBadCh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJzeW1ib2wifHxydCh0KSYmenQodCk9PW1pfWZ1bmN0aW9uIEZuKHQsZSl7Zm9yKHZhciBuPS0xLHI9dD09bnVsbD8wOnQubGVuZ3RoLHM9QXJyYXkocik7KytuPHI7KXNbbl09ZSh0W25dLG4sdCk7cmV0dXJuIHN9dmFyIHlpPUFycmF5LmlzQXJyYXk7Y29uc3QgV2U9eWk7dmFyIGdpPTEvMCxBbj1RP1EucHJvdG90eXBlOnZvaWQgMCxWbj1Bbj9Bbi50b1N0cmluZzp2b2lkIDA7ZnVuY3Rpb24gV24odCl7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0O2lmKFdlKHQpKXJldHVybiBGbih0LFduKSsiIjtpZihadCh0KSlyZXR1cm4gVm4/Vm4uY2FsbCh0KToiIjt2YXIgZT10KyIiO3JldHVybiBlPT0iMCImJjEvdD09LWdpPyItMCI6ZX1mdW5jdGlvbiBzdCh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gdCE9bnVsbCYmKGU9PSJvYmplY3QifHxlPT0iZnVuY3Rpb24iKX1mdW5jdGlvbiAkbih0KXtyZXR1cm4gdH12YXIgcGk9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLHdpPSJbb2JqZWN0IEZ1bmN0aW9uXSIsdmk9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIixPaT0iW29iamVjdCBQcm94eV0iO2Z1bmN0aW9uIExuKHQpe2lmKCFzdCh0KSlyZXR1cm4hMTt2YXIgZT16dCh0KTtyZXR1cm4gZT09d2l8fGU9PXZpfHxlPT1waXx8ZT09T2l9dmFyIFRpPUx0WyJfX2NvcmUtanNfc2hhcmVkX18iXTtjb25zdCBSdD1UaTt2YXIgem49ZnVuY3Rpb24oKXt2YXIgdD0vW14uXSskLy5leGVjKFJ0JiZSdC5rZXlzJiZSdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHQ/IlN5bWJvbChzcmMpXzEuIit0OiIifSgpO2Z1bmN0aW9uIFNpKHQpe3JldHVybiEhem4mJnpuIGluIHR9dmFyIGJpPUZ1bmN0aW9uLnByb3RvdHlwZSxraT1iaS50b1N0cmluZztmdW5jdGlvbiBJaSh0KXtpZih0IT1udWxsKXt0cnl7cmV0dXJuIGtpLmNhbGwodCl9Y2F0Y2h7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaHt9fXJldHVybiIifXZhciBFaT0vW1xcXiQuKis/KClbXF17fXxdL2csTmk9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8seGk9RnVuY3Rpb24ucHJvdG90eXBlLE1pPU9iamVjdC5wcm90b3R5cGUsQ2k9eGkudG9TdHJpbmcsRGk9TWkuaGFzT3duUHJvcGVydHksX2k9UmVnRXhwKCJeIitDaS5jYWxsKERpKS5yZXBsYWNlKEVpLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIEZpKHQpe2lmKCFzdCh0KXx8U2kodCkpcmV0dXJuITE7dmFyIGU9TG4odCk/X2k6Tmk7cmV0dXJuIGUudGVzdChJaSh0KSl9ZnVuY3Rpb24gQWkodCxlKXtyZXR1cm4gdD09bnVsbD92b2lkIDA6dFtlXX1mdW5jdGlvbiBQdCh0LGUpe3ZhciBuPUFpKHQsZSk7cmV0dXJuIEZpKG4pP246dm9pZCAwfWZ1bmN0aW9uIFZpKHQsZSxuKXtzd2l0Y2gobi5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gdC5jYWxsKGUpO2Nhc2UgMTpyZXR1cm4gdC5jYWxsKGUsblswXSk7Y2FzZSAyOnJldHVybiB0LmNhbGwoZSxuWzBdLG5bMV0pO2Nhc2UgMzpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdLG5bMl0pfXJldHVybiB0LmFwcGx5KGUsbil9dmFyIFdpPTgwMCwkaT0xNixMaT1EYXRlLm5vdztmdW5jdGlvbiB6aSh0KXt2YXIgZT0wLG49MDtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1MaSgpLHM9JGktKHItbik7aWYobj1yLHM+MCl7aWYoKytlPj1XaSlyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX1mdW5jdGlvbiBaaSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIFJpPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PVB0KE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaHt9fSgpO2NvbnN0IGl0PVJpO3ZhciBQaT1pdD9mdW5jdGlvbih0LGUpe3JldHVybiBpdCh0LCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOlppKGUpLHdyaXRhYmxlOiEwfSl9OiRuLGppPXppKFBpKTtjb25zdCBabj1qaTtmdW5jdGlvbiBVaSh0LGUsbixyKXtmb3IodmFyIHM9dC5sZW5ndGgsaT1uKyhyPzE6LTEpO3I/aS0tOisraTxzOylpZihlKHRbaV0saSx0KSlyZXR1cm4gaTtyZXR1cm4tMX1mdW5jdGlvbiBIaSh0KXtyZXR1cm4gdCE9PXR9ZnVuY3Rpb24gcWkodCxlLG4pe2Zvcih2YXIgcj1uLTEscz10Lmxlbmd0aDsrK3I8czspaWYodFtyXT09PWUpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gWWkodCxlLG4pe3JldHVybiBlPT09ZT9xaSh0LGUsbik6VWkodCxIaSxuKX1mdW5jdGlvbiBHaSh0LGUpe3ZhciBuPXQ9PW51bGw/MDp0Lmxlbmd0aDtyZXR1cm4hIW4mJllpKHQsZSwwKT4tMX12YXIgSmk9OTAwNzE5OTI1NDc0MDk5MSxCaT0vXig/OjB8WzEtOV1cZCopJC87ZnVuY3Rpb24gUm4odCxlKXt2YXIgbj10eXBlb2YgdDtyZXR1cm4gZT1lPz9KaSwhIWUmJihuPT0ibnVtYmVyInx8biE9InN5bWJvbCImJkJpLnRlc3QodCkpJiZ0Pi0xJiZ0JTE9PTAmJnQ8ZX1mdW5jdGlvbiBRaSh0LGUsbil7ZT09Il9fcHJvdG9fXyImJml0P2l0KHQsZSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH0pOnRbZV09bn1mdW5jdGlvbiBQbih0LGUpe3JldHVybiB0PT09ZXx8dCE9PXQmJmUhPT1lfXZhciBLaT1PYmplY3QucHJvdG90eXBlLFhpPUtpLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGVhKHQsZSxuKXt2YXIgcj10W2VdOyghKFhpLmNhbGwodCxlKSYmUG4ocixuKSl8fG49PT12b2lkIDAmJiEoZSBpbiB0KSkmJlFpKHQsZSxuKX12YXIgam49TWF0aC5tYXg7ZnVuY3Rpb24gVW4odCxlLG4pe3JldHVybiBlPWpuKGU9PT12b2lkIDA/dC5sZW5ndGgtMTplLDApLGZ1bmN0aW9uKCl7Zm9yKHZhciByPWFyZ3VtZW50cyxzPS0xLGk9am4oci5sZW5ndGgtZSwwKSxhPUFycmF5KGkpOysrczxpOylhW3NdPXJbZStzXTtzPS0xO2Zvcih2YXIgbz1BcnJheShlKzEpOysrczxlOylvW3NdPXJbc107cmV0dXJuIG9bZV09bihhKSxWaSh0LHRoaXMsbyl9fWZ1bmN0aW9uIHRhKHQsZSl7cmV0dXJuIFpuKFVuKHQsZSwkbiksdCsiIil9dmFyIG5hPTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gSG4odCl7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIiYmdD4tMSYmdCUxPT0wJiZ0PD1uYX1mdW5jdGlvbiByYSh0KXtyZXR1cm4gdCE9bnVsbCYmSG4odC5sZW5ndGgpJiYhTG4odCl9dmFyIHNhPSJbb2JqZWN0IEFyZ3VtZW50c10iO2Z1bmN0aW9uIHFuKHQpe3JldHVybiBydCh0KSYmenQodCk9PXNhfXZhciBZbj1PYmplY3QucHJvdG90eXBlLGlhPVluLmhhc093blByb3BlcnR5LGFhPVluLnByb3BlcnR5SXNFbnVtZXJhYmxlLG9hPXFuKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk/cW46ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KHQpJiZpYS5jYWxsKHQsImNhbGxlZSIpJiYhYWEuY2FsbCh0LCJjYWxsZWUiKX07Y29uc3QgR249b2E7ZnVuY3Rpb24gdWEodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpfX12YXIgbGE9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8sY2E9L15cdyokLztmdW5jdGlvbiBmYSh0LGUpe2lmKFdlKHQpKXJldHVybiExO3ZhciBuPXR5cGVvZiB0O3JldHVybiBuPT0ibnVtYmVyInx8bj09InN5bWJvbCJ8fG49PSJib29sZWFuInx8dD09bnVsbHx8WnQodCk/ITA6Y2EudGVzdCh0KXx8IWxhLnRlc3QodCl8fGUhPW51bGwmJnQgaW4gT2JqZWN0KGUpfXZhciBkYT1QdChPYmplY3QsImNyZWF0ZSIpO2NvbnN0ICRlPWRhO2Z1bmN0aW9uIGhhKCl7dGhpcy5fX2RhdGFfXz0kZT8kZShudWxsKTp7fSx0aGlzLnNpemU9MH1mdW5jdGlvbiBtYSh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX12YXIgeWE9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iLGdhPU9iamVjdC5wcm90b3R5cGUscGE9Z2EuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gd2EodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztpZigkZSl7dmFyIG49ZVt0XTtyZXR1cm4gbj09PXlhP3ZvaWQgMDpufXJldHVybiBwYS5jYWxsKGUsdCk/ZVt0XTp2b2lkIDB9dmFyIHZhPU9iamVjdC5wcm90b3R5cGUsT2E9dmEuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gVGEodCl7dmFyIGU9dGhpcy5fX2RhdGFfXztyZXR1cm4gJGU/ZVt0XSE9PXZvaWQgMDpPYS5jYWxsKGUsdCl9dmFyIFNhPSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIjtmdW5jdGlvbiBiYSh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX187cmV0dXJuIHRoaXMuc2l6ZSs9dGhpcy5oYXModCk/MDoxLG5bdF09JGUmJmU9PT12b2lkIDA/U2E6ZSx0aGlzfWZ1bmN0aW9uIGFlKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWFlLnByb3RvdHlwZS5jbGVhcj1oYSxhZS5wcm90b3R5cGUuZGVsZXRlPW1hLGFlLnByb3RvdHlwZS5nZXQ9d2EsYWUucHJvdG90eXBlLmhhcz1UYSxhZS5wcm90b3R5cGUuc2V0PWJhO2Z1bmN0aW9uIGthKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH1mdW5jdGlvbiBhdCh0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKFBuKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9dmFyIElhPUFycmF5LnByb3RvdHlwZSxFYT1JYS5zcGxpY2U7ZnVuY3Rpb24gTmEodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWF0KGUsdCk7aWYobjwwKXJldHVybiExO3ZhciByPWUubGVuZ3RoLTE7cmV0dXJuIG49PXI/ZS5wb3AoKTpFYS5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwhMH1mdW5jdGlvbiB4YSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49YXQoZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfWZ1bmN0aW9uIE1hKHQpe3JldHVybiBhdCh0aGlzLl9fZGF0YV9fLHQpPi0xfWZ1bmN0aW9uIENhKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxyPWF0KG4sdCk7cmV0dXJuIHI8MD8oKyt0aGlzLnNpemUsbi5wdXNoKFt0LGVdKSk6bltyXVsxXT1lLHRoaXN9ZnVuY3Rpb24gZ2UodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19Z2UucHJvdG90eXBlLmNsZWFyPWthLGdlLnByb3RvdHlwZS5kZWxldGU9TmEsZ2UucHJvdG90eXBlLmdldD14YSxnZS5wcm90b3R5cGUuaGFzPU1hLGdlLnByb3RvdHlwZS5zZXQ9Q2E7dmFyIERhPVB0KEx0LCJNYXAiKTtjb25zdCBfYT1EYTtmdW5jdGlvbiBGYSgpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IGFlLG1hcDpuZXcoX2F8fGdlKSxzdHJpbmc6bmV3IGFlfX1mdW5jdGlvbiBBYSh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gZT09InN0cmluZyJ8fGU9PSJudW1iZXIifHxlPT0ic3ltYm9sInx8ZT09ImJvb2xlYW4iP3QhPT0iX19wcm90b19fIjp0PT09bnVsbH1mdW5jdGlvbiBvdCh0LGUpe3ZhciBuPXQuX19kYXRhX187cmV0dXJuIEFhKGUpP25bdHlwZW9mIGU9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06bi5tYXB9ZnVuY3Rpb24gVmEodCl7dmFyIGU9b3QodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX1mdW5jdGlvbiBXYSh0KXtyZXR1cm4gb3QodGhpcyx0KS5nZXQodCl9ZnVuY3Rpb24gJGEodCl7cmV0dXJuIG90KHRoaXMsdCkuaGFzKHQpfWZ1bmN0aW9uIExhKHQsZSl7dmFyIG49b3QodGhpcyx0KSxyPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09cj8wOjEsdGhpc31mdW5jdGlvbiBLKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fUsucHJvdG90eXBlLmNsZWFyPUZhLEsucHJvdG90eXBlLmRlbGV0ZT1WYSxLLnByb3RvdHlwZS5nZXQ9V2EsSy5wcm90b3R5cGUuaGFzPSRhLEsucHJvdG90eXBlLnNldD1MYTt2YXIgemE9IkV4cGVjdGVkIGEgZnVuY3Rpb24iO2Z1bmN0aW9uIGp0KHQsZSl7aWYodHlwZW9mIHQhPSJmdW5jdGlvbiJ8fGUhPW51bGwmJnR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoemEpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIHI9YXJndW1lbnRzLHM9ZT9lLmFwcGx5KHRoaXMscik6clswXSxpPW4uY2FjaGU7aWYoaS5oYXMocykpcmV0dXJuIGkuZ2V0KHMpO3ZhciBhPXQuYXBwbHkodGhpcyxyKTtyZXR1cm4gbi5jYWNoZT1pLnNldChzLGEpfHxpLGF9O3JldHVybiBuLmNhY2hlPW5ldyhqdC5DYWNoZXx8Syksbn1qdC5DYWNoZT1LO3ZhciBaYT01MDA7ZnVuY3Rpb24gUmEodCl7dmFyIGU9anQodCxmdW5jdGlvbihyKXtyZXR1cm4gbi5zaXplPT09WmEmJm4uY2xlYXIoKSxyfSksbj1lLmNhY2hlO3JldHVybiBlfXZhciBQYT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxqYT0vXFwoXFwpPy9nLFVhPVJhKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB0LmNoYXJDb2RlQXQoMCk9PT00NiYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoUGEsZnVuY3Rpb24obixyLHMsaSl7ZS5wdXNoKHM/aS5yZXBsYWNlKGphLCIkMSIpOnJ8fG4pfSksZX0pO2NvbnN0IEhhPVVhO2Z1bmN0aW9uIHFhKHQpe3JldHVybiB0PT1udWxsPyIiOlduKHQpfWZ1bmN0aW9uIHV0KHQsZSl7cmV0dXJuIFdlKHQpP3Q6ZmEodCxlKT9bdF06SGEocWEodCkpfXZhciBZYT0xLzA7ZnVuY3Rpb24gVXQodCl7aWYodHlwZW9mIHQ9PSJzdHJpbmcifHxadCh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiBlPT0iMCImJjEvdD09LVlhPyItMCI6ZX1mdW5jdGlvbiBHYSh0LGUpe2U9dXQoZSx0KTtmb3IodmFyIG49MCxyPWUubGVuZ3RoO3QhPW51bGwmJm48cjspdD10W1V0KGVbbisrXSldO3JldHVybiBuJiZuPT1yP3Q6dm9pZCAwfWZ1bmN0aW9uIEphKHQsZSl7Zm9yKHZhciBuPS0xLHI9ZS5sZW5ndGgscz10Lmxlbmd0aDsrK248cjspdFtzK25dPWVbbl07cmV0dXJuIHR9dmFyIEpuPVE/US5pc0NvbmNhdFNwcmVhZGFibGU6dm9pZCAwO2Z1bmN0aW9uIEJhKHQpe3JldHVybiBXZSh0KXx8R24odCl8fCEhKEpuJiZ0JiZ0W0puXSl9ZnVuY3Rpb24gSHQodCxlLG4scixzKXt2YXIgaT0tMSxhPXQubGVuZ3RoO2ZvcihufHwobj1CYSksc3x8KHM9W10pOysraTxhOyl7dmFyIG89dFtpXTtlPjAmJm4obyk/ZT4xP0h0KG8sZS0xLG4scixzKTpKYShzLG8pOnJ8fChzW3MubGVuZ3RoXT1vKX1yZXR1cm4gc31mdW5jdGlvbiBRYSh0KXt2YXIgZT10PT1udWxsPzA6dC5sZW5ndGg7cmV0dXJuIGU/SHQodCwxKTpbXX1mdW5jdGlvbiBLYSh0KXtyZXR1cm4gWm4oVW4odCx2b2lkIDAsUWEpLHQrIiIpfXZhciBYYT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gZW8odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsWGEpLHRoaXN9ZnVuY3Rpb24gdG8odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfWZ1bmN0aW9uIGx0KHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBLOysrZTxuOyl0aGlzLmFkZCh0W2VdKX1sdC5wcm90b3R5cGUuYWRkPWx0LnByb3RvdHlwZS5wdXNoPWVvLGx0LnByb3RvdHlwZS5oYXM9dG87ZnVuY3Rpb24gbm8odCxlKXtyZXR1cm4gdC5oYXMoZSl9ZnVuY3Rpb24gcm8odCxlKXtyZXR1cm4gdCE9bnVsbCYmZSBpbiBPYmplY3QodCl9ZnVuY3Rpb24gc28odCxlLG4pe2U9dXQoZSx0KTtmb3IodmFyIHI9LTEscz1lLmxlbmd0aCxpPSExOysrcjxzOyl7dmFyIGE9VXQoZVtyXSk7aWYoIShpPXQhPW51bGwmJm4odCxhKSkpYnJlYWs7dD10W2FdfXJldHVybiBpfHwrK3IhPXM/aToocz10PT1udWxsPzA6dC5sZW5ndGgsISFzJiZIbihzKSYmUm4oYSxzKSYmKFdlKHQpfHxHbih0KSkpfWZ1bmN0aW9uIGlvKHQsZSl7cmV0dXJuIHQhPW51bGwmJnNvKHQsZSxybyl9ZnVuY3Rpb24gQm4odCl7cmV0dXJuIHJ0KHQpJiZyYSh0KX1mdW5jdGlvbiBhbyh0LGUsbil7Zm9yKHZhciByPS0xLHM9dD09bnVsbD8wOnQubGVuZ3RoOysrcjxzOylpZihuKGUsdFtyXSkpcmV0dXJuITA7cmV0dXJuITF9dmFyIG9vPTIwMDtmdW5jdGlvbiB1byh0LGUsbixyKXt2YXIgcz0tMSxpPUdpLGE9ITAsbz10Lmxlbmd0aCx1PVtdLGw9ZS5sZW5ndGg7aWYoIW8pcmV0dXJuIHU7biYmKGU9Rm4oZSx1YShuKSkpLHI/KGk9YW8sYT0hMSk6ZS5sZW5ndGg+PW9vJiYoaT1ubyxhPSExLGU9bmV3IGx0KGUpKTtlOmZvcig7KytzPG87KXt2YXIgYz10W3NdLGQ9bj09bnVsbD9jOm4oYyk7aWYoYz1yfHxjIT09MD9jOjAsYSYmZD09PWQpe2Zvcih2YXIgeT1sO3ktLTspaWYoZVt5XT09PWQpY29udGludWUgZTt1LnB1c2goYyl9ZWxzZSBpKGUsZCxyKXx8dS5wdXNoKGMpfXJldHVybiB1fXZhciBsbz10YShmdW5jdGlvbih0LGUpe3JldHVybiBCbih0KT91byh0LEh0KGUsMSxCbiwhMCkpOltdfSk7Y29uc3QgY289bG87ZnVuY3Rpb24gZm8odCxlLG4scil7aWYoIXN0KHQpKXJldHVybiB0O2U9dXQoZSx0KTtmb3IodmFyIHM9LTEsaT1lLmxlbmd0aCxhPWktMSxvPXQ7byE9bnVsbCYmKytzPGk7KXt2YXIgdT1VdChlW3NdKSxsPW47aWYodT09PSJfX3Byb3RvX18ifHx1PT09ImNvbnN0cnVjdG9yInx8dT09PSJwcm90b3R5cGUiKXJldHVybiB0O2lmKHMhPWEpe3ZhciBjPW9bdV07bD1yP3IoYyx1LG8pOnZvaWQgMCxsPT09dm9pZCAwJiYobD1zdChjKT9jOlJuKGVbcysxXSk/W106e30pfWVhKG8sdSxsKSxvPW9bdV19cmV0dXJuIHR9ZnVuY3Rpb24gaG8odCxlLG4pe2Zvcih2YXIgcj0tMSxzPWUubGVuZ3RoLGk9e307KytyPHM7KXt2YXIgYT1lW3JdLG89R2EodCxhKTtuKG8sYSkmJmZvKGksdXQoYSx0KSxvKX1yZXR1cm4gaX1mdW5jdGlvbiBtbyh0LGUpe3JldHVybiBobyh0LGUsZnVuY3Rpb24obixyKXtyZXR1cm4gaW8odCxyKX0pfUthKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PW51bGw/e306bW8odCxlKX0pO2NvbnN0IExlPXQ9PmU9PnR5cGVvZiBlPT09dCx5bz1MZSgib2JqZWN0IikscXQ9TGUoImJvb2xlYW4iKSxOPUxlKCJudW1iZXIiKSxBPUxlKCJzdHJpbmciKSxnbz1MZSgidW5kZWZpbmVkIiksUW49dD0+dD09PW51bGwsRz10PT5Rbih0KXx8Z28odCkse2lzQXJyYXk6WH09QXJyYXksVT10PT55byh0KSYmIVFuKHQpJiYhWCh0KSxZdD0odCxlKT0+bj0+TWF0aC5taW4oTWF0aC5tYXgobix0KSxlKTtmdW5jdGlvbiB3KHQsZSxuKXtyZXR1cm4gcj0+e2lmKCFuKXJldHVybjtjb25zdCBzPW5bcl07dChzKSYmKGVbcl09cyl9fWZ1bmN0aW9uIEgodCl7cmV0dXJuIGU9Pk4oZSkmJnQuaW5jbHVkZXMoZSl9ZnVuY3Rpb24gcGUoKXtjb25zdCB0PURhdGUubm93KCk7cmV0dXJue3VwZGF0ZUF0OnQsY3JlYXRlQXQ6dH19ZnVuY3Rpb24gd2UodCxlKXtjb25zdCBuPXcoTix0LGUpO24oInVwZGF0ZUF0IiksbigiY3JlYXRlQXQiKX1jb25zdCBwbz0oKT0+KHt0YWJsZUlkczpbXSxyZWxhdGlvbnNoaXBJZHM6W10saW5kZXhJZHM6W10sbWVtb0lkczpbXX0pO2Z1bmN0aW9uIHdvKHQpe2NvbnN0IGU9cG8oKTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtjb25zdCBuPXcoWCxlLHQpO3JldHVybiBuKCJ0YWJsZUlkcyIpLG4oInJlbGF0aW9uc2hpcElkcyIpLG4oImluZGV4SWRzIiksbigibWVtb0lkcyIpLGV9Y29uc3Qgdm89KCk9Pih7aWQ6IiIsbmFtZToiIix0YWJsZUlkOiIiLGluZGV4Q29sdW1uSWRzOltdLHNlcUluZGV4Q29sdW1uSWRzOltdLHVuaXF1ZTohMSxtZXRhOnBlKCl9KTtmdW5jdGlvbiBPbyh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9dm8oKSxzPXcoQSxyLG4pLGk9dyhxdCxyLG4pLGE9dyhYLHIsbik7cygiaWQiKSxzKCJuYW1lIikscygidGFibGVJZCIpLGkoInVuaXF1ZSIpLGEoImluZGV4Q29sdW1uSWRzIiksYSgic2VxSW5kZXhDb2x1bW5JZHMiKSx3ZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBLbj17QVNDOjEsREVTQzoyfSxUbz1PYmplY3QudmFsdWVzKEtuKSxTbz0oKT0+KHtpZDoiIixpbmRleElkOiIiLGNvbHVtbklkOiIiLG9yZGVyVHlwZTpLbi5BU0MsbWV0YTpwZSgpfSk7ZnVuY3Rpb24gYm8odCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPVNvKCkscz13KEEscixuKTtzKCJpZCIpLHMoImluZGV4SWQiKSxzKCJjb2x1bW5JZCIpLHcoSChUbykscixuKSgib3JkZXJUeXBlIiksd2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3Qga289KCk9Pih7fSk7ZnVuY3Rpb24gSW8odCl7Y29uc3QgZT1rbygpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdFtuLHJdb2YgT2JqZWN0LmVudHJpZXModCkpe2lmKCFYKHIpfHxyLmxlbmd0aCE9PTQpY29udGludWU7Y29uc3RbcyxpLGEsb109cjtpZihBKHMpJiZOKGkpJiZOKGEpJiZVKG8pKXtjb25zdCB1PXt9LGw9dyhOLHUsbyk7T2JqZWN0LmtleXMobykuZm9yRWFjaChsKSxlW25dPVtzLGksYSx1XX19cmV0dXJuIGV9Y29uc3QgRW89KCk9Pih7aWQ6IiIsdmFsdWU6IiIsdWk6e3g6MjAwLHk6MTAwLHpJbmRleDoyLHdpZHRoOjExNixoZWlnaHQ6MTAwLGNvbG9yOiIifSxtZXRhOnBlKCl9KTtmdW5jdGlvbiBObyh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9RW8oKSxzPXcoQSxyLG4pLGk9dyhOLHIudWksbi51aSksYT13KEEsci51aSxuLnVpKTtzKCJpZCIpLHMoInZhbHVlIiksYSgiY29sb3IiKSxpKCJ4IiksaSgieSIpLGkoInpJbmRleCIpLGkoIndpZHRoIiksaSgiaGVpZ2h0Iiksd2Uoci5tZXRhLG4ubWV0YSksci5pZCYmKGVbci5pZF09cil9cmV0dXJuIGV9Y29uc3QgWG49e1plcm9PbmU6MixaZXJvTjo0LE9uZU9ubHk6OCxPbmVOOjE2fSx4bz1PYmplY3QudmFsdWVzKFhuKSxlcj17cmluZzoxLGRhc2g6Mn0sTW89T2JqZWN0LnZhbHVlcyhlciksR3Q9e2xlZnQ6MSxyaWdodDoyLHRvcDo0LGJvdHRvbTo4fSx0cj1PYmplY3QudmFsdWVzKEd0KSxDbz0oKT0+KHtpZDoiIixpZGVudGlmaWNhdGlvbjohMSxyZWxhdGlvbnNoaXBUeXBlOlhuLlplcm9OLHN0YXJ0UmVsYXRpb25zaGlwVHlwZTplci5kYXNoLHN0YXJ0Ont0YWJsZUlkOiIiLGNvbHVtbklkczpbXSx4OjAseTowLGRpcmVjdGlvbjpHdC5ib3R0b219LGVuZDp7dGFibGVJZDoiIixjb2x1bW5JZHM6W10seDowLHk6MCxkaXJlY3Rpb246R3QuYm90dG9tfSxtZXRhOnBlKCl9KTtmdW5jdGlvbiBEbyh0KXtjb25zdCBlPXt9O2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXModCkpe2lmKCFuKWNvbnRpbnVlO2NvbnN0IHI9Q28oKSxzPXcoQSxyLG4pLGk9dyhxdCxyLG4pLGE9dyhOLHIuc3RhcnQsbi5zdGFydCksbz13KEEsci5zdGFydCxuLnN0YXJ0KSx1PXcoTixyLmVuZCxuLmVuZCksbD13KEEsci5lbmQsbi5lbmQpO3MoImlkIiksaSgiaWRlbnRpZmljYXRpb24iKSx3KEgoeG8pLHIsbikoInJlbGF0aW9uc2hpcFR5cGUiKSx3KEgoTW8pLHIsbikoInN0YXJ0UmVsYXRpb25zaGlwVHlwZSIpLG8oInRhYmxlSWQiKSxhKCJ4IiksYSgieSIpLHcoSCh0ciksci5zdGFydCxuLnN0YXJ0KSgiZGlyZWN0aW9uIiksdyhYLHIuc3RhcnQsbi5zdGFydCkoImNvbHVtbklkcyIpLGwoInRhYmxlSWQiKSx1KCJ4IiksdSgieSIpLHcoSCh0ciksci5lbmQsbi5lbmQpKCJkaXJlY3Rpb24iKSx3KFgsci5lbmQsbi5lbmQpKCJjb2x1bW5JZHMiKSx3ZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1jb25zdCBfbz17RVJEOiJFUkQiLHZpc3VhbGl6YXRpb246IkBkaW5ldWcvZXJkLWVkaXRvci9idWlsdGluLXZpc3VhbGl6YXRpb24iLHNjaGVtYVNRTDoiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tc2NoZW1hLXNxbCIsZ2VuZXJhdG9yQ29kZToiQGRpbmV1Zy9lcmQtZWRpdG9yL2J1aWx0aW4tZ2VuZXJhdG9yLWNvZGUiLHNldHRpbmdzOiJzZXR0aW5ncyJ9LG9lPXt0YWJsZUNvbW1lbnQ6MSxjb2x1bW5Db21tZW50OjIsY29sdW1uRGF0YVR5cGU6NCxjb2x1bW5EZWZhdWx0OjgsY29sdW1uQXV0b0luY3JlbWVudDoxNixjb2x1bW5QcmltYXJ5S2V5OjMyLGNvbHVtblVuaXF1ZTo2NCxjb2x1bW5Ob3ROdWxsOjEyOCxyZWxhdGlvbnNoaXA6MjU2fSxlZT17Y29sdW1uTmFtZToxLGNvbHVtbkRhdGFUeXBlOjIsY29sdW1uTm90TnVsbDo0LGNvbHVtblVuaXF1ZTo4LGNvbHVtbkF1dG9JbmNyZW1lbnQ6MTYsY29sdW1uRGVmYXVsdDozMixjb2x1bW5Db21tZW50OjY0fSxucj1PYmplY3QudmFsdWVzKGVlKSxycj17TWFyaWFEQjoxLE1TU1FMOjIsTXlTUUw6NCxPcmFjbGU6OCxQb3N0Z3JlU1FMOjE2LFNRTGl0ZTozMn0sRm89T2JqZWN0LnZhbHVlcyhyciksc3I9e0dyYXBoUUw6MSxjc2hhcnA6MixKYXZhOjQsS290bGluOjgsVHlwZVNjcmlwdDoxNixKUEE6MzIsU2NhbGE6NjR9LEFvPU9iamVjdC52YWx1ZXMoc3IpLEp0PXtub25lOjEsY2FtZWxDYXNlOjIscGFzY2FsQ2FzZTo0LHNuYWtlQ2FzZTo4fSxpcj1PYmplY3QudmFsdWVzKEp0KSxhcj17bm9uZToxLGRvdWJsZVF1b3RlOjIsc2luZ2xlUXVvdGU6NCxiYWNrdGljazo4fSxWbz1PYmplY3QudmFsdWVzKGFyKSxXbz0uMSwkbz0xLExvPTJlMyx6bz0yZTQsWm89b2UudGFibGVDb21tZW50fG9lLmNvbHVtbkNvbW1lbnR8b2UuY29sdW1uRGF0YVR5cGV8b2UuY29sdW1uRGVmYXVsdHxvZS5jb2x1bW5QcmltYXJ5S2V5fG9lLmNvbHVtbk5vdE51bGx8b2UucmVsYXRpb25zaGlwLFJvPSgpPT4oe3dpZHRoOjJlMyxoZWlnaHQ6MmUzLHNjcm9sbFRvcDowLHNjcm9sbExlZnQ6MCx6b29tTGV2ZWw6MSxzaG93OlpvLGRhdGFiYXNlOnJyLk15U1FMLGRhdGFiYXNlTmFtZToiIixjYW52YXNUeXBlOl9vLkVSRCxsYW5ndWFnZTpzci5HcmFwaFFMLHRhYmxlTmFtZUNhc2U6SnQucGFzY2FsQ2FzZSxjb2x1bW5OYW1lQ2FzZTpKdC5jYW1lbENhc2UsYnJhY2tldFR5cGU6YXIubm9uZSxyZWxhdGlvbnNoaXBEYXRhVHlwZVN5bmM6ITAscmVsYXRpb25zaGlwT3B0aW1pemF0aW9uOiExLGNvbHVtbk9yZGVyOltlZS5jb2x1bW5OYW1lLGVlLmNvbHVtbkRhdGFUeXBlLGVlLmNvbHVtbk5vdE51bGwsZWUuY29sdW1uVW5pcXVlLGVlLmNvbHVtbkF1dG9JbmNyZW1lbnQsZWUuY29sdW1uRGVmYXVsdCxlZS5jb2x1bW5Db21tZW50XSxtYXhXaWR0aENvbW1lbnQ6LTF9KSxvcj1ZdChMbyx6byksUG89WXQoV28sJG8pLGpvPVl0KDYwLDIwMCk7ZnVuY3Rpb24gVW8odCl7Y29uc3QgZT1SbygpO2lmKCFVKHQpfHxHKHQpKXJldHVybiBlO2NvbnN0IG49dyhOLGUsdCkscj13KEEsZSx0KSxzPXcocXQsZSx0KTtyZXR1cm4gTih0LndpZHRoKSYmKGUud2lkdGg9b3IodC53aWR0aCkpLE4odC5oZWlnaHQpJiYoZS5oZWlnaHQ9b3IodC5oZWlnaHQpKSxOKHQuem9vbUxldmVsKSYmKGUuem9vbUxldmVsPVBvKHQuem9vbUxldmVsKSksTih0Lm1heFdpZHRoQ29tbWVudCkmJnQubWF4V2lkdGhDb21tZW50IT09LTEmJihlLm1heFdpZHRoQ29tbWVudD1qbyh0Lm1heFdpZHRoQ29tbWVudCkpLG4oInNjcm9sbFRvcCIpLG4oInNjcm9sbExlZnQiKSxuKCJzaG93IikscigiZGF0YWJhc2VOYW1lIikscigiY2FudmFzVHlwZSIpLHMoInJlbGF0aW9uc2hpcERhdGFUeXBlU3luYyIpLHMoInJlbGF0aW9uc2hpcE9wdGltaXphdGlvbiIpLHcoSChGbyksZSx0KSgiZGF0YWJhc2UiKSx3KEgoQW8pLGUsdCkoImxhbmd1YWdlIiksdyhIKGlyKSxlLHQpKCJ0YWJsZU5hbWVDYXNlIiksdyhIKGlyKSxlLHQpKCJjb2x1bW5OYW1lQ2FzZSIpLHcoSChWbyksZSx0KSgiYnJhY2tldFR5cGUiKSxYKHQuY29sdW1uT3JkZXIpJiZuci5sZW5ndGg9PT10LmNvbHVtbk9yZGVyLmxlbmd0aCYmY28obnIsdC5jb2x1bW5PcmRlcikubGVuZ3RoPT09MCYmKGUuY29sdW1uT3JkZXI9dC5jb2x1bW5PcmRlciksZX1jb25zdCBIbz0oKT0+KHtpZDoiIixuYW1lOiIiLGNvbW1lbnQ6IiIsY29sdW1uSWRzOltdLHNlcUNvbHVtbklkczpbXSx1aTp7eDoyMDAseToxMDAsekluZGV4OjIsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCxjb2xvcjoiIn0sbWV0YTpwZSgpfSk7ZnVuY3Rpb24gcW8odCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPUhvKCkscz13KEEscixuKSxpPXcoWCxyLG4pLGE9dyhOLHIudWksbi51aSksbz13KEEsci51aSxuLnVpKTtzKCJpZCIpLHMoIm5hbWUiKSxzKCJjb21tZW50IiksaSgiY29sdW1uSWRzIiksaSgic2VxQ29sdW1uSWRzIiksbygiY29sb3IiKSxhKCJ4IiksYSgieSIpLGEoInpJbmRleCIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLHdlKHIubWV0YSxuLm1ldGEpLHIuaWQmJihlW3IuaWRdPXIpfXJldHVybiBlfWNvbnN0IFlvPSgpPT4oe2lkOiIiLHRhYmxlSWQ6IiIsbmFtZToiIixjb21tZW50OiIiLGRhdGFUeXBlOiIiLGRlZmF1bHQ6IiIsb3B0aW9uczowLHVpOntrZXlzOjAsd2lkdGhOYW1lOjYwLHdpZHRoQ29tbWVudDo2MCx3aWR0aERhdGFUeXBlOjYwLHdpZHRoRGVmYXVsdDo2MH0sbWV0YTpwZSgpfSk7ZnVuY3Rpb24gR28odCl7Y29uc3QgZT17fTtpZighVSh0KXx8Ryh0KSlyZXR1cm4gZTtmb3IoY29uc3QgbiBvZiBPYmplY3QudmFsdWVzKHQpKXtpZighbiljb250aW51ZTtjb25zdCByPVlvKCkscz13KEEscixuKSxpPXcoTixyLG4pLGE9dyhOLHIudWksbi51aSk7cygiaWQiKSxzKCJ0YWJsZUlkIikscygibmFtZSIpLHMoImNvbW1lbnQiKSxzKCJkYXRhVHlwZSIpLHMoImRlZmF1bHQiKSxpKCJvcHRpb25zIiksYSgia2V5cyIpLGEoIndpZHRoTmFtZSIpLGEoIndpZHRoQ29tbWVudCIpLGEoIndpZHRoRGF0YVR5cGUiKSxhKCJ3aWR0aERlZmF1bHQiKSx3ZShyLm1ldGEsbi5tZXRhKSxyLmlkJiYoZVtyLmlkXT1yKX1yZXR1cm4gZX1mdW5jdGlvbiBKbyh0KXt2YXIgZSxuLHIscyxpLGE7Y29uc3Qgbz10LHU9VW8oby5zZXR0aW5ncyksbD13byhvLmRvYyksYz1JbyhvLmx3dyksZD1xbygoZT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6ZS50YWJsZUVudGl0aWVzKSx5PUdvKChuPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDpuLnRhYmxlQ29sdW1uRW50aXRpZXMpLGg9RG8oKHI9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnIucmVsYXRpb25zaGlwRW50aXRpZXMpLFM9T28oKHM9by5jb2xsZWN0aW9ucyk9PW51bGw/dm9pZCAwOnMuaW5kZXhFbnRpdGllcyksaj1ibygoaT1vLmNvbGxlY3Rpb25zKT09bnVsbD92b2lkIDA6aS5pbmRleENvbHVtbkVudGl0aWVzKSxNPU5vKChhPW8uY29sbGVjdGlvbnMpPT1udWxsP3ZvaWQgMDphLm1lbW9FbnRpdGllcyk7cmV0dXJue3ZlcnNpb246IjMuMC4wIixzZXR0aW5nczp1LGRvYzpsLGNvbGxlY3Rpb25zOnt0YWJsZUVudGl0aWVzOmQsdGFibGVDb2x1bW5FbnRpdGllczp5LHJlbGF0aW9uc2hpcEVudGl0aWVzOmgsaW5kZXhFbnRpdGllczpTLGluZGV4Q29sdW1uRW50aXRpZXM6aixtZW1vRW50aXRpZXM6TX0sbHd3OmN9fWZ1bmN0aW9uIEJvKHQpe3JldHVyblt0LC0xLC0xLHt9XX1mdW5jdGlvbiBCdCh0LGUsbil7cmV0dXJuIHRbZV18fCh0W2VdPUJvKG4pLHRbZV0pfWZ1bmN0aW9uIFFvKHQsZSxuLHIscyl7Y29uc3QgaT1CdCh0LG4sciksYT1pWzFdLG89aVsyXTthPGUmJihpWzFdPWUpLG88ZSYmcygpfWZ1bmN0aW9uIEtvKHQsZSxuLHIscyl7Y29uc3QgaT1CdCh0LG4sciksYT1pWzJdLG89aVsxXTthPGUmJihpWzJdPWUpLG88PWUmJnMoKX1mdW5jdGlvbiBYbyh0LGUsbixyLHMsaSl7Y29uc3QgYT1CdCh0LG4scik7KGFbM11bc10/Py0xKTw9ZSYmKGFbM11bc109ZSxpKCkpfWNsYXNzIGV1e2NvbnN0cnVjdG9yKGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJjb2xsZWN0aW9ucyIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KX1jb2xsZWN0aW9uKGUpe3JldHVybiBuZXcgdHUodGhpcy5jb2xsZWN0aW9uc1tlXSxlKX19Y2xhc3MgdHV7Y29uc3RydWN0b3IoZSxuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29sbGVjdGlvbiIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmV9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29sbGVjdGlvbktleSIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOm59KX1zZWxlY3RCeUlkKGUpe3JldHVybiB0aGlzLmNvbGxlY3Rpb25bZV19c2VsZWN0QnlJZHMoZSl7cmV0dXJuIGUubGVuZ3RoLGUubWFwKG49PnRoaXMuc2VsZWN0QnlJZChuKSkuZmlsdGVyKEJvb2xlYW4pfXNlbGVjdEVudGl0aWVzKCl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbn1zZWxlY3RBbGwoKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmNvbGxlY3Rpb24pfXNldE9uZShlKXtyZXR1cm4gdGhpcy5jb2xsZWN0aW9uW2UuaWRdPWUsdGhpc31zZXRNYW55KGUpe3JldHVybiBlLmZvckVhY2gobj0+dGhpcy5zZXRPbmUobikpLHRoaXN9c2V0QWxsKGUpe3JldHVybiB0aGlzLnJlbW92ZUFsbCgpLHRoaXMuc2V0TWFueShlKSx0aGlzfWFkZE9uZShlKXtyZXR1cm4gdGhpcy5zZWxlY3RCeUlkKGUuaWQpP3RoaXM6KHRoaXMuc2V0T25lKGUpLHRoaXMpfWFkZE1hbnkoZSl7cmV0dXJuIGUuZm9yRWFjaChuPT50aGlzLmFkZE9uZShuKSksdGhpc31yZW1vdmVPbmUoZSl7cmV0dXJuIHRoaXMuc2VsZWN0QnlJZChlKSYmUmVmbGVjdC5kZWxldGVQcm9wZXJ0eSh0aGlzLmNvbGxlY3Rpb24sZSksdGhpc31yZW1vdmVNYW55KGUpe3JldHVybiBlLmZvckVhY2gobj0+dGhpcy5yZW1vdmVPbmUobikpLHRoaXN9cmVtb3ZlQWxsKCl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbj17fSx0aGlzfXVwZGF0ZU9uZShlLG4pe2NvbnN0IHI9dGhpcy5zZWxlY3RCeUlkKGUpO3JldHVybiByJiYobihyKSxyLm1ldGEudXBkYXRlQXQ9RGF0ZS5ub3coKSksdGhpc311cGRhdGVNYW55KGUsbil7cmV0dXJuIGUuZm9yRWFjaChyPT50aGlzLnVwZGF0ZU9uZShyLG4pKSx0aGlzfWdldE9yQ3JlYXRlKGUsbil7Y29uc3Qgcj10aGlzLnNlbGVjdEJ5SWQoZSk7aWYocilyZXR1cm4gcjtjb25zdCBzPW4oZSk7cmV0dXJuIHRoaXMuc2V0T25lKHMpLHRoaXMuc2VsZWN0QnlJZChlKX1hZGRPcGVyYXRvcihlLG4scixzKXtyZXR1cm4gUW8oZSxuLHIsdGhpcy5jb2xsZWN0aW9uS2V5LHMpLHRoaXN9cmVtb3ZlT3BlcmF0b3IoZSxuLHIscyl7cmV0dXJuIEtvKGUsbixyLHRoaXMuY29sbGVjdGlvbktleSxzKSx0aGlzfXJlcGxhY2VPcGVyYXRvcihlLG4scixzLGkpe3JldHVybiBYbyhlLG4scix0aGlzLmNvbGxlY3Rpb25LZXkscyxpKSx0aGlzfX1jb25zdCBWPXQ9Pm5ldyBldSh0KTtmdW5jdGlvbiBDKHQpe2NvbnN0IGU9bmV3IFNldCh0KTtyZXR1cm4gbj0+ZS5oYXMobil9dmFyIG51PXR5cGVvZiBnbG9iYWw9PSJvYmplY3QiJiZnbG9iYWwmJmdsb2JhbC5PYmplY3Q9PT1PYmplY3QmJmdsb2JhbCxydT1udSxzdT10eXBlb2Ygc2VsZj09Im9iamVjdCImJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGl1PXJ1fHxzdXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxjdD1pdSxhdT1jdC5TeW1ib2wsZnQ9YXUsdXI9T2JqZWN0LnByb3RvdHlwZSxvdT11ci5oYXNPd25Qcm9wZXJ0eSx1dT11ci50b1N0cmluZyx6ZT1mdD9mdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gbHUodCl7dmFyIGU9b3UuY2FsbCh0LHplKSxuPXRbemVdO3RyeXt0W3plXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2h7fXZhciBzPXV1LmNhbGwodCk7cmV0dXJuIHImJihlP3RbemVdPW46ZGVsZXRlIHRbemVdKSxzfXZhciBjdT1PYmplY3QucHJvdG90eXBlLGZ1PWN1LnRvU3RyaW5nO2Z1bmN0aW9uIGR1KHQpe3JldHVybiBmdS5jYWxsKHQpfXZhciBodT0iW29iamVjdCBOdWxsXSIsbXU9IltvYmplY3QgVW5kZWZpbmVkXSIsbHI9ZnQ/ZnQudG9TdHJpbmdUYWc6dm9pZCAwO2Z1bmN0aW9uIHl1KHQpe3JldHVybiB0PT1udWxsP3Q9PT12b2lkIDA/bXU6aHU6bHImJmxyIGluIE9iamVjdCh0KT9sdSh0KTpkdSh0KX1mdW5jdGlvbiBjcih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gdCE9bnVsbCYmKGU9PSJvYmplY3QifHxlPT0iZnVuY3Rpb24iKX12YXIgZ3U9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLHB1PSJbb2JqZWN0IEZ1bmN0aW9uXSIsd3U9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIix2dT0iW29iamVjdCBQcm94eV0iO2Z1bmN0aW9uIE91KHQpe2lmKCFjcih0KSlyZXR1cm4hMTt2YXIgZT15dSh0KTtyZXR1cm4gZT09cHV8fGU9PXd1fHxlPT1ndXx8ZT09dnV9dmFyIFR1PWN0WyJfX2NvcmUtanNfc2hhcmVkX18iXSxRdD1UdSxmcj1mdW5jdGlvbigpe3ZhciB0PS9bXi5dKyQvLmV4ZWMoUXQmJlF0LmtleXMmJlF0LmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdD8iU3ltYm9sKHNyYylfMS4iK3Q6IiJ9KCk7ZnVuY3Rpb24gU3UodCl7cmV0dXJuISFmciYmZnIgaW4gdH12YXIgYnU9RnVuY3Rpb24ucHJvdG90eXBlLGt1PWJ1LnRvU3RyaW5nO2Z1bmN0aW9uIEl1KHQpe2lmKHQhPW51bGwpe3RyeXtyZXR1cm4ga3UuY2FsbCh0KX1jYXRjaHt9dHJ5e3JldHVybiB0KyIifWNhdGNoe319cmV0dXJuIiJ9dmFyIEV1PS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxOdT0vXlxbb2JqZWN0IC4rP0NvbnN0cnVjdG9yXF0kLyx4dT1GdW5jdGlvbi5wcm90b3R5cGUsTXU9T2JqZWN0LnByb3RvdHlwZSxDdT14dS50b1N0cmluZyxEdT1NdS5oYXNPd25Qcm9wZXJ0eSxfdT1SZWdFeHAoIl4iK0N1LmNhbGwoRHUpLnJlcGxhY2UoRXUsIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7ZnVuY3Rpb24gRnUodCl7aWYoIWNyKHQpfHxTdSh0KSlyZXR1cm4hMTt2YXIgZT1PdSh0KT9fdTpOdTtyZXR1cm4gZS50ZXN0KEl1KHQpKX1mdW5jdGlvbiBBdSh0LGUpe3JldHVybiB0PT1udWxsP3ZvaWQgMDp0W2VdfWZ1bmN0aW9uIEt0KHQsZSl7dmFyIG49QXUodCxlKTtyZXR1cm4gRnUobik/bjp2b2lkIDB9ZnVuY3Rpb24gVnUoKXt9ZnVuY3Rpb24gV3UodCxlLG4scil7Zm9yKHZhciBzPXQubGVuZ3RoLGk9bisocj8xOi0xKTtyP2ktLTorK2k8czspaWYoZSh0W2ldLGksdCkpcmV0dXJuIGk7cmV0dXJuLTF9ZnVuY3Rpb24gJHUodCl7cmV0dXJuIHQhPT10fWZ1bmN0aW9uIEx1KHQsZSxuKXtmb3IodmFyIHI9bi0xLHM9dC5sZW5ndGg7KytyPHM7KWlmKHRbcl09PT1lKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIHp1KHQsZSxuKXtyZXR1cm4gZT09PWU/THUodCxlLG4pOld1KHQsJHUsbil9ZnVuY3Rpb24gWnUodCxlKXt2YXIgbj10PT1udWxsPzA6dC5sZW5ndGg7cmV0dXJuISFuJiZ6dSh0LGUsMCk+LTF9ZnVuY3Rpb24gUnUodCxlKXtyZXR1cm4gdD09PWV8fHQhPT10JiZlIT09ZX12YXIgUHU9S3QoT2JqZWN0LCJjcmVhdGUiKSxaZT1QdTtmdW5jdGlvbiBqdSgpe3RoaXMuX19kYXRhX189WmU/WmUobnVsbCk6e30sdGhpcy5zaXplPTB9ZnVuY3Rpb24gVXUodCl7dmFyIGU9dGhpcy5oYXModCkmJmRlbGV0ZSB0aGlzLl9fZGF0YV9fW3RdO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9dmFyIEh1PSJfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fIixxdT1PYmplY3QucHJvdG90eXBlLFl1PXF1Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIEd1KHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYoWmUpe3ZhciBuPWVbdF07cmV0dXJuIG49PT1IdT92b2lkIDA6bn1yZXR1cm4gWXUuY2FsbChlLHQpP2VbdF06dm9pZCAwfXZhciBKdT1PYmplY3QucHJvdG90eXBlLEJ1PUp1Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIFF1KHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIFplP2VbdF0hPT12b2lkIDA6QnUuY2FsbChlLHQpfXZhciBLdT0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gWHUodCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxuW3RdPVplJiZlPT09dm9pZCAwP0t1OmUsdGhpc31mdW5jdGlvbiB1ZSh0KXt2YXIgZT0tMSxuPXQ9PW51bGw/MDp0Lmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrZTxuOyl7dmFyIHI9dFtlXTt0aGlzLnNldChyWzBdLHJbMV0pfX11ZS5wcm90b3R5cGUuY2xlYXI9anUsdWUucHJvdG90eXBlLmRlbGV0ZT1VdSx1ZS5wcm90b3R5cGUuZ2V0PUd1LHVlLnByb3RvdHlwZS5oYXM9UXUsdWUucHJvdG90eXBlLnNldD1YdTtmdW5jdGlvbiBlbCgpe3RoaXMuX19kYXRhX189W10sdGhpcy5zaXplPTB9ZnVuY3Rpb24gZHQodCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tOylpZihSdSh0W25dWzBdLGUpKXJldHVybiBuO3JldHVybi0xfXZhciB0bD1BcnJheS5wcm90b3R5cGUsbmw9dGwuc3BsaWNlO2Z1bmN0aW9uIHJsKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1kdChlLHQpO2lmKG48MClyZXR1cm4hMTt2YXIgcj1lLmxlbmd0aC0xO3JldHVybiBuPT1yP2UucG9wKCk6bmwuY2FsbChlLG4sMSksLS10aGlzLnNpemUsITB9ZnVuY3Rpb24gc2wodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPWR0KGUsdCk7cmV0dXJuIG48MD92b2lkIDA6ZVtuXVsxXX1mdW5jdGlvbiBpbCh0KXtyZXR1cm4gZHQodGhpcy5fX2RhdGFfXyx0KT4tMX1mdW5jdGlvbiBhbCh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18scj1kdChuLHQpO3JldHVybiByPDA/KCsrdGhpcy5zaXplLG4ucHVzaChbdCxlXSkpOm5bcl1bMV09ZSx0aGlzfWZ1bmN0aW9uIHZlKHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fXZlLnByb3RvdHlwZS5jbGVhcj1lbCx2ZS5wcm90b3R5cGUuZGVsZXRlPXJsLHZlLnByb3RvdHlwZS5nZXQ9c2wsdmUucHJvdG90eXBlLmhhcz1pbCx2ZS5wcm90b3R5cGUuc2V0PWFsO3ZhciBvbD1LdChjdCwiTWFwIiksdWw9b2w7ZnVuY3Rpb24gbGwoKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyB1ZSxtYXA6bmV3KHVsfHx2ZSksc3RyaW5nOm5ldyB1ZX19ZnVuY3Rpb24gY2wodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIGU9PSJzdHJpbmcifHxlPT0ibnVtYmVyInx8ZT09InN5bWJvbCJ8fGU9PSJib29sZWFuIj90IT09Il9fcHJvdG9fXyI6dD09PW51bGx9ZnVuY3Rpb24gaHQodCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybiBjbChlKT9uW3R5cGVvZiBlPT0ic3RyaW5nIj8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIGZsKHQpe3ZhciBlPWh0KHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9ZnVuY3Rpb24gZGwodCl7cmV0dXJuIGh0KHRoaXMsdCkuZ2V0KHQpfWZ1bmN0aW9uIGhsKHQpe3JldHVybiBodCh0aGlzLHQpLmhhcyh0KX1mdW5jdGlvbiBtbCh0LGUpe3ZhciBuPWh0KHRoaXMsdCkscj1uLnNpemU7cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplKz1uLnNpemU9PXI/MDoxLHRoaXN9ZnVuY3Rpb24gT2UodCl7dmFyIGU9LTEsbj10PT1udWxsPzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19T2UucHJvdG90eXBlLmNsZWFyPWxsLE9lLnByb3RvdHlwZS5kZWxldGU9ZmwsT2UucHJvdG90eXBlLmdldD1kbCxPZS5wcm90b3R5cGUuaGFzPWhsLE9lLnByb3RvdHlwZS5zZXQ9bWw7dmFyIHlsPUt0KGN0LCJTZXQiKSxYdD15bCxnbD0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI7ZnVuY3Rpb24gcGwodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsZ2wpLHRoaXN9ZnVuY3Rpb24gd2wodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfWZ1bmN0aW9uIG10KHQpe3ZhciBlPS0xLG49dD09bnVsbD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBPZTsrK2U8bjspdGhpcy5hZGQodFtlXSl9bXQucHJvdG90eXBlLmFkZD1tdC5wcm90b3R5cGUucHVzaD1wbCxtdC5wcm90b3R5cGUuaGFzPXdsO2Z1bmN0aW9uIHZsKHQsZSl7cmV0dXJuIHQuaGFzKGUpfWZ1bmN0aW9uIGRyKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHIpe25bKytlXT1yfSksbn1mdW5jdGlvbiBPbCh0LGUsbil7Zm9yKHZhciByPS0xLHM9dD09bnVsbD8wOnQubGVuZ3RoOysrcjxzOylpZihuKGUsdFtyXSkpcmV0dXJuITA7cmV0dXJuITF9dmFyIFRsPTEvMCxTbD1YdCYmMS9kcihuZXcgWHQoWywtMF0pKVsxXT09VGw/ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBYdCh0KX06VnUsYmw9U2wsa2w9MjAwO2Z1bmN0aW9uIElsKHQsZSxuKXt2YXIgcj0tMSxzPVp1LGk9dC5sZW5ndGgsYT0hMCxvPVtdLHU9bztpZihuKWE9ITEscz1PbDtlbHNlIGlmKGk+PWtsKXt2YXIgbD1lP251bGw6YmwodCk7aWYobClyZXR1cm4gZHIobCk7YT0hMSxzPXZsLHU9bmV3IG10fWVsc2UgdT1lP1tdOm87ZTpmb3IoOysrcjxpOyl7dmFyIGM9dFtyXSxkPWU/ZShjKTpjO2lmKGM9bnx8YyE9PTA/YzowLGEmJmQ9PT1kKXtmb3IodmFyIHk9dS5sZW5ndGg7eS0tOylpZih1W3ldPT09ZCljb250aW51ZSBlO2UmJnUucHVzaChkKSxvLnB1c2goYyl9ZWxzZSBzKHUsZCxuKXx8KHUhPT1vJiZ1LnB1c2goZCksby5wdXNoKGMpKX1yZXR1cm4gb31mdW5jdGlvbiBUZSh0KXtyZXR1cm4gdCYmdC5sZW5ndGg/SWwodCk6W119Y2xhc3MgbGUgZXh0ZW5kcyBFcnJvcnt9Y2xhc3MgRWwgZXh0ZW5kcyBsZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCBEYXRlVGltZTogJHtlLnRvTWVzc2FnZSgpfWApfX1jbGFzcyBObCBleHRlbmRzIGxle2NvbnN0cnVjdG9yKGUpe3N1cGVyKGBJbnZhbGlkIEludGVydmFsOiAke2UudG9NZXNzYWdlKCl9YCl9fWNsYXNzIHhsIGV4dGVuZHMgbGV7Y29uc3RydWN0b3IoZSl7c3VwZXIoYEludmFsaWQgRHVyYXRpb246ICR7ZS50b01lc3NhZ2UoKX1gKX19Y2xhc3MgU2UgZXh0ZW5kcyBsZXt9Y2xhc3MgaHIgZXh0ZW5kcyBsZXtjb25zdHJ1Y3RvcihlKXtzdXBlcihgSW52YWxpZCB1bml0ICR7ZX1gKX19Y2xhc3MgXyBleHRlbmRzIGxle31jbGFzcyB0ZSBleHRlbmRzIGxle2NvbnN0cnVjdG9yKCl7c3VwZXIoIlpvbmUgaXMgYW4gYWJzdHJhY3QgY2xhc3MiKX19Y29uc3QgZj0ibnVtZXJpYyIsej0ic2hvcnQiLEY9ImxvbmciLHl0PXt5ZWFyOmYsbW9udGg6ZixkYXk6Zn0sbXI9e3llYXI6Zixtb250aDp6LGRheTpmfSxNbD17eWVhcjpmLG1vbnRoOnosZGF5OmYsd2Vla2RheTp6fSx5cj17eWVhcjpmLG1vbnRoOkYsZGF5OmZ9LGdyPXt5ZWFyOmYsbW9udGg6RixkYXk6Zix3ZWVrZGF5OkZ9LHByPXtob3VyOmYsbWludXRlOmZ9LHdyPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmZ9LHZyPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOnp9LE9yPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsdGltZVpvbmVOYW1lOkZ9LFRyPXtob3VyOmYsbWludXRlOmYsaG91ckN5Y2xlOiJoMjMifSxTcj17aG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLGhvdXJDeWNsZToiaDIzIn0sYnI9e2hvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zixob3VyQ3ljbGU6ImgyMyIsdGltZVpvbmVOYW1lOnp9LGtyPXtob3VyOmYsbWludXRlOmYsc2Vjb25kOmYsaG91ckN5Y2xlOiJoMjMiLHRpbWVab25lTmFtZTpGfSxJcj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSxFcj17eWVhcjpmLG1vbnRoOmYsZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxOcj17eWVhcjpmLG1vbnRoOnosZGF5OmYsaG91cjpmLG1pbnV0ZTpmfSx4cj17eWVhcjpmLG1vbnRoOnosZGF5OmYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmfSxDbD17eWVhcjpmLG1vbnRoOnosZGF5OmYsd2Vla2RheTp6LGhvdXI6ZixtaW51dGU6Zn0sTXI9e3llYXI6Zixtb250aDpGLGRheTpmLGhvdXI6ZixtaW51dGU6Zix0aW1lWm9uZU5hbWU6en0sQ3I9e3llYXI6Zixtb250aDpGLGRheTpmLGhvdXI6ZixtaW51dGU6ZixzZWNvbmQ6Zix0aW1lWm9uZU5hbWU6en0sRHI9e3llYXI6Zixtb250aDpGLGRheTpmLHdlZWtkYXk6Rixob3VyOmYsbWludXRlOmYsdGltZVpvbmVOYW1lOkZ9LF9yPXt5ZWFyOmYsbW9udGg6RixkYXk6Zix3ZWVrZGF5OkYsaG91cjpmLG1pbnV0ZTpmLHNlY29uZDpmLHRpbWVab25lTmFtZTpGfTtjbGFzcyBSZXtnZXQgdHlwZSgpe3Rocm93IG5ldyB0ZX1nZXQgbmFtZSgpe3Rocm93IG5ldyB0ZX1nZXQgaWFuYU5hbWUoKXtyZXR1cm4gdGhpcy5uYW1lfWdldCBpc1VuaXZlcnNhbCgpe3Rocm93IG5ldyB0ZX1vZmZzZXROYW1lKGUsbil7dGhyb3cgbmV3IHRlfWZvcm1hdE9mZnNldChlLG4pe3Rocm93IG5ldyB0ZX1vZmZzZXQoZSl7dGhyb3cgbmV3IHRlfWVxdWFscyhlKXt0aHJvdyBuZXcgdGV9Z2V0IGlzVmFsaWQoKXt0aHJvdyBuZXcgdGV9fWxldCBlbj1udWxsO2NsYXNzIGd0IGV4dGVuZHMgUmV7c3RhdGljIGdldCBpbnN0YW5jZSgpe3JldHVybiBlbj09PW51bGwmJihlbj1uZXcgZ3QpLGVufWdldCB0eXBlKCl7cmV0dXJuInN5c3RlbSJ9Z2V0IG5hbWUoKXtyZXR1cm4gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZX1nZXQgaXNVbml2ZXJzYWwoKXtyZXR1cm4hMX1vZmZzZXROYW1lKGUse2Zvcm1hdDpuLGxvY2FsZTpyfSl7cmV0dXJuIG5zKGUsbixyKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gSGUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe3JldHVybi1uZXcgRGF0ZShlKS5nZXRUaW1lem9uZU9mZnNldCgpfWVxdWFscyhlKXtyZXR1cm4gZS50eXBlPT09InN5c3RlbSJ9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMH19bGV0IHB0PXt9O2Z1bmN0aW9uIERsKHQpe3JldHVybiBwdFt0XXx8KHB0W3RdPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KCJlbi1VUyIse2hvdXIxMjohMSx0aW1lWm9uZTp0LHllYXI6Im51bWVyaWMiLG1vbnRoOiIyLWRpZ2l0IixkYXk6IjItZGlnaXQiLGhvdXI6IjItZGlnaXQiLG1pbnV0ZToiMi1kaWdpdCIsc2Vjb25kOiIyLWRpZ2l0IixlcmE6InNob3J0In0pKSxwdFt0XX1jb25zdCBfbD17eWVhcjowLG1vbnRoOjEsZGF5OjIsZXJhOjMsaG91cjo0LG1pbnV0ZTo1LHNlY29uZDo2fTtmdW5jdGlvbiBGbCh0LGUpe2NvbnN0IG49dC5mb3JtYXQoZSkucmVwbGFjZSgvXHUyMDBFL2csIiIpLHI9LyhcZCspXC8oXGQrKVwvKFxkKykgKEFEfEJDKSw/IChcZCspOihcZCspOihcZCspLy5leGVjKG4pLFsscyxpLGEsbyx1LGwsY109cjtyZXR1cm5bYSxzLGksbyx1LGwsY119ZnVuY3Rpb24gQWwodCxlKXtjb25zdCBuPXQuZm9ybWF0VG9QYXJ0cyhlKSxyPVtdO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cysrKXtjb25zdHt0eXBlOmksdmFsdWU6YX09bltzXSxvPV9sW2ldO2k9PT0iZXJhIj9yW29dPWE6ZyhvKXx8KHJbb109cGFyc2VJbnQoYSwxMCkpfXJldHVybiByfWxldCB3dD17fTtjbGFzcyBKIGV4dGVuZHMgUmV7c3RhdGljIGNyZWF0ZShlKXtyZXR1cm4gd3RbZV18fCh3dFtlXT1uZXcgSihlKSksd3RbZV19c3RhdGljIHJlc2V0Q2FjaGUoKXt3dD17fSxwdD17fX1zdGF0aWMgaXNWYWxpZFNwZWNpZmllcihlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkWm9uZShlKX1zdGF0aWMgaXNWYWxpZFpvbmUoZSl7aWYoIWUpcmV0dXJuITE7dHJ5e3JldHVybiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCgiZW4tVVMiLHt0aW1lWm9uZTplfSkuZm9ybWF0KCksITB9Y2F0Y2h7cmV0dXJuITF9fWNvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lLHRoaXMudmFsaWQ9Si5pc1ZhbGlkWm9uZShlKX1nZXQgdHlwZSgpe3JldHVybiJpYW5hIn1nZXQgbmFtZSgpe3JldHVybiB0aGlzLnpvbmVOYW1lfWdldCBpc1VuaXZlcnNhbCgpe3JldHVybiExfW9mZnNldE5hbWUoZSx7Zm9ybWF0Om4sbG9jYWxlOnJ9KXtyZXR1cm4gbnMoZSxuLHIsdGhpcy5uYW1lKX1mb3JtYXRPZmZzZXQoZSxuKXtyZXR1cm4gSGUodGhpcy5vZmZzZXQoZSksbil9b2Zmc2V0KGUpe2NvbnN0IG49bmV3IERhdGUoZSk7aWYoaXNOYU4obikpcmV0dXJuIE5hTjtjb25zdCByPURsKHRoaXMubmFtZSk7bGV0W3MsaSxhLG8sdSxsLGNdPXIuZm9ybWF0VG9QYXJ0cz9BbChyLG4pOkZsKHIsbik7bz09PSJCQyImJihzPS1NYXRoLmFicyhzKSsxKTtjb25zdCB5PWJ0KHt5ZWFyOnMsbW9udGg6aSxkYXk6YSxob3VyOnU9PT0yND8wOnUsbWludXRlOmwsc2Vjb25kOmMsbWlsbGlzZWNvbmQ6MH0pO2xldCBoPStuO2NvbnN0IFM9aCUxZTM7cmV0dXJuIGgtPVM+PTA/UzoxZTMrUywoeS1oKS8oNjAqMWUzKX1lcXVhbHMoZSl7cmV0dXJuIGUudHlwZT09PSJpYW5hIiYmZS5uYW1lPT09dGhpcy5uYW1lfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMudmFsaWR9fWxldCBGcj17fTtmdW5jdGlvbiBWbCh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPUZyW25dO3JldHVybiByfHwocj1uZXcgSW50bC5MaXN0Rm9ybWF0KHQsZSksRnJbbl09cikscn1sZXQgdG49e307ZnVuY3Rpb24gbm4odCxlPXt9KXtjb25zdCBuPUpTT04uc3RyaW5naWZ5KFt0LGVdKTtsZXQgcj10bltuXTtyZXR1cm4gcnx8KHI9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodCxlKSx0bltuXT1yKSxyfWxldCBybj17fTtmdW5jdGlvbiBXbCh0LGU9e30pe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoW3QsZV0pO2xldCByPXJuW25dO3JldHVybiByfHwocj1uZXcgSW50bC5OdW1iZXJGb3JtYXQodCxlKSxybltuXT1yKSxyfWxldCBzbj17fTtmdW5jdGlvbiAkbCh0LGU9e30pe2NvbnN0e2Jhc2U6biwuLi5yfT1lLHM9SlNPTi5zdHJpbmdpZnkoW3Qscl0pO2xldCBpPXNuW3NdO3JldHVybiBpfHwoaT1uZXcgSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXQodCxlKSxzbltzXT1pKSxpfWxldCBQZT1udWxsO2Z1bmN0aW9uIExsKCl7cmV0dXJuIFBlfHwoUGU9bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUsUGUpfWxldCBBcj17fTtmdW5jdGlvbiB6bCh0KXtsZXQgZT1Bclt0XTtpZighZSl7Y29uc3Qgbj1uZXcgSW50bC5Mb2NhbGUodCk7ZT0iZ2V0V2Vla0luZm8iaW4gbj9uLmdldFdlZWtJbmZvKCk6bi53ZWVrSW5mbyxBclt0XT1lfXJldHVybiBlfWZ1bmN0aW9uIFpsKHQpe2NvbnN0IGU9dC5pbmRleE9mKCIteC0iKTtlIT09LTEmJih0PXQuc3Vic3RyaW5nKDAsZSkpO2NvbnN0IG49dC5pbmRleE9mKCItdS0iKTtpZihuPT09LTEpcmV0dXJuW3RdO3tsZXQgcixzO3RyeXtyPW5uKHQpLnJlc29sdmVkT3B0aW9ucygpLHM9dH1jYXRjaHtjb25zdCB1PXQuc3Vic3RyaW5nKDAsbik7cj1ubih1KS5yZXNvbHZlZE9wdGlvbnMoKSxzPXV9Y29uc3R7bnVtYmVyaW5nU3lzdGVtOmksY2FsZW5kYXI6YX09cjtyZXR1cm5bcyxpLGFdfX1mdW5jdGlvbiBSbCh0LGUsbil7cmV0dXJuKG58fGUpJiYodC5pbmNsdWRlcygiLXUtIil8fCh0Kz0iLXUiKSxuJiYodCs9YC1jYS0ke259YCksZSYmKHQrPWAtbnUtJHtlfWApKSx0fWZ1bmN0aW9uIFBsKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTE7bjw9MTI7bisrKXtjb25zdCByPXAudXRjKDIwMDksbiwxKTtlLnB1c2godChyKSl9cmV0dXJuIGV9ZnVuY3Rpb24gamwodCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MTtuPD03O24rKyl7Y29uc3Qgcj1wLnV0YygyMDE2LDExLDEzK24pO2UucHVzaCh0KHIpKX1yZXR1cm4gZX1mdW5jdGlvbiB2dCh0LGUsbixyKXtjb25zdCBzPXQubGlzdGluZ01vZGUoKTtyZXR1cm4gcz09PSJlcnJvciI/bnVsbDpzPT09ImVuIj9uKGUpOnIoZSl9ZnVuY3Rpb24gVWwodCl7cmV0dXJuIHQubnVtYmVyaW5nU3lzdGVtJiZ0Lm51bWJlcmluZ1N5c3RlbSE9PSJsYXRuIj8hMTp0Lm51bWJlcmluZ1N5c3RlbT09PSJsYXRuInx8IXQubG9jYWxlfHx0LmxvY2FsZS5zdGFydHNXaXRoKCJlbiIpfHxuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0LmludGwpLnJlc29sdmVkT3B0aW9ucygpLm51bWJlcmluZ1N5c3RlbT09PSJsYXRuIn1jbGFzcyBIbHtjb25zdHJ1Y3RvcihlLG4scil7dGhpcy5wYWRUbz1yLnBhZFRvfHwwLHRoaXMuZmxvb3I9ci5mbG9vcnx8ITE7Y29uc3R7cGFkVG86cyxmbG9vcjppLC4uLmF9PXI7aWYoIW58fE9iamVjdC5rZXlzKGEpLmxlbmd0aD4wKXtjb25zdCBvPXt1c2VHcm91cGluZzohMSwuLi5yfTtyLnBhZFRvPjAmJihvLm1pbmltdW1JbnRlZ2VyRGlnaXRzPXIucGFkVG8pLHRoaXMuaW5mPVdsKGUsbyl9fWZvcm1hdChlKXtpZih0aGlzLmluZil7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6ZTtyZXR1cm4gdGhpcy5pbmYuZm9ybWF0KG4pfWVsc2V7Y29uc3Qgbj10aGlzLmZsb29yP01hdGguZmxvb3IoZSk6ZG4oZSwzKTtyZXR1cm4gRShuLHRoaXMucGFkVG8pfX19Y2xhc3MgcWx7Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz1yLHRoaXMub3JpZ2luYWxab25lPXZvaWQgMDtsZXQgcztpZih0aGlzLm9wdHMudGltZVpvbmUpdGhpcy5kdD1lO2Vsc2UgaWYoZS56b25lLnR5cGU9PT0iZml4ZWQiKXtjb25zdCBhPS0xKihlLm9mZnNldC82MCksbz1hPj0wP2BFdGMvR01UKyR7YX1gOmBFdGMvR01UJHthfWA7ZS5vZmZzZXQhPT0wJiZKLmNyZWF0ZShvKS52YWxpZD8ocz1vLHRoaXMuZHQ9ZSk6KHM9IlVUQyIsdGhpcy5kdD1lLm9mZnNldD09PTA/ZTplLnNldFpvbmUoIlVUQyIpLnBsdXMoe21pbnV0ZXM6ZS5vZmZzZXR9KSx0aGlzLm9yaWdpbmFsWm9uZT1lLnpvbmUpfWVsc2UgZS56b25lLnR5cGU9PT0ic3lzdGVtIj90aGlzLmR0PWU6ZS56b25lLnR5cGU9PT0iaWFuYSI/KHRoaXMuZHQ9ZSxzPWUuem9uZS5uYW1lKToocz0iVVRDIix0aGlzLmR0PWUuc2V0Wm9uZSgiVVRDIikucGx1cyh7bWludXRlczplLm9mZnNldH0pLHRoaXMub3JpZ2luYWxab25lPWUuem9uZSk7Y29uc3QgaT17Li4udGhpcy5vcHRzfTtpLnRpbWVab25lPWkudGltZVpvbmV8fHMsdGhpcy5kdGY9bm4obixpKX1mb3JtYXQoKXtyZXR1cm4gdGhpcy5vcmlnaW5hbFpvbmU/dGhpcy5mb3JtYXRUb1BhcnRzKCkubWFwKCh7dmFsdWU6ZX0pPT5lKS5qb2luKCIiKTp0aGlzLmR0Zi5mb3JtYXQodGhpcy5kdC50b0pTRGF0ZSgpKX1mb3JtYXRUb1BhcnRzKCl7Y29uc3QgZT10aGlzLmR0Zi5mb3JtYXRUb1BhcnRzKHRoaXMuZHQudG9KU0RhdGUoKSk7cmV0dXJuIHRoaXMub3JpZ2luYWxab25lP2UubWFwKG49PntpZihuLnR5cGU9PT0idGltZVpvbmVOYW1lIil7Y29uc3Qgcj10aGlzLm9yaWdpbmFsWm9uZS5vZmZzZXROYW1lKHRoaXMuZHQudHMse2xvY2FsZTp0aGlzLmR0LmxvY2FsZSxmb3JtYXQ6dGhpcy5vcHRzLnRpbWVab25lTmFtZX0pO3JldHVybnsuLi5uLHZhbHVlOnJ9fWVsc2UgcmV0dXJuIG59KTplfXJlc29sdmVkT3B0aW9ucygpe3JldHVybiB0aGlzLmR0Zi5yZXNvbHZlZE9wdGlvbnMoKX19Y2xhc3MgWWx7Y29uc3RydWN0b3IoZSxuLHIpe3RoaXMub3B0cz17c3R5bGU6ImxvbmciLC4uLnJ9LCFuJiZLcigpJiYodGhpcy5ydGY9JGwoZSxyKSl9Zm9ybWF0KGUsbil7cmV0dXJuIHRoaXMucnRmP3RoaXMucnRmLmZvcm1hdChlLG4pOmhjKG4sZSx0aGlzLm9wdHMubnVtZXJpYyx0aGlzLm9wdHMuc3R5bGUhPT0ibG9uZyIpfWZvcm1hdFRvUGFydHMoZSxuKXtyZXR1cm4gdGhpcy5ydGY/dGhpcy5ydGYuZm9ybWF0VG9QYXJ0cyhlLG4pOltdfX1jb25zdCBHbD17Zmlyc3REYXk6MSxtaW5pbWFsRGF5czo0LHdlZWtlbmQ6WzYsN119O2NsYXNzIFR7c3RhdGljIGZyb21PcHRzKGUpe3JldHVybiBULmNyZWF0ZShlLmxvY2FsZSxlLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyLGUud2Vla1NldHRpbmdzLGUuZGVmYXVsdFRvRU4pfXN0YXRpYyBjcmVhdGUoZSxuLHIscyxpPSExKXtjb25zdCBhPWV8fEkuZGVmYXVsdExvY2FsZSxvPWF8fChpPyJlbi1VUyI6TGwoKSksdT1ufHxJLmRlZmF1bHROdW1iZXJpbmdTeXN0ZW0sbD1yfHxJLmRlZmF1bHRPdXRwdXRDYWxlbmRhcixjPWNuKHMpfHxJLmRlZmF1bHRXZWVrU2V0dGluZ3M7cmV0dXJuIG5ldyBUKG8sdSxsLGMsYSl9c3RhdGljIHJlc2V0Q2FjaGUoKXtQZT1udWxsLHRuPXt9LHJuPXt9LHNuPXt9fXN0YXRpYyBmcm9tT2JqZWN0KHtsb2NhbGU6ZSxudW1iZXJpbmdTeXN0ZW06bixvdXRwdXRDYWxlbmRhcjpyLHdlZWtTZXR0aW5nczpzfT17fSl7cmV0dXJuIFQuY3JlYXRlKGUsbixyLHMpfWNvbnN0cnVjdG9yKGUsbixyLHMsaSl7Y29uc3RbYSxvLHVdPVpsKGUpO3RoaXMubG9jYWxlPWEsdGhpcy5udW1iZXJpbmdTeXN0ZW09bnx8b3x8bnVsbCx0aGlzLm91dHB1dENhbGVuZGFyPXJ8fHV8fG51bGwsdGhpcy53ZWVrU2V0dGluZ3M9cyx0aGlzLmludGw9UmwodGhpcy5sb2NhbGUsdGhpcy5udW1iZXJpbmdTeXN0ZW0sdGhpcy5vdXRwdXRDYWxlbmRhciksdGhpcy53ZWVrZGF5c0NhY2hlPXtmb3JtYXQ6e30sc3RhbmRhbG9uZTp7fX0sdGhpcy5tb250aHNDYWNoZT17Zm9ybWF0Ont9LHN0YW5kYWxvbmU6e319LHRoaXMubWVyaWRpZW1DYWNoZT1udWxsLHRoaXMuZXJhQ2FjaGU9e30sdGhpcy5zcGVjaWZpZWRMb2NhbGU9aSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPW51bGx9Z2V0IGZhc3ROdW1iZXJzKCl7cmV0dXJuIHRoaXMuZmFzdE51bWJlcnNDYWNoZWQ9PW51bGwmJih0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkPVVsKHRoaXMpKSx0aGlzLmZhc3ROdW1iZXJzQ2FjaGVkfWxpc3RpbmdNb2RlKCl7Y29uc3QgZT10aGlzLmlzRW5nbGlzaCgpLG49KHRoaXMubnVtYmVyaW5nU3lzdGVtPT09bnVsbHx8dGhpcy5udW1iZXJpbmdTeXN0ZW09PT0ibGF0biIpJiYodGhpcy5vdXRwdXRDYWxlbmRhcj09PW51bGx8fHRoaXMub3V0cHV0Q2FsZW5kYXI9PT0iZ3JlZ29yeSIpO3JldHVybiBlJiZuPyJlbiI6ImludGwifWNsb25lKGUpe3JldHVybiFlfHxPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5sZW5ndGg9PT0wP3RoaXM6VC5jcmVhdGUoZS5sb2NhbGV8fHRoaXMuc3BlY2lmaWVkTG9jYWxlLGUubnVtYmVyaW5nU3lzdGVtfHx0aGlzLm51bWJlcmluZ1N5c3RlbSxlLm91dHB1dENhbGVuZGFyfHx0aGlzLm91dHB1dENhbGVuZGFyLGNuKGUud2Vla1NldHRpbmdzKXx8dGhpcy53ZWVrU2V0dGluZ3MsZS5kZWZhdWx0VG9FTnx8ITEpfXJlZGVmYXVsdFRvRU4oZT17fSl7cmV0dXJuIHRoaXMuY2xvbmUoey4uLmUsZGVmYXVsdFRvRU46ITB9KX1yZWRlZmF1bHRUb1N5c3RlbShlPXt9KXtyZXR1cm4gdGhpcy5jbG9uZSh7Li4uZSxkZWZhdWx0VG9FTjohMX0pfW1vbnRocyhlLG49ITEpe3JldHVybiB2dCh0aGlzLGUsaXMsKCk9Pntjb25zdCByPW4/e21vbnRoOmUsZGF5OiJudW1lcmljIn06e21vbnRoOmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMubW9udGhzQ2FjaGVbc11bZV18fCh0aGlzLm1vbnRoc0NhY2hlW3NdW2VdPVBsKGk9PnRoaXMuZXh0cmFjdChpLHIsIm1vbnRoIikpKSx0aGlzLm1vbnRoc0NhY2hlW3NdW2VdfSl9d2Vla2RheXMoZSxuPSExKXtyZXR1cm4gdnQodGhpcyxlLHVzLCgpPT57Y29uc3Qgcj1uP3t3ZWVrZGF5OmUseWVhcjoibnVtZXJpYyIsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9Ont3ZWVrZGF5OmV9LHM9bj8iZm9ybWF0Ijoic3RhbmRhbG9uZSI7cmV0dXJuIHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXXx8KHRoaXMud2Vla2RheXNDYWNoZVtzXVtlXT1qbChpPT50aGlzLmV4dHJhY3QoaSxyLCJ3ZWVrZGF5IikpKSx0aGlzLndlZWtkYXlzQ2FjaGVbc11bZV19KX1tZXJpZGllbXMoKXtyZXR1cm4gdnQodGhpcyx2b2lkIDAsKCk9PmxzLCgpPT57aWYoIXRoaXMubWVyaWRpZW1DYWNoZSl7Y29uc3QgZT17aG91cjoibnVtZXJpYyIsaG91ckN5Y2xlOiJoMTIifTt0aGlzLm1lcmlkaWVtQ2FjaGU9W3AudXRjKDIwMTYsMTEsMTMsOSkscC51dGMoMjAxNiwxMSwxMywxOSldLm1hcChuPT50aGlzLmV4dHJhY3QobixlLCJkYXlwZXJpb2QiKSl9cmV0dXJuIHRoaXMubWVyaWRpZW1DYWNoZX0pfWVyYXMoZSl7cmV0dXJuIHZ0KHRoaXMsZSxjcywoKT0+e2NvbnN0IG49e2VyYTplfTtyZXR1cm4gdGhpcy5lcmFDYWNoZVtlXXx8KHRoaXMuZXJhQ2FjaGVbZV09W3AudXRjKC00MCwxLDEpLHAudXRjKDIwMTcsMSwxKV0ubWFwKHI9PnRoaXMuZXh0cmFjdChyLG4sImVyYSIpKSksdGhpcy5lcmFDYWNoZVtlXX0pfWV4dHJhY3QoZSxuLHIpe2NvbnN0IHM9dGhpcy5kdEZvcm1hdHRlcihlLG4pLGk9cy5mb3JtYXRUb1BhcnRzKCksYT1pLmZpbmQobz0+by50eXBlLnRvTG93ZXJDYXNlKCk9PT1yKTtyZXR1cm4gYT9hLnZhbHVlOm51bGx9bnVtYmVyRm9ybWF0dGVyKGU9e30pe3JldHVybiBuZXcgSGwodGhpcy5pbnRsLGUuZm9yY2VTaW1wbGV8fHRoaXMuZmFzdE51bWJlcnMsZSl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gbmV3IHFsKGUsdGhpcy5pbnRsLG4pfXJlbEZvcm1hdHRlcihlPXt9KXtyZXR1cm4gbmV3IFlsKHRoaXMuaW50bCx0aGlzLmlzRW5nbGlzaCgpLGUpfWxpc3RGb3JtYXR0ZXIoZT17fSl7cmV0dXJuIFZsKHRoaXMuaW50bCxlKX1pc0VuZ2xpc2goKXtyZXR1cm4gdGhpcy5sb2NhbGU9PT0iZW4ifHx0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpPT09ImVuLXVzInx8bmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5pbnRsKS5yZXNvbHZlZE9wdGlvbnMoKS5sb2NhbGUuc3RhcnRzV2l0aCgiZW4tdXMiKX1nZXRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gdGhpcy53ZWVrU2V0dGluZ3M/dGhpcy53ZWVrU2V0dGluZ3M6WHIoKT96bCh0aGlzLmxvY2FsZSk6R2x9Z2V0U3RhcnRPZldlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5maXJzdERheX1nZXRNaW5EYXlzSW5GaXJzdFdlZWsoKXtyZXR1cm4gdGhpcy5nZXRXZWVrU2V0dGluZ3MoKS5taW5pbWFsRGF5c31nZXRXZWVrZW5kRGF5cygpe3JldHVybiB0aGlzLmdldFdlZWtTZXR0aW5ncygpLndlZWtlbmR9ZXF1YWxzKGUpe3JldHVybiB0aGlzLmxvY2FsZT09PWUubG9jYWxlJiZ0aGlzLm51bWJlcmluZ1N5c3RlbT09PWUubnVtYmVyaW5nU3lzdGVtJiZ0aGlzLm91dHB1dENhbGVuZGFyPT09ZS5vdXRwdXRDYWxlbmRhcn19bGV0IGFuPW51bGw7Y2xhc3MgRCBleHRlbmRzIFJle3N0YXRpYyBnZXQgdXRjSW5zdGFuY2UoKXtyZXR1cm4gYW49PT1udWxsJiYoYW49bmV3IEQoMCkpLGFufXN0YXRpYyBpbnN0YW5jZShlKXtyZXR1cm4gZT09PTA/RC51dGNJbnN0YW5jZTpuZXcgRChlKX1zdGF0aWMgcGFyc2VTcGVjaWZpZXIoZSl7aWYoZSl7Y29uc3Qgbj1lLm1hdGNoKC9edXRjKD86KFsrLV1cZHsxLDJ9KSg/OjooXGR7Mn0pKT8pPyQvaSk7aWYobilyZXR1cm4gbmV3IEQoa3QoblsxXSxuWzJdKSl9cmV0dXJuIG51bGx9Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmZpeGVkPWV9Z2V0IHR5cGUoKXtyZXR1cm4iZml4ZWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJVVEMiOmBVVEMke0hlKHRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9Z2V0IGlhbmFOYW1lKCl7cmV0dXJuIHRoaXMuZml4ZWQ9PT0wPyJFdGMvVVRDIjpgRXRjL0dNVCR7SGUoLXRoaXMuZml4ZWQsIm5hcnJvdyIpfWB9b2Zmc2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9Zm9ybWF0T2Zmc2V0KGUsbil7cmV0dXJuIEhlKHRoaXMuZml4ZWQsbil9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITB9b2Zmc2V0KCl7cmV0dXJuIHRoaXMuZml4ZWR9ZXF1YWxzKGUpe3JldHVybiBlLnR5cGU9PT0iZml4ZWQiJiZlLmZpeGVkPT09dGhpcy5maXhlZH1nZXQgaXNWYWxpZCgpe3JldHVybiEwfX1jbGFzcyBKbCBleHRlbmRzIFJle2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy56b25lTmFtZT1lfWdldCB0eXBlKCl7cmV0dXJuImludmFsaWQifWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuem9uZU5hbWV9Z2V0IGlzVW5pdmVyc2FsKCl7cmV0dXJuITF9b2Zmc2V0TmFtZSgpe3JldHVybiBudWxsfWZvcm1hdE9mZnNldCgpe3JldHVybiIifW9mZnNldCgpe3JldHVybiBOYU59ZXF1YWxzKCl7cmV0dXJuITF9Z2V0IGlzVmFsaWQoKXtyZXR1cm4hMX19ZnVuY3Rpb24gbmUodCxlKXtpZihnKHQpfHx0PT09bnVsbClyZXR1cm4gZTtpZih0IGluc3RhbmNlb2YgUmUpcmV0dXJuIHQ7aWYoS2wodCkpe2NvbnN0IG49dC50b0xvd2VyQ2FzZSgpO3JldHVybiBuPT09ImRlZmF1bHQiP2U6bj09PSJsb2NhbCJ8fG49PT0ic3lzdGVtIj9ndC5pbnN0YW5jZTpuPT09InV0YyJ8fG49PT0iZ210Ij9ELnV0Y0luc3RhbmNlOkQucGFyc2VTcGVjaWZpZXIobil8fEouY3JlYXRlKHQpfWVsc2UgcmV0dXJuIGNlKHQpP0QuaW5zdGFuY2UodCk6dHlwZW9mIHQ9PSJvYmplY3QiJiYib2Zmc2V0ImluIHQmJnR5cGVvZiB0Lm9mZnNldD09ImZ1bmN0aW9uIj90Om5ldyBKbCh0KX1sZXQgVnI9KCk9PkRhdGUubm93KCksV3I9InN5c3RlbSIsJHI9bnVsbCxMcj1udWxsLHpyPW51bGwsWnI9NjAsUnIsUHI9bnVsbDtjbGFzcyBJe3N0YXRpYyBnZXQgbm93KCl7cmV0dXJuIFZyfXN0YXRpYyBzZXQgbm93KGUpe1ZyPWV9c3RhdGljIHNldCBkZWZhdWx0Wm9uZShlKXtXcj1lfXN0YXRpYyBnZXQgZGVmYXVsdFpvbmUoKXtyZXR1cm4gbmUoV3IsZ3QuaW5zdGFuY2UpfXN0YXRpYyBnZXQgZGVmYXVsdExvY2FsZSgpe3JldHVybiAkcn1zdGF0aWMgc2V0IGRlZmF1bHRMb2NhbGUoZSl7JHI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHROdW1iZXJpbmdTeXN0ZW0oKXtyZXR1cm4gTHJ9c3RhdGljIHNldCBkZWZhdWx0TnVtYmVyaW5nU3lzdGVtKGUpe0xyPWV9c3RhdGljIGdldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoKXtyZXR1cm4genJ9c3RhdGljIHNldCBkZWZhdWx0T3V0cHV0Q2FsZW5kYXIoZSl7enI9ZX1zdGF0aWMgZ2V0IGRlZmF1bHRXZWVrU2V0dGluZ3MoKXtyZXR1cm4gUHJ9c3RhdGljIHNldCBkZWZhdWx0V2Vla1NldHRpbmdzKGUpe1ByPWNuKGUpfXN0YXRpYyBnZXQgdHdvRGlnaXRDdXRvZmZZZWFyKCl7cmV0dXJuIFpyfXN0YXRpYyBzZXQgdHdvRGlnaXRDdXRvZmZZZWFyKGUpe1pyPWUlMTAwfXN0YXRpYyBnZXQgdGhyb3dPbkludmFsaWQoKXtyZXR1cm4gUnJ9c3RhdGljIHNldCB0aHJvd09uSW52YWxpZChlKXtScj1lfXN0YXRpYyByZXNldENhY2hlcygpe1QucmVzZXRDYWNoZSgpLEoucmVzZXRDYWNoZSgpfX1jbGFzcyBae2NvbnN0cnVjdG9yKGUsbil7dGhpcy5yZWFzb249ZSx0aGlzLmV4cGxhbmF0aW9uPW59dG9NZXNzYWdlKCl7cmV0dXJuIHRoaXMuZXhwbGFuYXRpb24/YCR7dGhpcy5yZWFzb259OiAke3RoaXMuZXhwbGFuYXRpb259YDp0aGlzLnJlYXNvbn19Y29uc3QganI9WzAsMzEsNTksOTAsMTIwLDE1MSwxODEsMjEyLDI0MywyNzMsMzA0LDMzNF0sVXI9WzAsMzEsNjAsOTEsMTIxLDE1MiwxODIsMjEzLDI0NCwyNzQsMzA1LDMzNV07ZnVuY3Rpb24gVyh0LGUpe3JldHVybiBuZXcgWigidW5pdCBvdXQgb2YgcmFuZ2UiLGB5b3Ugc3BlY2lmaWVkICR7ZX0gKG9mIHR5cGUgJHt0eXBlb2YgZX0pIGFzIGEgJHt0fSwgd2hpY2ggaXMgaW52YWxpZGApfWZ1bmN0aW9uIG9uKHQsZSxuKXtjb25zdCByPW5ldyBEYXRlKERhdGUuVVRDKHQsZS0xLG4pKTt0PDEwMCYmdD49MCYmci5zZXRVVENGdWxsWWVhcihyLmdldFVUQ0Z1bGxZZWFyKCktMTkwMCk7Y29uc3Qgcz1yLmdldFVUQ0RheSgpO3JldHVybiBzPT09MD83OnN9ZnVuY3Rpb24gSHIodCxlLG4pe3JldHVybiBuKyhqZSh0KT9VcjpqcilbZS0xXX1mdW5jdGlvbiBxcih0LGUpe2NvbnN0IG49amUodCk/VXI6anIscj1uLmZpbmRJbmRleChpPT5pPGUpLHM9ZS1uW3JdO3JldHVybnttb250aDpyKzEsZGF5OnN9fWZ1bmN0aW9uIHVuKHQsZSl7cmV0dXJuKHQtZSs3KSU3KzF9ZnVuY3Rpb24gT3QodCxlPTQsbj0xKXtjb25zdHt5ZWFyOnIsbW9udGg6cyxkYXk6aX09dCxhPUhyKHIscyxpKSxvPXVuKG9uKHIscyxpKSxuKTtsZXQgdT1NYXRoLmZsb29yKChhLW8rMTQtZSkvNyksbDtyZXR1cm4gdTwxPyhsPXItMSx1PVVlKGwsZSxuKSk6dT5VZShyLGUsbik/KGw9cisxLHU9MSk6bD1yLHt3ZWVrWWVhcjpsLHdlZWtOdW1iZXI6dSx3ZWVrZGF5Om8sLi4uRXQodCl9fWZ1bmN0aW9uIFlyKHQsZT00LG49MSl7Y29uc3R7d2Vla1llYXI6cix3ZWVrTnVtYmVyOnMsd2Vla2RheTppfT10LGE9dW4ob24ociwxLGUpLG4pLG89a2Uocik7bGV0IHU9cyo3K2ktYS03K2UsbDt1PDE/KGw9ci0xLHUrPWtlKGwpKTp1Pm8/KGw9cisxLHUtPWtlKHIpKTpsPXI7Y29uc3R7bW9udGg6YyxkYXk6ZH09cXIobCx1KTtyZXR1cm57eWVhcjpsLG1vbnRoOmMsZGF5OmQsLi4uRXQodCl9fWZ1bmN0aW9uIGxuKHQpe2NvbnN0e3llYXI6ZSxtb250aDpuLGRheTpyfT10LHM9SHIoZSxuLHIpO3JldHVybnt5ZWFyOmUsb3JkaW5hbDpzLC4uLkV0KHQpfX1mdW5jdGlvbiBHcih0KXtjb25zdHt5ZWFyOmUsb3JkaW5hbDpufT10LHttb250aDpyLGRheTpzfT1xcihlLG4pO3JldHVybnt5ZWFyOmUsbW9udGg6cixkYXk6cywuLi5FdCh0KX19ZnVuY3Rpb24gSnIodCxlKXtpZighZyh0LmxvY2FsV2Vla2RheSl8fCFnKHQubG9jYWxXZWVrTnVtYmVyKXx8IWcodC5sb2NhbFdlZWtZZWFyKSl7aWYoIWcodC53ZWVrZGF5KXx8IWcodC53ZWVrTnVtYmVyKXx8IWcodC53ZWVrWWVhcikpdGhyb3cgbmV3IFNlKCJDYW5ub3QgbWl4IGxvY2FsZS1iYXNlZCB3ZWVrIGZpZWxkcyB3aXRoIElTTy1iYXNlZCB3ZWVrIGZpZWxkcyIpO3JldHVybiBnKHQubG9jYWxXZWVrZGF5KXx8KHQud2Vla2RheT10LmxvY2FsV2Vla2RheSksZyh0LmxvY2FsV2Vla051bWJlcil8fCh0LndlZWtOdW1iZXI9dC5sb2NhbFdlZWtOdW1iZXIpLGcodC5sb2NhbFdlZWtZZWFyKXx8KHQud2Vla1llYXI9dC5sb2NhbFdlZWtZZWFyKSxkZWxldGUgdC5sb2NhbFdlZWtkYXksZGVsZXRlIHQubG9jYWxXZWVrTnVtYmVyLGRlbGV0ZSB0LmxvY2FsV2Vla1llYXIse21pbkRheXNJbkZpcnN0V2VlazplLmdldE1pbkRheXNJbkZpcnN0V2VlaygpLHN0YXJ0T2ZXZWVrOmUuZ2V0U3RhcnRPZldlZWsoKX19ZWxzZSByZXR1cm57bWluRGF5c0luRmlyc3RXZWVrOjQsc3RhcnRPZldlZWs6MX19ZnVuY3Rpb24gQmwodCxlPTQsbj0xKXtjb25zdCByPVR0KHQud2Vla1llYXIpLHM9JCh0LndlZWtOdW1iZXIsMSxVZSh0LndlZWtZZWFyLGUsbikpLGk9JCh0LndlZWtkYXksMSw3KTtyZXR1cm4gcj9zP2k/ITE6Vygid2Vla2RheSIsdC53ZWVrZGF5KTpXKCJ3ZWVrIix0LndlZWtOdW1iZXIpOlcoIndlZWtZZWFyIix0LndlZWtZZWFyKX1mdW5jdGlvbiBRbCh0KXtjb25zdCBlPVR0KHQueWVhciksbj0kKHQub3JkaW5hbCwxLGtlKHQueWVhcikpO3JldHVybiBlP24/ITE6Vygib3JkaW5hbCIsdC5vcmRpbmFsKTpXKCJ5ZWFyIix0LnllYXIpfWZ1bmN0aW9uIEJyKHQpe2NvbnN0IGU9VHQodC55ZWFyKSxuPSQodC5tb250aCwxLDEyKSxyPSQodC5kYXksMSxTdCh0LnllYXIsdC5tb250aCkpO3JldHVybiBlP24/cj8hMTpXKCJkYXkiLHQuZGF5KTpXKCJtb250aCIsdC5tb250aCk6VygieWVhciIsdC55ZWFyKX1mdW5jdGlvbiBRcih0KXtjb25zdHtob3VyOmUsbWludXRlOm4sc2Vjb25kOnIsbWlsbGlzZWNvbmQ6c309dCxpPSQoZSwwLDIzKXx8ZT09PTI0JiZuPT09MCYmcj09PTAmJnM9PT0wLGE9JChuLDAsNTkpLG89JChyLDAsNTkpLHU9JChzLDAsOTk5KTtyZXR1cm4gaT9hP28/dT8hMTpXKCJtaWxsaXNlY29uZCIscyk6Vygic2Vjb25kIixyKTpXKCJtaW51dGUiLG4pOlcoImhvdXIiLGUpfWZ1bmN0aW9uIGcodCl7cmV0dXJuIHR5cGVvZiB0PiJ1In1mdW5jdGlvbiBjZSh0KXtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIifWZ1bmN0aW9uIFR0KHQpe3JldHVybiB0eXBlb2YgdD09Im51bWJlciImJnQlMT09PTB9ZnVuY3Rpb24gS2wodCl7cmV0dXJuIHR5cGVvZiB0PT0ic3RyaW5nIn1mdW5jdGlvbiBYbCh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgRGF0ZV0ifWZ1bmN0aW9uIEtyKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5SZWxhdGl2ZVRpbWVGb3JtYXR9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIFhyKCl7dHJ5e3JldHVybiB0eXBlb2YgSW50bDwidSImJiEhSW50bC5Mb2NhbGUmJigid2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlfHwiZ2V0V2Vla0luZm8iaW4gSW50bC5Mb2NhbGUucHJvdG90eXBlKX1jYXRjaHtyZXR1cm4hMX19ZnVuY3Rpb24gZWModCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDpbdF19ZnVuY3Rpb24gZXModCxlLG4pe2lmKHQubGVuZ3RoIT09MClyZXR1cm4gdC5yZWR1Y2UoKHIscyk9Pntjb25zdCBpPVtlKHMpLHNdO3JldHVybiByJiZuKHJbMF0saVswXSk9PT1yWzBdP3I6aX0sbnVsbClbMV19ZnVuY3Rpb24gdGModCxlKXtyZXR1cm4gZS5yZWR1Y2UoKG4scik9PihuW3JdPXRbcl0sbikse30pfWZ1bmN0aW9uIGJlKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIGNuKHQpe2lmKHQ9PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIHQhPSJvYmplY3QiKXRocm93IG5ldyBfKCJXZWVrIHNldHRpbmdzIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYoISQodC5maXJzdERheSwxLDcpfHwhJCh0Lm1pbmltYWxEYXlzLDEsNyl8fCFBcnJheS5pc0FycmF5KHQud2Vla2VuZCl8fHQud2Vla2VuZC5zb21lKGU9PiEkKGUsMSw3KSkpdGhyb3cgbmV3IF8oIkludmFsaWQgd2VlayBzZXR0aW5ncyIpO3JldHVybntmaXJzdERheTp0LmZpcnN0RGF5LG1pbmltYWxEYXlzOnQubWluaW1hbERheXMsd2Vla2VuZDpBcnJheS5mcm9tKHQud2Vla2VuZCl9fWZ1bmN0aW9uICQodCxlLG4pe3JldHVybiBUdCh0KSYmdD49ZSYmdDw9bn1mdW5jdGlvbiBuYyh0LGUpe3JldHVybiB0LWUqTWF0aC5mbG9vcih0L2UpfWZ1bmN0aW9uIEUodCxlPTIpe2NvbnN0IG49dDwwO2xldCByO3JldHVybiBuP3I9Ii0iKygiIistdCkucGFkU3RhcnQoZSwiMCIpOnI9KCIiK3QpLnBhZFN0YXJ0KGUsIjAiKSxyfWZ1bmN0aW9uIHJlKHQpe2lmKCEoZyh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlSW50KHQsMTApfWZ1bmN0aW9uIGZlKHQpe2lmKCEoZyh0KXx8dD09PW51bGx8fHQ9PT0iIikpcmV0dXJuIHBhcnNlRmxvYXQodCl9ZnVuY3Rpb24gZm4odCl7aWYoIShnKHQpfHx0PT09bnVsbHx8dD09PSIiKSl7Y29uc3QgZT1wYXJzZUZsb2F0KCIwLiIrdCkqMWUzO3JldHVybiBNYXRoLmZsb29yKGUpfX1mdW5jdGlvbiBkbih0LGUsbj0hMSl7Y29uc3Qgcj0xMCoqZTtyZXR1cm4obj9NYXRoLnRydW5jOk1hdGgucm91bmQpKHQqcikvcn1mdW5jdGlvbiBqZSh0KXtyZXR1cm4gdCU0PT09MCYmKHQlMTAwIT09MHx8dCU0MDA9PT0wKX1mdW5jdGlvbiBrZSh0KXtyZXR1cm4gamUodCk/MzY2OjM2NX1mdW5jdGlvbiBTdCh0LGUpe2NvbnN0IG49bmMoZS0xLDEyKSsxLHI9dCsoZS1uKS8xMjtyZXR1cm4gbj09PTI/amUocik/Mjk6Mjg6WzMxLG51bGwsMzEsMzAsMzEsMzAsMzEsMzEsMzAsMzEsMzAsMzFdW24tMV19ZnVuY3Rpb24gYnQodCl7bGV0IGU9RGF0ZS5VVEModC55ZWFyLHQubW9udGgtMSx0LmRheSx0LmhvdXIsdC5taW51dGUsdC5zZWNvbmQsdC5taWxsaXNlY29uZCk7cmV0dXJuIHQueWVhcjwxMDAmJnQueWVhcj49MCYmKGU9bmV3IERhdGUoZSksZS5zZXRVVENGdWxsWWVhcih0LnllYXIsdC5tb250aC0xLHQuZGF5KSksK2V9ZnVuY3Rpb24gdHModCxlLG4pe3JldHVybi11bihvbih0LDEsZSksbikrZS0xfWZ1bmN0aW9uIFVlKHQsZT00LG49MSl7Y29uc3Qgcj10cyh0LGUsbikscz10cyh0KzEsZSxuKTtyZXR1cm4oa2UodCktcitzKS83fWZ1bmN0aW9uIGhuKHQpe3JldHVybiB0Pjk5P3Q6dD5JLnR3b0RpZ2l0Q3V0b2ZmWWVhcj8xOTAwK3Q6MmUzK3R9ZnVuY3Rpb24gbnModCxlLG4scj1udWxsKXtjb25zdCBzPW5ldyBEYXRlKHQpLGk9e2hvdXJDeWNsZToiaDIzIix5ZWFyOiJudW1lcmljIixtb250aDoiMi1kaWdpdCIsZGF5OiIyLWRpZ2l0Iixob3VyOiIyLWRpZ2l0IixtaW51dGU6IjItZGlnaXQifTtyJiYoaS50aW1lWm9uZT1yKTtjb25zdCBhPXt0aW1lWm9uZU5hbWU6ZSwuLi5pfSxvPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KG4sYSkuZm9ybWF0VG9QYXJ0cyhzKS5maW5kKHU9PnUudHlwZS50b0xvd2VyQ2FzZSgpPT09InRpbWV6b25lbmFtZSIpO3JldHVybiBvP28udmFsdWU6bnVsbH1mdW5jdGlvbiBrdCh0LGUpe2xldCBuPXBhcnNlSW50KHQsMTApO051bWJlci5pc05hTihuKSYmKG49MCk7Y29uc3Qgcj1wYXJzZUludChlLDEwKXx8MCxzPW48MHx8T2JqZWN0LmlzKG4sLTApPy1yOnI7cmV0dXJuIG4qNjArc31mdW5jdGlvbiBycyh0KXtjb25zdCBlPU51bWJlcih0KTtpZih0eXBlb2YgdD09ImJvb2xlYW4ifHx0PT09IiJ8fE51bWJlci5pc05hTihlKSl0aHJvdyBuZXcgXyhgSW52YWxpZCB1bml0IHZhbHVlICR7dH1gKTtyZXR1cm4gZX1mdW5jdGlvbiBJdCh0LGUpe2NvbnN0IG49e307Zm9yKGNvbnN0IHIgaW4gdClpZihiZSh0LHIpKXtjb25zdCBzPXRbcl07aWYocz09bnVsbCljb250aW51ZTtuW2UocildPXJzKHMpfXJldHVybiBufWZ1bmN0aW9uIEhlKHQsZSl7Y29uc3Qgbj1NYXRoLnRydW5jKE1hdGguYWJzKHQvNjApKSxyPU1hdGgudHJ1bmMoTWF0aC5hYnModCU2MCkpLHM9dD49MD8iKyI6Ii0iO3N3aXRjaChlKXtjYXNlInNob3J0IjpyZXR1cm5gJHtzfSR7RShuLDIpfToke0UociwyKX1gO2Nhc2UibmFycm93IjpyZXR1cm5gJHtzfSR7bn0ke3I+MD9gOiR7cn1gOiIifWA7Y2FzZSJ0ZWNoaWUiOnJldHVybmAke3N9JHtFKG4sMil9JHtFKHIsMil9YDtkZWZhdWx0OnRocm93IG5ldyBSYW5nZUVycm9yKGBWYWx1ZSBmb3JtYXQgJHtlfSBpcyBvdXQgb2YgcmFuZ2UgZm9yIHByb3BlcnR5IGZvcm1hdGApfX1mdW5jdGlvbiBFdCh0KXtyZXR1cm4gdGModCxbImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdKX1jb25zdCByYz1bIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc3M9WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXSxzYz1bIkoiLCJGIiwiTSIsIkEiLCJNIiwiSiIsIkoiLCJBIiwiUyIsIk8iLCJOIiwiRCJdO2Z1bmN0aW9uIGlzKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLnNjXTtjYXNlInNob3J0IjpyZXR1cm5bLi4uc3NdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLnJjXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIl07Y2FzZSIyLWRpZ2l0IjpyZXR1cm5bIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjEwIiwiMTEiLCIxMiJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IGFzPVsiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiLCJTdW5kYXkiXSxvcz1bIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCIsIlN1biJdLGljPVsiTSIsIlQiLCJXIiwiVCIsIkYiLCJTIiwiUyJdO2Z1bmN0aW9uIHVzKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLmljXTtjYXNlInNob3J0IjpyZXR1cm5bLi4ub3NdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLmFzXTtjYXNlIm51bWVyaWMiOnJldHVyblsiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyJdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWNvbnN0IGxzPVsiQU0iLCJQTSJdLGFjPVsiQmVmb3JlIENocmlzdCIsIkFubm8gRG9taW5pIl0sb2M9WyJCQyIsIkFEIl0sdWM9WyJCIiwiQSJdO2Z1bmN0aW9uIGNzKHQpe3N3aXRjaCh0KXtjYXNlIm5hcnJvdyI6cmV0dXJuWy4uLnVjXTtjYXNlInNob3J0IjpyZXR1cm5bLi4ub2NdO2Nhc2UibG9uZyI6cmV0dXJuWy4uLmFjXTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBsYyh0KXtyZXR1cm4gbHNbdC5ob3VyPDEyPzA6MV19ZnVuY3Rpb24gY2ModCxlKXtyZXR1cm4gdXMoZSlbdC53ZWVrZGF5LTFdfWZ1bmN0aW9uIGZjKHQsZSl7cmV0dXJuIGlzKGUpW3QubW9udGgtMV19ZnVuY3Rpb24gZGModCxlKXtyZXR1cm4gY3MoZSlbdC55ZWFyPDA/MDoxXX1mdW5jdGlvbiBoYyh0LGUsbj0iYWx3YXlzIixyPSExKXtjb25zdCBzPXt5ZWFyczpbInllYXIiLCJ5ci4iXSxxdWFydGVyczpbInF1YXJ0ZXIiLCJxdHIuIl0sbW9udGhzOlsibW9udGgiLCJtby4iXSx3ZWVrczpbIndlZWsiLCJ3ay4iXSxkYXlzOlsiZGF5IiwiZGF5IiwiZGF5cyJdLGhvdXJzOlsiaG91ciIsImhyLiJdLG1pbnV0ZXM6WyJtaW51dGUiLCJtaW4uIl0sc2Vjb25kczpbInNlY29uZCIsInNlYy4iXX0saT1bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiXS5pbmRleE9mKHQpPT09LTE7aWYobj09PSJhdXRvIiYmaSl7Y29uc3QgZD10PT09ImRheXMiO3N3aXRjaChlKXtjYXNlIDE6cmV0dXJuIGQ/InRvbW9ycm93IjpgbmV4dCAke3NbdF1bMF19YDtjYXNlLTE6cmV0dXJuIGQ/Inllc3RlcmRheSI6YGxhc3QgJHtzW3RdWzBdfWA7Y2FzZSAwOnJldHVybiBkPyJ0b2RheSI6YHRoaXMgJHtzW3RdWzBdfWB9fWNvbnN0IGE9T2JqZWN0LmlzKGUsLTApfHxlPDAsbz1NYXRoLmFicyhlKSx1PW89PT0xLGw9c1t0XSxjPXI/dT9sWzFdOmxbMl18fGxbMV06dT9zW3RdWzBdOnQ7cmV0dXJuIGE/YCR7b30gJHtjfSBhZ29gOmBpbiAke299ICR7Y31gfWZ1bmN0aW9uIGZzKHQsZSl7bGV0IG49IiI7Zm9yKGNvbnN0IHIgb2YgdClyLmxpdGVyYWw/bis9ci52YWw6bis9ZShyLnZhbCk7cmV0dXJuIG59Y29uc3QgbWM9e0Q6eXQsREQ6bXIsREREOnlyLEREREQ6Z3IsdDpwcix0dDp3cix0dHQ6dnIsdHR0dDpPcixUOlRyLFRUOlNyLFRUVDpicixUVFRUOmtyLGY6SXIsZmY6TnIsZmZmOk1yLGZmZmY6RHIsRjpFcixGRjp4cixGRkY6Q3IsRkZGRjpfcn07Y2xhc3MgeHtzdGF0aWMgY3JlYXRlKGUsbj17fSl7cmV0dXJuIG5ldyB4KGUsbil9c3RhdGljIHBhcnNlRm9ybWF0KGUpe2xldCBuPW51bGwscj0iIixzPSExO2NvbnN0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2NvbnN0IG89ZS5jaGFyQXQoYSk7bz09PSInIj8oci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLG49bnVsbCxyPSIiLHM9IXMpOnN8fG89PT1uP3IrPW86KHIubGVuZ3RoPjAmJmkucHVzaCh7bGl0ZXJhbDovXlxzKyQvLnRlc3QociksdmFsOnJ9KSxyPW8sbj1vKX1yZXR1cm4gci5sZW5ndGg+MCYmaS5wdXNoKHtsaXRlcmFsOnN8fC9eXHMrJC8udGVzdChyKSx2YWw6cn0pLGl9c3RhdGljIG1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoZSl7cmV0dXJuIG1jW2VdfWNvbnN0cnVjdG9yKGUsbil7dGhpcy5vcHRzPW4sdGhpcy5sb2M9ZSx0aGlzLnN5c3RlbUxvYz1udWxsfWZvcm1hdFdpdGhTeXN0ZW1EZWZhdWx0KGUsbil7cmV0dXJuIHRoaXMuc3lzdGVtTG9jPT09bnVsbCYmKHRoaXMuc3lzdGVtTG9jPXRoaXMubG9jLnJlZGVmYXVsdFRvU3lzdGVtKCkpLHRoaXMuc3lzdGVtTG9jLmR0Rm9ybWF0dGVyKGUsey4uLnRoaXMub3B0cywuLi5ufSkuZm9ybWF0KCl9ZHRGb3JtYXR0ZXIoZSxuPXt9KXtyZXR1cm4gdGhpcy5sb2MuZHRGb3JtYXR0ZXIoZSx7Li4udGhpcy5vcHRzLC4uLm59KX1mb3JtYXREYXRlVGltZShlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0KCl9Zm9ybWF0RGF0ZVRpbWVQYXJ0cyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikuZm9ybWF0VG9QYXJ0cygpfWZvcm1hdEludGVydmFsKGUsbil7cmV0dXJuIHRoaXMuZHRGb3JtYXR0ZXIoZS5zdGFydCxuKS5kdGYuZm9ybWF0UmFuZ2UoZS5zdGFydC50b0pTRGF0ZSgpLGUuZW5kLnRvSlNEYXRlKCkpfXJlc29sdmVkT3B0aW9ucyhlLG4pe3JldHVybiB0aGlzLmR0Rm9ybWF0dGVyKGUsbikucmVzb2x2ZWRPcHRpb25zKCl9bnVtKGUsbj0wKXtpZih0aGlzLm9wdHMuZm9yY2VTaW1wbGUpcmV0dXJuIEUoZSxuKTtjb25zdCByPXsuLi50aGlzLm9wdHN9O3JldHVybiBuPjAmJihyLnBhZFRvPW4pLHRoaXMubG9jLm51bWJlckZvcm1hdHRlcihyKS5mb3JtYXQoZSl9Zm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj10aGlzLmxvYy5saXN0aW5nTW9kZSgpPT09ImVuIixzPXRoaXMubG9jLm91dHB1dENhbGVuZGFyJiZ0aGlzLmxvYy5vdXRwdXRDYWxlbmRhciE9PSJncmVnb3J5IixpPShoLFMpPT50aGlzLmxvYy5leHRyYWN0KGUsaCxTKSxhPWg9PmUuaXNPZmZzZXRGaXhlZCYmZS5vZmZzZXQ9PT0wJiZoLmFsbG93Wj8iWiI6ZS5pc1ZhbGlkP2Uuem9uZS5mb3JtYXRPZmZzZXQoZS50cyxoLmZvcm1hdCk6IiIsbz0oKT0+cj9sYyhlKTppKHtob3VyOiJudW1lcmljIixob3VyQ3ljbGU6ImgxMiJ9LCJkYXlwZXJpb2QiKSx1PShoLFMpPT5yP2ZjKGUsaCk6aShTP3ttb250aDpofTp7bW9udGg6aCxkYXk6Im51bWVyaWMifSwibW9udGgiKSxsPShoLFMpPT5yP2NjKGUsaCk6aShTP3t3ZWVrZGF5Omh9Ont3ZWVrZGF5OmgsbW9udGg6ImxvbmciLGRheToibnVtZXJpYyJ9LCJ3ZWVrZGF5IiksYz1oPT57Y29uc3QgUz14Lm1hY3JvVG9rZW5Ub0Zvcm1hdE9wdHMoaCk7cmV0dXJuIFM/dGhpcy5mb3JtYXRXaXRoU3lzdGVtRGVmYXVsdChlLFMpOmh9LGQ9aD0+cj9kYyhlLGgpOmkoe2VyYTpofSwiZXJhIikseT1oPT57c3dpdGNoKGgpe2Nhc2UiUyI6cmV0dXJuIHRoaXMubnVtKGUubWlsbGlzZWNvbmQpO2Nhc2UidSI6Y2FzZSJTU1MiOnJldHVybiB0aGlzLm51bShlLm1pbGxpc2Vjb25kLDMpO2Nhc2UicyI6cmV0dXJuIHRoaXMubnVtKGUuc2Vjb25kKTtjYXNlInNzIjpyZXR1cm4gdGhpcy5udW0oZS5zZWNvbmQsMik7Y2FzZSJ1dSI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS5taWxsaXNlY29uZC8xMCksMik7Y2FzZSJ1dXUiOnJldHVybiB0aGlzLm51bShNYXRoLmZsb29yKGUubWlsbGlzZWNvbmQvMTAwKSk7Y2FzZSJtIjpyZXR1cm4gdGhpcy5udW0oZS5taW51dGUpO2Nhc2UibW0iOnJldHVybiB0aGlzLm51bShlLm1pbnV0ZSwyKTtjYXNlImgiOnJldHVybiB0aGlzLm51bShlLmhvdXIlMTI9PT0wPzEyOmUuaG91ciUxMik7Y2FzZSJoaCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciUxMj09PTA/MTI6ZS5ob3VyJTEyLDIpO2Nhc2UiSCI6cmV0dXJuIHRoaXMubnVtKGUuaG91cik7Y2FzZSJISCI6cmV0dXJuIHRoaXMubnVtKGUuaG91ciwyKTtjYXNlIloiOnJldHVybiBhKHtmb3JtYXQ6Im5hcnJvdyIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaIjpyZXR1cm4gYSh7Zm9ybWF0OiJzaG9ydCIsYWxsb3daOnRoaXMub3B0cy5hbGxvd1p9KTtjYXNlIlpaWiI6cmV0dXJuIGEoe2Zvcm1hdDoidGVjaGllIixhbGxvd1o6dGhpcy5vcHRzLmFsbG93Wn0pO2Nhc2UiWlpaWiI6cmV0dXJuIGUuem9uZS5vZmZzZXROYW1lKGUudHMse2Zvcm1hdDoic2hvcnQiLGxvY2FsZTp0aGlzLmxvYy5sb2NhbGV9KTtjYXNlIlpaWlpaIjpyZXR1cm4gZS56b25lLm9mZnNldE5hbWUoZS50cyx7Zm9ybWF0OiJsb25nIixsb2NhbGU6dGhpcy5sb2MubG9jYWxlfSk7Y2FzZSJ6IjpyZXR1cm4gZS56b25lTmFtZTtjYXNlImEiOnJldHVybiBvKCk7Y2FzZSJkIjpyZXR1cm4gcz9pKHtkYXk6Im51bWVyaWMifSwiZGF5Iik6dGhpcy5udW0oZS5kYXkpO2Nhc2UiZGQiOnJldHVybiBzP2koe2RheToiMi1kaWdpdCJ9LCJkYXkiKTp0aGlzLm51bShlLmRheSwyKTtjYXNlImMiOnJldHVybiB0aGlzLm51bShlLndlZWtkYXkpO2Nhc2UiY2NjIjpyZXR1cm4gbCgic2hvcnQiLCEwKTtjYXNlImNjY2MiOnJldHVybiBsKCJsb25nIiwhMCk7Y2FzZSJjY2NjYyI6cmV0dXJuIGwoIm5hcnJvdyIsITApO2Nhc2UiRSI6cmV0dXJuIHRoaXMubnVtKGUud2Vla2RheSk7Y2FzZSJFRUUiOnJldHVybiBsKCJzaG9ydCIsITEpO2Nhc2UiRUVFRSI6cmV0dXJuIGwoImxvbmciLCExKTtjYXNlIkVFRUVFIjpyZXR1cm4gbCgibmFycm93IiwhMSk7Y2FzZSJMIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyIsZGF5OiJudW1lcmljIn0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCk7Y2FzZSJMTCI6cmV0dXJuIHM/aSh7bW9udGg6IjItZGlnaXQiLGRheToibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgsMik7Y2FzZSJMTEwiOnJldHVybiB1KCJzaG9ydCIsITApO2Nhc2UiTExMTCI6cmV0dXJuIHUoImxvbmciLCEwKTtjYXNlIkxMTExMIjpyZXR1cm4gdSgibmFycm93IiwhMCk7Y2FzZSJNIjpyZXR1cm4gcz9pKHttb250aDoibnVtZXJpYyJ9LCJtb250aCIpOnRoaXMubnVtKGUubW9udGgpO2Nhc2UiTU0iOnJldHVybiBzP2koe21vbnRoOiIyLWRpZ2l0In0sIm1vbnRoIik6dGhpcy5udW0oZS5tb250aCwyKTtjYXNlIk1NTSI6cmV0dXJuIHUoInNob3J0IiwhMSk7Y2FzZSJNTU1NIjpyZXR1cm4gdSgibG9uZyIsITEpO2Nhc2UiTU1NTU0iOnJldHVybiB1KCJuYXJyb3ciLCExKTtjYXNlInkiOnJldHVybiBzP2koe3llYXI6Im51bWVyaWMifSwieWVhciIpOnRoaXMubnVtKGUueWVhcik7Y2FzZSJ5eSI6cmV0dXJuIHM/aSh7eWVhcjoiMi1kaWdpdCJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLnRvU3RyaW5nKCkuc2xpY2UoLTIpLDIpO2Nhc2UieXl5eSI6cmV0dXJuIHM/aSh7eWVhcjoibnVtZXJpYyJ9LCJ5ZWFyIik6dGhpcy5udW0oZS55ZWFyLDQpO2Nhc2UieXl5eXl5IjpyZXR1cm4gcz9pKHt5ZWFyOiJudW1lcmljIn0sInllYXIiKTp0aGlzLm51bShlLnllYXIsNik7Y2FzZSJHIjpyZXR1cm4gZCgic2hvcnQiKTtjYXNlIkdHIjpyZXR1cm4gZCgibG9uZyIpO2Nhc2UiR0dHR0ciOnJldHVybiBkKCJuYXJyb3ciKTtjYXNlImtrIjpyZXR1cm4gdGhpcy5udW0oZS53ZWVrWWVhci50b1N0cmluZygpLnNsaWNlKC0yKSwyKTtjYXNlImtra2siOnJldHVybiB0aGlzLm51bShlLndlZWtZZWFyLDQpO2Nhc2UiVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlcik7Y2FzZSJXVyI6cmV0dXJuIHRoaXMubnVtKGUud2Vla051bWJlciwyKTtjYXNlIm4iOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla051bWJlcik7Y2FzZSJubiI6cmV0dXJuIHRoaXMubnVtKGUubG9jYWxXZWVrTnVtYmVyLDIpO2Nhc2UiaWkiOnJldHVybiB0aGlzLm51bShlLmxvY2FsV2Vla1llYXIudG9TdHJpbmcoKS5zbGljZSgtMiksMik7Y2FzZSJpaWlpIjpyZXR1cm4gdGhpcy5udW0oZS5sb2NhbFdlZWtZZWFyLDQpO2Nhc2UibyI6cmV0dXJuIHRoaXMubnVtKGUub3JkaW5hbCk7Y2FzZSJvb28iOnJldHVybiB0aGlzLm51bShlLm9yZGluYWwsMyk7Y2FzZSJxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyKTtjYXNlInFxIjpyZXR1cm4gdGhpcy5udW0oZS5xdWFydGVyLDIpO2Nhc2UiWCI6cmV0dXJuIHRoaXMubnVtKE1hdGguZmxvb3IoZS50cy8xZTMpKTtjYXNlIngiOnJldHVybiB0aGlzLm51bShlLnRzKTtkZWZhdWx0OnJldHVybiBjKGgpfX07cmV0dXJuIGZzKHgucGFyc2VGb3JtYXQobikseSl9Zm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKGUsbil7Y29uc3Qgcj11PT57c3dpdGNoKHVbMF0pe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpyZXR1cm4iaG91ciI7Y2FzZSJkIjpyZXR1cm4iZGF5IjtjYXNlInciOnJldHVybiJ3ZWVrIjtjYXNlIk0iOnJldHVybiJtb250aCI7Y2FzZSJ5IjpyZXR1cm4ieWVhciI7ZGVmYXVsdDpyZXR1cm4gbnVsbH19LHM9dT0+bD0+e2NvbnN0IGM9cihsKTtyZXR1cm4gYz90aGlzLm51bSh1LmdldChjKSxsLmxlbmd0aCk6bH0saT14LnBhcnNlRm9ybWF0KG4pLGE9aS5yZWR1Y2UoKHUse2xpdGVyYWw6bCx2YWw6Y30pPT5sP3U6dS5jb25jYXQoYyksW10pLG89ZS5zaGlmdFRvKC4uLmEubWFwKHIpLmZpbHRlcih1PT51KSk7cmV0dXJuIGZzKGkscyhvKSl9fWNvbnN0IGRzPS9bQS1aYS16XystXXsxLDI1Nn0oPzo6P1wvW0EtWmEtejAtOV8rLV17MSwyNTZ9KD86XC9bQS1aYS16MC05XystXXsxLDI1Nn0pPyk/LztmdW5jdGlvbiBJZSguLi50KXtjb25zdCBlPXQucmVkdWNlKChuLHIpPT5uK3Iuc291cmNlLCIiKTtyZXR1cm4gUmVnRXhwKGBeJHtlfSRgKX1mdW5jdGlvbiBFZSguLi50KXtyZXR1cm4gZT0+dC5yZWR1Y2UoKFtuLHIsc10saSk9Pntjb25zdFthLG8sdV09aShlLHMpO3JldHVyblt7Li4ubiwuLi5hfSxvfHxyLHVdfSxbe30sbnVsbCwxXSkuc2xpY2UoMCwyKX1mdW5jdGlvbiBOZSh0LC4uLmUpe2lmKHQ9PW51bGwpcmV0dXJuW251bGwsbnVsbF07Zm9yKGNvbnN0W24scl1vZiBlKXtjb25zdCBzPW4uZXhlYyh0KTtpZihzKXJldHVybiByKHMpfXJldHVybltudWxsLG51bGxdfWZ1bmN0aW9uIGhzKC4uLnQpe3JldHVybihlLG4pPT57Y29uc3Qgcj17fTtsZXQgcztmb3Iocz0wO3M8dC5sZW5ndGg7cysrKXJbdFtzXV09cmUoZVtuK3NdKTtyZXR1cm5bcixudWxsLG4rc119fWNvbnN0IG1zPS8oPzooWil8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8pLyx5Yz1gKD86JHttcy5zb3VyY2V9Pyg/OlxcWygke2RzLnNvdXJjZX0pXFxdKT8pP2AsbW49LyhcZFxkKSg/Ojo/KFxkXGQpKD86Oj8oXGRcZCkoPzpbLixdKFxkezEsMzB9KSk/KT8pPy8seXM9UmVnRXhwKGAke21uLnNvdXJjZX0ke3ljfWApLHluPVJlZ0V4cChgKD86VCR7eXMuc291cmNlfSk/YCksZ2M9LyhbKy1dXGR7Nn18XGR7NH0pKD86LT8oXGRcZCkoPzotPyhcZFxkKSk/KT8vLHBjPS8oXGR7NH0pLT9XKFxkXGQpKD86LT8oXGQpKT8vLHdjPS8oXGR7NH0pLT8oXGR7M30pLyx2Yz1ocygid2Vla1llYXIiLCJ3ZWVrTnVtYmVyIiwid2Vla0RheSIpLE9jPWhzKCJ5ZWFyIiwib3JkaW5hbCIpLFRjPS8oXGR7NH0pLShcZFxkKS0oXGRcZCkvLGdzPVJlZ0V4cChgJHttbi5zb3VyY2V9ID8oPzoke21zLnNvdXJjZX18KCR7ZHMuc291cmNlfSkpP2ApLFNjPVJlZ0V4cChgKD86ICR7Z3Muc291cmNlfSk/YCk7ZnVuY3Rpb24geGUodCxlLG4pe2NvbnN0IHI9dFtlXTtyZXR1cm4gZyhyKT9uOnJlKHIpfWZ1bmN0aW9uIGJjKHQsZSl7cmV0dXJuW3t5ZWFyOnhlKHQsZSksbW9udGg6eGUodCxlKzEsMSksZGF5OnhlKHQsZSsyLDEpfSxudWxsLGUrM119ZnVuY3Rpb24gTWUodCxlKXtyZXR1cm5be2hvdXJzOnhlKHQsZSwwKSxtaW51dGVzOnhlKHQsZSsxLDApLHNlY29uZHM6eGUodCxlKzIsMCksbWlsbGlzZWNvbmRzOmZuKHRbZSszXSl9LG51bGwsZSs0XX1mdW5jdGlvbiBxZSh0LGUpe2NvbnN0IG49IXRbZV0mJiF0W2UrMV0scj1rdCh0W2UrMV0sdFtlKzJdKSxzPW4/bnVsbDpELmluc3RhbmNlKHIpO3JldHVyblt7fSxzLGUrM119ZnVuY3Rpb24gWWUodCxlKXtjb25zdCBuPXRbZV0/Si5jcmVhdGUodFtlXSk6bnVsbDtyZXR1cm5be30sbixlKzFdfWNvbnN0IGtjPVJlZ0V4cChgXlQ/JHttbi5zb3VyY2V9JGApLEljPS9eLT9QKD86KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pWSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pTSk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pVyk/KD86KC0/XGR7MSwyMH0oPzpcLlxkezEsMjB9KT8pRCk/KD86VCg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KUgpPyg/OigtP1xkezEsMjB9KD86XC5cZHsxLDIwfSk/KU0pPyg/OigtP1xkezEsMjB9KSg/OlsuLF0oLT9cZHsxLDIwfSkpP1MpPyk/KSQvO2Z1bmN0aW9uIEVjKHQpe2NvbnN0W2UsbixyLHMsaSxhLG8sdSxsXT10LGM9ZVswXT09PSItIixkPXUmJnVbMF09PT0iLSIseT0oaCxTPSExKT0+aCE9PXZvaWQgMCYmKFN8fGgmJmMpPy1oOmg7cmV0dXJuW3t5ZWFyczp5KGZlKG4pKSxtb250aHM6eShmZShyKSksd2Vla3M6eShmZShzKSksZGF5czp5KGZlKGkpKSxob3Vyczp5KGZlKGEpKSxtaW51dGVzOnkoZmUobykpLHNlY29uZHM6eShmZSh1KSx1PT09Ii0wIiksbWlsbGlzZWNvbmRzOnkoZm4obCksZCl9XX1jb25zdCBOYz17R01UOjAsRURUOi00KjYwLEVTVDotNSo2MCxDRFQ6LTUqNjAsQ1NUOi02KjYwLE1EVDotNio2MCxNU1Q6LTcqNjAsUERUOi03KjYwLFBTVDotOCo2MH07ZnVuY3Rpb24gZ24odCxlLG4scixzLGksYSl7Y29uc3Qgbz17eWVhcjplLmxlbmd0aD09PTI/aG4ocmUoZSkpOnJlKGUpLG1vbnRoOnNzLmluZGV4T2YobikrMSxkYXk6cmUociksaG91cjpyZShzKSxtaW51dGU6cmUoaSl9O3JldHVybiBhJiYoby5zZWNvbmQ9cmUoYSkpLHQmJihvLndlZWtkYXk9dC5sZW5ndGg+Mz9hcy5pbmRleE9mKHQpKzE6b3MuaW5kZXhPZih0KSsxKSxvfWNvbnN0IHhjPS9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksXHMpPyhcZHsxLDJ9KVxzKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKVxzKFxkezIsNH0pXHMoXGRcZCk6KFxkXGQpKD86OihcZFxkKSk/XHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KD86KFsrLV1cZFxkKShcZFxkKSkpJC87ZnVuY3Rpb24gTWModCl7Y29uc3RbLGUsbixyLHMsaSxhLG8sdSxsLGMsZF09dCx5PWduKGUscyxyLG4saSxhLG8pO2xldCBoO3JldHVybiB1P2g9TmNbdV06bD9oPTA6aD1rdChjLGQpLFt5LG5ldyBEKGgpXX1mdW5jdGlvbiBDYyh0KXtyZXR1cm4gdC5yZXBsYWNlKC9cKFteKCldKlwpfFtcblx0XS9nLCIgIikucmVwbGFjZSgvKFxzXHMrKS9nLCIgIikudHJpbSgpfWNvbnN0IERjPS9eKE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksIChcZFxkKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpIChcZHs0fSkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sX2M9L14oTW9uZGF5fFR1ZXNkYXl8V2VkbmVzZGF5fFRodXJzZGF5fEZyaWRheXxTYXR1cmRheXxTdW5kYXkpLCAoXGRcZCktKEphbnxGZWJ8TWFyfEFwcnxNYXl8SnVufEp1bHxBdWd8U2VwfE9jdHxOb3Z8RGVjKS0oXGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgR01UJC8sRmM9L14oTW9ufFR1ZXxXZWR8VGh1fEZyaXxTYXR8U3VuKSAoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpICggXGR8XGRcZCkgKFxkXGQpOihcZFxkKTooXGRcZCkgKFxkezR9KSQvO2Z1bmN0aW9uIHBzKHQpe2NvbnN0WyxlLG4scixzLGksYSxvXT10O3JldHVybltnbihlLHMscixuLGksYSxvKSxELnV0Y0luc3RhbmNlXX1mdW5jdGlvbiBBYyh0KXtjb25zdFssZSxuLHIscyxpLGEsb109dDtyZXR1cm5bZ24oZSxvLG4scixzLGksYSksRC51dGNJbnN0YW5jZV19Y29uc3QgVmM9SWUoZ2MseW4pLFdjPUllKHBjLHluKSwkYz1JZSh3Yyx5biksTGM9SWUoeXMpLHdzPUVlKGJjLE1lLHFlLFllKSx6Yz1FZSh2YyxNZSxxZSxZZSksWmM9RWUoT2MsTWUscWUsWWUpLFJjPUVlKE1lLHFlLFllKTtmdW5jdGlvbiBQYyh0KXtyZXR1cm4gTmUodCxbVmMsd3NdLFtXYyx6Y10sWyRjLFpjXSxbTGMsUmNdKX1mdW5jdGlvbiBqYyh0KXtyZXR1cm4gTmUoQ2ModCksW3hjLE1jXSl9ZnVuY3Rpb24gVWModCl7cmV0dXJuIE5lKHQsW0RjLHBzXSxbX2MscHNdLFtGYyxBY10pfWZ1bmN0aW9uIEhjKHQpe3JldHVybiBOZSh0LFtJYyxFY10pfWNvbnN0IHFjPUVlKE1lKTtmdW5jdGlvbiBZYyh0KXtyZXR1cm4gTmUodCxba2MscWNdKX1jb25zdCBHYz1JZShUYyxTYyksSmM9SWUoZ3MpLEJjPUVlKE1lLHFlLFllKTtmdW5jdGlvbiBRYyh0KXtyZXR1cm4gTmUodCxbR2Msd3NdLFtKYyxCY10pfWNvbnN0IHZzPSJJbnZhbGlkIER1cmF0aW9uIixPcz17d2Vla3M6e2RheXM6Nyxob3Vyczo3KjI0LG1pbnV0ZXM6NyoyNCo2MCxzZWNvbmRzOjcqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOjcqMjQqNjAqNjAqMWUzfSxkYXlzOntob3VyczoyNCxtaW51dGVzOjI0KjYwLHNlY29uZHM6MjQqNjAqNjAsbWlsbGlzZWNvbmRzOjI0KjYwKjYwKjFlM30saG91cnM6e21pbnV0ZXM6NjAsc2Vjb25kczo2MCo2MCxtaWxsaXNlY29uZHM6NjAqNjAqMWUzfSxtaW51dGVzOntzZWNvbmRzOjYwLG1pbGxpc2Vjb25kczo2MCoxZTN9LHNlY29uZHM6e21pbGxpc2Vjb25kczoxZTN9fSxLYz17eWVhcnM6e3F1YXJ0ZXJzOjQsbW9udGhzOjEyLHdlZWtzOjUyLGRheXM6MzY1LGhvdXJzOjM2NSoyNCxtaW51dGVzOjM2NSoyNCo2MCxzZWNvbmRzOjM2NSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzY1KjI0KjYwKjYwKjFlM30scXVhcnRlcnM6e21vbnRoczozLHdlZWtzOjEzLGRheXM6OTEsaG91cnM6OTEqMjQsbWludXRlczo5MSoyNCo2MCxzZWNvbmRzOjkxKjI0KjYwKjYwLG1pbGxpc2Vjb25kczo5MSoyNCo2MCo2MCoxZTN9LG1vbnRoczp7d2Vla3M6NCxkYXlzOjMwLGhvdXJzOjMwKjI0LG1pbnV0ZXM6MzAqMjQqNjAsc2Vjb25kczozMCoyNCo2MCo2MCxtaWxsaXNlY29uZHM6MzAqMjQqNjAqNjAqMWUzfSwuLi5Pc30sTD0xNDYwOTcvNDAwLENlPTE0NjA5Ny80ODAwLFhjPXt5ZWFyczp7cXVhcnRlcnM6NCxtb250aHM6MTIsd2Vla3M6TC83LGRheXM6TCxob3VyczpMKjI0LG1pbnV0ZXM6TCoyNCo2MCxzZWNvbmRzOkwqMjQqNjAqNjAsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzfSxxdWFydGVyczp7bW9udGhzOjMsd2Vla3M6TC8yOCxkYXlzOkwvNCxob3VyczpMKjI0LzQsbWludXRlczpMKjI0KjYwLzQsc2Vjb25kczpMKjI0KjYwKjYwLzQsbWlsbGlzZWNvbmRzOkwqMjQqNjAqNjAqMWUzLzR9LG1vbnRoczp7d2Vla3M6Q2UvNyxkYXlzOkNlLGhvdXJzOkNlKjI0LG1pbnV0ZXM6Q2UqMjQqNjAsc2Vjb25kczpDZSoyNCo2MCo2MCxtaWxsaXNlY29uZHM6Q2UqMjQqNjAqNjAqMWUzfSwuLi5Pc30sZGU9WyJ5ZWFycyIsInF1YXJ0ZXJzIiwibW9udGhzIiwid2Vla3MiLCJkYXlzIiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsIm1pbGxpc2Vjb25kcyJdLGVmPWRlLnNsaWNlKDApLnJldmVyc2UoKTtmdW5jdGlvbiBzZSh0LGUsbj0hMSl7Y29uc3Qgcj17dmFsdWVzOm4/ZS52YWx1ZXM6ey4uLnQudmFsdWVzLC4uLmUudmFsdWVzfHx7fX0sbG9jOnQubG9jLmNsb25lKGUubG9jKSxjb252ZXJzaW9uQWNjdXJhY3k6ZS5jb252ZXJzaW9uQWNjdXJhY3l8fHQuY29udmVyc2lvbkFjY3VyYWN5LG1hdHJpeDplLm1hdHJpeHx8dC5tYXRyaXh9O3JldHVybiBuZXcgdihyKX1mdW5jdGlvbiBUcyh0LGUpe2xldCBuPWUubWlsbGlzZWNvbmRzPz8wO2Zvcihjb25zdCByIG9mIGVmLnNsaWNlKDEpKWVbcl0mJihuKz1lW3JdKnRbcl0ubWlsbGlzZWNvbmRzKTtyZXR1cm4gbn1mdW5jdGlvbiBTcyh0LGUpe2NvbnN0IG49VHModCxlKTwwPy0xOjE7ZGUucmVkdWNlUmlnaHQoKHIscyk9PntpZihnKGVbc10pKXJldHVybiByO2lmKHIpe2NvbnN0IGk9ZVtyXSpuLGE9dFtzXVtyXSxvPU1hdGguZmxvb3IoaS9hKTtlW3NdKz1vKm4sZVtyXS09byphKm59cmV0dXJuIHN9LG51bGwpLGRlLnJlZHVjZSgocixzKT0+e2lmKGcoZVtzXSkpcmV0dXJuIHI7aWYocil7Y29uc3QgaT1lW3JdJTE7ZVtyXS09aSxlW3NdKz1pKnRbcl1bc119cmV0dXJuIHN9LG51bGwpfWZ1bmN0aW9uIHRmKHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyh0KSlyIT09MCYmKGVbbl09cik7cmV0dXJuIGV9Y2xhc3Mgdntjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuY29udmVyc2lvbkFjY3VyYWN5PT09Imxvbmd0ZXJtInx8ITE7bGV0IHI9bj9YYzpLYztlLm1hdHJpeCYmKHI9ZS5tYXRyaXgpLHRoaXMudmFsdWVzPWUudmFsdWVzLHRoaXMubG9jPWUubG9jfHxULmNyZWF0ZSgpLHRoaXMuY29udmVyc2lvbkFjY3VyYWN5PW4/Imxvbmd0ZXJtIjoiY2FzdWFsIix0aGlzLmludmFsaWQ9ZS5pbnZhbGlkfHxudWxsLHRoaXMubWF0cml4PXIsdGhpcy5pc0x1eG9uRHVyYXRpb249ITB9c3RhdGljIGZyb21NaWxsaXMoZSxuKXtyZXR1cm4gdi5mcm9tT2JqZWN0KHttaWxsaXNlY29uZHM6ZX0sbil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtpZihlPT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IF8oYER1cmF0aW9uLmZyb21PYmplY3Q6IGFyZ3VtZW50IGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCwgZ290ICR7ZT09PW51bGw/Im51bGwiOnR5cGVvZiBlfWApO3JldHVybiBuZXcgdih7dmFsdWVzOkl0KGUsdi5ub3JtYWxpemVVbml0KSxsb2M6VC5mcm9tT2JqZWN0KG4pLGNvbnZlcnNpb25BY2N1cmFjeTpuLmNvbnZlcnNpb25BY2N1cmFjeSxtYXRyaXg6bi5tYXRyaXh9KX1zdGF0aWMgZnJvbUR1cmF0aW9uTGlrZShlKXtpZihjZShlKSlyZXR1cm4gdi5mcm9tTWlsbGlzKGUpO2lmKHYuaXNEdXJhdGlvbihlKSlyZXR1cm4gZTtpZih0eXBlb2YgZT09Im9iamVjdCIpcmV0dXJuIHYuZnJvbU9iamVjdChlKTt0aHJvdyBuZXcgXyhgVW5rbm93biBkdXJhdGlvbiBhcmd1bWVudCAke2V9IG9mIHR5cGUgJHt0eXBlb2YgZX1gKX1zdGF0aWMgZnJvbUlTTyhlLG4pe2NvbnN0W3JdPUhjKGUpO3JldHVybiByP3YuZnJvbU9iamVjdChyLG4pOnYuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGZyb21JU09UaW1lKGUsbil7Y29uc3Rbcl09WWMoZSk7cmV0dXJuIHI/di5mcm9tT2JqZWN0KHIsbik6di5pbnZhbGlkKCJ1bnBhcnNhYmxlIixgdGhlIGlucHV0ICIke2V9IiBjYW4ndCBiZSBwYXJzZWQgYXMgSVNPIDg2MDFgKX1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IF8oIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRHVyYXRpb24gaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIFo/ZTpuZXcgWihlLG4pO2lmKEkudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IHhsKHIpO3JldHVybiBuZXcgdih7aW52YWxpZDpyfSl9c3RhdGljIG5vcm1hbGl6ZVVuaXQoZSl7Y29uc3Qgbj17eWVhcjoieWVhcnMiLHllYXJzOiJ5ZWFycyIscXVhcnRlcjoicXVhcnRlcnMiLHF1YXJ0ZXJzOiJxdWFydGVycyIsbW9udGg6Im1vbnRocyIsbW9udGhzOiJtb250aHMiLHdlZWs6IndlZWtzIix3ZWVrczoid2Vla3MiLGRheToiZGF5cyIsZGF5czoiZGF5cyIsaG91cjoiaG91cnMiLGhvdXJzOiJob3VycyIsbWludXRlOiJtaW51dGVzIixtaW51dGVzOiJtaW51dGVzIixzZWNvbmQ6InNlY29uZHMiLHNlY29uZHM6InNlY29uZHMiLG1pbGxpc2Vjb25kOiJtaWxsaXNlY29uZHMiLG1pbGxpc2Vjb25kczoibWlsbGlzZWNvbmRzIn1bZSYmZS50b0xvd2VyQ2FzZSgpXTtpZighbil0aHJvdyBuZXcgaHIoZSk7cmV0dXJuIG59c3RhdGljIGlzRHVyYXRpb24oZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkR1cmF0aW9ufHwhMX1nZXQgbG9jYWxlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5sb2NhbGU6bnVsbH1nZXQgbnVtYmVyaW5nU3lzdGVtKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW06bnVsbH10b0Zvcm1hdChlLG49e30pe2NvbnN0IHI9ey4uLm4sZmxvb3I6bi5yb3VuZCE9PSExJiZuLmZsb29yIT09ITF9O3JldHVybiB0aGlzLmlzVmFsaWQ/eC5jcmVhdGUodGhpcy5sb2MscikuZm9ybWF0RHVyYXRpb25Gcm9tU3RyaW5nKHRoaXMsZSk6dnN9dG9IdW1hbihlPXt9KXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB2cztjb25zdCBuPWRlLm1hcChyPT57Y29uc3Qgcz10aGlzLnZhbHVlc1tyXTtyZXR1cm4gZyhzKT9udWxsOnRoaXMubG9jLm51bWJlckZvcm1hdHRlcih7c3R5bGU6InVuaXQiLHVuaXREaXNwbGF5OiJsb25nIiwuLi5lLHVuaXQ6ci5zbGljZSgwLC0xKX0pLmZvcm1hdChzKX0pLmZpbHRlcihyPT5yKTtyZXR1cm4gdGhpcy5sb2MubGlzdEZvcm1hdHRlcih7dHlwZToiY29uanVuY3Rpb24iLHN0eWxlOmUubGlzdFN0eWxlfHwibmFycm93IiwuLi5lfSkuZm9ybWF0KG4pfXRvT2JqZWN0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD97Li4udGhpcy52YWx1ZXN9Ont9fXRvSVNPKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gbnVsbDtsZXQgZT0iUCI7cmV0dXJuIHRoaXMueWVhcnMhPT0wJiYoZSs9dGhpcy55ZWFycysiWSIpLCh0aGlzLm1vbnRocyE9PTB8fHRoaXMucXVhcnRlcnMhPT0wKSYmKGUrPXRoaXMubW9udGhzK3RoaXMucXVhcnRlcnMqMysiTSIpLHRoaXMud2Vla3MhPT0wJiYoZSs9dGhpcy53ZWVrcysiVyIpLHRoaXMuZGF5cyE9PTAmJihlKz10aGlzLmRheXMrIkQiKSwodGhpcy5ob3VycyE9PTB8fHRoaXMubWludXRlcyE9PTB8fHRoaXMuc2Vjb25kcyE9PTB8fHRoaXMubWlsbGlzZWNvbmRzIT09MCkmJihlKz0iVCIpLHRoaXMuaG91cnMhPT0wJiYoZSs9dGhpcy5ob3VycysiSCIpLHRoaXMubWludXRlcyE9PTAmJihlKz10aGlzLm1pbnV0ZXMrIk0iKSwodGhpcy5zZWNvbmRzIT09MHx8dGhpcy5taWxsaXNlY29uZHMhPT0wKSYmKGUrPWRuKHRoaXMuc2Vjb25kcyt0aGlzLm1pbGxpc2Vjb25kcy8xZTMsMykrIlMiKSxlPT09IlAiJiYoZSs9IlQwUyIpLGV9dG9JU09UaW1lKGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3Qgbj10aGlzLnRvTWlsbGlzKCk7cmV0dXJuIG48MHx8bj49ODY0ZTU/bnVsbDooZT17c3VwcHJlc3NNaWxsaXNlY29uZHM6ITEsc3VwcHJlc3NTZWNvbmRzOiExLGluY2x1ZGVQcmVmaXg6ITEsZm9ybWF0OiJleHRlbmRlZCIsLi4uZSxpbmNsdWRlT2Zmc2V0OiExfSxwLmZyb21NaWxsaXMobix7em9uZToiVVRDIn0pLnRvSVNPVGltZShlKSl9dG9KU09OKCl7cmV0dXJuIHRoaXMudG9JU08oKX10b1N0cmluZygpe3JldHVybiB0aGlzLnRvSVNPKCl9W1N5bWJvbC5mb3IoIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tIildKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gRHVyYXRpb24geyB2YWx1ZXM6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZXMpfSB9YDpgRHVyYXRpb24geyBJbnZhbGlkLCByZWFzb246ICR7dGhpcy5pbnZhbGlkUmVhc29ufSB9YH10b01pbGxpcygpe3JldHVybiB0aGlzLmlzVmFsaWQ/VHModGhpcy5tYXRyaXgsdGhpcy52YWx1ZXMpOk5hTn12YWx1ZU9mKCl7cmV0dXJuIHRoaXMudG9NaWxsaXMoKX1wbHVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj12LmZyb21EdXJhdGlvbkxpa2UoZSkscj17fTtmb3IoY29uc3QgcyBvZiBkZSkoYmUobi52YWx1ZXMscyl8fGJlKHRoaXMudmFsdWVzLHMpKSYmKHJbc109bi5nZXQocykrdGhpcy5nZXQocykpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6cn0sITApfW1pbnVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj12LmZyb21EdXJhdGlvbkxpa2UoZSk7cmV0dXJuIHRoaXMucGx1cyhuLm5lZ2F0ZSgpKX1tYXBVbml0cyhlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49e307Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmtleXModGhpcy52YWx1ZXMpKW5bcl09cnMoZSh0aGlzLnZhbHVlc1tyXSxyKSk7cmV0dXJuIHNlKHRoaXMse3ZhbHVlczpufSwhMCl9Z2V0KGUpe3JldHVybiB0aGlzW3Yubm9ybWFsaXplVW5pdChlKV19c2V0KGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj17Li4udGhpcy52YWx1ZXMsLi4uSXQoZSx2Lm5vcm1hbGl6ZVVuaXQpfTtyZXR1cm4gc2UodGhpcyx7dmFsdWVzOm59KX1yZWNvbmZpZ3VyZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sY29udmVyc2lvbkFjY3VyYWN5OnIsbWF0cml4OnN9PXt9KXtjb25zdCBhPXtsb2M6dGhpcy5sb2MuY2xvbmUoe2xvY2FsZTplLG51bWJlcmluZ1N5c3RlbTpufSksbWF0cml4OnMsY29udmVyc2lvbkFjY3VyYWN5OnJ9O3JldHVybiBzZSh0aGlzLGEpfWFzKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKGUpLmdldChlKTpOYU59bm9ybWFsaXplKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPXRoaXMudG9PYmplY3QoKTtyZXR1cm4gU3ModGhpcy5tYXRyaXgsZSksc2UodGhpcyx7dmFsdWVzOmV9LCEwKX1yZXNjYWxlKCl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCBlPXRmKHRoaXMubm9ybWFsaXplKCkuc2hpZnRUb0FsbCgpLnRvT2JqZWN0KCkpO3JldHVybiBzZSh0aGlzLHt2YWx1ZXM6ZX0sITApfXNoaWZ0VG8oLi4uZSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztpZihlLmxlbmd0aD09PTApcmV0dXJuIHRoaXM7ZT1lLm1hcChhPT52Lm5vcm1hbGl6ZVVuaXQoYSkpO2NvbnN0IG49e30scj17fSxzPXRoaXMudG9PYmplY3QoKTtsZXQgaTtmb3IoY29uc3QgYSBvZiBkZSlpZihlLmluZGV4T2YoYSk+PTApe2k9YTtsZXQgbz0wO2Zvcihjb25zdCBsIGluIHIpbys9dGhpcy5tYXRyaXhbbF1bYV0qcltsXSxyW2xdPTA7Y2Uoc1thXSkmJihvKz1zW2FdKTtjb25zdCB1PU1hdGgudHJ1bmMobyk7blthXT11LHJbYV09KG8qMWUzLXUqMWUzKS8xZTN9ZWxzZSBjZShzW2FdKSYmKHJbYV09c1thXSk7Zm9yKGNvbnN0IGEgaW4gcilyW2FdIT09MCYmKG5baV0rPWE9PT1pP3JbYV06clthXS90aGlzLm1hdHJpeFtpXVthXSk7cmV0dXJuIFNzKHRoaXMubWF0cml4LG4pLHNlKHRoaXMse3ZhbHVlczpufSwhMCl9c2hpZnRUb0FsbCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5zaGlmdFRvKCJ5ZWFycyIsIm1vbnRocyIsIndlZWtzIiwiZGF5cyIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiKTp0aGlzfW5lZ2F0ZSgpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3QgZT17fTtmb3IoY29uc3QgbiBvZiBPYmplY3Qua2V5cyh0aGlzLnZhbHVlcykpZVtuXT10aGlzLnZhbHVlc1tuXT09PTA/MDotdGhpcy52YWx1ZXNbbl07cmV0dXJuIHNlKHRoaXMse3ZhbHVlczplfSwhMCl9Z2V0IHllYXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy55ZWFyc3x8MDpOYU59Z2V0IHF1YXJ0ZXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5xdWFydGVyc3x8MDpOYU59Z2V0IG1vbnRocygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMubW9udGhzfHwwOk5hTn1nZXQgd2Vla3MoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLndlZWtzfHwwOk5hTn1nZXQgZGF5cygpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy52YWx1ZXMuZGF5c3x8MDpOYU59Z2V0IGhvdXJzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5ob3Vyc3x8MDpOYU59Z2V0IG1pbnV0ZXMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudmFsdWVzLm1pbnV0ZXN8fDA6TmFOfWdldCBzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5zZWNvbmRzfHwwOk5hTn1nZXQgbWlsbGlzZWNvbmRzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnZhbHVlcy5taWxsaXNlY29uZHN8fDA6TmFOfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZD09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1lcXVhbHMoZSl7aWYoIXRoaXMuaXNWYWxpZHx8IWUuaXNWYWxpZHx8IXRoaXMubG9jLmVxdWFscyhlLmxvYykpcmV0dXJuITE7ZnVuY3Rpb24gbihyLHMpe3JldHVybiByPT09dm9pZCAwfHxyPT09MD9zPT09dm9pZCAwfHxzPT09MDpyPT09c31mb3IoY29uc3QgciBvZiBkZSlpZighbih0aGlzLnZhbHVlc1tyXSxlLnZhbHVlc1tyXSkpcmV0dXJuITE7cmV0dXJuITB9fWNvbnN0IERlPSJJbnZhbGlkIEludGVydmFsIjtmdW5jdGlvbiBuZih0LGUpe3JldHVybiF0fHwhdC5pc1ZhbGlkP2suaW52YWxpZCgibWlzc2luZyBvciBpbnZhbGlkIHN0YXJ0Iik6IWV8fCFlLmlzVmFsaWQ/ay5pbnZhbGlkKCJtaXNzaW5nIG9yIGludmFsaWQgZW5kIik6ZTx0P2suaW52YWxpZCgiZW5kIGJlZm9yZSBzdGFydCIsYFRoZSBlbmQgb2YgYW4gaW50ZXJ2YWwgbXVzdCBiZSBhZnRlciBpdHMgc3RhcnQsIGJ1dCB5b3UgaGFkIHN0YXJ0PSR7dC50b0lTTygpfSBhbmQgZW5kPSR7ZS50b0lTTygpfWApOm51bGx9Y2xhc3Mga3tjb25zdHJ1Y3RvcihlKXt0aGlzLnM9ZS5zdGFydCx0aGlzLmU9ZS5lbmQsdGhpcy5pbnZhbGlkPWUuaW52YWxpZHx8bnVsbCx0aGlzLmlzTHV4b25JbnRlcnZhbD0hMH1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IF8oIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgSW50ZXJ2YWwgaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIFo/ZTpuZXcgWihlLG4pO2lmKEkudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IE5sKHIpO3JldHVybiBuZXcgayh7aW52YWxpZDpyfSl9c3RhdGljIGZyb21EYXRlVGltZXMoZSxuKXtjb25zdCByPUplKGUpLHM9SmUobiksaT1uZihyLHMpO3JldHVybiBpPz9uZXcgayh7c3RhcnQ6cixlbmQ6c30pfXN0YXRpYyBhZnRlcihlLG4pe2NvbnN0IHI9di5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SmUoZSk7cmV0dXJuIGsuZnJvbURhdGVUaW1lcyhzLHMucGx1cyhyKSl9c3RhdGljIGJlZm9yZShlLG4pe2NvbnN0IHI9di5mcm9tRHVyYXRpb25MaWtlKG4pLHM9SmUoZSk7cmV0dXJuIGsuZnJvbURhdGVUaW1lcyhzLm1pbnVzKHIpLHMpfXN0YXRpYyBmcm9tSVNPKGUsbil7Y29uc3RbcixzXT0oZXx8IiIpLnNwbGl0KCIvIiwyKTtpZihyJiZzKXtsZXQgaSxhO3RyeXtpPXAuZnJvbUlTTyhyLG4pLGE9aS5pc1ZhbGlkfWNhdGNoe2E9ITF9bGV0IG8sdTt0cnl7bz1wLmZyb21JU08ocyxuKSx1PW8uaXNWYWxpZH1jYXRjaHt1PSExfWlmKGEmJnUpcmV0dXJuIGsuZnJvbURhdGVUaW1lcyhpLG8pO2lmKGEpe2NvbnN0IGw9di5mcm9tSVNPKHMsbik7aWYobC5pc1ZhbGlkKXJldHVybiBrLmFmdGVyKGksbCl9ZWxzZSBpZih1KXtjb25zdCBsPXYuZnJvbUlTTyhyLG4pO2lmKGwuaXNWYWxpZClyZXR1cm4gay5iZWZvcmUobyxsKX19cmV0dXJuIGsuaW52YWxpZCgidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtlfSIgY2FuJ3QgYmUgcGFyc2VkIGFzIElTTyA4NjAxYCl9c3RhdGljIGlzSW50ZXJ2YWwoZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkludGVydmFsfHwhMX1nZXQgc3RhcnQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczpudWxsfWdldCBlbmQoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTpudWxsfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZFJlYXNvbj09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1sZW5ndGgoZT0ibWlsbGlzZWNvbmRzIil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnRvRHVyYXRpb24oZSkuZ2V0KGUpOk5hTn1jb3VudChlPSJtaWxsaXNlY29uZHMiLG4pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIE5hTjtjb25zdCByPXRoaXMuc3RhcnQuc3RhcnRPZihlLG4pO2xldCBzO3JldHVybiBuIT1udWxsJiZuLnVzZUxvY2FsZVdlZWtzP3M9dGhpcy5lbmQucmVjb25maWd1cmUoe2xvY2FsZTpyLmxvY2FsZX0pOnM9dGhpcy5lbmQscz1zLnN0YXJ0T2YoZSxuKSxNYXRoLmZsb29yKHMuZGlmZihyLGUpLmdldChlKSkrKHMudmFsdWVPZigpIT09dGhpcy5lbmQudmFsdWVPZigpKX1oYXNTYW1lKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5pc0VtcHR5KCl8fHRoaXMuZS5taW51cygxKS5oYXNTYW1lKHRoaXMucyxlKTohMX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMucy52YWx1ZU9mKCk9PT10aGlzLmUudmFsdWVPZigpfWlzQWZ0ZXIoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM+ZTohMX1pc0JlZm9yZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuZTw9ZTohMX1jb250YWlucyhlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuczw9ZSYmdGhpcy5lPmU6ITF9c2V0KHtzdGFydDplLGVuZDpufT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9rLmZyb21EYXRlVGltZXMoZXx8dGhpcy5zLG58fHRoaXMuZSk6dGhpc31zcGxpdEF0KC4uLmUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuW107Y29uc3Qgbj1lLm1hcChKZSkuZmlsdGVyKGE9PnRoaXMuY29udGFpbnMoYSkpLnNvcnQoKGEsbyk9PmEudG9NaWxsaXMoKS1vLnRvTWlsbGlzKCkpLHI9W107bGV0e3N9PXRoaXMsaT0wO2Zvcig7czx0aGlzLmU7KXtjb25zdCBhPW5baV18fHRoaXMuZSxvPSthPit0aGlzLmU/dGhpcy5lOmE7ci5wdXNoKGsuZnJvbURhdGVUaW1lcyhzLG8pKSxzPW8saSs9MX1yZXR1cm4gcn1zcGxpdEJ5KGUpe2NvbnN0IG49di5mcm9tRHVyYXRpb25MaWtlKGUpO2lmKCF0aGlzLmlzVmFsaWR8fCFuLmlzVmFsaWR8fG4uYXMoIm1pbGxpc2Vjb25kcyIpPT09MClyZXR1cm5bXTtsZXR7czpyfT10aGlzLHM9MSxpO2NvbnN0IGE9W107Zm9yKDtyPHRoaXMuZTspe2NvbnN0IG89dGhpcy5zdGFydC5wbHVzKG4ubWFwVW5pdHModT0+dSpzKSk7aT0rbz4rdGhpcy5lP3RoaXMuZTpvLGEucHVzaChrLmZyb21EYXRlVGltZXMocixpKSkscj1pLHMrPTF9cmV0dXJuIGF9ZGl2aWRlRXF1YWxseShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuc3BsaXRCeSh0aGlzLmxlbmd0aCgpL2UpLnNsaWNlKDAsZSk6W119b3ZlcmxhcHMoZSl7cmV0dXJuIHRoaXMuZT5lLnMmJnRoaXMuczxlLmV9YWJ1dHNTdGFydChlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkPyt0aGlzLmU9PStlLnM6ITF9YWJ1dHNFbmQoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD8rZS5lPT0rdGhpcy5zOiExfWVuZ3VsZnMoZSl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnM8PWUucyYmdGhpcy5lPj1lLmU6ITF9ZXF1YWxzKGUpe3JldHVybiF0aGlzLmlzVmFsaWR8fCFlLmlzVmFsaWQ/ITE6dGhpcy5zLmVxdWFscyhlLnMpJiZ0aGlzLmUuZXF1YWxzKGUuZSl9aW50ZXJzZWN0aW9uKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj10aGlzLnM+ZS5zP3RoaXMuczplLnMscj10aGlzLmU8ZS5lP3RoaXMuZTplLmU7cmV0dXJuIG4+PXI/bnVsbDprLmZyb21EYXRlVGltZXMobixyKX11bmlvbihlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49dGhpcy5zPGUucz90aGlzLnM6ZS5zLHI9dGhpcy5lPmUuZT90aGlzLmU6ZS5lO3JldHVybiBrLmZyb21EYXRlVGltZXMobixyKX1zdGF0aWMgbWVyZ2UoZSl7Y29uc3RbbixyXT1lLnNvcnQoKHMsaSk9PnMucy1pLnMpLnJlZHVjZSgoW3MsaV0sYSk9Pmk/aS5vdmVybGFwcyhhKXx8aS5hYnV0c1N0YXJ0KGEpP1tzLGkudW5pb24oYSldOltzLmNvbmNhdChbaV0pLGFdOltzLGFdLFtbXSxudWxsXSk7cmV0dXJuIHImJm4ucHVzaChyKSxufXN0YXRpYyB4b3IoZSl7bGV0IG49bnVsbCxyPTA7Y29uc3Qgcz1bXSxpPWUubWFwKHU9Plt7dGltZTp1LnMsdHlwZToicyJ9LHt0aW1lOnUuZSx0eXBlOiJlIn1dKSxhPUFycmF5LnByb3RvdHlwZS5jb25jYXQoLi4uaSksbz1hLnNvcnQoKHUsbCk9PnUudGltZS1sLnRpbWUpO2Zvcihjb25zdCB1IG9mIG8pcis9dS50eXBlPT09InMiPzE6LTEscj09PTE/bj11LnRpbWU6KG4mJituIT0rdS50aW1lJiZzLnB1c2goay5mcm9tRGF0ZVRpbWVzKG4sdS50aW1lKSksbj1udWxsKTtyZXR1cm4gay5tZXJnZShzKX1kaWZmZXJlbmNlKC4uLmUpe3JldHVybiBrLnhvcihbdGhpc10uY29uY2F0KGUpKS5tYXAobj0+dGhpcy5pbnRlcnNlY3Rpb24obikpLmZpbHRlcihuPT5uJiYhbi5pc0VtcHR5KCkpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9gWyR7dGhpcy5zLnRvSVNPKCl9IOKAkyAke3RoaXMuZS50b0lTTygpfSlgOkRlfVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YEludGVydmFsIHsgc3RhcnQ6ICR7dGhpcy5zLnRvSVNPKCl9LCBlbmQ6ICR7dGhpcy5lLnRvSVNPKCl9IH1gOmBJbnRlcnZhbCB7IEludmFsaWQsIHJlYXNvbjogJHt0aGlzLmludmFsaWRSZWFzb259IH1gfXRvTG9jYWxlU3RyaW5nKGU9eXQsbj17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD94LmNyZWF0ZSh0aGlzLnMubG9jLmNsb25lKG4pLGUpLmZvcm1hdEludGVydmFsKHRoaXMpOkRlfXRvSVNPKGUpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPKGUpfS8ke3RoaXMuZS50b0lTTyhlKX1gOkRlfXRvSVNPRGF0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy5zLnRvSVNPRGF0ZSgpfS8ke3RoaXMuZS50b0lTT0RhdGUoKX1gOkRlfXRvSVNPVGltZShlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0lTT1RpbWUoZSl9LyR7dGhpcy5lLnRvSVNPVGltZShlKX1gOkRlfXRvRm9ybWF0KGUse3NlcGFyYXRvcjpuPSIg4oCTICJ9PXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2Ake3RoaXMucy50b0Zvcm1hdChlKX0ke259JHt0aGlzLmUudG9Gb3JtYXQoZSl9YDpEZX10b0R1cmF0aW9uKGUsbil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmUuZGlmZih0aGlzLnMsZSxuKTp2LmludmFsaWQodGhpcy5pbnZhbGlkUmVhc29uKX1tYXBFbmRwb2ludHMoZSl7cmV0dXJuIGsuZnJvbURhdGVUaW1lcyhlKHRoaXMucyksZSh0aGlzLmUpKX19Y2xhc3MgTnR7c3RhdGljIGhhc0RTVChlPUkuZGVmYXVsdFpvbmUpe2NvbnN0IG49cC5ub3coKS5zZXRab25lKGUpLnNldCh7bW9udGg6MTJ9KTtyZXR1cm4hZS5pc1VuaXZlcnNhbCYmbi5vZmZzZXQhPT1uLnNldCh7bW9udGg6Nn0pLm9mZnNldH1zdGF0aWMgaXNWYWxpZElBTkFab25lKGUpe3JldHVybiBKLmlzVmFsaWRab25lKGUpfXN0YXRpYyBub3JtYWxpemVab25lKGUpe3JldHVybiBuZShlLEkuZGVmYXVsdFpvbmUpfXN0YXRpYyBnZXRTdGFydE9mV2Vlayh7bG9jYWxlOmU9bnVsbCxsb2NPYmo6bj1udWxsfT17fSl7cmV0dXJuKG58fFQuY3JlYXRlKGUpKS5nZXRTdGFydE9mV2VlaygpfXN0YXRpYyBnZXRNaW5pbXVtRGF5c0luRmlyc3RXZWVrKHtsb2NhbGU6ZT1udWxsLGxvY09iajpuPW51bGx9PXt9KXtyZXR1cm4obnx8VC5jcmVhdGUoZSkpLmdldE1pbkRheXNJbkZpcnN0V2VlaygpfXN0YXRpYyBnZXRXZWVrZW5kV2Vla2RheXMoe2xvY2FsZTplPW51bGwsbG9jT2JqOm49bnVsbH09e30pe3JldHVybihufHxULmNyZWF0ZShlKSkuZ2V0V2Vla2VuZERheXMoKS5zbGljZSgpfXN0YXRpYyBtb250aHMoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fFQuY3JlYXRlKG4scixpKSkubW9udGhzKGUpfXN0YXRpYyBtb250aHNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsLG91dHB1dENhbGVuZGFyOmk9ImdyZWdvcnkifT17fSl7cmV0dXJuKHN8fFQuY3JlYXRlKG4scixpKSkubW9udGhzKGUsITApfXN0YXRpYyB3ZWVrZGF5cyhlPSJsb25nIix7bG9jYWxlOm49bnVsbCxudW1iZXJpbmdTeXN0ZW06cj1udWxsLGxvY09iajpzPW51bGx9PXt9KXtyZXR1cm4oc3x8VC5jcmVhdGUobixyLG51bGwpKS53ZWVrZGF5cyhlKX1zdGF0aWMgd2Vla2RheXNGb3JtYXQoZT0ibG9uZyIse2xvY2FsZTpuPW51bGwsbnVtYmVyaW5nU3lzdGVtOnI9bnVsbCxsb2NPYmo6cz1udWxsfT17fSl7cmV0dXJuKHN8fFQuY3JlYXRlKG4scixudWxsKSkud2Vla2RheXMoZSwhMCl9c3RhdGljIG1lcmlkaWVtcyh7bG9jYWxlOmU9bnVsbH09e30pe3JldHVybiBULmNyZWF0ZShlKS5tZXJpZGllbXMoKX1zdGF0aWMgZXJhcyhlPSJzaG9ydCIse2xvY2FsZTpuPW51bGx9PXt9KXtyZXR1cm4gVC5jcmVhdGUobixudWxsLCJncmVnb3J5IikuZXJhcyhlKX1zdGF0aWMgZmVhdHVyZXMoKXtyZXR1cm57cmVsYXRpdmU6S3IoKSxsb2NhbGVXZWVrOlhyKCl9fX1mdW5jdGlvbiBicyh0LGUpe2NvbnN0IG49cz0+cy50b1VUQygwLHtrZWVwTG9jYWxUaW1lOiEwfSkuc3RhcnRPZigiZGF5IikudmFsdWVPZigpLHI9bihlKS1uKHQpO3JldHVybiBNYXRoLmZsb29yKHYuZnJvbU1pbGxpcyhyKS5hcygiZGF5cyIpKX1mdW5jdGlvbiByZih0LGUsbil7Y29uc3Qgcj1bWyJ5ZWFycyIsKHUsbCk9PmwueWVhci11LnllYXJdLFsicXVhcnRlcnMiLCh1LGwpPT5sLnF1YXJ0ZXItdS5xdWFydGVyKyhsLnllYXItdS55ZWFyKSo0XSxbIm1vbnRocyIsKHUsbCk9PmwubW9udGgtdS5tb250aCsobC55ZWFyLXUueWVhcikqMTJdLFsid2Vla3MiLCh1LGwpPT57Y29uc3QgYz1icyh1LGwpO3JldHVybihjLWMlNykvN31dLFsiZGF5cyIsYnNdXSxzPXt9LGk9dDtsZXQgYSxvO2Zvcihjb25zdFt1LGxdb2YgciluLmluZGV4T2YodSk+PTAmJihhPXUsc1t1XT1sKHQsZSksbz1pLnBsdXMocyksbz5lPyhzW3VdLS0sdD1pLnBsdXMocyksdD5lJiYobz10LHNbdV0tLSx0PWkucGx1cyhzKSkpOnQ9byk7cmV0dXJuW3QscyxvLGFdfWZ1bmN0aW9uIHNmKHQsZSxuLHIpe2xldFtzLGksYSxvXT1yZih0LGUsbik7Y29uc3QgdT1lLXMsbD1uLmZpbHRlcihkPT5bImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJtaWxsaXNlY29uZHMiXS5pbmRleE9mKGQpPj0wKTtsLmxlbmd0aD09PTAmJihhPGUmJihhPXMucGx1cyh7W29dOjF9KSksYSE9PXMmJihpW29dPShpW29dfHwwKSt1LyhhLXMpKSk7Y29uc3QgYz12LmZyb21PYmplY3QoaSxyKTtyZXR1cm4gbC5sZW5ndGg+MD92LmZyb21NaWxsaXModSxyKS5zaGlmdFRvKC4uLmwpLnBsdXMoYyk6Y31jb25zdCBwbj17YXJhYjoiW9mgLdmpXSIsYXJhYmV4dDoiW9uwLdu5XSIsYmFsaToiW+GtkC3hrZldIixiZW5nOiJb4KemLeCnr10iLGRldmE6IlvgpaYt4KWvXSIsZnVsbHdpZGU6IlvvvJAt77yZXSIsZ3VqcjoiW+Crpi3gq69dIixoYW5pZGVjOiJb44CHfOS4gHzkuox85LiJfOWbm3zkupR85YWtfOS4g3zlhat85LmdXSIsa2htcjoiW+GfoC3hn6ldIixrbmRhOiJb4LOmLeCzr10iLGxhb286Ilvgu5At4LuZXSIsbGltYjoiW+Glhi3hpY9dIixtbHltOiJb4LWmLeC1r10iLG1vbmc6IlvhoJAt4aCZXSIsbXltcjoiW+GBgC3hgYldIixvcnlhOiJb4K2mLeCtr10iLHRhbWxkZWM6Ilvgr6Yt4K+vXSIsdGVsdToiW+Cxpi3gsa9dIix0aGFpOiJb4LmQLeC5mV0iLHRpYnQ6IlvgvKAt4LypXSIsbGF0bjoiXFxkIn0sa3M9e2FyYWI6WzE2MzIsMTY0MV0sYXJhYmV4dDpbMTc3NiwxNzg1XSxiYWxpOls2OTkyLDcwMDFdLGJlbmc6WzI1MzQsMjU0M10sZGV2YTpbMjQwNiwyNDE1XSxmdWxsd2lkZTpbNjUyOTYsNjUzMDNdLGd1anI6WzI3OTAsMjc5OV0sa2htcjpbNjExMiw2MTIxXSxrbmRhOlszMzAyLDMzMTFdLGxhb286WzM3OTIsMzgwMV0sbGltYjpbNjQ3MCw2NDc5XSxtbHltOlszNDMwLDM0MzldLG1vbmc6WzYxNjAsNjE2OV0sbXltcjpbNDE2MCw0MTY5XSxvcnlhOlsyOTE4LDI5MjddLHRhbWxkZWM6WzMwNDYsMzA1NV0sdGVsdTpbMzE3NCwzMTgzXSx0aGFpOlszNjY0LDM2NzNdLHRpYnQ6WzM4NzIsMzg4MV19LGFmPXBuLmhhbmlkZWMucmVwbGFjZSgvW1xbfFxdXS9nLCIiKS5zcGxpdCgiIik7ZnVuY3Rpb24gb2YodCl7bGV0IGU9cGFyc2VJbnQodCwxMCk7aWYoaXNOYU4oZSkpe2U9IiI7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dC5jaGFyQ29kZUF0KG4pO2lmKHRbbl0uc2VhcmNoKHBuLmhhbmlkZWMpIT09LTEpZSs9YWYuaW5kZXhPZih0W25dKTtlbHNlIGZvcihjb25zdCBzIGluIGtzKXtjb25zdFtpLGFdPWtzW3NdO3I+PWkmJnI8PWEmJihlKz1yLWkpfX1yZXR1cm4gcGFyc2VJbnQoZSwxMCl9ZWxzZSByZXR1cm4gZX1mdW5jdGlvbiBSKHtudW1iZXJpbmdTeXN0ZW06dH0sZT0iIil7cmV0dXJuIG5ldyBSZWdFeHAoYCR7cG5bdHx8ImxhdG4iXX0ke2V9YCl9Y29uc3QgdWY9Im1pc3NpbmcgSW50bC5EYXRlVGltZUZvcm1hdC5mb3JtYXRUb1BhcnRzIHN1cHBvcnQiO2Z1bmN0aW9uIE8odCxlPW49Pm4pe3JldHVybntyZWdleDp0LGRlc2VyOihbbl0pPT5lKG9mKG4pKX19Y29uc3QgSXM9IlsgwqBdIixFcz1uZXcgUmVnRXhwKElzLCJnIik7ZnVuY3Rpb24gbGYodCl7cmV0dXJuIHQucmVwbGFjZSgvXC4vZywiXFwuPyIpLnJlcGxhY2UoRXMsSXMpfWZ1bmN0aW9uIE5zKHQpe3JldHVybiB0LnJlcGxhY2UoL1wuL2csIiIpLnJlcGxhY2UoRXMsIiAiKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIFAodCxlKXtyZXR1cm4gdD09PW51bGw/bnVsbDp7cmVnZXg6UmVnRXhwKHQubWFwKGxmKS5qb2luKCJ8IikpLGRlc2VyOihbbl0pPT50LmZpbmRJbmRleChyPT5OcyhuKT09PU5zKHIpKStlfX1mdW5jdGlvbiB4cyh0LGUpe3JldHVybntyZWdleDp0LGRlc2VyOihbLG4scl0pPT5rdChuLHIpLGdyb3VwczplfX1mdW5jdGlvbiB4dCh0KXtyZXR1cm57cmVnZXg6dCxkZXNlcjooW2VdKT0+ZX19ZnVuY3Rpb24gY2YodCl7cmV0dXJuIHQucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfWZ1bmN0aW9uIGZmKHQsZSl7Y29uc3Qgbj1SKGUpLHI9UihlLCJ7Mn0iKSxzPVIoZSwiezN9IiksaT1SKGUsIns0fSIpLGE9UihlLCJ7Nn0iKSxvPVIoZSwiezEsMn0iKSx1PVIoZSwiezEsM30iKSxsPVIoZSwiezEsNn0iKSxjPVIoZSwiezEsOX0iKSxkPVIoZSwiezIsNH0iKSx5PVIoZSwiezQsNn0iKSxoPU09Pih7cmVnZXg6UmVnRXhwKGNmKE0udmFsKSksZGVzZXI6KFtxXSk9PnEsbGl0ZXJhbDohMH0pLGo9KE09PntpZih0LmxpdGVyYWwpcmV0dXJuIGgoTSk7c3dpdGNoKE0udmFsKXtjYXNlIkciOnJldHVybiBQKGUuZXJhcygic2hvcnQiKSwwKTtjYXNlIkdHIjpyZXR1cm4gUChlLmVyYXMoImxvbmciKSwwKTtjYXNlInkiOnJldHVybiBPKGwpO2Nhc2UieXkiOnJldHVybiBPKGQsaG4pO2Nhc2UieXl5eSI6cmV0dXJuIE8oaSk7Y2FzZSJ5eXl5eSI6cmV0dXJuIE8oeSk7Y2FzZSJ5eXl5eXkiOnJldHVybiBPKGEpO2Nhc2UiTSI6cmV0dXJuIE8obyk7Y2FzZSJNTSI6cmV0dXJuIE8ocik7Y2FzZSJNTU0iOnJldHVybiBQKGUubW9udGhzKCJzaG9ydCIsITApLDEpO2Nhc2UiTU1NTSI6cmV0dXJuIFAoZS5tb250aHMoImxvbmciLCEwKSwxKTtjYXNlIkwiOnJldHVybiBPKG8pO2Nhc2UiTEwiOnJldHVybiBPKHIpO2Nhc2UiTExMIjpyZXR1cm4gUChlLm1vbnRocygic2hvcnQiLCExKSwxKTtjYXNlIkxMTEwiOnJldHVybiBQKGUubW9udGhzKCJsb25nIiwhMSksMSk7Y2FzZSJkIjpyZXR1cm4gTyhvKTtjYXNlImRkIjpyZXR1cm4gTyhyKTtjYXNlIm8iOnJldHVybiBPKHUpO2Nhc2Uib29vIjpyZXR1cm4gTyhzKTtjYXNlIkhIIjpyZXR1cm4gTyhyKTtjYXNlIkgiOnJldHVybiBPKG8pO2Nhc2UiaGgiOnJldHVybiBPKHIpO2Nhc2UiaCI6cmV0dXJuIE8obyk7Y2FzZSJtbSI6cmV0dXJuIE8ocik7Y2FzZSJtIjpyZXR1cm4gTyhvKTtjYXNlInEiOnJldHVybiBPKG8pO2Nhc2UicXEiOnJldHVybiBPKHIpO2Nhc2UicyI6cmV0dXJuIE8obyk7Y2FzZSJzcyI6cmV0dXJuIE8ocik7Y2FzZSJTIjpyZXR1cm4gTyh1KTtjYXNlIlNTUyI6cmV0dXJuIE8ocyk7Y2FzZSJ1IjpyZXR1cm4geHQoYyk7Y2FzZSJ1dSI6cmV0dXJuIHh0KG8pO2Nhc2UidXV1IjpyZXR1cm4gTyhuKTtjYXNlImEiOnJldHVybiBQKGUubWVyaWRpZW1zKCksMCk7Y2FzZSJra2trIjpyZXR1cm4gTyhpKTtjYXNlImtrIjpyZXR1cm4gTyhkLGhuKTtjYXNlIlciOnJldHVybiBPKG8pO2Nhc2UiV1ciOnJldHVybiBPKHIpO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4gTyhuKTtjYXNlIkVFRSI6cmV0dXJuIFAoZS53ZWVrZGF5cygic2hvcnQiLCExKSwxKTtjYXNlIkVFRUUiOnJldHVybiBQKGUud2Vla2RheXMoImxvbmciLCExKSwxKTtjYXNlImNjYyI6cmV0dXJuIFAoZS53ZWVrZGF5cygic2hvcnQiLCEwKSwxKTtjYXNlImNjY2MiOnJldHVybiBQKGUud2Vla2RheXMoImxvbmciLCEwKSwxKTtjYXNlIloiOmNhc2UiWloiOnJldHVybiB4cyhuZXcgUmVnRXhwKGAoWystXSR7by5zb3VyY2V9KSg/OjooJHtyLnNvdXJjZX0pKT9gKSwyKTtjYXNlIlpaWiI6cmV0dXJuIHhzKG5ldyBSZWdFeHAoYChbKy1dJHtvLnNvdXJjZX0pKCR7ci5zb3VyY2V9KT9gKSwyKTtjYXNlInoiOnJldHVybiB4dCgvW2Etel8rLS9dezEsMjU2fT8vaSk7Y2FzZSIgIjpyZXR1cm4geHQoL1teXFNcblxyXS8pO2RlZmF1bHQ6cmV0dXJuIGgoTSl9fSkodCl8fHtpbnZhbGlkUmVhc29uOnVmfTtyZXR1cm4gai50b2tlbj10LGp9Y29uc3QgZGY9e3llYXI6eyIyLWRpZ2l0IjoieXkiLG51bWVyaWM6Inl5eXl5In0sbW9udGg6e251bWVyaWM6Ik0iLCIyLWRpZ2l0IjoiTU0iLHNob3J0OiJNTU0iLGxvbmc6Ik1NTU0ifSxkYXk6e251bWVyaWM6ImQiLCIyLWRpZ2l0IjoiZGQifSx3ZWVrZGF5OntzaG9ydDoiRUVFIixsb25nOiJFRUVFIn0sZGF5cGVyaW9kOiJhIixkYXlQZXJpb2Q6ImEiLGhvdXIxMjp7bnVtZXJpYzoiaCIsIjItZGlnaXQiOiJoaCJ9LGhvdXIyNDp7bnVtZXJpYzoiSCIsIjItZGlnaXQiOiJISCJ9LG1pbnV0ZTp7bnVtZXJpYzoibSIsIjItZGlnaXQiOiJtbSJ9LHNlY29uZDp7bnVtZXJpYzoicyIsIjItZGlnaXQiOiJzcyJ9LHRpbWVab25lTmFtZTp7bG9uZzoiWlpaWloiLHNob3J0OiJaWloifX07ZnVuY3Rpb24gaGYodCxlLG4pe2NvbnN0e3R5cGU6cix2YWx1ZTpzfT10O2lmKHI9PT0ibGl0ZXJhbCIpe2NvbnN0IHU9L15ccyskLy50ZXN0KHMpO3JldHVybntsaXRlcmFsOiF1LHZhbDp1PyIgIjpzfX1jb25zdCBpPWVbcl07bGV0IGE9cjtyPT09ImhvdXIiJiYoZS5ob3VyMTIhPW51bGw/YT1lLmhvdXIxMj8iaG91cjEyIjoiaG91cjI0IjplLmhvdXJDeWNsZSE9bnVsbD9lLmhvdXJDeWNsZT09PSJoMTEifHxlLmhvdXJDeWNsZT09PSJoMTIiP2E9ImhvdXIxMiI6YT0iaG91cjI0IjphPW4uaG91cjEyPyJob3VyMTIiOiJob3VyMjQiKTtsZXQgbz1kZlthXTtpZih0eXBlb2Ygbz09Im9iamVjdCImJihvPW9baV0pLG8pcmV0dXJue2xpdGVyYWw6ITEsdmFsOm99fWZ1bmN0aW9uIG1mKHQpe3JldHVybltgXiR7dC5tYXAobj0+bi5yZWdleCkucmVkdWNlKChuLHIpPT5gJHtufSgke3Iuc291cmNlfSlgLCIiKX0kYCx0XX1mdW5jdGlvbiB5Zih0LGUsbil7Y29uc3Qgcj10Lm1hdGNoKGUpO2lmKHIpe2NvbnN0IHM9e307bGV0IGk9MTtmb3IoY29uc3QgYSBpbiBuKWlmKGJlKG4sYSkpe2NvbnN0IG89blthXSx1PW8uZ3JvdXBzP28uZ3JvdXBzKzE6MTshby5saXRlcmFsJiZvLnRva2VuJiYoc1tvLnRva2VuLnZhbFswXV09by5kZXNlcihyLnNsaWNlKGksaSt1KSkpLGkrPXV9cmV0dXJuW3Isc119ZWxzZSByZXR1cm5bcix7fV19ZnVuY3Rpb24gZ2YodCl7Y29uc3QgZT1pPT57c3dpdGNoKGkpe2Nhc2UiUyI6cmV0dXJuIm1pbGxpc2Vjb25kIjtjYXNlInMiOnJldHVybiJzZWNvbmQiO2Nhc2UibSI6cmV0dXJuIm1pbnV0ZSI7Y2FzZSJoIjpjYXNlIkgiOnJldHVybiJob3VyIjtjYXNlImQiOnJldHVybiJkYXkiO2Nhc2UibyI6cmV0dXJuIm9yZGluYWwiO2Nhc2UiTCI6Y2FzZSJNIjpyZXR1cm4ibW9udGgiO2Nhc2UieSI6cmV0dXJuInllYXIiO2Nhc2UiRSI6Y2FzZSJjIjpyZXR1cm4id2Vla2RheSI7Y2FzZSJXIjpyZXR1cm4id2Vla051bWJlciI7Y2FzZSJrIjpyZXR1cm4id2Vla1llYXIiO2Nhc2UicSI6cmV0dXJuInF1YXJ0ZXIiO2RlZmF1bHQ6cmV0dXJuIG51bGx9fTtsZXQgbj1udWxsLHI7cmV0dXJuIGcodC56KXx8KG49Si5jcmVhdGUodC56KSksZyh0LlopfHwobnx8KG49bmV3IEQodC5aKSkscj10LlopLGcodC5xKXx8KHQuTT0odC5xLTEpKjMrMSksZyh0LmgpfHwodC5oPDEyJiZ0LmE9PT0xP3QuaCs9MTI6dC5oPT09MTImJnQuYT09PTAmJih0Lmg9MCkpLHQuRz09PTAmJnQueSYmKHQueT0tdC55KSxnKHQudSl8fCh0LlM9Zm4odC51KSksW09iamVjdC5rZXlzKHQpLnJlZHVjZSgoaSxhKT0+e2NvbnN0IG89ZShhKTtyZXR1cm4gbyYmKGlbb109dFthXSksaX0se30pLG4scl19bGV0IHduPW51bGw7ZnVuY3Rpb24gcGYoKXtyZXR1cm4gd258fCh3bj1wLmZyb21NaWxsaXMoMTU1NTU1NTU1NTU1NSkpLHdufWZ1bmN0aW9uIHdmKHQsZSl7aWYodC5saXRlcmFsKXJldHVybiB0O2NvbnN0IG49eC5tYWNyb1Rva2VuVG9Gb3JtYXRPcHRzKHQudmFsKSxyPURzKG4sZSk7cmV0dXJuIHI9PW51bGx8fHIuaW5jbHVkZXModm9pZCAwKT90OnJ9ZnVuY3Rpb24gTXModCxlKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdCguLi50Lm1hcChuPT53ZihuLGUpKSl9ZnVuY3Rpb24gQ3ModCxlLG4pe2NvbnN0IHI9TXMoeC5wYXJzZUZvcm1hdChuKSx0KSxzPXIubWFwKGE9PmZmKGEsdCkpLGk9cy5maW5kKGE9PmEuaW52YWxpZFJlYXNvbik7aWYoaSlyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixpbnZhbGlkUmVhc29uOmkuaW52YWxpZFJlYXNvbn07e2NvbnN0W2Esb109bWYocyksdT1SZWdFeHAoYSwiaSIpLFtsLGNdPXlmKGUsdSxvKSxbZCx5LGhdPWM/Z2YoYyk6W251bGwsbnVsbCx2b2lkIDBdO2lmKGJlKGMsImEiKSYmYmUoYywiSCIpKXRocm93IG5ldyBTZSgiQ2FuJ3QgaW5jbHVkZSBtZXJpZGllbSB3aGVuIHNwZWNpZnlpbmcgMjQtaG91ciBmb3JtYXQiKTtyZXR1cm57aW5wdXQ6ZSx0b2tlbnM6cixyZWdleDp1LHJhd01hdGNoZXM6bCxtYXRjaGVzOmMscmVzdWx0OmQsem9uZTp5LHNwZWNpZmljT2Zmc2V0Omh9fX1mdW5jdGlvbiB2Zih0LGUsbil7Y29uc3R7cmVzdWx0OnIsem9uZTpzLHNwZWNpZmljT2Zmc2V0OmksaW52YWxpZFJlYXNvbjphfT1Dcyh0LGUsbik7cmV0dXJuW3IscyxpLGFdfWZ1bmN0aW9uIERzKHQsZSl7aWYoIXQpcmV0dXJuIG51bGw7Y29uc3Qgcj14LmNyZWF0ZShlLHQpLmR0Rm9ybWF0dGVyKHBmKCkpLHM9ci5mb3JtYXRUb1BhcnRzKCksaT1yLnJlc29sdmVkT3B0aW9ucygpO3JldHVybiBzLm1hcChhPT5oZihhLHQsaSkpfWNvbnN0IHZuPSJJbnZhbGlkIERhdGVUaW1lIixfcz04NjRlMTM7ZnVuY3Rpb24gTXQodCl7cmV0dXJuIG5ldyBaKCJ1bnN1cHBvcnRlZCB6b25lIixgdGhlIHpvbmUgIiR7dC5uYW1lfSIgaXMgbm90IHN1cHBvcnRlZGApfWZ1bmN0aW9uIE9uKHQpe3JldHVybiB0LndlZWtEYXRhPT09bnVsbCYmKHQud2Vla0RhdGE9T3QodC5jKSksdC53ZWVrRGF0YX1mdW5jdGlvbiBUbih0KXtyZXR1cm4gdC5sb2NhbFdlZWtEYXRhPT09bnVsbCYmKHQubG9jYWxXZWVrRGF0YT1PdCh0LmMsdC5sb2MuZ2V0TWluRGF5c0luRmlyc3RXZWVrKCksdC5sb2MuZ2V0U3RhcnRPZldlZWsoKSkpLHQubG9jYWxXZWVrRGF0YX1mdW5jdGlvbiBoZSh0LGUpe2NvbnN0IG49e3RzOnQudHMsem9uZTp0LnpvbmUsYzp0LmMsbzp0Lm8sbG9jOnQubG9jLGludmFsaWQ6dC5pbnZhbGlkfTtyZXR1cm4gbmV3IHAoey4uLm4sLi4uZSxvbGQ6bn0pfWZ1bmN0aW9uIEZzKHQsZSxuKXtsZXQgcj10LWUqNjAqMWUzO2NvbnN0IHM9bi5vZmZzZXQocik7aWYoZT09PXMpcmV0dXJuW3IsZV07ci09KHMtZSkqNjAqMWUzO2NvbnN0IGk9bi5vZmZzZXQocik7cmV0dXJuIHM9PT1pP1tyLHNdOlt0LU1hdGgubWluKHMsaSkqNjAqMWUzLE1hdGgubWF4KHMsaSldfWZ1bmN0aW9uIEN0KHQsZSl7dCs9ZSo2MCoxZTM7Y29uc3Qgbj1uZXcgRGF0ZSh0KTtyZXR1cm57eWVhcjpuLmdldFVUQ0Z1bGxZZWFyKCksbW9udGg6bi5nZXRVVENNb250aCgpKzEsZGF5Om4uZ2V0VVRDRGF0ZSgpLGhvdXI6bi5nZXRVVENIb3VycygpLG1pbnV0ZTpuLmdldFVUQ01pbnV0ZXMoKSxzZWNvbmQ6bi5nZXRVVENTZWNvbmRzKCksbWlsbGlzZWNvbmQ6bi5nZXRVVENNaWxsaXNlY29uZHMoKX19ZnVuY3Rpb24gRHQodCxlLG4pe3JldHVybiBGcyhidCh0KSxlLG4pfWZ1bmN0aW9uIEFzKHQsZSl7Y29uc3Qgbj10Lm8scj10LmMueWVhcitNYXRoLnRydW5jKGUueWVhcnMpLHM9dC5jLm1vbnRoK01hdGgudHJ1bmMoZS5tb250aHMpK01hdGgudHJ1bmMoZS5xdWFydGVycykqMyxpPXsuLi50LmMseWVhcjpyLG1vbnRoOnMsZGF5Ok1hdGgubWluKHQuYy5kYXksU3QocixzKSkrTWF0aC50cnVuYyhlLmRheXMpK01hdGgudHJ1bmMoZS53ZWVrcykqN30sYT12LmZyb21PYmplY3Qoe3llYXJzOmUueWVhcnMtTWF0aC50cnVuYyhlLnllYXJzKSxxdWFydGVyczplLnF1YXJ0ZXJzLU1hdGgudHJ1bmMoZS5xdWFydGVycyksbW9udGhzOmUubW9udGhzLU1hdGgudHJ1bmMoZS5tb250aHMpLHdlZWtzOmUud2Vla3MtTWF0aC50cnVuYyhlLndlZWtzKSxkYXlzOmUuZGF5cy1NYXRoLnRydW5jKGUuZGF5cyksaG91cnM6ZS5ob3VycyxtaW51dGVzOmUubWludXRlcyxzZWNvbmRzOmUuc2Vjb25kcyxtaWxsaXNlY29uZHM6ZS5taWxsaXNlY29uZHN9KS5hcygibWlsbGlzZWNvbmRzIiksbz1idChpKTtsZXRbdSxsXT1GcyhvLG4sdC56b25lKTtyZXR1cm4gYSE9PTAmJih1Kz1hLGw9dC56b25lLm9mZnNldCh1KSkse3RzOnUsbzpsfX1mdW5jdGlvbiBHZSh0LGUsbixyLHMsaSl7Y29uc3R7c2V0Wm9uZTphLHpvbmU6b309bjtpZih0JiZPYmplY3Qua2V5cyh0KS5sZW5ndGghPT0wfHxlKXtjb25zdCB1PWV8fG8sbD1wLmZyb21PYmplY3QodCx7Li4ubix6b25lOnUsc3BlY2lmaWNPZmZzZXQ6aX0pO3JldHVybiBhP2w6bC5zZXRab25lKG8pfWVsc2UgcmV0dXJuIHAuaW52YWxpZChuZXcgWigidW5wYXJzYWJsZSIsYHRoZSBpbnB1dCAiJHtzfSIgY2FuJ3QgYmUgcGFyc2VkIGFzICR7cn1gKSl9ZnVuY3Rpb24gX3QodCxlLG49ITApe3JldHVybiB0LmlzVmFsaWQ/eC5jcmVhdGUoVC5jcmVhdGUoImVuLVVTIikse2FsbG93WjpuLGZvcmNlU2ltcGxlOiEwfSkuZm9ybWF0RGF0ZVRpbWVGcm9tU3RyaW5nKHQsZSk6bnVsbH1mdW5jdGlvbiBTbih0LGUpe2NvbnN0IG49dC5jLnllYXI+OTk5OXx8dC5jLnllYXI8MDtsZXQgcj0iIjtyZXR1cm4gbiYmdC5jLnllYXI+PTAmJihyKz0iKyIpLHIrPUUodC5jLnllYXIsbj82OjQpLGU/KHIrPSItIixyKz1FKHQuYy5tb250aCkscis9Ii0iLHIrPUUodC5jLmRheSkpOihyKz1FKHQuYy5tb250aCkscis9RSh0LmMuZGF5KSkscn1mdW5jdGlvbiBWcyh0LGUsbixyLHMsaSl7bGV0IGE9RSh0LmMuaG91cik7cmV0dXJuIGU/KGErPSI6IixhKz1FKHQuYy5taW51dGUpLCh0LmMubWlsbGlzZWNvbmQhPT0wfHx0LmMuc2Vjb25kIT09MHx8IW4pJiYoYSs9IjoiKSk6YSs9RSh0LmMubWludXRlKSwodC5jLm1pbGxpc2Vjb25kIT09MHx8dC5jLnNlY29uZCE9PTB8fCFuKSYmKGErPUUodC5jLnNlY29uZCksKHQuYy5taWxsaXNlY29uZCE9PTB8fCFyKSYmKGErPSIuIixhKz1FKHQuYy5taWxsaXNlY29uZCwzKSkpLHMmJih0LmlzT2Zmc2V0Rml4ZWQmJnQub2Zmc2V0PT09MCYmIWk/YSs9IloiOnQubzwwPyhhKz0iLSIsYSs9RShNYXRoLnRydW5jKC10Lm8vNjApKSxhKz0iOiIsYSs9RShNYXRoLnRydW5jKC10Lm8lNjApKSk6KGErPSIrIixhKz1FKE1hdGgudHJ1bmModC5vLzYwKSksYSs9IjoiLGErPUUoTWF0aC50cnVuYyh0Lm8lNjApKSkpLGkmJihhKz0iWyIrdC56b25lLmlhbmFOYW1lKyJdIiksYX1jb25zdCBXcz17bW9udGg6MSxkYXk6MSxob3VyOjAsbWludXRlOjAsc2Vjb25kOjAsbWlsbGlzZWNvbmQ6MH0sT2Y9e3dlZWtOdW1iZXI6MSx3ZWVrZGF5OjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LFRmPXtvcmRpbmFsOjEsaG91cjowLG1pbnV0ZTowLHNlY29uZDowLG1pbGxpc2Vjb25kOjB9LCRzPVsieWVhciIsIm1vbnRoIiwiZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sU2Y9WyJ3ZWVrWWVhciIsIndlZWtOdW1iZXIiLCJ3ZWVrZGF5IiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsIm1pbGxpc2Vjb25kIl0sYmY9WyJ5ZWFyIiwib3JkaW5hbCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJtaWxsaXNlY29uZCJdO2Z1bmN0aW9uIGtmKHQpe2NvbnN0IGU9e3llYXI6InllYXIiLHllYXJzOiJ5ZWFyIixtb250aDoibW9udGgiLG1vbnRoczoibW9udGgiLGRheToiZGF5IixkYXlzOiJkYXkiLGhvdXI6ImhvdXIiLGhvdXJzOiJob3VyIixtaW51dGU6Im1pbnV0ZSIsbWludXRlczoibWludXRlIixxdWFydGVyOiJxdWFydGVyIixxdWFydGVyczoicXVhcnRlciIsc2Vjb25kOiJzZWNvbmQiLHNlY29uZHM6InNlY29uZCIsbWlsbGlzZWNvbmQ6Im1pbGxpc2Vjb25kIixtaWxsaXNlY29uZHM6Im1pbGxpc2Vjb25kIix3ZWVrZGF5OiJ3ZWVrZGF5Iix3ZWVrZGF5czoid2Vla2RheSIsd2Vla251bWJlcjoid2Vla051bWJlciIsd2Vla3NudW1iZXI6IndlZWtOdW1iZXIiLHdlZWtudW1iZXJzOiJ3ZWVrTnVtYmVyIix3ZWVreWVhcjoid2Vla1llYXIiLHdlZWt5ZWFyczoid2Vla1llYXIiLG9yZGluYWw6Im9yZGluYWwifVt0LnRvTG93ZXJDYXNlKCldO2lmKCFlKXRocm93IG5ldyBocih0KTtyZXR1cm4gZX1mdW5jdGlvbiBMcyh0KXtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlImxvY2Fsd2Vla2RheSI6Y2FzZSJsb2NhbHdlZWtkYXlzIjpyZXR1cm4ibG9jYWxXZWVrZGF5IjtjYXNlImxvY2Fsd2Vla251bWJlciI6Y2FzZSJsb2NhbHdlZWtudW1iZXJzIjpyZXR1cm4ibG9jYWxXZWVrTnVtYmVyIjtjYXNlImxvY2Fsd2Vla3llYXIiOmNhc2UibG9jYWx3ZWVreWVhcnMiOnJldHVybiJsb2NhbFdlZWtZZWFyIjtkZWZhdWx0OnJldHVybiBrZih0KX19ZnVuY3Rpb24genModCxlKXtjb25zdCBuPW5lKGUuem9uZSxJLmRlZmF1bHRab25lKSxyPVQuZnJvbU9iamVjdChlKSxzPUkubm93KCk7bGV0IGksYTtpZihnKHQueWVhcikpaT1zO2Vsc2V7Zm9yKGNvbnN0IGwgb2YgJHMpZyh0W2xdKSYmKHRbbF09V3NbbF0pO2NvbnN0IG89QnIodCl8fFFyKHQpO2lmKG8pcmV0dXJuIHAuaW52YWxpZChvKTtjb25zdCB1PW4ub2Zmc2V0KHMpO1tpLGFdPUR0KHQsdSxuKX1yZXR1cm4gbmV3IHAoe3RzOmksem9uZTpuLGxvYzpyLG86YX0pfWZ1bmN0aW9uIFpzKHQsZSxuKXtjb25zdCByPWcobi5yb3VuZCk/ITA6bi5yb3VuZCxzPShhLG8pPT4oYT1kbihhLHJ8fG4uY2FsZW5kYXJ5PzA6MiwhMCksZS5sb2MuY2xvbmUobikucmVsRm9ybWF0dGVyKG4pLmZvcm1hdChhLG8pKSxpPWE9Pm4uY2FsZW5kYXJ5P2UuaGFzU2FtZSh0LGEpPzA6ZS5zdGFydE9mKGEpLmRpZmYodC5zdGFydE9mKGEpLGEpLmdldChhKTplLmRpZmYodCxhKS5nZXQoYSk7aWYobi51bml0KXJldHVybiBzKGkobi51bml0KSxuLnVuaXQpO2Zvcihjb25zdCBhIG9mIG4udW5pdHMpe2NvbnN0IG89aShhKTtpZihNYXRoLmFicyhvKT49MSlyZXR1cm4gcyhvLGEpfXJldHVybiBzKHQ+ZT8tMDowLG4udW5pdHNbbi51bml0cy5sZW5ndGgtMV0pfWZ1bmN0aW9uIFJzKHQpe2xldCBlPXt9LG47cmV0dXJuIHQubGVuZ3RoPjAmJnR5cGVvZiB0W3QubGVuZ3RoLTFdPT0ib2JqZWN0Ij8oZT10W3QubGVuZ3RoLTFdLG49QXJyYXkuZnJvbSh0KS5zbGljZSgwLHQubGVuZ3RoLTEpKTpuPUFycmF5LmZyb20odCksW2Usbl19Y2xhc3MgcHtjb25zdHJ1Y3RvcihlKXtjb25zdCBuPWUuem9uZXx8SS5kZWZhdWx0Wm9uZTtsZXQgcj1lLmludmFsaWR8fChOdW1iZXIuaXNOYU4oZS50cyk/bmV3IFooImludmFsaWQgaW5wdXQiKTpudWxsKXx8KG4uaXNWYWxpZD9udWxsOk10KG4pKTt0aGlzLnRzPWcoZS50cyk/SS5ub3coKTplLnRzO2xldCBzPW51bGwsaT1udWxsO2lmKCFyKWlmKGUub2xkJiZlLm9sZC50cz09PXRoaXMudHMmJmUub2xkLnpvbmUuZXF1YWxzKG4pKVtzLGldPVtlLm9sZC5jLGUub2xkLm9dO2Vsc2V7Y29uc3Qgbz1uLm9mZnNldCh0aGlzLnRzKTtzPUN0KHRoaXMudHMsbykscj1OdW1iZXIuaXNOYU4ocy55ZWFyKT9uZXcgWigiaW52YWxpZCBpbnB1dCIpOm51bGwscz1yP251bGw6cyxpPXI/bnVsbDpvfXRoaXMuX3pvbmU9bix0aGlzLmxvYz1lLmxvY3x8VC5jcmVhdGUoKSx0aGlzLmludmFsaWQ9cix0aGlzLndlZWtEYXRhPW51bGwsdGhpcy5sb2NhbFdlZWtEYXRhPW51bGwsdGhpcy5jPXMsdGhpcy5vPWksdGhpcy5pc0x1eG9uRGF0ZVRpbWU9ITB9c3RhdGljIG5vdygpe3JldHVybiBuZXcgcCh7fSl9c3RhdGljIGxvY2FsKCl7Y29uc3RbZSxuXT1Scyhhcmd1bWVudHMpLFtyLHMsaSxhLG8sdSxsXT1uO3JldHVybiB6cyh7eWVhcjpyLG1vbnRoOnMsZGF5OmksaG91cjphLG1pbnV0ZTpvLHNlY29uZDp1LG1pbGxpc2Vjb25kOmx9LGUpfXN0YXRpYyB1dGMoKXtjb25zdFtlLG5dPVJzKGFyZ3VtZW50cyksW3IscyxpLGEsbyx1LGxdPW47cmV0dXJuIGUuem9uZT1ELnV0Y0luc3RhbmNlLHpzKHt5ZWFyOnIsbW9udGg6cyxkYXk6aSxob3VyOmEsbWludXRlOm8sc2Vjb25kOnUsbWlsbGlzZWNvbmQ6bH0sZSl9c3RhdGljIGZyb21KU0RhdGUoZSxuPXt9KXtjb25zdCByPVhsKGUpP2UudmFsdWVPZigpOk5hTjtpZihOdW1iZXIuaXNOYU4ocikpcmV0dXJuIHAuaW52YWxpZCgiaW52YWxpZCBpbnB1dCIpO2NvbnN0IHM9bmUobi56b25lLEkuZGVmYXVsdFpvbmUpO3JldHVybiBzLmlzVmFsaWQ/bmV3IHAoe3RzOnIsem9uZTpzLGxvYzpULmZyb21PYmplY3Qobil9KTpwLmludmFsaWQoTXQocykpfXN0YXRpYyBmcm9tTWlsbGlzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIGU8LV9zfHxlPl9zP3AuaW52YWxpZCgiVGltZXN0YW1wIG91dCBvZiByYW5nZSIpOm5ldyBwKHt0czplLHpvbmU6bmUobi56b25lLEkuZGVmYXVsdFpvbmUpLGxvYzpULmZyb21PYmplY3Qobil9KTt0aHJvdyBuZXcgXyhgZnJvbU1pbGxpcyByZXF1aXJlcyBhIG51bWVyaWNhbCBpbnB1dCwgYnV0IHJlY2VpdmVkIGEgJHt0eXBlb2YgZX0gd2l0aCB2YWx1ZSAke2V9YCl9c3RhdGljIGZyb21TZWNvbmRzKGUsbj17fSl7aWYoY2UoZSkpcmV0dXJuIG5ldyBwKHt0czplKjFlMyx6b25lOm5lKG4uem9uZSxJLmRlZmF1bHRab25lKSxsb2M6VC5mcm9tT2JqZWN0KG4pfSk7dGhyb3cgbmV3IF8oImZyb21TZWNvbmRzIHJlcXVpcmVzIGEgbnVtZXJpY2FsIGlucHV0Iil9c3RhdGljIGZyb21PYmplY3QoZSxuPXt9KXtlPWV8fHt9O2NvbnN0IHI9bmUobi56b25lLEkuZGVmYXVsdFpvbmUpO2lmKCFyLmlzVmFsaWQpcmV0dXJuIHAuaW52YWxpZChNdChyKSk7Y29uc3Qgcz1ULmZyb21PYmplY3QobiksaT1JdChlLExzKSx7bWluRGF5c0luRmlyc3RXZWVrOmEsc3RhcnRPZldlZWs6b309SnIoaSxzKSx1PUkubm93KCksbD1nKG4uc3BlY2lmaWNPZmZzZXQpP3Iub2Zmc2V0KHUpOm4uc3BlY2lmaWNPZmZzZXQsYz0hZyhpLm9yZGluYWwpLGQ9IWcoaS55ZWFyKSx5PSFnKGkubW9udGgpfHwhZyhpLmRheSksaD1kfHx5LFM9aS53ZWVrWWVhcnx8aS53ZWVrTnVtYmVyO2lmKChofHxjKSYmUyl0aHJvdyBuZXcgU2UoIkNhbid0IG1peCB3ZWVrWWVhci93ZWVrTnVtYmVyIHVuaXRzIHdpdGggeWVhci9tb250aC9kYXkgb3Igb3JkaW5hbHMiKTtpZih5JiZjKXRocm93IG5ldyBTZSgiQ2FuJ3QgbWl4IG9yZGluYWwgZGF0ZXMgd2l0aCBtb250aC9kYXkiKTtjb25zdCBqPVN8fGkud2Vla2RheSYmIWg7bGV0IE0scSxCPUN0KHUsbCk7aj8oTT1TZixxPU9mLEI9T3QoQixhLG8pKTpjPyhNPWJmLHE9VGYsQj1sbihCKSk6KE09JHMscT1Xcyk7bGV0IF9lPSExO2Zvcihjb25zdCBtZSBvZiBNKXtjb25zdCBBdD1pW21lXTtnKEF0KT9fZT9pW21lXT1xW21lXTppW21lXT1CW21lXTpfZT0hMH1jb25zdCBGdD1qP0JsKGksYSxvKTpjP1FsKGkpOkJyKGkpLGI9RnR8fFFyKGkpO2lmKGIpcmV0dXJuIHAuaW52YWxpZChiKTtjb25zdCBGZT1qP1lyKGksYSxvKTpjP0dyKGkpOmksW2JuLEJlXT1EdChGZSxsLHIpLEFlPW5ldyBwKHt0czpibix6b25lOnIsbzpCZSxsb2M6c30pO3JldHVybiBpLndlZWtkYXkmJmgmJmUud2Vla2RheSE9PUFlLndlZWtkYXk/cC5pbnZhbGlkKCJtaXNtYXRjaGVkIHdlZWtkYXkiLGB5b3UgY2FuJ3Qgc3BlY2lmeSBib3RoIGEgd2Vla2RheSBvZiAke2kud2Vla2RheX0gYW5kIGEgZGF0ZSBvZiAke0FlLnRvSVNPKCl9YCk6QWV9c3RhdGljIGZyb21JU08oZSxuPXt9KXtjb25zdFtyLHNdPVBjKGUpO3JldHVybiBHZShyLHMsbiwiSVNPIDg2MDEiLGUpfXN0YXRpYyBmcm9tUkZDMjgyMihlLG49e30pe2NvbnN0W3Isc109amMoZSk7cmV0dXJuIEdlKHIscyxuLCJSRkMgMjgyMiIsZSl9c3RhdGljIGZyb21IVFRQKGUsbj17fSl7Y29uc3RbcixzXT1VYyhlKTtyZXR1cm4gR2UocixzLG4sIkhUVFAiLG4pfXN0YXRpYyBmcm9tRm9ybWF0KGUsbixyPXt9KXtpZihnKGUpfHxnKG4pKXRocm93IG5ldyBfKCJmcm9tRm9ybWF0IHJlcXVpcmVzIGFuIGlucHV0IHN0cmluZyBhbmQgYSBmb3JtYXQiKTtjb25zdHtsb2NhbGU6cz1udWxsLG51bWJlcmluZ1N5c3RlbTppPW51bGx9PXIsYT1ULmZyb21PcHRzKHtsb2NhbGU6cyxudW1iZXJpbmdTeXN0ZW06aSxkZWZhdWx0VG9FTjohMH0pLFtvLHUsbCxjXT12ZihhLGUsbik7cmV0dXJuIGM/cC5pbnZhbGlkKGMpOkdlKG8sdSxyLGBmb3JtYXQgJHtufWAsZSxsKX1zdGF0aWMgZnJvbVN0cmluZyhlLG4scj17fSl7cmV0dXJuIHAuZnJvbUZvcm1hdChlLG4scil9c3RhdGljIGZyb21TUUwoZSxuPXt9KXtjb25zdFtyLHNdPVFjKGUpO3JldHVybiBHZShyLHMsbiwiU1FMIixlKX1zdGF0aWMgaW52YWxpZChlLG49bnVsbCl7aWYoIWUpdGhyb3cgbmV3IF8oIm5lZWQgdG8gc3BlY2lmeSBhIHJlYXNvbiB0aGUgRGF0ZVRpbWUgaXMgaW52YWxpZCIpO2NvbnN0IHI9ZSBpbnN0YW5jZW9mIFo/ZTpuZXcgWihlLG4pO2lmKEkudGhyb3dPbkludmFsaWQpdGhyb3cgbmV3IEVsKHIpO3JldHVybiBuZXcgcCh7aW52YWxpZDpyfSl9c3RhdGljIGlzRGF0ZVRpbWUoZSl7cmV0dXJuIGUmJmUuaXNMdXhvbkRhdGVUaW1lfHwhMX1zdGF0aWMgcGFyc2VGb3JtYXRGb3JPcHRzKGUsbj17fSl7Y29uc3Qgcj1EcyhlLFQuZnJvbU9iamVjdChuKSk7cmV0dXJuIHI/ci5tYXAocz0+cz9zLnZhbDpudWxsKS5qb2luKCIiKTpudWxsfXN0YXRpYyBleHBhbmRGb3JtYXQoZSxuPXt9KXtyZXR1cm4gTXMoeC5wYXJzZUZvcm1hdChlKSxULmZyb21PYmplY3QobikpLm1hcChzPT5zLnZhbCkuam9pbigiIil9Z2V0KGUpe3JldHVybiB0aGlzW2VdfWdldCBpc1ZhbGlkKCl7cmV0dXJuIHRoaXMuaW52YWxpZD09PW51bGx9Z2V0IGludmFsaWRSZWFzb24oKXtyZXR1cm4gdGhpcy5pbnZhbGlkP3RoaXMuaW52YWxpZC5yZWFzb246bnVsbH1nZXQgaW52YWxpZEV4cGxhbmF0aW9uKCl7cmV0dXJuIHRoaXMuaW52YWxpZD90aGlzLmludmFsaWQuZXhwbGFuYXRpb246bnVsbH1nZXQgbG9jYWxlKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5sb2NhbGU6bnVsbH1nZXQgbnVtYmVyaW5nU3lzdGVtKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmxvYy5udW1iZXJpbmdTeXN0ZW06bnVsbH1nZXQgb3V0cHV0Q2FsZW5kYXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMubG9jLm91dHB1dENhbGVuZGFyOm51bGx9Z2V0IHpvbmUoKXtyZXR1cm4gdGhpcy5fem9uZX1nZXQgem9uZU5hbWUoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuem9uZS5uYW1lOm51bGx9Z2V0IHllYXIoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy55ZWFyOk5hTn1nZXQgcXVhcnRlcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/TWF0aC5jZWlsKHRoaXMuYy5tb250aC8zKTpOYU59Z2V0IG1vbnRoKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMubW9udGg6TmFOfWdldCBkYXkoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuYy5kYXk6TmFOfWdldCBob3VyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMuaG91cjpOYU59Z2V0IG1pbnV0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLm1pbnV0ZTpOYU59Z2V0IHNlY29uZCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy5jLnNlY29uZDpOYU59Z2V0IG1pbGxpc2Vjb25kKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLmMubWlsbGlzZWNvbmQ6TmFOfWdldCB3ZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/T24odGhpcykud2Vla1llYXI6TmFOfWdldCB3ZWVrTnVtYmVyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Pbih0aGlzKS53ZWVrTnVtYmVyOk5hTn1nZXQgd2Vla2RheSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/T24odGhpcykud2Vla2RheTpOYU59Z2V0IGlzV2Vla2VuZCgpe3JldHVybiB0aGlzLmlzVmFsaWQmJnRoaXMubG9jLmdldFdlZWtlbmREYXlzKCkuaW5jbHVkZXModGhpcy53ZWVrZGF5KX1nZXQgbG9jYWxXZWVrZGF5KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Ubih0aGlzKS53ZWVrZGF5Ok5hTn1nZXQgbG9jYWxXZWVrTnVtYmVyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Ubih0aGlzKS53ZWVrTnVtYmVyOk5hTn1nZXQgbG9jYWxXZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/VG4odGhpcykud2Vla1llYXI6TmFOfWdldCBvcmRpbmFsKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9sbih0aGlzLmMpLm9yZGluYWw6TmFOfWdldCBtb250aFNob3J0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OdC5tb250aHMoInNob3J0Iix7bG9jT2JqOnRoaXMubG9jfSlbdGhpcy5tb250aC0xXTpudWxsfWdldCBtb250aExvbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP050Lm1vbnRocygibG9uZyIse2xvY09iajp0aGlzLmxvY30pW3RoaXMubW9udGgtMV06bnVsbH1nZXQgd2Vla2RheVNob3J0KCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9OdC53ZWVrZGF5cygic2hvcnQiLHtsb2NPYmo6dGhpcy5sb2N9KVt0aGlzLndlZWtkYXktMV06bnVsbH1nZXQgd2Vla2RheUxvbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP050LndlZWtkYXlzKCJsb25nIix7bG9jT2JqOnRoaXMubG9jfSlbdGhpcy53ZWVrZGF5LTFdOm51bGx9Z2V0IG9mZnNldCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/K3RoaXMubzpOYU59Z2V0IG9mZnNldE5hbWVTaG9ydCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLm9mZnNldE5hbWUodGhpcy50cyx7Zm9ybWF0OiJzaG9ydCIsbG9jYWxlOnRoaXMubG9jYWxlfSk6bnVsbH1nZXQgb2Zmc2V0TmFtZUxvbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMuem9uZS5vZmZzZXROYW1lKHRoaXMudHMse2Zvcm1hdDoibG9uZyIsbG9jYWxlOnRoaXMubG9jYWxlfSk6bnVsbH1nZXQgaXNPZmZzZXRGaXhlZCgpe3JldHVybiB0aGlzLmlzVmFsaWQ/dGhpcy56b25lLmlzVW5pdmVyc2FsOm51bGx9Z2V0IGlzSW5EU1QoKXtyZXR1cm4gdGhpcy5pc09mZnNldEZpeGVkPyExOnRoaXMub2Zmc2V0PnRoaXMuc2V0KHttb250aDoxLGRheToxfSkub2Zmc2V0fHx0aGlzLm9mZnNldD50aGlzLnNldCh7bW9udGg6NX0pLm9mZnNldH1nZXRQb3NzaWJsZU9mZnNldHMoKXtpZighdGhpcy5pc1ZhbGlkfHx0aGlzLmlzT2Zmc2V0Rml4ZWQpcmV0dXJuW3RoaXNdO2NvbnN0IGU9ODY0ZTUsbj02ZTQscj1idCh0aGlzLmMpLHM9dGhpcy56b25lLm9mZnNldChyLWUpLGk9dGhpcy56b25lLm9mZnNldChyK2UpLGE9dGhpcy56b25lLm9mZnNldChyLXMqbiksbz10aGlzLnpvbmUub2Zmc2V0KHItaSpuKTtpZihhPT09bylyZXR1cm5bdGhpc107Y29uc3QgdT1yLWEqbixsPXItbypuLGM9Q3QodSxhKSxkPUN0KGwsbyk7cmV0dXJuIGMuaG91cj09PWQuaG91ciYmYy5taW51dGU9PT1kLm1pbnV0ZSYmYy5zZWNvbmQ9PT1kLnNlY29uZCYmYy5taWxsaXNlY29uZD09PWQubWlsbGlzZWNvbmQ/W2hlKHRoaXMse3RzOnV9KSxoZSh0aGlzLHt0czpsfSldOlt0aGlzXX1nZXQgaXNJbkxlYXBZZWFyKCl7cmV0dXJuIGplKHRoaXMueWVhcil9Z2V0IGRheXNJbk1vbnRoKCl7cmV0dXJuIFN0KHRoaXMueWVhcix0aGlzLm1vbnRoKX1nZXQgZGF5c0luWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/a2UodGhpcy55ZWFyKTpOYU59Z2V0IHdlZWtzSW5XZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/VWUodGhpcy53ZWVrWWVhcik6TmFOfWdldCB3ZWVrc0luTG9jYWxXZWVrWWVhcigpe3JldHVybiB0aGlzLmlzVmFsaWQ/VWUodGhpcy5sb2NhbFdlZWtZZWFyLHRoaXMubG9jLmdldE1pbkRheXNJbkZpcnN0V2VlaygpLHRoaXMubG9jLmdldFN0YXJ0T2ZXZWVrKCkpOk5hTn1yZXNvbHZlZExvY2FsZU9wdGlvbnMoZT17fSl7Y29uc3R7bG9jYWxlOm4sbnVtYmVyaW5nU3lzdGVtOnIsY2FsZW5kYXI6c309eC5jcmVhdGUodGhpcy5sb2MuY2xvbmUoZSksZSkucmVzb2x2ZWRPcHRpb25zKHRoaXMpO3JldHVybntsb2NhbGU6bixudW1iZXJpbmdTeXN0ZW06cixvdXRwdXRDYWxlbmRhcjpzfX10b1VUQyhlPTAsbj17fSl7cmV0dXJuIHRoaXMuc2V0Wm9uZShELmluc3RhbmNlKGUpLG4pfXRvTG9jYWwoKXtyZXR1cm4gdGhpcy5zZXRab25lKEkuZGVmYXVsdFpvbmUpfXNldFpvbmUoZSx7a2VlcExvY2FsVGltZTpuPSExLGtlZXBDYWxlbmRhclRpbWU6cj0hMX09e30pe2lmKGU9bmUoZSxJLmRlZmF1bHRab25lKSxlLmVxdWFscyh0aGlzLnpvbmUpKXJldHVybiB0aGlzO2lmKGUuaXNWYWxpZCl7bGV0IHM9dGhpcy50cztpZihufHxyKXtjb25zdCBpPWUub2Zmc2V0KHRoaXMudHMpLGE9dGhpcy50b09iamVjdCgpO1tzXT1EdChhLGksZSl9cmV0dXJuIGhlKHRoaXMse3RzOnMsem9uZTplfSl9ZWxzZSByZXR1cm4gcC5pbnZhbGlkKE10KGUpKX1yZWNvbmZpZ3VyZSh7bG9jYWxlOmUsbnVtYmVyaW5nU3lzdGVtOm4sb3V0cHV0Q2FsZW5kYXI6cn09e30pe2NvbnN0IHM9dGhpcy5sb2MuY2xvbmUoe2xvY2FsZTplLG51bWJlcmluZ1N5c3RlbTpuLG91dHB1dENhbGVuZGFyOnJ9KTtyZXR1cm4gaGUodGhpcyx7bG9jOnN9KX1zZXRMb2NhbGUoZSl7cmV0dXJuIHRoaXMucmVjb25maWd1cmUoe2xvY2FsZTplfSl9c2V0KGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj1JdChlLExzKSx7bWluRGF5c0luRmlyc3RXZWVrOnIsc3RhcnRPZldlZWs6c309SnIobix0aGlzLmxvYyksaT0hZyhuLndlZWtZZWFyKXx8IWcobi53ZWVrTnVtYmVyKXx8IWcobi53ZWVrZGF5KSxhPSFnKG4ub3JkaW5hbCksbz0hZyhuLnllYXIpLHU9IWcobi5tb250aCl8fCFnKG4uZGF5KSxsPW98fHUsYz1uLndlZWtZZWFyfHxuLndlZWtOdW1iZXI7aWYoKGx8fGEpJiZjKXRocm93IG5ldyBTZSgiQ2FuJ3QgbWl4IHdlZWtZZWFyL3dlZWtOdW1iZXIgdW5pdHMgd2l0aCB5ZWFyL21vbnRoL2RheSBvciBvcmRpbmFscyIpO2lmKHUmJmEpdGhyb3cgbmV3IFNlKCJDYW4ndCBtaXggb3JkaW5hbCBkYXRlcyB3aXRoIG1vbnRoL2RheSIpO2xldCBkO2k/ZD1Zcih7Li4uT3QodGhpcy5jLHIscyksLi4ubn0scixzKTpnKG4ub3JkaW5hbCk/KGQ9ey4uLnRoaXMudG9PYmplY3QoKSwuLi5ufSxnKG4uZGF5KSYmKGQuZGF5PU1hdGgubWluKFN0KGQueWVhcixkLm1vbnRoKSxkLmRheSkpKTpkPUdyKHsuLi5sbih0aGlzLmMpLC4uLm59KTtjb25zdFt5LGhdPUR0KGQsdGhpcy5vLHRoaXMuem9uZSk7cmV0dXJuIGhlKHRoaXMse3RzOnksbzpofSl9cGx1cyhlKXtpZighdGhpcy5pc1ZhbGlkKXJldHVybiB0aGlzO2NvbnN0IG49di5mcm9tRHVyYXRpb25MaWtlKGUpO3JldHVybiBoZSh0aGlzLEFzKHRoaXMsbikpfW1pbnVzKGUpe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIHRoaXM7Y29uc3Qgbj12LmZyb21EdXJhdGlvbkxpa2UoZSkubmVnYXRlKCk7cmV0dXJuIGhlKHRoaXMsQXModGhpcyxuKSl9c3RhcnRPZihlLHt1c2VMb2NhbGVXZWVrczpuPSExfT17fSl7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4gdGhpcztjb25zdCByPXt9LHM9di5ub3JtYWxpemVVbml0KGUpO3N3aXRjaChzKXtjYXNlInllYXJzIjpyLm1vbnRoPTE7Y2FzZSJxdWFydGVycyI6Y2FzZSJtb250aHMiOnIuZGF5PTE7Y2FzZSJ3ZWVrcyI6Y2FzZSJkYXlzIjpyLmhvdXI9MDtjYXNlImhvdXJzIjpyLm1pbnV0ZT0wO2Nhc2UibWludXRlcyI6ci5zZWNvbmQ9MDtjYXNlInNlY29uZHMiOnIubWlsbGlzZWNvbmQ9MDticmVha31pZihzPT09IndlZWtzIilpZihuKXtjb25zdCBpPXRoaXMubG9jLmdldFN0YXJ0T2ZXZWVrKCkse3dlZWtkYXk6YX09dGhpczthPGkmJihyLndlZWtOdW1iZXI9dGhpcy53ZWVrTnVtYmVyLTEpLHIud2Vla2RheT1pfWVsc2Ugci53ZWVrZGF5PTE7aWYocz09PSJxdWFydGVycyIpe2NvbnN0IGk9TWF0aC5jZWlsKHRoaXMubW9udGgvMyk7ci5tb250aD0oaS0xKSozKzF9cmV0dXJuIHRoaXMuc2V0KHIpfWVuZE9mKGUsbil7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnBsdXMoe1tlXToxfSkuc3RhcnRPZihlLG4pLm1pbnVzKDEpOnRoaXN9dG9Gb3JtYXQoZSxuPXt9KXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3guY3JlYXRlKHRoaXMubG9jLnJlZGVmYXVsdFRvRU4obikpLmZvcm1hdERhdGVUaW1lRnJvbVN0cmluZyh0aGlzLGUpOnZufXRvTG9jYWxlU3RyaW5nKGU9eXQsbj17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD94LmNyZWF0ZSh0aGlzLmxvYy5jbG9uZShuKSxlKS5mb3JtYXREYXRlVGltZSh0aGlzKTp2bn10b0xvY2FsZVBhcnRzKGU9e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/eC5jcmVhdGUodGhpcy5sb2MuY2xvbmUoZSksZSkuZm9ybWF0RGF0ZVRpbWVQYXJ0cyh0aGlzKTpbXX10b0lTTyh7Zm9ybWF0OmU9ImV4dGVuZGVkIixzdXBwcmVzc1NlY29uZHM6bj0hMSxzdXBwcmVzc01pbGxpc2Vjb25kczpyPSExLGluY2x1ZGVPZmZzZXQ6cz0hMCxleHRlbmRlZFpvbmU6aT0hMX09e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3QgYT1lPT09ImV4dGVuZGVkIjtsZXQgbz1Tbih0aGlzLGEpO3JldHVybiBvKz0iVCIsbys9VnModGhpcyxhLG4scixzLGkpLG99dG9JU09EYXRlKHtmb3JtYXQ6ZT0iZXh0ZW5kZWQifT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9Tbih0aGlzLGU9PT0iZXh0ZW5kZWQiKTpudWxsfXRvSVNPV2Vla0RhdGUoKXtyZXR1cm4gX3QodGhpcywia2tray0nVydXVy1jIil9dG9JU09UaW1lKHtzdXBwcmVzc01pbGxpc2Vjb25kczplPSExLHN1cHByZXNzU2Vjb25kczpuPSExLGluY2x1ZGVPZmZzZXQ6cj0hMCxpbmNsdWRlUHJlZml4OnM9ITEsZXh0ZW5kZWRab25lOmk9ITEsZm9ybWF0OmE9ImV4dGVuZGVkIn09e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/KHM/IlQiOiIiKStWcyh0aGlzLGE9PT0iZXh0ZW5kZWQiLG4sZSxyLGkpOm51bGx9dG9SRkMyODIyKCl7cmV0dXJuIF90KHRoaXMsIkVFRSwgZGQgTExMIHl5eXkgSEg6bW06c3MgWlpaIiwhMSl9dG9IVFRQKCl7cmV0dXJuIF90KHRoaXMudG9VVEMoKSwiRUVFLCBkZCBMTEwgeXl5eSBISDptbTpzcyAnR01UJyIpfXRvU1FMRGF0ZSgpe3JldHVybiB0aGlzLmlzVmFsaWQ/U24odGhpcywhMCk6bnVsbH10b1NRTFRpbWUoe2luY2x1ZGVPZmZzZXQ6ZT0hMCxpbmNsdWRlWm9uZTpuPSExLGluY2x1ZGVPZmZzZXRTcGFjZTpyPSEwfT17fSl7bGV0IHM9IkhIOm1tOnNzLlNTUyI7cmV0dXJuKG58fGUpJiYociYmKHMrPSIgIiksbj9zKz0ieiI6ZSYmKHMrPSJaWiIpKSxfdCh0aGlzLHMsITApfXRvU1FMKGU9e30pe3JldHVybiB0aGlzLmlzVmFsaWQ/YCR7dGhpcy50b1NRTERhdGUoKX0gJHt0aGlzLnRvU1FMVGltZShlKX1gOm51bGx9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudG9JU08oKTp2bn1bU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV0oKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2BEYXRlVGltZSB7IHRzOiAke3RoaXMudG9JU08oKX0sIHpvbmU6ICR7dGhpcy56b25lLm5hbWV9LCBsb2NhbGU6ICR7dGhpcy5sb2NhbGV9IH1gOmBEYXRlVGltZSB7IEludmFsaWQsIHJlYXNvbjogJHt0aGlzLmludmFsaWRSZWFzb259IH1gfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy50b01pbGxpcygpfXRvTWlsbGlzKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD90aGlzLnRzOk5hTn10b1NlY29uZHMoKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP3RoaXMudHMvMWUzOk5hTn10b1VuaXhJbnRlZ2VyKCl7cmV0dXJuIHRoaXMuaXNWYWxpZD9NYXRoLmZsb29yKHRoaXMudHMvMWUzKTpOYU59dG9KU09OKCl7cmV0dXJuIHRoaXMudG9JU08oKX10b0JTT04oKXtyZXR1cm4gdGhpcy50b0pTRGF0ZSgpfXRvT2JqZWN0KGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJue307Y29uc3Qgbj17Li4udGhpcy5jfTtyZXR1cm4gZS5pbmNsdWRlQ29uZmlnJiYobi5vdXRwdXRDYWxlbmRhcj10aGlzLm91dHB1dENhbGVuZGFyLG4ubnVtYmVyaW5nU3lzdGVtPXRoaXMubG9jLm51bWJlcmluZ1N5c3RlbSxuLmxvY2FsZT10aGlzLmxvYy5sb2NhbGUpLG59dG9KU0RhdGUoKXtyZXR1cm4gbmV3IERhdGUodGhpcy5pc1ZhbGlkP3RoaXMudHM6TmFOKX1kaWZmKGUsbj0ibWlsbGlzZWNvbmRzIixyPXt9KXtpZighdGhpcy5pc1ZhbGlkfHwhZS5pc1ZhbGlkKXJldHVybiB2LmludmFsaWQoImNyZWF0ZWQgYnkgZGlmZmluZyBhbiBpbnZhbGlkIERhdGVUaW1lIik7Y29uc3Qgcz17bG9jYWxlOnRoaXMubG9jYWxlLG51bWJlcmluZ1N5c3RlbTp0aGlzLm51bWJlcmluZ1N5c3RlbSwuLi5yfSxpPWVjKG4pLm1hcCh2Lm5vcm1hbGl6ZVVuaXQpLGE9ZS52YWx1ZU9mKCk+dGhpcy52YWx1ZU9mKCksbz1hP3RoaXM6ZSx1PWE/ZTp0aGlzLGw9c2Yobyx1LGkscyk7cmV0dXJuIGE/bC5uZWdhdGUoKTpsfWRpZmZOb3coZT0ibWlsbGlzZWNvbmRzIixuPXt9KXtyZXR1cm4gdGhpcy5kaWZmKHAubm93KCksZSxuKX11bnRpbChlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkP2suZnJvbURhdGVUaW1lcyh0aGlzLGUpOnRoaXN9aGFzU2FtZShlLG4scil7aWYoIXRoaXMuaXNWYWxpZClyZXR1cm4hMTtjb25zdCBzPWUudmFsdWVPZigpLGk9dGhpcy5zZXRab25lKGUuem9uZSx7a2VlcExvY2FsVGltZTohMH0pO3JldHVybiBpLnN0YXJ0T2YobixyKTw9cyYmczw9aS5lbmRPZihuLHIpfWVxdWFscyhlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkJiZlLmlzVmFsaWQmJnRoaXMudmFsdWVPZigpPT09ZS52YWx1ZU9mKCkmJnRoaXMuem9uZS5lcXVhbHMoZS56b25lKSYmdGhpcy5sb2MuZXF1YWxzKGUubG9jKX10b1JlbGF0aXZlKGU9e30pe2lmKCF0aGlzLmlzVmFsaWQpcmV0dXJuIG51bGw7Y29uc3Qgbj1lLmJhc2V8fHAuZnJvbU9iamVjdCh7fSx7em9uZTp0aGlzLnpvbmV9KSxyPWUucGFkZGluZz90aGlzPG4/LWUucGFkZGluZzplLnBhZGRpbmc6MDtsZXQgcz1bInllYXJzIiwibW9udGhzIiwiZGF5cyIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiXSxpPWUudW5pdDtyZXR1cm4gQXJyYXkuaXNBcnJheShlLnVuaXQpJiYocz1lLnVuaXQsaT12b2lkIDApLFpzKG4sdGhpcy5wbHVzKHIpLHsuLi5lLG51bWVyaWM6ImFsd2F5cyIsdW5pdHM6cyx1bml0Oml9KX10b1JlbGF0aXZlQ2FsZW5kYXIoZT17fSl7cmV0dXJuIHRoaXMuaXNWYWxpZD9acyhlLmJhc2V8fHAuZnJvbU9iamVjdCh7fSx7em9uZTp0aGlzLnpvbmV9KSx0aGlzLHsuLi5lLG51bWVyaWM6ImF1dG8iLHVuaXRzOlsieWVhcnMiLCJtb250aHMiLCJkYXlzIl0sY2FsZW5kYXJ5OiEwfSk6bnVsbH1zdGF0aWMgbWluKC4uLmUpe2lmKCFlLmV2ZXJ5KHAuaXNEYXRlVGltZSkpdGhyb3cgbmV3IF8oIm1pbiByZXF1aXJlcyBhbGwgYXJndW1lbnRzIGJlIERhdGVUaW1lcyIpO3JldHVybiBlcyhlLG49Pm4udmFsdWVPZigpLE1hdGgubWluKX1zdGF0aWMgbWF4KC4uLmUpe2lmKCFlLmV2ZXJ5KHAuaXNEYXRlVGltZSkpdGhyb3cgbmV3IF8oIm1heCByZXF1aXJlcyBhbGwgYXJndW1lbnRzIGJlIERhdGVUaW1lcyIpO3JldHVybiBlcyhlLG49Pm4udmFsdWVPZigpLE1hdGgubWF4KX1zdGF0aWMgZnJvbUZvcm1hdEV4cGxhaW4oZSxuLHI9e30pe2NvbnN0e2xvY2FsZTpzPW51bGwsbnVtYmVyaW5nU3lzdGVtOmk9bnVsbH09cixhPVQuZnJvbU9wdHMoe2xvY2FsZTpzLG51bWJlcmluZ1N5c3RlbTppLGRlZmF1bHRUb0VOOiEwfSk7cmV0dXJuIENzKGEsZSxuKX1zdGF0aWMgZnJvbVN0cmluZ0V4cGxhaW4oZSxuLHI9e30pe3JldHVybiBwLmZyb21Gb3JtYXRFeHBsYWluKGUsbixyKX1zdGF0aWMgZ2V0IERBVEVfU0hPUlQoKXtyZXR1cm4geXR9c3RhdGljIGdldCBEQVRFX01FRCgpe3JldHVybiBtcn1zdGF0aWMgZ2V0IERBVEVfTUVEX1dJVEhfV0VFS0RBWSgpe3JldHVybiBNbH1zdGF0aWMgZ2V0IERBVEVfRlVMTCgpe3JldHVybiB5cn1zdGF0aWMgZ2V0IERBVEVfSFVHRSgpe3JldHVybiBncn1zdGF0aWMgZ2V0IFRJTUVfU0lNUExFKCl7cmV0dXJuIHByfXN0YXRpYyBnZXQgVElNRV9XSVRIX1NFQ09ORFMoKXtyZXR1cm4gd3J9c3RhdGljIGdldCBUSU1FX1dJVEhfU0hPUlRfT0ZGU0VUKCl7cmV0dXJuIHZyfXN0YXRpYyBnZXQgVElNRV9XSVRIX0xPTkdfT0ZGU0VUKCl7cmV0dXJuIE9yfXN0YXRpYyBnZXQgVElNRV8yNF9TSU1QTEUoKXtyZXR1cm4gVHJ9c3RhdGljIGdldCBUSU1FXzI0X1dJVEhfU0VDT05EUygpe3JldHVybiBTcn1zdGF0aWMgZ2V0IFRJTUVfMjRfV0lUSF9TSE9SVF9PRkZTRVQoKXtyZXR1cm4gYnJ9c3RhdGljIGdldCBUSU1FXzI0X1dJVEhfTE9OR19PRkZTRVQoKXtyZXR1cm4ga3J9c3RhdGljIGdldCBEQVRFVElNRV9TSE9SVCgpe3JldHVybiBJcn1zdGF0aWMgZ2V0IERBVEVUSU1FX1NIT1JUX1dJVEhfU0VDT05EUygpe3JldHVybiBFcn1zdGF0aWMgZ2V0IERBVEVUSU1FX01FRCgpe3JldHVybiBOcn1zdGF0aWMgZ2V0IERBVEVUSU1FX01FRF9XSVRIX1NFQ09ORFMoKXtyZXR1cm4geHJ9c3RhdGljIGdldCBEQVRFVElNRV9NRURfV0lUSF9XRUVLREFZKCl7cmV0dXJuIENsfXN0YXRpYyBnZXQgREFURVRJTUVfRlVMTCgpe3JldHVybiBNcn1zdGF0aWMgZ2V0IERBVEVUSU1FX0ZVTExfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIENyfXN0YXRpYyBnZXQgREFURVRJTUVfSFVHRSgpe3JldHVybiBEcn1zdGF0aWMgZ2V0IERBVEVUSU1FX0hVR0VfV0lUSF9TRUNPTkRTKCl7cmV0dXJuIF9yfX1mdW5jdGlvbiBKZSh0KXtpZihwLmlzRGF0ZVRpbWUodCkpcmV0dXJuIHQ7aWYodCYmdC52YWx1ZU9mJiZjZSh0LnZhbHVlT2YoKSkpcmV0dXJuIHAuZnJvbUpTRGF0ZSh0KTtpZih0JiZ0eXBlb2YgdD09Im9iamVjdCIpcmV0dXJuIHAuZnJvbU9iamVjdCh0KTt0aHJvdyBuZXcgXyhgVW5rbm93biBkYXRldGltZSBhcmd1bWVudDogJHt0fSwgb2YgdHlwZSAke3R5cGVvZiB0fWApfWZ1bmN0aW9uIElmKHtjb2xsZWN0aW9uczp0LGx3dzplfSx7dGFibGVJZHM6bix0YWJsZUNvbHVtbklkczpyLHJlbGF0aW9uc2hpcElkczpzLGluZGV4SWRzOmksaW5kZXhDb2x1bW5JZHM6YSxtZW1vSWRzOm99KXtWKHQpLmNvbGxlY3Rpb24oInRhYmxlRW50aXRpZXMiKS5yZW1vdmVNYW55KG4pLFYodCkuY29sbGVjdGlvbigidGFibGVDb2x1bW5FbnRpdGllcyIpLnJlbW92ZU1hbnkociksVih0KS5jb2xsZWN0aW9uKCJyZWxhdGlvbnNoaXBFbnRpdGllcyIpLnJlbW92ZU1hbnkocyksVih0KS5jb2xsZWN0aW9uKCJpbmRleEVudGl0aWVzIikucmVtb3ZlTWFueShpKSxWKHQpLmNvbGxlY3Rpb24oImluZGV4Q29sdW1uRW50aXRpZXMiKS5yZW1vdmVNYW55KGEpLFYodCkuY29sbGVjdGlvbigibWVtb0VudGl0aWVzIikucmVtb3ZlTWFueShvKSxbLi4ubiwuLi5yLC4uLnMsLi4uaSwuLi5hLC4uLm9dLmZvckVhY2godT0+UmVmbGVjdC5kZWxldGVQcm9wZXJ0eShlLHUpKX1jb25zdCBFZj0zMCxOZj1DKFsidGFibGVFbnRpdGllcyIsInRhYmxlQ29sdW1uRW50aXRpZXMiLCJyZWxhdGlvbnNoaXBFbnRpdGllcyIsImluZGV4RW50aXRpZXMiLCJpbmRleENvbHVtbkVudGl0aWVzIiwibWVtb0VudGl0aWVzIl0pO2NsYXNzIHhme2FzeW5jIHJ1bihlKXtjb25zdCBuPUpTT04ucGFyc2UoZSkscj1KbyhuKSx7ZG9jOnt0YWJsZUlkczpzLG1lbW9JZHM6aSxpbmRleElkczphLHJlbGF0aW9uc2hpcElkczpvfSxjb2xsZWN0aW9uczp1LGx3dzpsfT1yLGM9QyhzKSxkPUMoaSkseT1DKGEpLGg9QyhvKSxTPU1mKHAubm93KCkpLGo9Vih1KS5jb2xsZWN0aW9uKCJ0YWJsZUVudGl0aWVzIiksTT1WKHUpLmNvbGxlY3Rpb24oInRhYmxlQ29sdW1uRW50aXRpZXMiKSxxPVYodSkuY29sbGVjdGlvbigiaW5kZXhFbnRpdGllcyIpLEI9Vih1KS5jb2xsZWN0aW9uKCJpbmRleENvbHVtbkVudGl0aWVzIiksX2U9Vih1KS5jb2xsZWN0aW9uKCJyZWxhdGlvbnNoaXBFbnRpdGllcyIpLEZ0PVYodSkuY29sbGVjdGlvbigibWVtb0VudGl0aWVzIiksYj17dGFibGVJZHM6Wy4uLmouc2VsZWN0QWxsKCkuZmlsdGVyKFMoYykpLm1hcCgoe2lkOm19KT0+bSldLHRhYmxlQ29sdW1uSWRzOltdLHJlbGF0aW9uc2hpcElkczpbLi4uX2Uuc2VsZWN0QWxsKCkuZmlsdGVyKFMoaCkpLm1hcCgoe2lkOm19KT0+bSldLGluZGV4SWRzOlsuLi5xLnNlbGVjdEFsbCgpLmZpbHRlcihTKHkpKS5tYXAoKHtpZDptfSk9Pm0pXSxpbmRleENvbHVtbklkczpbXSxtZW1vSWRzOlsuLi5GdC5zZWxlY3RBbGwoKS5maWx0ZXIoUyhkKSkubWFwKCh7aWQ6bX0pPT5tKV19LEZlPUMoYi50YWJsZUlkcyksYm49QyhiLnJlbGF0aW9uc2hpcElkcyk7bGV0IEJlPUMoYi5pbmRleElkcyk7Yi50YWJsZUNvbHVtbklkcy5wdXNoKC4uLk0uc2VsZWN0QWxsKCkuZmlsdGVyKCh7dGFibGVJZDptfSk9PkZlKG0pKS5tYXAoKHtpZDptfSk9Pm0pKSxiLnJlbGF0aW9uc2hpcElkcy5wdXNoKC4uLl9lLnNlbGVjdEFsbCgpLmZpbHRlcigoe2lkOm0sc3RhcnQ6WSxlbmQ6UWV9KT0+IWJuKG0pJiYoRmUoWS50YWJsZUlkKXx8RmUoUWUudGFibGVJZCkpKS5tYXAoKHtpZDptfSk9Pm0pKSxiLmluZGV4SWRzLnB1c2goLi4ucS5zZWxlY3RBbGwoKS5maWx0ZXIoKHtpZDptLHRhYmxlSWQ6WX0pPT4hQmUobSkmJkZlKFkpKS5tYXAoKHtpZDptfSk9Pm0pKSxCZT1DKGIuaW5kZXhJZHMpLGIuaW5kZXhDb2x1bW5JZHMucHVzaCguLi5CLnNlbGVjdEFsbCgpLmZpbHRlcigoe2luZGV4SWQ6bX0pPT5CZShtKSkubWFwKCh7aWQ6bX0pPT5tKSksSWYocixiKTtjb25zdCBBZT1DKGouc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksbWU9QyhNLnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpLEF0PUMocS5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxEZj1DKEIuc2VsZWN0QWxsKCkubWFwKCh7aWQ6bX0pPT5tKSksX2Y9QyhfZS5zZWxlY3RBbGwoKS5tYXAoKHtpZDptfSk9Pm0pKSxGZj1DKEZ0LnNlbGVjdEFsbCgpLm1hcCgoe2lkOm19KT0+bSkpO3JldHVybiBiLnRhYmxlQ29sdW1uSWRzLnB1c2goLi4uTS5zZWxlY3RBbGwoKS5maWx0ZXIoKHt0YWJsZUlkOm0saWQ6WSxtZXRhOlFlfSk9PiFBZShtKSYmUygoKT0+ITEpKHtpZDpZLG1ldGE6UWV9KSkubWFwKCh7aWQ6bX0pPT5tKSksYi5pbmRleENvbHVtbklkcy5wdXNoKC4uLkIuc2VsZWN0QWxsKCkuZmlsdGVyKCh7aW5kZXhJZDptLGlkOlksbWV0YTpRZX0pPT4hQXQobSkmJlMoKCk9PiExKSh7aWQ6WSxtZXRhOlFlfSkpLm1hcCgoe2lkOm19KT0+bSkpLE9iamVjdC5lbnRyaWVzKGwpLmZvckVhY2goKFttLFtZXV0pPT57aWYoTmYoWSkpc3dpdGNoKFkpe2Nhc2UidGFibGVFbnRpdGllcyI6IUFlKG0pJiZiLnRhYmxlSWRzLnB1c2gobSk7YnJlYWs7Y2FzZSJ0YWJsZUNvbHVtbkVudGl0aWVzIjohbWUobSkmJmIudGFibGVDb2x1bW5JZHMucHVzaChtKTticmVhaztjYXNlInJlbGF0aW9uc2hpcEVudGl0aWVzIjohX2YobSkmJmIucmVsYXRpb25zaGlwSWRzLnB1c2gobSk7YnJlYWs7Y2FzZSJpbmRleEVudGl0aWVzIjohQXQobSkmJmIuaW5kZXhJZHMucHVzaChtKTticmVhaztjYXNlImluZGV4Q29sdW1uRW50aXRpZXMiOiFEZihtKSYmYi5pbmRleENvbHVtbklkcy5wdXNoKG0pO2JyZWFrO2Nhc2UibWVtb0VudGl0aWVzIjohRmYobSkmJmIubWVtb0lkcy5wdXNoKG0pO2JyZWFrfX0pLHt0YWJsZUlkczpUZShiLnRhYmxlSWRzKSx0YWJsZUNvbHVtbklkczpUZShiLnRhYmxlQ29sdW1uSWRzKSxyZWxhdGlvbnNoaXBJZHM6VGUoYi5yZWxhdGlvbnNoaXBJZHMpLGluZGV4SWRzOlRlKGIuaW5kZXhJZHMpLGluZGV4Q29sdW1uSWRzOlRlKGIuaW5kZXhDb2x1bW5JZHMpLG1lbW9JZHM6VGUoYi5tZW1vSWRzKX19fWNvbnN0IE1mPXQ9PmU9Pih7aWQ6bixtZXRhOnJ9KT0+e2lmKGUobikpcmV0dXJuITE7Y29uc3Qgcz1NYXRoLmZsb29yKHQuZGlmZihwLmZyb21NaWxsaXMoci51cGRhdGVBdCksImRheXMiKS50b09iamVjdCgpLmRheXM/PzApO3JldHVybiBFZjxzfSxDZj1uZXcgeGY7V3QoQ2YpfSkoKTsK",ok=typeof window<"u"&&window.Blob&&new Blob([atob(ik)],{type:"text/javascript;charset=utf-8"});function Joe(e){let t;try{if(t=ok&&(window.URL||window.webkitURL).createObjectURL(ok),!t)throw"";const n=new Worker(t,{name:e==null?void 0:e.name});return n.addEventListener("error",()=>{(window.URL||window.webkitURL).revokeObjectURL(t)}),n}catch{return new Worker("data:application/javascript;base64,"+ik,{name:e==null?void 0:e.name})}finally{t&&(window.URL||window.webkitURL).revokeObjectURL(t)}}function rk({collections:e,lww:t},{tableIds:n,tableColumnIds:i,relationshipIds:o,indexIds:r,indexColumnIds:a,memoIds:l}){S(e).collection("tableEntities").removeMany(n),S(e).collection("tableColumnEntities").removeMany(i),S(e).collection("relationshipEntities").removeMany(o),S(e).collection("indexEntities").removeMany(r),S(e).collection("indexColumnEntities").removeMany(a),S(e).collection("memoEntities").removeMany(l),[...n,...i,...o,...r,...a,...l].forEach(u=>Reflect.deleteProperty(t,u))}const $oe=30,Foe=se(["tableEntities","tableColumnEntities","relationshipEntities","indexEntities","indexColumnEntities","memoEntities"]);class Eoe{async run(t){const n=JSON.parse(t),i=Zr(n),{doc:{tableIds:o,memoIds:r,indexIds:a,relationshipIds:l},collections:u,lww:d}=i,h=se(o),y=se(r),f=se(a),g=se(l),Z=Ooe(Ze.now()),x=S(u).collection("tableEntities"),X=S(u).collection("tableColumnEntities"),W=S(u).collection("indexEntities"),R=S(u).collection("indexColumnEntities"),T=S(u).collection("relationshipEntities"),V=S(u).collection("memoEntities"),z={tableIds:[...x.selectAll().filter(Z(h)).map(({id:re})=>re)],tableColumnIds:[],relationshipIds:[...T.selectAll().filter(Z(g)).map(({id:re})=>re)],indexIds:[...W.selectAll().filter(Z(f)).map(({id:re})=>re)],indexColumnIds:[],memoIds:[...V.selectAll().filter(Z(y)).map(({id:re})=>re)]},H=se(z.tableIds),N=se(z.relationshipIds);let w=se(z.indexIds);z.tableColumnIds.push(...X.selectAll().filter(({tableId:re})=>H(re)).map(({id:re})=>re)),z.relationshipIds.push(...T.selectAll().filter(({id:re,start:Ge,end:Ot})=>!N(re)&&(H(Ge.tableId)||H(Ot.tableId))).map(({id:re})=>re)),z.indexIds.push(...W.selectAll().filter(({id:re,tableId:Ge})=>!w(re)&&H(Ge)).map(({id:re})=>re)),w=se(z.indexIds),z.indexColumnIds.push(...R.selectAll().filter(({indexId:re})=>w(re)).map(({id:re})=>re)),rk(i,z);const F=se(x.selectAll().map(({id:re})=>re)),E=se(X.selectAll().map(({id:re})=>re)),O=se(W.selectAll().map(({id:re})=>re)),A=se(R.selectAll().map(({id:re})=>re)),P=se(T.selectAll().map(({id:re})=>re)),Ve=se(V.selectAll().map(({id:re})=>re));return z.tableColumnIds.push(...X.selectAll().filter(({tableId:re,id:Ge,meta:Ot})=>!F(re)&&Z(()=>!1)({id:Ge,meta:Ot})).map(({id:re})=>re)),z.indexColumnIds.push(...R.selectAll().filter(({indexId:re,id:Ge,meta:Ot})=>!O(re)&&Z(()=>!1)({id:Ge,meta:Ot})).map(({id:re})=>re)),Object.entries(d).forEach(([re,[Ge]])=>{if(Foe(Ge))switch(Ge){case"tableEntities":!F(re)&&z.tableIds.push(re);break;case"tableColumnEntities":!E(re)&&z.tableColumnIds.push(re);break;case"relationshipEntities":!P(re)&&z.relationshipIds.push(re);break;case"indexEntities":!O(re)&&z.indexIds.push(re);break;case"indexColumnEntities":!A(re)&&z.indexColumnIds.push(re);break;case"memoEntities":!Ve(re)&&z.memoIds.push(re);break}}),{tableIds:Ao(z.tableIds),tableColumnIds:Ao(z.tableColumnIds),relationshipIds:Ao(z.relationshipIds),indexIds:Ao(z.indexIds),indexColumnIds:Ao(z.indexColumnIds),memoIds:Ao(z.memoIds)}}}const Ooe=e=>t=>({id:n,meta:i})=>{if(t(n))return!1;const o=Math.floor(e.diff(Ze.fromMillis(i.updateAt),"days").toObject().days??0);return $oe<o},ak="@dineug/erd-editor-schema-gc-worker?v3.0.3";let rs=null;function Uoe(){if(rs)return rs;try{const e=new zoe({name:ak});rs=M1(e.port)}catch{try{const t=new Joe({name:ak});rs=M1(t)}catch{rs=new Eoe}}return rs}let Qh=null,as;const Poe=2,joe=J`
|
|
7063
7063
|
visibility: hidden;
|
|
7064
7064
|
position: fixed;
|
|
7065
7065
|
top: -100px;
|