UNPKG

mars3d-cesium

Version:

CesiumJS是一个JavaScript库,用于在web浏览器中无需插件创建3D地球仪和2D地图,mars3d-cesium是火星科技修改版本的CesiumJS。

26 lines (25 loc) 5.17 MB
/** * @license * Cesium - https://github.com/CesiumGS/cesium * Version 1.127 * * Copyright 2011-2022 Cesium Contributors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Columbus View (Pat. Pend.) * * Portions licensed separately. * See https://github.com/CesiumGS/cesium/blob/main/LICENSE.md for full licensing details. */ var Cesium=(()=>{var x1e=Object.create;var lN=Object.defineProperty;var _1e=Object.getOwnPropertyDescriptor;var T1e=Object.getOwnPropertyNames;var S1e=Object.getPrototypeOf,C1e=Object.prototype.hasOwnProperty;var dN=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var dd=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),V1e=(e,t)=>{for(var n in t)lN(e,n,{get:t[n],enumerable:!0})},Wq=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of T1e(t))!C1e.call(e,o)&&o!==n&&lN(e,o,{get:()=>t[o],enumerable:!(i=_1e(t,o))||i.enumerable});return e};var T=(e,t,n)=>(n=e!=null?x1e(S1e(e)):{},Wq(t||!e||!e.__esModule?lN(n,"default",{value:e,enumerable:!0}):n,e)),L1e=e=>Wq(lN({},"__esModule",{value:!0}),e);var S=dd(()=>{globalThis.CESIUM_WORKERS=atob("dmFyIENlc2l1bVdvcmtlcnM9KCgpPT57dmFyIFhTPU9iamVjdC5jcmVhdGU7dmFyIEJsPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgWVM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgJFM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIFpTPU9iamVjdC5nZXRQcm90b3R5cGVPZixRUz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBwcj0odD0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkodCx7Z2V0OihlLG4pPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6ZSlbbl19KTp0KShmdW5jdGlvbih0KXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrdCsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KSxwMT10PT5lPT57dmFyIG49dFtlXTtpZihuKXJldHVybiBuKCk7dGhyb3cgbmV3IEVycm9yKCJNb2R1bGUgbm90IGZvdW5kIGluIGJ1bmRsZTogIitlKX07dmFyIFo9KHQsZSk9PigpPT4odCYmKGU9dCh0PTApKSxlKTt2YXIgWG49KHQsZSk9PigpPT4oZXx8dCgoZT17ZXhwb3J0czp7fX0pLmV4cG9ydHMsZSksZS5leHBvcnRzKSxkZT0odCxlKT0+e2Zvcih2YXIgbiBpbiBlKUJsKHQsbix7Z2V0OmVbbl0sZW51bWVyYWJsZTohMH0pfSxkMT0odCxlLG4sbyk9PntpZihlJiZ0eXBlb2YgZT09Im9iamVjdCJ8fHR5cGVvZiBlPT0iZnVuY3Rpb24iKWZvcihsZXQgciBvZiAkUyhlKSkhUVMuY2FsbCh0LHIpJiZyIT09biYmQmwodCxyLHtnZXQ6KCk9PmVbcl0sZW51bWVyYWJsZTohKG89WVMoZSxyKSl8fG8uZW51bWVyYWJsZX0pO3JldHVybiB0fTt2YXIgZHI9KHQsZSxuKT0+KG49dCE9bnVsbD9YUyhaUyh0KSk6e30sZDEoZXx8IXR8fCF0Ll9fZXNNb2R1bGU/QmwobiwiZGVmYXVsdCIse3ZhbHVlOnQsZW51bWVyYWJsZTohMH0pOm4sdCkpLEpTPXQ9PmQxKEJsKHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0KTtmdW5jdGlvbiB0Qyh0KXtyZXR1cm4gdCE9bnVsbH12YXIgaCxmdD1aKCgpPT57aD10Q30pO2Z1bmN0aW9uIFZzKHQpe3RoaXMubmFtZT0iRGV2ZWxvcGVyRXJyb3IiLHRoaXMubWVzc2FnZT10O2xldCBlO3RyeXt0aHJvdyBuZXcgRXJyb3J9Y2F0Y2gobil7ZT1uLnN0YWNrfXRoaXMuc3RhY2s9ZX12YXIgQixIdD1aKCgpPT57ZnQoKTtoKE9iamVjdC5jcmVhdGUpJiYoVnMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKSxWcy5wcm90b3R5cGUuY29uc3RydWN0b3I9VnMpO1ZzLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2xldCB0PWAke3RoaXMubmFtZX06ICR7dGhpcy5tZXNzYWdlfWA7cmV0dXJuIGgodGhpcy5zdGFjaykmJih0Kz1gCiR7dGhpcy5zdGFjay50b1N0cmluZygpfWApLHR9O1ZzLnRocm93SW5zdGFudGlhdGlvbkVycm9yPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFZzKCJUaGlzIGZ1bmN0aW9uIGRlZmluZXMgYW4gaW50ZXJmYWNlIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4iKX07Qj1Wc30pO2Z1bmN0aW9uIGVDKHQpe3JldHVybmAke3R9IGlzIHJlcXVpcmVkLCBhY3R1YWwgdmFsdWUgd2FzIHVuZGVmaW5lZGB9ZnVuY3Rpb24gemModCxlLG4pe3JldHVybmBFeHBlY3RlZCAke259IHRvIGJlIHR5cGVvZiAke2V9LCBhY3R1YWwgdHlwZW9mIHdhcyAke3R9YH12YXIgWW4seSxYdD1aKCgpPT57ZnQoKTtIdCgpO1luPXt9O1luLnR5cGVPZj17fTtZbi5kZWZpbmVkPWZ1bmN0aW9uKHQsZSl7aWYoIWgoZSkpdGhyb3cgbmV3IEIoZUModCkpfTtZbi50eXBlT2YuZnVuYz1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0iZnVuY3Rpb24iKXRocm93IG5ldyBCKHpjKHR5cGVvZiBlLCJmdW5jdGlvbiIsdCkpfTtZbi50eXBlT2Yuc3RyaW5nPWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJzdHJpbmciKXRocm93IG5ldyBCKHpjKHR5cGVvZiBlLCJzdHJpbmciLHQpKX07WW4udHlwZU9mLm51bWJlcj1mdW5jdGlvbih0LGUpe2lmKHR5cGVvZiBlIT0ibnVtYmVyIil0aHJvdyBuZXcgQih6Yyh0eXBlb2YgZSwibnVtYmVyIix0KSl9O1luLnR5cGVPZi5udW1iZXIubGVzc1RoYW49ZnVuY3Rpb24odCxlLG4pe2lmKFluLnR5cGVPZi5udW1iZXIodCxlKSxlPj1uKXRocm93IG5ldyBCKGBFeHBlY3RlZCAke3R9IHRvIGJlIGxlc3MgdGhhbiAke259LCBhY3R1YWwgdmFsdWUgd2FzICR7ZX1gKX07WW4udHlwZU9mLm51bWJlci5sZXNzVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKHQsZSxuKXtpZihZbi50eXBlT2YubnVtYmVyKHQsZSksZT5uKXRocm93IG5ldyBCKGBFeHBlY3RlZCAke3R9IHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAke259LCBhY3R1YWwgdmFsdWUgd2FzICR7ZX1gKX07WW4udHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoWW4udHlwZU9mLm51bWJlcih0LGUpLGU8PW4pdGhyb3cgbmV3IEIoYEV4cGVjdGVkICR7dH0gdG8gYmUgZ3JlYXRlciB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfTtZbi50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKFluLnR5cGVPZi5udW1iZXIodCxlKSxlPG4pdGhyb3cgbmV3IEIoYEV4cGVjdGVkICR7dH0gdG8gYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHtlfWApfTtZbi50eXBlT2Yub2JqZWN0PWZ1bmN0aW9uKHQsZSl7aWYodHlwZW9mIGUhPSJvYmplY3QiKXRocm93IG5ldyBCKHpjKHR5cGVvZiBlLCJvYmplY3QiLHQpKX07WW4udHlwZU9mLmJvb2w9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9ImJvb2xlYW4iKXRocm93IG5ldyBCKHpjKHR5cGVvZiBlLCJib29sZWFuIix0KSl9O1luLnR5cGVPZi5iaWdpbnQ9ZnVuY3Rpb24odCxlKXtpZih0eXBlb2YgZSE9ImJpZ2ludCIpdGhyb3cgbmV3IEIoemModHlwZW9mIGUsImJpZ2ludCIsdCkpfTtZbi50eXBlT2YubnVtYmVyLmVxdWFscz1mdW5jdGlvbih0LGUsbixvKXtpZihZbi50eXBlT2YubnVtYmVyKHQsbiksWW4udHlwZU9mLm51bWJlcihlLG8pLG4hPT1vKXRocm93IG5ldyBCKGAke3R9IG11c3QgYmUgZXF1YWwgdG8gJHtlfSwgdGhlIGFjdHVhbCB2YWx1ZXMgYXJlICR7bn0gYW5kICR7b31gKX07eT1Zbn0pO2Z1bmN0aW9uIG0xKHQsZSl7cmV0dXJuIHQhPW51bGw/dDplfXZhciB4LEl0PVooKCk9PnttMS5FTVBUWV9PQkpFQ1Q9T2JqZWN0LmZyZWV6ZSh7fSk7eD1tMX0pO3ZhciBfMT1YbigocVYsaDEpPT57dmFyIFJpPWZ1bmN0aW9uKHQpe3Q9PW51bGwmJih0PW5ldyBEYXRlKCkuZ2V0VGltZSgpKSx0aGlzLk49NjI0LHRoaXMuTT0zOTcsdGhpcy5NQVRSSVhfQT0yNTY3NDgzNjE1LHRoaXMuVVBQRVJfTUFTSz0yMTQ3NDgzNjQ4LHRoaXMuTE9XRVJfTUFTSz0yMTQ3NDgzNjQ3LHRoaXMubXQ9bmV3IEFycmF5KHRoaXMuTiksdGhpcy5tdGk9dGhpcy5OKzEsdC5jb25zdHJ1Y3Rvcj09QXJyYXk/dGhpcy5pbml0X2J5X2FycmF5KHQsdC5sZW5ndGgpOnRoaXMuaW5pdF9zZWVkKHQpfTtSaS5wcm90b3R5cGUuaW5pdF9zZWVkPWZ1bmN0aW9uKHQpe2Zvcih0aGlzLm10WzBdPXQ+Pj4wLHRoaXMubXRpPTE7dGhpcy5tdGk8dGhpcy5OO3RoaXMubXRpKyspe3ZhciB0PXRoaXMubXRbdGhpcy5tdGktMV1edGhpcy5tdFt0aGlzLm10aS0xXT4+PjMwO3RoaXMubXRbdGhpcy5tdGldPSgoKHQmNDI5NDkwMTc2MCk+Pj4xNikqMTgxMjQzMzI1Mzw8MTYpKyh0JjY1NTM1KSoxODEyNDMzMjUzK3RoaXMubXRpLHRoaXMubXRbdGhpcy5tdGldPj4+PTB9fTtSaS5wcm90b3R5cGUuaW5pdF9ieV9hcnJheT1mdW5jdGlvbih0LGUpe3ZhciBuLG8scjtmb3IodGhpcy5pbml0X3NlZWQoMTk2NTAyMTgpLG49MSxvPTAscj10aGlzLk4+ZT90aGlzLk46ZTtyO3ItLSl7dmFyIGk9dGhpcy5tdFtuLTFdXnRoaXMubXRbbi0xXT4+PjMwO3RoaXMubXRbbl09KHRoaXMubXRbbl1eKCgoaSY0Mjk0OTAxNzYwKT4+PjE2KSoxNjY0NTI1PDwxNikrKGkmNjU1MzUpKjE2NjQ1MjUpK3Rbb10rbyx0aGlzLm10W25dPj4+PTAsbisrLG8rKyxuPj10aGlzLk4mJih0aGlzLm10WzBdPXRoaXMubXRbdGhpcy5OLTFdLG49MSksbz49ZSYmKG89MCl9Zm9yKHI9dGhpcy5OLTE7cjtyLS0pe3ZhciBpPXRoaXMubXRbbi0xXV50aGlzLm10W24tMV0+Pj4zMDt0aGlzLm10W25dPSh0aGlzLm10W25dXigoKGkmNDI5NDkwMTc2MCk+Pj4xNikqMTU2NjA4Mzk0MTw8MTYpKyhpJjY1NTM1KSoxNTY2MDgzOTQxKS1uLHRoaXMubXRbbl0+Pj49MCxuKyssbj49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxuPTEpfXRoaXMubXRbMF09MjE0NzQ4MzY0OH07UmkucHJvdG90eXBlLnJhbmRvbV9pbnQ9ZnVuY3Rpb24oKXt2YXIgdCxlPW5ldyBBcnJheSgwLHRoaXMuTUFUUklYX0EpO2lmKHRoaXMubXRpPj10aGlzLk4pe3ZhciBuO2Zvcih0aGlzLm10aT09dGhpcy5OKzEmJnRoaXMuaW5pdF9zZWVkKDU0ODkpLG49MDtuPHRoaXMuTi10aGlzLk07bisrKXQ9dGhpcy5tdFtuXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtuKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W25dPXRoaXMubXRbbit0aGlzLk1dXnQ+Pj4xXmVbdCYxXTtmb3IoO248dGhpcy5OLTE7bisrKXQ9dGhpcy5tdFtuXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFtuKzFdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W25dPXRoaXMubXRbbisodGhpcy5NLXRoaXMuTildXnQ+Pj4xXmVbdCYxXTt0PXRoaXMubXRbdGhpcy5OLTFdJnRoaXMuVVBQRVJfTUFTS3x0aGlzLm10WzBdJnRoaXMuTE9XRVJfTUFTSyx0aGlzLm10W3RoaXMuTi0xXT10aGlzLm10W3RoaXMuTS0xXV50Pj4+MV5lW3QmMV0sdGhpcy5tdGk9MH1yZXR1cm4gdD10aGlzLm10W3RoaXMubXRpKytdLHRePXQ+Pj4xMSx0Xj10PDw3JjI2MzY5Mjg2NDAsdF49dDw8MTUmNDAyMjczMDc1Mix0Xj10Pj4+MTgsdD4+PjB9O1JpLnByb3RvdHlwZS5yYW5kb21faW50MzE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCk+Pj4xfTtSaS5wcm90b3R5cGUucmFuZG9tX2luY2w9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCkqKDEvNDI5NDk2NzI5NSl9O1JpLnByb3RvdHlwZS5yYW5kb209ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5kb21faW50KCkqKDEvNDI5NDk2NzI5Nil9O1JpLnByb3RvdHlwZS5yYW5kb21fZXhjbD1mdW5jdGlvbigpe3JldHVybih0aGlzLnJhbmRvbV9pbnQoKSsuNSkqKDEvNDI5NDk2NzI5Nil9O1JpLnByb3RvdHlwZS5yYW5kb21fbG9uZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMucmFuZG9tX2ludCgpPj4+NSxlPXRoaXMucmFuZG9tX2ludCgpPj4+NjtyZXR1cm4odCo2NzEwODg2NCtlKSooMS85MDA3MTk5MjU0NzQwOTkyKX07aDEuZXhwb3J0cz1SaX0pO3ZhciBPbSx4dCxVbCx5MSxNLFd0PVooKCk9PntPbT1kcihfMSgpLDEpO1h0KCk7SXQoKTtmdCgpO0h0KCk7eHQ9e307eHQuRVBTSUxPTjE9LjE7eHQuRVBTSUxPTjI9LjAxO3h0LkVQU0lMT04zPS4wMDE7eHQuRVBTSUxPTjQ9MWUtNDt4dC5FUFNJTE9ONT0xZS01O3h0LkVQU0lMT042PTFlLTY7eHQuRVBTSUxPTjc9MWUtNzt4dC5FUFNJTE9OOD0xZS04O3h0LkVQU0lMT045PTFlLTk7eHQuRVBTSUxPTjEwPTFlLTEwO3h0LkVQU0lMT04xMT0xZS0xMTt4dC5FUFNJTE9OMTI9MWUtMTI7eHQuRVBTSUxPTjEzPTFlLTEzO3h0LkVQU0lMT04xND0xZS0xNDt4dC5FUFNJTE9OMTU9MWUtMTU7eHQuRVBTSUxPTjE2PTFlLTE2O3h0LkVQU0lMT04xNz0xZS0xNzt4dC5FUFNJTE9OMTg9MWUtMTg7eHQuRVBTSUxPTjE5PTFlLTE5O3h0LkVQU0lMT04yMD0xZS0yMDt4dC5FUFNJTE9OMjE9MWUtMjE7eHQuR1JBVklUQVRJT05BTFBBUkFNRVRFUj0zOTg2MDA0NDE4ZTU7eHQuU09MQVJfUkFESVVTPTY5NTVlNTt4dC5MVU5BUl9SQURJVVM9MTczNzQwMDt4dC5TSVhUWV9GT1VSX0tJTE9CWVRFUz02NCoxMDI0O3h0LkZPVVJfR0lHQUJZVEVTPTQqMTAyNCoxMDI0KjEwMjQ7eHQuc2lnbj14KE1hdGguc2lnbixmdW5jdGlvbihlKXtyZXR1cm4gZT0rZSxlPT09MHx8ZSE9PWU/ZTplPjA/MTotMX0pO3h0LnNpZ25Ob3RaZXJvPWZ1bmN0aW9uKHQpe3JldHVybiB0PDA/LTE6MX07eHQudG9TTm9ybT1mdW5jdGlvbih0LGUpe3JldHVybiBlPXgoZSwyNTUpLE1hdGgucm91bmQoKHh0LmNsYW1wKHQsLTEsMSkqLjUrLjUpKmUpfTt4dC5mcm9tU05vcm09ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT14KGUsMjU1KSx4dC5jbGFtcCh0LDAsZSkvZSoyLTF9O3h0Lm5vcm1hbGl6ZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49TWF0aC5tYXgobi1lLDApLG49PT0wPzA6eHQuY2xhbXAoKHQtZSkvbiwwLDEpfTt4dC5zaW5oPXgoTWF0aC5zaW5oLGZ1bmN0aW9uKGUpe3JldHVybihNYXRoLmV4cChlKS1NYXRoLmV4cCgtZSkpLzJ9KTt4dC5jb3NoPXgoTWF0aC5jb3NoLGZ1bmN0aW9uKGUpe3JldHVybihNYXRoLmV4cChlKStNYXRoLmV4cCgtZSkpLzJ9KTt4dC5sZXJwPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX07eHQuUEk9TWF0aC5QSTt4dC5PTkVfT1ZFUl9QST0xL01hdGguUEk7eHQuUElfT1ZFUl9UV089TWF0aC5QSS8yO3h0LlBJX09WRVJfVEhSRUU9TWF0aC5QSS8zO3h0LlBJX09WRVJfRk9VUj1NYXRoLlBJLzQ7eHQuUElfT1ZFUl9TSVg9TWF0aC5QSS82O3h0LlRIUkVFX1BJX09WRVJfVFdPPTMqTWF0aC5QSS8yO3h0LlRXT19QST0yKk1hdGguUEk7eHQuT05FX09WRVJfVFdPX1BJPTEvKDIqTWF0aC5QSSk7eHQuUkFESUFOU19QRVJfREVHUkVFPU1hdGguUEkvMTgwO3h0LkRFR1JFRVNfUEVSX1JBRElBTj0xODAvTWF0aC5QSTt4dC5SQURJQU5TX1BFUl9BUkNTRUNPTkQ9eHQuUkFESUFOU19QRVJfREVHUkVFLzM2MDA7eHQudG9SYWRpYW5zPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJkZWdyZWVzIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0Knh0LlJBRElBTlNfUEVSX0RFR1JFRX07eHQudG9EZWdyZWVzPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJyYWRpYW5zIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0Knh0LkRFR1JFRVNfUEVSX1JBRElBTn07eHQuY29udmVydExvbmdpdHVkZVJhbmdlPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJhbmdsZSBpcyByZXF1aXJlZC4iKTtsZXQgZT14dC5UV09fUEksbj10LU1hdGguZmxvb3IodC9lKSplO3JldHVybiBuPC1NYXRoLlBJP24rZTpuPj1NYXRoLlBJP24tZTpufTt4dC5jbGFtcFRvTGF0aXR1ZGVSYW5nZT1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgQigiYW5nbGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHh0LmNsYW1wKHQsLTEqeHQuUElfT1ZFUl9UV08seHQuUElfT1ZFUl9UV08pfTt4dC5uZWdhdGl2ZVBpVG9QaT1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgQigiYW5nbGUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQ+PS14dC5QSSYmdDw9eHQuUEk/dDp4dC56ZXJvVG9Ud29QaSh0K3h0LlBJKS14dC5QSX07eHQuemVyb1RvVHdvUGk9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEIoImFuZ2xlIGlzIHJlcXVpcmVkLiIpO2lmKHQ+PTAmJnQ8PXh0LlRXT19QSSlyZXR1cm4gdDtsZXQgZT14dC5tb2QodCx4dC5UV09fUEkpO3JldHVybiBNYXRoLmFicyhlKTx4dC5FUFNJTE9OMTQmJk1hdGguYWJzKHQpPnh0LkVQU0lMT04xND94dC5UV09fUEk6ZX07eHQubW9kPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoIm0gaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoIm4gaXMgcmVxdWlyZWQuIik7aWYoZT09PTApdGhyb3cgbmV3IEIoImRpdmlzb3IgY2Fubm90IGJlIDAuIik7cmV0dXJuIHh0LnNpZ24odCk9PT14dC5zaWduKGUpJiZNYXRoLmFicyh0KTxNYXRoLmFicyhlKT90Oih0JWUrZSklZX07eHQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixvKXtpZighaCh0KSl0aHJvdyBuZXcgQigibGVmdCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigicmlnaHQgaXMgcmVxdWlyZWQuIik7bj14KG4sMCksbz14KG8sbik7bGV0IHI9TWF0aC5hYnModC1lKTtyZXR1cm4gcjw9b3x8cjw9bipNYXRoLm1heChNYXRoLmFicyh0KSxNYXRoLmFicyhlKSl9O3h0Lmxlc3NUaGFuPWZ1bmN0aW9uKHQsZSxuKXtpZighaCh0KSl0aHJvdyBuZXcgQigiZmlyc3QgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoInNlY29uZCBpcyByZXF1aXJlZC4iKTtpZighaChuKSl0aHJvdyBuZXcgQigiYWJzb2x1dGVFcHNpbG9uIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0LWU8LW59O3h0Lmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJmaXJzdCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigic2Vjb25kIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBCKCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQtZTxufTt4dC5ncmVhdGVyVGhhbj1mdW5jdGlvbih0LGUsbil7aWYoIWgodCkpdGhyb3cgbmV3IEIoImZpcnN0IGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJzZWNvbmQgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEIoImFic29sdXRlRXBzaWxvbiBpcyByZXF1aXJlZC4iKTtyZXR1cm4gdC1lPm59O3h0LmdyZWF0ZXJUaGFuT3JFcXVhbHM9ZnVuY3Rpb24odCxlLG4pe2lmKCFoKHQpKXRocm93IG5ldyBCKCJmaXJzdCBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigic2Vjb25kIGlzIHJlcXVpcmVkLiIpO2lmKCFoKG4pKXRocm93IG5ldyBCKCJhYnNvbHV0ZUVwc2lsb24gaXMgcmVxdWlyZWQuIik7cmV0dXJuIHQtZT4tbn07VWw9WzFdO3h0LmZhY3RvcmlhbD1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MCl0aHJvdyBuZXcgQigiQSBudW1iZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAgaXMgcmVxdWlyZWQuIik7bGV0IGU9VWwubGVuZ3RoO2lmKHQ+PWUpe2xldCBuPVVsW2UtMV07Zm9yKGxldCBvPWU7bzw9dDtvKyspe2xldCByPW4qbztVbC5wdXNoKHIpLG49cn19cmV0dXJuIFVsW3RdfTt4dC5pbmNyZW1lbnRXcmFwPWZ1bmN0aW9uKHQsZSxuKXtpZihuPXgobiwwKSwhaCh0KSl0aHJvdyBuZXcgQigibiBpcyByZXF1aXJlZC4iKTtpZihlPD1uKXRocm93IG5ldyBCKCJtYXhpbXVtVmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gbWluaW11bVZhbHVlLiIpO3JldHVybisrdCx0PmUmJih0PW4pLHR9O3h0LmlzUG93ZXJPZlR3bz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8dD40Mjk0OTY3Mjk1KXRocm93IG5ldyBCKCJBIG51bWJlciBiZXR3ZWVuIDAgYW5kICgyXjMyKS0xIGlzIHJlcXVpcmVkLiIpO3JldHVybiB0IT09MCYmKHQmdC0xKT09PTB9O3h0Lm5leHRQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjIxNDc0ODM2NDgpdGhyb3cgbmV3IEIoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMl4zMSBpcyByZXF1aXJlZC4iKTtyZXR1cm4tLXQsdHw9dD4+MSx0fD10Pj4yLHR8PXQ+PjQsdHw9dD4+OCx0fD10Pj4xNiwrK3QsdH07eHQucHJldmlvdXNQb3dlck9mVHdvPWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyInx8dDwwfHx0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IEIoIkEgbnVtYmVyIGJldHdlZW4gMCBhbmQgKDJeMzIpLTEgaXMgcmVxdWlyZWQuIik7cmV0dXJuIHR8PXQ+PjEsdHw9dD4+Mix0fD10Pj40LHR8PXQ+PjgsdHw9dD4+MTYsdHw9dD4+MzIsdD0odD4+PjApLSh0Pj4+MSksdH07eHQuY2xhbXA9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5udW1iZXIoInZhbHVlIix0KSx5LnR5cGVPZi5udW1iZXIoIm1pbiIsZSkseS50eXBlT2YubnVtYmVyKCJtYXgiLG4pLHQ8ZT9lOnQ+bj9uOnR9O3kxPW5ldyBPbS5kZWZhdWx0O3h0LnNldFJhbmRvbU51bWJlclNlZWQ9ZnVuY3Rpb24odCl7aWYoIWgodCkpdGhyb3cgbmV3IEIoInNlZWQgaXMgcmVxdWlyZWQuIik7eTE9bmV3IE9tLmRlZmF1bHQodCl9O3h0Lm5leHRSYW5kb21OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4geTEucmFuZG9tKCl9O3h0LnJhbmRvbUJldHdlZW49ZnVuY3Rpb24odCxlKXtyZXR1cm4geHQubmV4dFJhbmRvbU51bWJlcigpKihlLXQpK3R9O3h0LmFjb3NDbGFtcGVkPWZ1bmN0aW9uKHQpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJ2YWx1ZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5hY29zKHh0LmNsYW1wKHQsLTEsMSkpfTt4dC5hc2luQ2xhbXBlZD1mdW5jdGlvbih0KXtpZighaCh0KSl0aHJvdyBuZXcgQigidmFsdWUgaXMgcmVxdWlyZWQuIik7cmV0dXJuIE1hdGguYXNpbih4dC5jbGFtcCh0LC0xLDEpKX07eHQuY2hvcmRMZW5ndGg9ZnVuY3Rpb24odCxlKXtpZighaCh0KSl0aHJvdyBuZXcgQigiYW5nbGUgaXMgcmVxdWlyZWQuIik7aWYoIWgoZSkpdGhyb3cgbmV3IEIoInJhZGl1cyBpcyByZXF1aXJlZC4iKTtyZXR1cm4gMiplKk1hdGguc2luKHQqLjUpfTt4dC5sb2dCYXNlPWZ1bmN0aW9uKHQsZSl7aWYoIWgodCkpdGhyb3cgbmV3IEIoIm51bWJlciBpcyByZXF1aXJlZC4iKTtpZighaChlKSl0aHJvdyBuZXcgQigiYmFzZSBpcyByZXF1aXJlZC4iKTtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5sb2coZSl9O3h0LmNicnQ9eChNYXRoLmNicnQsZnVuY3Rpb24oZSl7bGV0IG49TWF0aC5wb3coTWF0aC5hYnMoZSksLjMzMzMzMzMzMzMzMzMzMzMpO3JldHVybiBlPDA/LW46bn0pO3h0LmxvZzI9eChNYXRoLmxvZzIsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUpKk1hdGguTE9HMkV9KTt4dC5mb2c9ZnVuY3Rpb24odCxlKXtsZXQgbj10KmU7cmV0dXJuIDEtTWF0aC5leHAoLShuKm4pKX07eHQuZmFzdEFwcHJveGltYXRlQXRhbj1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2YubnVtYmVyKCJ4Iix0KSx0KigtLjE3ODQqTWF0aC5hYnModCktLjA2NjMqdCp0KzEuMDMwMSl9O3h0LmZhc3RBcHByb3hpbWF0ZUF0YW4yPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2YubnVtYmVyKCJ4Iix0KSx5LnR5cGVPZi5udW1iZXIoInkiLGUpO2xldCBuLG89TWF0aC5hYnModCk7bj1NYXRoLmFicyhlKTtsZXQgcj1NYXRoLm1heChvLG4pO249TWF0aC5taW4obyxuKTtsZXQgaT1uL3I7aWYoaXNOYU4oaSkpdGhyb3cgbmV3IEIoImVpdGhlciB4IG9yIHkgbXVzdCBiZSBub256ZXJvIik7cmV0dXJuIG89eHQuZmFzdEFwcHJveGltYXRlQXRhbihpKSxvPU1hdGguYWJzKGUpPk1hdGguYWJzKHQpP3h0LlBJX09WRVJfVFdPLW86byxvPXQ8MD94dC5QSS1vOm8sbz1lPDA/LW86byxvfTtNPXh0fSk7ZnVuY3Rpb24gYnQodCxlLG4pe3RoaXMueD14KHQsMCksdGhpcy55PXgoZSwwKSx0aGlzLno9eChuLDApfXZhciBrbCxnMSxWbCxFbSxuQyxtcixqYyxhLEZ0PVooKCk9PntYdCgpO0l0KCk7ZnQoKTtIdCgpO1d0KCk7YnQuZnJvbVNwaGVyaWNhbD1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgic3BoZXJpY2FsIix0KSxoKGUpfHwoZT1uZXcgYnQpO2xldCBuPXQuY2xvY2ssbz10LmNvbmUscj14KHQubWFnbml0dWRlLDEpLGk9cipNYXRoLnNpbihvKTtyZXR1cm4gZS54PWkqTWF0aC5jb3MobiksZS55PWkqTWF0aC5zaW4obiksZS56PXIqTWF0aC5jb3MobyksZX07YnQuZnJvbUVsZW1lbnRzPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiBoKG8pPyhvLng9dCxvLnk9ZSxvLno9bixvKTpuZXcgYnQodCxlLG4pfTtidC5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKGgodCkpcmV0dXJuIGgoZSk/KGUueD10LngsZS55PXQueSxlLno9dC56LGUpOm5ldyBidCh0LngsdC55LHQueil9O2J0LmZyb21DYXJ0ZXNpYW40PWJ0LmNsb25lO2J0LnBhY2tlZExlbmd0aD0zO2J0LnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxlW24rK109dC54LGVbbisrXT10LnksZVtuXT10LnosZX07YnQudW5wYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS5kZWZpbmVkKCJhcnJheSIsdCksZT14KGUsMCksaChuKXx8KG49bmV3IGJ0KSxuLng9dFtlKytdLG4ueT10W2UrK10sbi56PXRbZV0sbn07YnQucGFja0FycmF5PWZ1bmN0aW9uKHQsZSl7eS5kZWZpbmVkKCJhcnJheSIsdCk7bGV0IG49dC5sZW5ndGgsbz1uKjM7aWYoIWgoZSkpZT1uZXcgQXJyYXkobyk7ZWxzZXtpZighQXJyYXkuaXNBcnJheShlKSYmZS5sZW5ndGghPT1vKXRocm93IG5ldyBCKCJJZiByZXN1bHQgaXMgYSB0eXBlZCBhcnJheSwgaXQgbXVzdCBoYXZlIGV4YWN0bHkgYXJyYXkubGVuZ3RoICogMyBlbGVtZW50cyIpO2UubGVuZ3RoIT09byYmKGUubGVuZ3RoPW8pfWZvcihsZXQgcj0wO3I8bjsrK3IpYnQucGFjayh0W3JdLGUsciozKTtyZXR1cm4gZX07YnQudW5wYWNrQXJyYXk9ZnVuY3Rpb24odCxlKXtpZih5LmRlZmluZWQoImFycmF5Iix0KSx5LnR5cGVPZi5udW1iZXIuZ3JlYXRlclRoYW5PckVxdWFscygiYXJyYXkubGVuZ3RoIix0Lmxlbmd0aCwzKSx0Lmxlbmd0aCUzIT09MCl0aHJvdyBuZXcgQigiYXJyYXkgbGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzLiIpO2xldCBuPXQubGVuZ3RoO2goZSk/ZS5sZW5ndGg9bi8zOmU9bmV3IEFycmF5KG4vMyk7Zm9yKGxldCBvPTA7bzxuO28rPTMpe2xldCByPW8vMztlW3JdPWJ0LnVucGFjayh0LG8sZVtyXSl9cmV0dXJuIGV9O2J0LmZyb21BcnJheT1idC51bnBhY2s7YnQubWF4aW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWF4KHQueCx0LnksdC56KX07YnQubWluaW11bUNvbXBvbmVudD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLE1hdGgubWluKHQueCx0LnksdC56KX07YnQubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCkseS50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5taW4odC54LGUueCksbi55PU1hdGgubWluKHQueSxlLnkpLG4uej1NYXRoLm1pbih0LnosZS56KSxufTtidC5tYXhpbXVtQnlDb21wb25lbnQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImZpcnN0Iix0KSx5LnR5cGVPZi5vYmplY3QoInNlY29uZCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD1NYXRoLm1heCh0LngsZS54KSxuLnk9TWF0aC5tYXgodC55LGUueSksbi56PU1hdGgubWF4KHQueixlLnopLG59O2J0LmNsYW1wPWZ1bmN0aW9uKHQsZSxuLG8pe3kudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHkudHlwZU9mLm9iamVjdCgibWluIixlKSx5LnR5cGVPZi5vYmplY3QoIm1heCIsbikseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG8pO2xldCByPU0uY2xhbXAodC54LGUueCxuLngpLGk9TS5jbGFtcCh0LnksZS55LG4ueSkscz1NLmNsYW1wKHQueixlLnosbi56KTtyZXR1cm4gby54PXIsby55PWksby56PXMsb307YnQubWFnbml0dWRlU3F1YXJlZD1mdW5jdGlvbih0KXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHQueCp0LngrdC55KnQueSt0LnoqdC56fTtidC5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChidC5tYWduaXR1ZGVTcXVhcmVkKHQpKX07a2w9bmV3IGJ0O2J0LmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksYnQuc3VidHJhY3QodCxlLGtsKSxidC5tYWduaXR1ZGUoa2wpfTtidC5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxidC5zdWJ0cmFjdCh0LGUsa2wpLGJ0Lm1hZ25pdHVkZVNxdWFyZWQoa2wpfTtidC5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPWJ0Lm1hZ25pdHVkZSh0KTtpZihlLng9dC54L24sZS55PXQueS9uLGUuej10Lnovbixpc05hTihlLngpfHxpc05hTihlLnkpfHxpc05hTihlLnopKXRocm93IG5ldyBCKCJub3JtYWxpemVkIHJlc3VsdCBpcyBub3QgYSBudW1iZXIiKTtyZXR1cm4gZX07YnQuZG90PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueCt0LnkqZS55K3QueiplLnp9O2J0Lm11bHRpcGx5Q29tcG9uZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngqZS54LG4ueT10LnkqZS55LG4uej10LnoqZS56LG59O2J0LmRpdmlkZUNvbXBvbmVudHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54L2UueCxuLnk9dC55L2UueSxuLno9dC56L2UueixufTtidC5hZGQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54K2UueCxuLnk9dC55K2UueSxuLno9dC56K2UueixufTtidC5zdWJ0cmFjdD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngtZS54LG4ueT10LnktZS55LG4uej10LnotZS56LG59O2J0Lm11bHRpcGx5QnlTY2FsYXI9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2YubnVtYmVyKCJzY2FsYXIiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54KmUsbi55PXQueSplLG4uej10LnoqZSxufTtidC5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbi56PXQuei9lLG59O2J0Lm5lZ2F0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD0tdC54LGUueT0tdC55LGUuej0tdC56LGV9O2J0LmFicz1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpLGUueD1NYXRoLmFicyh0LngpLGUueT1NYXRoLmFicyh0LnkpLGUuej1NYXRoLmFicyh0LnopLGV9O2cxPW5ldyBidDtidC5sZXJwPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInN0YXJ0Iix0KSx5LnR5cGVPZi5vYmplY3QoImVuZCIsZSkseS50eXBlT2YubnVtYmVyKCJ0IixuKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbyksYnQubXVsdGlwbHlCeVNjYWxhcihlLG4sZzEpLG89YnQubXVsdGlwbHlCeVNjYWxhcih0LDEtbixvKSxidC5hZGQoZzEsbyxvKX07Vmw9bmV3IGJ0LEVtPW5ldyBidDtidC5hbmdsZUJldHdlZW49ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGJ0Lm5vcm1hbGl6ZSh0LFZsKSxidC5ub3JtYWxpemUoZSxFbSk7bGV0IG49YnQuZG90KFZsLEVtKSxvPWJ0Lm1hZ25pdHVkZShidC5jcm9zcyhWbCxFbSxWbCkpO3JldHVybiBNYXRoLmF0YW4yKG8sbil9O25DPW5ldyBidDtidC5tb3N0T3J0aG9nb25hbEF4aXM9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPWJ0Lm5vcm1hbGl6ZSh0LG5DKTtyZXR1cm4gYnQuYWJzKG4sbiksbi54PD1uLnk/bi54PD1uLno/ZT1idC5jbG9uZShidC5VTklUX1gsZSk6ZT1idC5jbG9uZShidC5VTklUX1osZSk6bi55PD1uLno/ZT1idC5jbG9uZShidC5VTklUX1ksZSk6ZT1idC5jbG9uZShidC5VTklUX1osZSksZX07YnQucHJvamVjdFZlY3Rvcj1mdW5jdGlvbih0LGUsbil7eS5kZWZpbmVkKCJhIix0KSx5LmRlZmluZWQoImIiLGUpLHkuZGVmaW5lZCgicmVzdWx0IixuKTtsZXQgbz1idC5kb3QodCxlKS9idC5kb3QoZSxlKTtyZXR1cm4gYnQubXVsdGlwbHlCeVNjYWxhcihlLG8sbil9O2J0LmVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8aCh0KSYmaChlKSYmdC54PT09ZS54JiZ0Lnk9PT1lLnkmJnQuej09PWUuen07YnQuZXF1YWxzQXJyYXk9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Lng9PT1lW25dJiZ0Lnk9PT1lW24rMV0mJnQuej09PWVbbisyXX07YnQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJk0uZXF1YWxzRXBzaWxvbih0LngsZS54LG4sbykmJk0uZXF1YWxzRXBzaWxvbih0LnksZS55LG4sbykmJk0uZXF1YWxzRXBzaWxvbih0LnosZS56LG4sbyl9O2J0LmNyb3NzPWZ1bmN0aW9uKHQsZSxuKXt5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKTtsZXQgbz10Lngscj10LnksaT10Lnoscz1lLngsZj1lLnksdT1lLnosYz1yKnUtaSpmLGw9aSpzLW8qdSxwPW8qZi1yKnM7cmV0dXJuIG4ueD1jLG4ueT1sLG4uej1wLG59O2J0Lm1pZHBvaW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PSh0LngrZS54KSouNSxuLnk9KHQueStlLnkpKi41LG4uej0odC56K2UueikqLjUsbn07YnQuZnJvbURlZ3JlZXM9ZnVuY3Rpb24odCxlLG4sbyxyKXtyZXR1cm4geS50eXBlT2YubnVtYmVyKCJsb25naXR1ZGUiLHQpLHkudHlwZU9mLm51bWJlcigibGF0aXR1ZGUiLGUpLHQ9TS50b1JhZGlhbnModCksZT1NLnRvUmFkaWFucyhlKSxidC5mcm9tUmFkaWFucyh0LGUsbixvLHIpfTttcj1uZXcgYnQsamM9bmV3IGJ0O2J0Ll9lbGxpcHNvaWRSYWRpaVNxdWFyZWQ9bmV3IGJ0KDYzNzgxMzcqNjM3ODEzNyw2Mzc4MTM3KjYzNzgxMzcsNjM1Njc1MjMxNDI0NTE3OWUtOSo2MzU2NzUyMzE0MjQ1MTc5ZS05KTtidC5mcm9tUmFkaWFucz1mdW5jdGlvbih0LGUsbixvLHIpe3kudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSx5LnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSxuPXgobiwwKTtsZXQgaT1oKG8pP28ucmFkaWlTcXVhcmVkOmJ0Ll9lbGxpcHNvaWRSYWRpaVNxdWFyZWQscz1NYXRoLmNvcyhlKTttci54PXMqTWF0aC5jb3ModCksbXIueT1zKk1hdGguc2luKHQpLG1yLno9TWF0aC5zaW4oZSksbXI9YnQubm9ybWFsaXplKG1yLG1yKSxidC5tdWx0aXBseUNvbXBvbmVudHMoaSxtcixqYyk7bGV0IGY9TWF0aC5zcXJ0KGJ0LmRvdChtcixqYykpO3JldHVybiBqYz1idC5kaXZpZGVCeVNjYWxhcihqYyxmLGpjKSxtcj1idC5tdWx0aXBseUJ5U2NhbGFyKG1yLG4sbXIpLGgocil8fChyPW5ldyBidCksYnQuYWRkKGpjLG1yLHIpfTtidC5mcm9tRGVncmVlc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtpZih5LmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwyfHx0Lmxlbmd0aCUyIT09MCl0aHJvdyBuZXcgQigidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgYXQgbGVhc3QgMiIpO2xldCBvPXQubGVuZ3RoO2gobik/bi5sZW5ndGg9by8yOm49bmV3IEFycmF5KG8vMik7Zm9yKGxldCByPTA7cjxvO3IrPTIpe2xldCBpPXRbcl0scz10W3IrMV0sZj1yLzI7bltmXT1idC5mcm9tRGVncmVlcyhpLHMsMCxlLG5bZl0pfXJldHVybiBufTtidC5mcm9tUmFkaWFuc0FycmF5PWZ1bmN0aW9uKHQsZSxuKXtpZih5LmRlZmluZWQoImNvb3JkaW5hdGVzIix0KSx0Lmxlbmd0aDwyfHx0Lmxlbmd0aCUyIT09MCl0aHJvdyBuZXcgQigidGhlIG51bWJlciBvZiBjb29yZGluYXRlcyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiBhbmQgYXQgbGVhc3QgMiIpO2xldCBvPXQubGVuZ3RoO2gobik/bi5sZW5ndGg9by8yOm49bmV3IEFycmF5KG8vMik7Zm9yKGxldCByPTA7cjxvO3IrPTIpe2xldCBpPXRbcl0scz10W3IrMV0sZj1yLzI7bltmXT1idC5mcm9tUmFkaWFucyhpLHMsMCxlLG5bZl0pfXJldHVybiBufTtidC5mcm9tRGVncmVlc0FycmF5SGVpZ2h0cz1mdW5jdGlvbih0LGUsbil7aWYoeS5kZWZpbmVkKCJjb29yZGluYXRlcyIsdCksdC5sZW5ndGg8M3x8dC5sZW5ndGglMyE9PTApdGhyb3cgbmV3IEIoInRoZSBudW1iZXIgb2YgY29vcmRpbmF0ZXMgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMgYW5kIGF0IGxlYXN0IDMiKTtsZXQgbz10Lmxlbmd0aDtoKG4pP24ubGVuZ3RoPW8vMzpuPW5ldyBBcnJheShvLzMpO2ZvcihsZXQgcj0wO3I8bztyKz0zKXtsZXQgaT10W3JdLHM9dFtyKzFdLGY9dFtyKzJdLHU9ci8zO25bdV09YnQuZnJvbURlZ3JlZXMoaSxzLGYsZSxuW3VdKX1yZXR1cm4gbn07YnQuZnJvbVJhZGlhbnNBcnJheUhlaWdodHM9ZnVuY3Rpb24odCxlLG4pe2lmKHkuZGVmaW5lZCgiY29vcmRpbmF0ZXMiLHQpLHQubGVuZ3RoPDN8fHQubGVuZ3RoJTMhPT0wKXRocm93IG5ldyBCKCJ0aGUgbnVtYmVyIG9mIGNvb3JkaW5hdGVzIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzIGFuZCBhdCBsZWFzdCAzIik7bGV0IG89dC5sZW5ndGg7aChuKT9uLmxlbmd0aD1vLzM6bj1uZXcgQXJyYXkoby8zKTtmb3IobGV0IHI9MDtyPG87cis9Myl7bGV0IGk9dFtyXSxzPXRbcisxXSxmPXRbcisyXSx1PXIvMztuW3VdPWJ0LmZyb21SYWRpYW5zKGkscyxmLGUsblt1XSl9cmV0dXJuIG59O2J0LlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgYnQoMCwwLDApKTtidC5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgYnQoMSwxLDEpKTtidC5VTklUX1g9T2JqZWN0LmZyZWV6ZShuZXcgYnQoMSwwLDApKTtidC5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgYnQoMCwxLDApKTtidC5VTklUX1o9T2JqZWN0LmZyZWV6ZShuZXcgYnQoMCwwLDEpKTtidC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24odCl7cmV0dXJuIGJ0LmNsb25lKHRoaXMsdCl9O2J0LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGJ0LmVxdWFscyh0aGlzLHQpfTtidC5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGJ0LmVxdWFsc0Vwc2lsb24odGhpcyx0LGUsbil9O2J0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fSlgfTthPWJ0fSk7ZnVuY3Rpb24gaUModCxlLG4sbyxyKXtpZighaCh0KSl0aHJvdyBuZXcgQigiY2FydGVzaWFuIGlzIHJlcXVpcmVkLiIpO2lmKCFoKGUpKXRocm93IG5ldyBCKCJvbmVPdmVyUmFkaWkgaXMgcmVxdWlyZWQuIik7aWYoIWgobikpdGhyb3cgbmV3IEIoIm9uZU92ZXJSYWRpaVNxdWFyZWQgaXMgcmVxdWlyZWQuIik7aWYoIWgobykpdGhyb3cgbmV3IEIoImNlbnRlclRvbGVyYW5jZVNxdWFyZWQgaXMgcmVxdWlyZWQuIik7bGV0IGk9dC54LHM9dC55LGY9dC56LHU9ZS54LGM9ZS55LGw9ZS56LHA9aSppKnUqdSxkPXMqcypjKmMsbT1mKmYqbCpsLF89cCtkK20sZz1NYXRoLnNxcnQoMS9fKSxiPWEubXVsdGlwbHlCeVNjYWxhcih0LGcsb0MpO2lmKF88bylyZXR1cm4gaXNGaW5pdGUoZyk/YS5jbG9uZShiLHIpOnZvaWQgMDtsZXQgVD1uLngsTz1uLnksRT1uLnosdz1yQzt3Lng9Yi54KlQqMix3Lnk9Yi55Kk8qMix3Lno9Yi56KkUqMjtsZXQgQz0oMS1nKSphLm1hZ25pdHVkZSh0KS8oLjUqYS5tYWduaXR1ZGUodykpLE49MCxJLEQsdixMLFUsQSxTLFAsRixqLEg7ZG97Qy09Tix2PTEvKDErQypUKSxMPTEvKDErQypPKSxVPTEvKDErQypFKSxBPXYqdixTPUwqTCxQPVUqVSxGPUEqdixqPVMqTCxIPVAqVSxJPXAqQStkKlMrbSpQLTEsRD1wKkYqVCtkKmoqTyttKkgqRTtsZXQgaz0tMipEO049SS9rfXdoaWxlKE1hdGguYWJzKEkpPk0uRVBTSUxPTjEyKTtyZXR1cm4gaChyKT8oci54PWkqdixyLnk9cypMLHIuej1mKlUscik6bmV3IGEoaSp2LHMqTCxmKlUpfXZhciBvQyxyQyxHbCxSbT1aKCgpPT57RnQoKTtmdCgpO0h0KCk7V3QoKTtvQz1uZXcgYSxyQz1uZXcgYTtHbD1pQ30pO2Z1bmN0aW9uIF9uKHQsZSxuKXt0aGlzLmxvbmdpdHVkZT14KHQsMCksdGhpcy5sYXRpdHVkZT14KGUsMCksdGhpcy5oZWlnaHQ9eChuLDApfXZhciBzQyxjQyxhQyxjdCxJZT1aKCgpPT57RnQoKTtYdCgpO0l0KCk7ZnQoKTtXdCgpO1JtKCk7X24uZnJvbVJhZGlhbnM9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIHkudHlwZU9mLm51bWJlcigibG9uZ2l0dWRlIix0KSx5LnR5cGVPZi5udW1iZXIoImxhdGl0dWRlIixlKSxuPXgobiwwKSxoKG8pPyhvLmxvbmdpdHVkZT10LG8ubGF0aXR1ZGU9ZSxvLmhlaWdodD1uLG8pOm5ldyBfbih0LGUsbil9O19uLmZyb21EZWdyZWVzPWZ1bmN0aW9uKHQsZSxuLG8pe3JldHVybiB5LnR5cGVPZi5udW1iZXIoImxvbmdpdHVkZSIsdCkseS50eXBlT2YubnVtYmVyKCJsYXRpdHVkZSIsZSksdD1NLnRvUmFkaWFucyh0KSxlPU0udG9SYWRpYW5zKGUpLF9uLmZyb21SYWRpYW5zKHQsZSxuLG8pfTtzQz1uZXcgYSxjQz1uZXcgYSxhQz1uZXcgYTtfbi5fZWxsaXBzb2lkT25lT3ZlclJhZGlpPW5ldyBhKDEvNjM3ODEzNywxLzYzNzgxMzcsMS82MzU2NzUyMzE0MjQ1MTc5ZS05KTtfbi5fZWxsaXBzb2lkT25lT3ZlclJhZGlpU3F1YXJlZD1uZXcgYSgxLyg2Mzc4MTM3KjYzNzgxMzcpLDEvKDYzNzgxMzcqNjM3ODEzNyksMS8oNjM1Njc1MjMxNDI0NTE3OWUtOSo2MzU2NzUyMzE0MjQ1MTc5ZS05KSk7X24uX2VsbGlwc29pZENlbnRlclRvbGVyYW5jZVNxdWFyZWQ9TS5FUFNJTE9OMTtfbi5mcm9tQ2FydGVzaWFuPWZ1bmN0aW9uKHQsZSxuKXtsZXQgbz1oKGUpP2Uub25lT3ZlclJhZGlpOl9uLl9lbGxpcHNvaWRPbmVPdmVyUmFkaWkscj1oKGUpP2Uub25lT3ZlclJhZGlpU3F1YXJlZDpfbi5fZWxsaXBzb2lkT25lT3ZlclJhZGlpU3F1YXJlZCxpPWgoZSk/ZS5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZDpfbi5fZWxsaXBzb2lkQ2VudGVyVG9sZXJhbmNlU3F1YXJlZCxzPUdsKHQsbyxyLGksY0MpO2lmKCFoKHMpKXJldHVybjtsZXQgZj1hLm11bHRpcGx5Q29tcG9uZW50cyhzLHIsc0MpO2Y9YS5ub3JtYWxpemUoZixmKTtsZXQgdT1hLnN1YnRyYWN0KHQscyxhQyksYz1NYXRoLmF0YW4yKGYueSxmLngpLGw9TWF0aC5hc2luKGYueikscD1NLnNpZ24oYS5kb3QodSx0KSkqYS5tYWduaXR1ZGUodSk7cmV0dXJuIGgobik/KG4ubG9uZ2l0dWRlPWMsbi5sYXRpdHVkZT1sLG4uaGVpZ2h0PXAsbik6bmV3IF9uKGMsbCxwKX07X24udG9DYXJ0ZXNpYW49ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LmRlZmluZWQoImNhcnRvZ3JhcGhpYyIsdCksYS5mcm9tUmFkaWFucyh0LmxvbmdpdHVkZSx0LmxhdGl0dWRlLHQuaGVpZ2h0LGUsbil9O19uLmNsb25lPWZ1bmN0aW9uKHQsZSl7aWYoaCh0KSlyZXR1cm4gaChlKT8oZS5sb25naXR1ZGU9dC5sb25naXR1ZGUsZS5sYXRpdHVkZT10LmxhdGl0dWRlLGUuaGVpZ2h0PXQuaGVpZ2h0LGUpOm5ldyBfbih0LmxvbmdpdHVkZSx0LmxhdGl0dWRlLHQuaGVpZ2h0KX07X24uZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfHxoKHQpJiZoKGUpJiZ0LmxvbmdpdHVkZT09PWUubG9uZ2l0dWRlJiZ0LmxhdGl0dWRlPT09ZS5sYXRpdHVkZSYmdC5oZWlnaHQ9PT1lLmhlaWdodH07X24uZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG49eChuLDApLHQ9PT1lfHxoKHQpJiZoKGUpJiZNYXRoLmFicyh0LmxvbmdpdHVkZS1lLmxvbmdpdHVkZSk8PW4mJk1hdGguYWJzKHQubGF0aXR1ZGUtZS5sYXRpdHVkZSk8PW4mJk1hdGguYWJzKHQuaGVpZ2h0LWUuaGVpZ2h0KTw9bn07X24uWkVSTz1PYmplY3QuZnJlZXplKG5ldyBfbigwLDAsMCkpO19uLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4gX24uY2xvbmUodGhpcyx0KX07X24ucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gX24uZXF1YWxzKHRoaXMsdCl9O19uLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIF9uLmVxdWFsc0Vwc2lsb24odGhpcyx0LGUpfTtfbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy5sb25naXR1ZGV9LCAke3RoaXMubGF0aXR1ZGV9LCAke3RoaXMuaGVpZ2h0fSlgfTtjdD1fbn0pO2Z1bmN0aW9uIGp0KHQsZSl7dGhpcy54PXgodCwwKSx0aGlzLnk9eChlLDApfXZhciB6bCxBMSxiMSxUMSxmQyx0dCxVZT1aKCgpPT57WHQoKTtJdCgpO2Z0KCk7SHQoKTtXdCgpO2p0LmZyb21FbGVtZW50cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGgobik/KG4ueD10LG4ueT1lLG4pOm5ldyBqdCh0LGUpfTtqdC5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKGgodCkpcmV0dXJuIGgoZSk/KGUueD10LngsZS55PXQueSxlKTpuZXcganQodC54LHQueSl9O2p0LmZyb21DYXJ0ZXNpYW4zPWp0LmNsb25lO2p0LmZyb21DYXJ0ZXNpYW40PWp0LmNsb25lO2p0LnBhY2tlZExlbmd0aD0yO2p0LnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxlW24rK109dC54LGVbbl09dC55LGV9O2p0LnVucGFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApLGgobil8fChuPW5ldyBqdCksbi54PXRbZSsrXSxuLnk9dFtlXSxufTtqdC5wYWNrQXJyYXk9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImFycmF5Iix0KTtsZXQgbj10Lmxlbmd0aCxvPW4qMjtpZighaChlKSllPW5ldyBBcnJheShvKTtlbHNle2lmKCFBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aCE9PW8pdGhyb3cgbmV3IEIoIklmIHJlc3VsdCBpcyBhIHR5cGVkIGFycmF5LCBpdCBtdXN0IGhhdmUgZXhhY3RseSBhcnJheS5sZW5ndGggKiAyIGVsZW1lbnRzIik7ZS5sZW5ndGghPT1vJiYoZS5sZW5ndGg9byl9Zm9yKGxldCByPTA7cjxuOysrcilqdC5wYWNrKHRbcl0sZSxyKjIpO3JldHVybiBlfTtqdC51bnBhY2tBcnJheT1mdW5jdGlvbih0LGUpe2lmKHkuZGVmaW5lZCgiYXJyYXkiLHQpLHkudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzKCJhcnJheS5sZW5ndGgiLHQubGVuZ3RoLDIpLHQubGVuZ3RoJTIhPT0wKXRocm93IG5ldyBCKCJhcnJheSBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIuIik7bGV0IG49dC5sZW5ndGg7aChlKT9lLmxlbmd0aD1uLzI6ZT1uZXcgQXJyYXkobi8yKTtmb3IobGV0IG89MDtvPG47bys9Mil7bGV0IHI9by8yO2Vbcl09anQudW5wYWNrKHQsbyxlW3JdKX1yZXR1cm4gZX07anQuZnJvbUFycmF5PWp0LnVucGFjaztqdC5tYXhpbXVtQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksTWF0aC5tYXgodC54LHQueSl9O2p0Lm1pbmltdW1Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSxNYXRoLm1pbih0LngsdC55KX07anQubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJmaXJzdCIsdCkseS50eXBlT2Yub2JqZWN0KCJzZWNvbmQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9TWF0aC5taW4odC54LGUueCksbi55PU1hdGgubWluKHQueSxlLnkpLG59O2p0Lm1heGltdW1CeUNvbXBvbmVudD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiZmlyc3QiLHQpLHkudHlwZU9mLm9iamVjdCgic2Vjb25kIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PU1hdGgubWF4KHQueCxlLngpLG4ueT1NYXRoLm1heCh0LnksZS55KSxufTtqdC5jbGFtcD1mdW5jdGlvbih0LGUsbixvKXt5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LnR5cGVPZi5vYmplY3QoIm1pbiIsZSkseS50eXBlT2Yub2JqZWN0KCJtYXgiLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKTtsZXQgcj1NLmNsYW1wKHQueCxlLngsbi54KSxpPU0uY2xhbXAodC55LGUueSxuLnkpO3JldHVybiBvLng9cixvLnk9aSxvfTtqdC5tYWduaXR1ZGVTcXVhcmVkPWZ1bmN0aW9uKHQpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksdC54KnQueCt0LnkqdC55fTtqdC5tYWduaXR1ZGU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChqdC5tYWduaXR1ZGVTcXVhcmVkKHQpKX07emw9bmV3IGp0O2p0LmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksanQuc3VidHJhY3QodCxlLHpsKSxqdC5tYWduaXR1ZGUoemwpfTtqdC5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSxqdC5zdWJ0cmFjdCh0LGUsemwpLGp0Lm1hZ25pdHVkZVNxdWFyZWQoemwpfTtqdC5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLGUpO2xldCBuPWp0Lm1hZ25pdHVkZSh0KTtpZihlLng9dC54L24sZS55PXQueS9uLGlzTmFOKGUueCl8fGlzTmFOKGUueSkpdGhyb3cgbmV3IEIoIm5vcm1hbGl6ZWQgcmVzdWx0IGlzIG5vdCBhIG51bWJlciIpO3JldHVybiBlfTtqdC5kb3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx0LngqZS54K3QueSplLnl9O2p0LmNyb3NzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgibGVmdCIsdCkseS50eXBlT2Yub2JqZWN0KCJyaWdodCIsZSksdC54KmUueS10LnkqZS54fTtqdC5tdWx0aXBseUNvbXBvbmVudHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54KmUueCxuLnk9dC55KmUueSxufTtqdC5kaXZpZGVDb21wb25lbnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueC9lLngsbi55PXQueS9lLnksbn07anQuYWRkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJsZWZ0Iix0KSx5LnR5cGVPZi5vYmplY3QoInJpZ2h0IixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCtlLngsbi55PXQueStlLnksbn07anQuc3VidHJhY3Q9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixuKSxuLng9dC54LWUueCxuLnk9dC55LWUueSxufTtqdC5tdWx0aXBseUJ5U2NhbGFyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geS50eXBlT2Yub2JqZWN0KCJjYXJ0ZXNpYW4iLHQpLHkudHlwZU9mLm51bWJlcigic2NhbGFyIixlKSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsbiksbi54PXQueCplLG4ueT10LnkqZSxufTtqdC5kaXZpZGVCeVNjYWxhcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5udW1iZXIoInNjYWxhciIsZSkseS50eXBlT2Yub2JqZWN0KCJyZXN1bHQiLG4pLG4ueD10LngvZSxuLnk9dC55L2Usbn07anQubmVnYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PS10LngsZS55PS10LnksZX07anQuYWJzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSksZS54PU1hdGguYWJzKHQueCksZS55PU1hdGguYWJzKHQueSksZX07QTE9bmV3IGp0O2p0LmxlcnA9ZnVuY3Rpb24odCxlLG4sbyl7cmV0dXJuIHkudHlwZU9mLm9iamVjdCgic3RhcnQiLHQpLHkudHlwZU9mLm9iamVjdCgiZW5kIixlKSx5LnR5cGVPZi5udW1iZXIoInQiLG4pLHkudHlwZU9mLm9iamVjdCgicmVzdWx0IixvKSxqdC5tdWx0aXBseUJ5U2NhbGFyKGUsbixBMSksbz1qdC5tdWx0aXBseUJ5U2NhbGFyKHQsMS1uLG8pLGp0LmFkZChBMSxvLG8pfTtiMT1uZXcganQsVDE9bmV3IGp0O2p0LmFuZ2xlQmV0d2Vlbj1mdW5jdGlvbih0LGUpe3JldHVybiB5LnR5cGVPZi5vYmplY3QoImxlZnQiLHQpLHkudHlwZU9mLm9iamVjdCgicmlnaHQiLGUpLGp0Lm5vcm1hbGl6ZSh0LGIxKSxqdC5ub3JtYWxpemUoZSxUMSksTS5hY29zQ2xhbXBlZChqdC5kb3QoYjEsVDEpKX07ZkM9bmV3IGp0O2p0Lm1vc3RPcnRob2dvbmFsQXhpcz1mdW5jdGlvbih0LGUpe3kudHlwZU9mLm9iamVjdCgiY2FydGVzaWFuIix0KSx5LnR5cGVPZi5vYmplY3QoInJlc3VsdCIsZSk7bGV0IG49anQubm9ybWFsaXplKHQsZkMpO3JldHVybiBqdC5hYnMobixuKSxuLng8PW4ueT9lPWp0LmNsb25lKGp0LlVOSVRfWCxlKTplPWp0LmNsb25lKGp0LlVOSVRfWSxlKSxlfTtqdC5lcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJnQueD09PWUueCYmdC55PT09ZS55fTtqdC5lcXVhbHNBcnJheT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQueD09PWVbbl0mJnQueT09PWVbbisxXX07anQuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbih0LGUsbixvKXtyZXR1cm4gdD09PWV8fGgodCkmJmgoZSkmJk0uZXF1YWxzRXBzaWxvbih0LngsZS54LG4sbykmJk0uZXF1YWxzRXBzaWxvbih0LnksZS55LG4sbyl9O2p0LlpFUk89T2JqZWN0LmZyZWV6ZShuZXcganQoMCwwKSk7anQuT05FPU9iamVjdC5mcmVlemUobmV3IGp0KDEsMSkpO2p0LlVOSVRfWD1PYmplY3QuZnJlZXplKG5ldyBqdCgxLDApKTtqdC5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcganQoMCwxKSk7anQucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKHQpe3JldHVybiBqdC5jbG9uZSh0aGlzLHQpfTtqdC5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe3JldHVybiBqdC5lcXVhbHModGhpcyx0KX07anQucHJvdG90eXBlLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24odCxlLG4pe3JldHVybiBqdC5lcXVhbHNFcHNpbG9uKHRoaXMsdCxlLG4pfTtqdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm5gKCR7dGhpcy54fSwgJHt0aGlzLnl9KWB9O3R0PWp0fSk7ZnVuY3Rpb24gTzEodCxlLG4sbyl7ZT14KGUsMCksbj14KG4sMCksbz14KG8sMCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoIngiLGUsMCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInkiLG4sMCkseS50eXBlT2YubnVtYmVyLmdyZWF0ZXJUaGFuT3JFcXVhbHMoInoiLG8sMCksdC5fcmFkaWk9bmV3IGEoZSxuLG8pLHQuX3JhZGlpU3F1YXJlZD1uZXcgYShlKmUsbipuLG8qbyksdC5fcmFkaWlUb1RoZUZvdXJ0aD1uZXcgYShlKmUqZSplLG4qbipuKm4sbypvKm8qbyksdC5fb25lT3ZlclJhZGlpPW5ldyBhKGU9PT0wPzA6MS9lLG49PT0wPzA6MS9uLG89PT0wPzA6MS9vKSx0Ll9vbmVPdmVyUmFkaWlTcXVhcmVkPW5ldyBhKGU9PT0wPzA6MS8oZSplKSxuPT09MD8wOjEvKG4qbiksbz09PTA/MDoxLyhvKm8pKSx0Ll9taW5pbXVtUmFkaXVzPU1hdGgubWluKGUsbixvKSx0Ll9tYXhpbXVtUmFkaXVzPU1hdGgubWF4KGUsbixvKSx0Ll9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPU0uRVBTSUxPTjEsdC5fcmFkaWlTcXVhcmVkLnohPT0wJiYodC5fc3F1YXJlZFhPdmVyU3F1YXJlZFo9dC5fcmFkaWlTcXVhcmVkLngvdC5fcmFkaWlTcXVhcmVkLnopfWZ1bmN0aW9uIHhlKHQsZSxuKXt0aGlzLl9yYWRpaT12b2lkIDAsdGhpcy5fcmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9yYWRpaVRvVGhlRm91cnRoPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWk9dm9pZCAwLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQ9dm9pZCAwLHRoaXMuX21pbmltdW1SYWRpdXM9dm9pZCAwLHRoaXMuX21heGltdW1SYWRpdXM9dm9pZCAwLHRoaXMuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9dm9pZCAwLHRoaXMuX3NxdWFyZWRYT3ZlclNxdWFyZWRaPXZvaWQgMCxPMSh0aGlzLHQsZSxuKX1mdW5jdGlvbiB3MSh0LGUsbil7eS50eXBlT2YubnVtYmVyKCJhIix0KSx5LnR5cGVPZi5udW1iZXIoImIiLGUpLHkudHlwZU9mLmZ1bmMoImZ1bmMiLG4pO2xldCBvPS41KihlK3QpLHI9LjUqKGUtdCksaT0wO2ZvcihsZXQgcz0wO3M8NTtzKyspe2xldCBmPXIqX0Nbc107aSs9eUNbc10qKG4obytmKStuKG8tZikpfXJldHVybiBpKj1yLGl9dmFyIHVDLGxDLHBDLGRDLG1DLGhDLF9DLHlDLCQsWnQ9WigoKT0+e1VlKCk7RnQoKTtJZSgpO1h0KCk7SXQoKTtmdCgpO0h0KCk7V3QoKTtSbSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHhlLnByb3RvdHlwZSx7cmFkaWk6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaX19LHJhZGlpU3F1YXJlZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpU3F1YXJlZH19LHJhZGlpVG9UaGVGb3VydGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaVRvVGhlRm91cnRofX0sb25lT3ZlclJhZGlpOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25lT3ZlclJhZGlpfX0sb25lT3ZlclJhZGlpU3F1YXJlZDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWR9fSxtaW5pbXVtUmFkaXVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWluaW11bVJhZGl1c319LG1heGltdW1SYWRpdXM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhpbXVtUmFkaXVzfX19KTt4ZS5jbG9uZT1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXJldHVybjtsZXQgbj10Ll9yYWRpaTtyZXR1cm4gaChlKT8oYS5jbG9uZShuLGUuX3JhZGlpKSxhLmNsb25lKHQuX3JhZGlpU3F1YXJlZCxlLl9yYWRpaVNxdWFyZWQpLGEuY2xvbmUodC5fcmFkaWlUb1RoZUZvdXJ0aCxlLl9yYWRpaVRvVGhlRm91cnRoKSxhLmNsb25lKHQuX29uZU92ZXJSYWRpaSxlLl9vbmVPdmVyUmFkaWkpLGEuY2xvbmUodC5fb25lT3ZlclJhZGlpU3F1YXJlZCxlLl9vbmVPdmVyUmFkaWlTcXVhcmVkKSxlLl9taW5pbXVtUmFkaXVzPXQuX21pbmltdW1SYWRpdXMsZS5fbWF4aW11bVJhZGl1cz10Ll9tYXhpbXVtUmFkaXVzLGUuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9dC5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZCxlKTpuZXcgeGUobi54LG4ueSxuLnopfTt4ZS5mcm9tQ2FydGVzaWFuMz1mdW5jdGlvbih0LGUpe3JldHVybiBoKGUpfHwoZT1uZXcgeGUpLGgodCkmJk8xKGUsdC54LHQueSx0LnopLGV9O3hlLldHUzg0PU9iamVjdC5mcmVlemUobmV3IHhlKDYzNzgxMzcsNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KSk7eGUuVU5JVF9TUEhFUkU9T2JqZWN0LmZyZWV6ZShuZXcgeGUoMSwxLDEpKTt4ZS5NT09OPU9iamVjdC5mcmVlemUobmV3IHhlKE0uTFVOQVJfUkFESVVTLE0uTFVOQVJfUkFESVVTLE0uTFVOQVJfUkFESVVTKSk7eGUuX2RlZmF1bHQ9eGUuV0dTODQ7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeGUse2RlZmF1bHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB4ZS5fZGVmYXVsdH0sc2V0OmZ1bmN0aW9uKHQpe3kudHlwZU9mLm9iamVjdCgidmFsdWUiLHQpLHhlLl9kZWZhdWx0PXQsYS5fZWxsaXBzb2lkUmFkaWlTcXVhcmVkPXQucmFkaWlTcXVhcmVkLGN0Ll9lbGxpcHNvaWRPbmVPdmVyUmFkaWk9dC5vbmVPdmVyUmFkaWksY3QuX2VsbGlwc29pZE9uZU92ZXJSYWRpaVNxdWFyZWQ9dC5vbmVPdmVyUmFkaWlTcXVhcmVkLGN0Ll9lbGxpcHNvaWRDZW50ZXJUb2xlcmFuY2VTcXVhcmVkPXQuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWR9fX0pO3hlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbih0KXtyZXR1cm4geGUuY2xvbmUodGhpcyx0KX07eGUucGFja2VkTGVuZ3RoPWEucGFja2VkTGVuZ3RoO3hlLnBhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5LnR5cGVPZi5vYmplY3QoInZhbHVlIix0KSx5LmRlZmluZWQoImFycmF5IixlKSxuPXgobiwwKSxhLnBhY2sodC5fcmFkaWksZSxuKSxlfTt4ZS51bnBhY2s9ZnVuY3Rpb24odCxlLG4pe3kuZGVmaW5lZCgiYXJyYXkiLHQpLGU9eChlLDApO2xldCBvPWEudW5wYWNrKHQsZSk7cmV0dXJuIHhlLmZyb21DYXJ0ZXNpYW4zKG8sbil9O3hlLnByb3RvdHlwZS5nZW9jZW50cmljU3VyZmFjZU5vcm1hbD1hLm5vcm1hbGl6ZTt4ZS5wcm90b3R5cGUuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsQ2FydG9ncmFwaGljPWZ1bmN0aW9uKHQsZSl7eS50eXBlT2Yub2JqZWN0KCJjYXJ0b2dyYXBoaWMiLHQpO2xldCBuPXQubG9uZ2l0dWRlLG89dC5sYXRpdHVkZSxyPU1hdGguY29zKG8pLGk9cipNYXRoLmNvcyhuKSxzPXIqTWF0aC5zaW4obiksZj1NYXRoLnNpbihvKTtyZXR1cm4gaChlKXx8KGU9bmV3IGEpLGUueD1pLGUueT1zLGUuej1mLGEubm9ybWFsaXplKGUsZSl9O3hlLnByb3RvdHlwZS5nZW9kZXRpY1N1cmZhY2VOb3JtYWw9ZnVuY3Rpb24odCxlKXtpZih5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaXNOYU4odC54KXx8aXNOYU4odC55KXx8aXNOYU4odC56KSl0aHJvdyBuZXcgQigiY2FydGVzaWFuIGhhcyBhIE5hTiBjb21wb25lbnQiKTtpZighYS5lcXVhbHNFcHNpbG9uKHQsYS5aRVJPLE0uRVBTSUxPTjE0KSlyZXR1cm4gaChlKXx8KGU9bmV3IGEpLGU9YS5tdWx0aXBseUNvbXBvbmVudHModCx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkLGUpLGEubm9ybWFsaXplKGUsZSl9O3VDPW5ldyBhLGxDPW5ldyBhO3hlLnByb3RvdHlwZS5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbj1mdW5jdGlvbih0LGUpe2xldCBuPXVDLG89bEM7dGhpcy5nZW9kZXRpY1N1cmZhY2VOb3JtYWxDYXJ0b2dyYXBoaWModCxuKSxhLm11bHRpcGx5Q29tcG9uZW50cyh0aGlzLl9yYWRpaVNxdWFyZWQsbixvKTtsZXQgcj1NYXRoLnNxcnQoYS5kb3QobixvKSk7cmV0dXJuIGEuZGl2aWRlQnlTY2FsYXIobyxyLG8pLGEubXVsdGlwbHlCeVNjYWxhcihuLHQuaGVpZ2h0LG4pLGgoZSl8fChlPW5ldyBhKSxhLmFkZChvLG4sZSl9O3hlLnByb3RvdHlwZS5jYXJ0b2dyYXBoaWNBcnJheVRvQ2FydGVzaWFuQXJyYXk9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImNhcnRvZ3JhcGhpY3MiLHQpO2xldCBuPXQubGVuZ3RoO2goZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IG89MDtvPG47bysrKWVbb109dGhpcy5jYXJ0b2dyYXBoaWNUb0NhcnRlc2lhbih0W29dLGVbb10pO3JldHVybiBlfTtwQz1uZXcgYSxkQz1uZXcgYSxtQz1uZXcgYTt4ZS5wcm90b3R5cGUuY2FydGVzaWFuVG9DYXJ0b2dyYXBoaWM9ZnVuY3Rpb24odCxlKXtsZXQgbj10aGlzLnNjYWxlVG9HZW9kZXRpY1N1cmZhY2UodCxkQyk7aWYoIWgobikpcmV0dXJuO2xldCBvPXRoaXMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsKG4scEMpLHI9YS5zdWJ0cmFjdCh0LG4sbUMpLGk9TWF0aC5hdGFuMihvLnksby54KSxzPU1hdGguYXNpbihvLnopLGY9TS5zaWduKGEuZG90KHIsdCkpKmEubWFnbml0dWRlKHIpO3JldHVybiBoKGUpPyhlLmxvbmdpdHVkZT1pLGUubGF0aXR1ZGU9cyxlLmhlaWdodD1mLGUpOm5ldyBjdChpLHMsZil9O3hlLnByb3RvdHlwZS5jYXJ0ZXNpYW5BcnJheVRvQ2FydG9ncmFwaGljQXJyYXk9ZnVuY3Rpb24odCxlKXt5LmRlZmluZWQoImNhcnRlc2lhbnMiLHQpO2xldCBuPXQubGVuZ3RoO2goZSk/ZS5sZW5ndGg9bjplPW5ldyBBcnJheShuKTtmb3IobGV0IG89MDtvPG47KytvKWVbb109dGhpcy5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyh0W29dLGVbb10pO3JldHVybiBlfTt4ZS5wcm90b3R5cGUuc2NhbGVUb0dlb2RldGljU3VyZmFjZT1mdW5jdGlvbih0LGUpe3JldHVybiBHbCh0LHRoaXMuX29uZU92ZXJSYWRpaSx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkLHRoaXMuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQsZSl9O3hlLnByb3RvdHlwZS5zY2FsZVRvR2VvY2VudHJpY1N1cmZhY2U9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoImNhcnRlc2lhbiIsdCksaChlKXx8KGU9bmV3IGEpO2xldCBuPXQueCxvPXQueSxyPXQueixpPXRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQscz0xL01hdGguc3FydChuKm4qaS54K28qbyppLnkrcipyKmkueik7cmV0dXJuIGEubXVsdGlwbHlCeVNjYWxhcih0LHMsZSl9O3hlLnByb3RvdHlwZS50cmFuc2Zvcm1Qb3NpdGlvblRvU2NhbGVkU3BhY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaChlKXx8KGU9bmV3IGEpLGEubXVsdGlwbHlDb21wb25lbnRzKHQsdGhpcy5fb25lT3ZlclJhZGlpLGUpfTt4ZS5wcm90b3R5cGUudHJhbnNmb3JtUG9zaXRpb25Gcm9tU2NhbGVkU3BhY2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaChlKXx8KGU9bmV3IGEpLGEubXVsdGlwbHlDb21wb25lbnRzKHQsdGhpcy5fcmFkaWksZSl9O3hlLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXM9PT10fHxoKHQpJiZhLmVxdWFscyh0aGlzLl9yYWRpaSx0Ll9yYWRpaSl9O3hlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yYWRpaS50b1N0cmluZygpfTt4ZS5wcm90b3R5cGUuZ2V0U3VyZmFjZU5vcm1hbEludGVyc2VjdGlvbldpdGhaQXhpcz1mdW5jdGlvbih0LGUsbil7aWYoeS50eXBlT2Yub2JqZWN0KCJwb3NpdGlvbiIsdCksIU0uZXF1YWxzRXBzaWxvbih0aGlzLl9yYWRpaS54LHRoaXMuX3JhZGlpLnksTS5FUFNJTE9OMTUpKXRocm93IG5ldyBCKCJFbGxpcHNvaWQgbXVzdCBiZSBhbiBlbGxpcHNvaWQgb2YgcmV2b2x1dGlvbiAocmFkaWkueCA9PSByYWRpaS55KSIpO3kudHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbigiRWxsaXBzb2lkLnJhZGlpLnoiLHRoaXMuX3JhZGlpLnosMCksZT14KGUsMCk7bGV0IG89dGhpcy5fc3F1YXJlZFhPdmVyU3F1YXJlZFo7aWYoaChuKXx8KG49bmV3IGEpLG4ueD0wLG4ueT0wLG4uej10LnoqKDEtbyksIShNYXRoLmFicyhuLnopPj10aGlzLl9yYWRpaS56LWUpKXJldHVybiBufTtoQz1uZXcgYTt4ZS5wcm90b3R5cGUuZ2V0TG9jYWxDdXJ2YXR1cmU9ZnVuY3Rpb24odCxlKXt5LnR5cGVPZi5vYmplY3QoInN1cmZhY2VQb3NpdGlvbiIsdCksaChlKXx8KGU9bmV3IHR0KTtsZXQgbj10aGlzLmdldFN1cmZhY2VOb3JtYWxJbnRlcnNlY3Rpb25XaXRoWkF4aXModCwwLGhDKSxvPWEuZGlzdGFuY2UodCxuKSxyPXRoaXMubWluaW11bVJhZGl1cypvL3RoaXMubWF4aW11bVJhZGl1cyoqMixpPW8qcioqMjtyZXR1cm4gdHQuZnJvbUVsZW1lbnRzKDEvbywxL2ksZSl9O19DPVsuMTQ4ODc0MzM4OTgxNjMsLjQzMzM5NTM5NDEyOTI1LC42Nzk0MDk1NjgyOTkwMiwuODY1MDYzMzY2Njg4OTgsLjk3MzkwNjUyODUxNzE3LDBdLHlDPVsuMjk1NTI0MjI0NzE0NzUsLjI2OTI2NjcxOTMwOTk5LC4yMTkwODYzNjI1MTU5OCwuMTQ5NDUxMzQ5MTUwNTgsLjA2NjY3MTM0NDMwODY4NCwwXTt4ZS5wcm90b3R5cGUuc3VyZmFjZUFyZWE9ZnVuY3Rpb24odCl7eS50eXBlT2Yub2JqZWN0KCJyZWN0YW5nbGUiLHQpO2xldCBlPXQud2VzdCxuPXQuZWFzdCxvPXQuc291dGgscj10Lm5vcnRoO2Zvcig7bjxlOyluKz1NLlRXT19QSTtsZXQgaT10aGlzLl9yYWRpaVNxdWFyZWQscz1pLngsZj1pLnksdT1pLnosYz1zKmY7cmV0dXJuIHcxKG8scixmdW5jdGlvbihsKXtsZXQgcD1NYXRoLmNvcyhsKSxkPU1hdGguc2luKGwpO3JldHVybiBNYXRoLmNvcyhsKSp3MShlLG4sZnVuY3Rpb24obSl7bGV0IF89TWF0aC5jb3MobSksZz1NYXRoLnNpbihtKTtyZXR1cm4gTWF0aC5zcXJ0KGMqZCpkK3UqKGYqXypfK3MqZypnKSpwKnApfSl9KX07JD14ZX0pO2Z1bmN0aW9uIGpsKHQpe3RoaXMuX2VsbGlwc29pZD14KHQsJC5kZWZhdWx0KSx0aGlzLl9zZW1pbWFqb3JBeGlzPXRoaXMuX2VsbGlwc29pZC5tYXhpbXVtUmFkaXVzLHRoaXMuX29uZU92ZXJTZW1pbWFqb3JBeGlzPTEvdGhpcy5fc2VtaW1ham9yQXhpc312YXIgSm4sU2k9WigoKT0+e0Z0KCk7SWUoKTtJdCgpO2Z0KCk7SHQoKTtadCgpO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGpsLnByb3RvdHlwZSx7ZWxsaXBzb2lkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZWxsaXBzb2lkfX19KTtqbC5wcm90b3R5cGUucHJvamVjdD1mdW5jdGlvbih0LGUpe2xldCBuPXRoaXMuX3NlbWltYWpvckF4aXMsbz10LmxvbmdpdHVkZSpuLHI9dC5sYXRpdHVkZSpuLGk9dC5oZWlnaHQ7cmV0dXJuIGgoZSk/KGUueD1vLGUueT1yLGUuej1pLGUpOm5ldyBhKG8scixpKX07amwucHJvdG90eXBlLnVucHJvamVjdD1mdW5jdGlvbih0LGUpe2lmKCFoKHQpKXRocm93IG5ldyBCKCJjYXJ0ZXNpYW4gaXMgcmVxdWlyZWQiKTtsZXQgbj10aGlzLl9vbmVPdmVyU2VtaW1ham9yQXhpcyxvPXQueCpuLHI9dC55Km4saT10Lno7cmV0dXJuIGgoZSk/KGUubG9uZ2l0dWRlPW8sZS5sYXRpdHVkZT1yLGUuaGVpZ2h0PWksZSk6bmV3IGN0KG8scixpKX07Sm49amx9KTt2YXIgZ0MsU24sa3M9WigoKT0+e2dDPXtPVVRTSURFOi0xLElOVEVSU0VDVElORzowLElOU0lERToxfSxTbj1PYmplY3QuZnJlZXplKGdDKX0pO2Z1bmN0aW9uIEFDKHQsZSl7dGhpcy5zdGFydD14KHQsMCksdGhpcy5zdG9wPXgoZSwwKX12YXIgUXIsSGw9WigoKT0+e0l0KCk7UXI9QUN9KTtmdW5jdGlvbiB3dCh0LGUsbixvLHIsaSxzLGYsdSl7dGhpc1swXT14KHQsMCksdGhpc1sxXT14KG8sMCksdGhpc1syXT14KHMsMCksdGhpc1szXT14KGUsMCksdGhpc1s0XT14KHIsMCksdGhpc1s1XT14KGYsMCksdGhpc1s2XT14KG4sMCksdGhpc1s3XT14KGksMCksdGhpc1s4XT14KHUsMCl9ZnVuY3Rpb24gRUModCl7bGV0IGU9MDtmb3IobGV0IG49MDtuPDk7KytuKXtsZXQgbz10W25dO2UrPW8qb31yZXR1cm4gTWF0aC5zcXJ0KGUpfWZ1bmN0aW9uIFJDKHQpe2xldCBlPTA7Zm9yKGxldCBuPTA7bjwzOysrbil7bGV0IG89dFt3dC5nZXRFbGVtZW50SW5kZXgoeG1bbl0sQ21bbl0pXTtlKz0yKm8qb31yZXR1cm4gTWF0aC5zcXJ0KGUpfWZ1bmN0aW9uIFNDKHQsZSl7bGV0IG49TS5FUFNJTE9OMTUsbz0wLHI9MTtmb3IobGV0IGM9MDtjPDM7KytjKXtsZXQgbD1NYXRoLmFicyh0W3d0LmdldEVsZW1lbnRJbmRleCh4bVtjXSxDbVtjXSldKTtsPm8mJihyPWMsbz1sKX1sZXQgaT0xLHM9MCxmPUNtW3JdLHU9eG1bcl07aWYoTWF0aC5hYnModFt3dC5nZXRFbGVtZW50SW5kZXgodSxmKV0pPm4pe2xldCBjPXRbd3QuZ2V0RWxlbWVudEluZGV4KHUsdSldLGw9dFt3dC5nZXRFbGVtZW50SW5kZXgoZixmKV0scD10W3d0LmdldEVsZW1lbnRJbmRleCh1LGYpXSxkPShjLWwpLzIvcCxtO2Q8MD9tPS0xLygtZCtNYXRoLnNxcnQoMStkKmQpKTptPTEvKGQrTWF0aC5zcXJ0KDErZCpkKSksaT0xL01hdGguc3FydCgxK20qbSkscz1tKml9cmV0dXJuIGU9d3QuY2xvbmUod3QuSURFTlRJVFksZSksZVt3dC5nZXRFbGVtZW50SW5kZXgoZixmKV09ZVt3dC5nZXRFbGVtZW50SW5kZXgodSx1KV09aSxlW3d0LmdldEVsZW1lbnRJbmRleCh1LGYpXT1zLGVbd3QuZ2V0RWxlbWVudEluZGV4KGYsdSldPS1zLGV9dmFyIGJDLFRDLFNtLEUxLHdDLE9DLENtLHhtLHFsLFIxLENDLFEsQm49WigoKT0+e0Z0KCk7WHQoKTtJdCgpO2