UNPKG

cesium

Version:

CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.

26 lines (25 loc) 5.71 MB
/** * @license * Cesium - https://github.com/CesiumGS/cesium * Version 1.136.0 * * 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 dRe=Object.create;var sv=Object.defineProperty;var uRe=Object.getOwnPropertyDescriptor;var mRe=Object.getOwnPropertyNames;var hRe=Object.getPrototypeOf,fRe=Object.prototype.hasOwnProperty;var av=(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 ku=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),pRe=(e,t)=>{for(var n in t)sv(e,n,{get:t[n],enumerable:!0})},Cte=(e,t,n,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of mRe(t))!fRe.call(e,o)&&o!==n&&sv(e,o,{get:()=>t[o],enumerable:!(i=uRe(t,o))||i.enumerable});return e};var y=(e,t,n)=>(n=e!=null?dRe(hRe(e)):{},Cte(t||!e||!e.__esModule?sv(n,"default",{value:e,enumerable:!0}):n,e)),ARe=e=>Cte(sv({},"__esModule",{value:!0}),e);var C=ku(()=>{globalThis.CESIUM_WORKERS=atob("dmFyIENlc2l1bVdvcmtlcnM9KCgpPT57dmFyIG1TPU9iamVjdC5jcmVhdGU7dmFyIFh1PU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgYlM9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgcFM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIGdTPU9iamVjdC5nZXRQcm90b3R5cGVPZixfUz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBwcj0oZT0+dHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dHlwZW9mIFByb3h5PCJ1Ij9uZXcgUHJveHkoZSx7Z2V0Oih0LG4pPT4odHlwZW9mIHJlcXVpcmU8InUiP3JlcXVpcmU6dClbbl19KTplKShmdW5jdGlvbihlKXtpZih0eXBlb2YgcmVxdWlyZTwidSIpcmV0dXJuIHJlcXVpcmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3Rocm93IEVycm9yKCdEeW5hbWljIHJlcXVpcmUgb2YgIicrZSsnIiBpcyBub3Qgc3VwcG9ydGVkJyl9KSxjMT1lPT50PT57dmFyIG49ZVt0XTtpZihuKXJldHVybiBuKCk7dGhyb3cgbmV3IEVycm9yKCJNb2R1bGUgbm90IGZvdW5kIGluIGJ1bmRsZTogIit0KX07dmFyIFg9KGUsdCk9PigpPT4oZSYmKHQ9ZShlPTApKSx0KTt2YXIgZW89KGUsdCk9PigpPT4odHx8ZSgodD17ZXhwb3J0czp7fX0pLmV4cG9ydHMsdCksdC5leHBvcnRzKSxzdD0oZSx0KT0+e2Zvcih2YXIgbiBpbiB0KVh1KGUsbix7Z2V0OnRbbl0sZW51bWVyYWJsZTohMH0pfSxzMT0oZSx0LG4sbyk9PntpZih0JiZ0eXBlb2YgdD09Im9iamVjdCJ8fHR5cGVvZiB0PT0iZnVuY3Rpb24iKWZvcihsZXQgciBvZiBwUyh0KSkhX1MuY2FsbChlLHIpJiZyIT09biYmWHUoZSxyLHtnZXQ6KCk9PnRbcl0sZW51bWVyYWJsZTohKG89YlModCxyKSl8fG8uZW51bWVyYWJsZX0pO3JldHVybiBlfTt2YXIgc3I9KGUsdCxuKT0+KG49ZSE9bnVsbD9tUyhnUyhlKSk6e30sczEodHx8IWV8fCFlLl9fZXNNb2R1bGU/WHUobiwiZGVmYXVsdCIse3ZhbHVlOmUsZW51bWVyYWJsZTohMH0pOm4sZSkpLHlTPWU9PnMxKFh1KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKTtmdW5jdGlvbiBBUyhlKXtyZXR1cm4gZSE9bnVsbH12YXIgZyxjZT1YKCgpPT57Zz1BU30pO2Z1bmN0aW9uIFlpKGUpe3RoaXMubmFtZT0iRGV2ZWxvcGVyRXJyb3IiLHRoaXMubWVzc2FnZT1lO2xldCB0O3RyeXt0aHJvdyBuZXcgRXJyb3J9Y2F0Y2gobil7dD1uLnN0YWNrfXRoaXMuc3RhY2s9dH12YXIgSnQsSmk9WCgoKT0+e2NlKCk7ZyhPYmplY3QuY3JlYXRlKSYmKFlpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSksWWkucHJvdG90eXBlLmNvbnN0cnVjdG9yPVlpKTtZaS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtsZXQgZT1gJHt0aGlzLm5hbWV9OiAke3RoaXMubWVzc2FnZX1gO3JldHVybiBnKHRoaXMuc3RhY2spJiYoZSs9YAoke3RoaXMuc3RhY2sudG9TdHJpbmcoKX1gKSxlfTtZaS50aHJvd0luc3RhbnRpYXRpb25FcnJvcj1mdW5jdGlvbigpe3Rocm93IG5ldyBZaSgiVGhpcyBmdW5jdGlvbiBkZWZpbmVzIGFuIGludGVyZmFjZSBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIil9O0p0PVlpfSk7ZnVuY3Rpb24gd1MoZSl7cmV0dXJuYCR7ZX0gaXMgcmVxdWlyZWQsIGFjdHVhbCB2YWx1ZSB3YXMgdW5kZWZpbmVkYH1mdW5jdGlvbiBXYyhlLHQsbil7cmV0dXJuYEV4cGVjdGVkICR7bn0gdG8gYmUgdHlwZW9mICR7dH0sIGFjdHVhbCB0eXBlb2Ygd2FzICR7ZX1gfXZhciB0byxJbixMbT1YKCgpPT57Y2UoKTtKaSgpO3RvPXt9O3RvLnR5cGVPZj17fTt0by5kZWZpbmVkPWZ1bmN0aW9uKGUsdCl7aWYoIWcodCkpdGhyb3cgbmV3IEp0KHdTKGUpKX07dG8udHlwZU9mLmZ1bmM9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgSnQoV2ModHlwZW9mIHQsImZ1bmN0aW9uIixlKSl9O3RvLnR5cGVPZi5zdHJpbmc9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IEp0KFdjKHR5cGVvZiB0LCJzdHJpbmciLGUpKX07dG8udHlwZU9mLm51bWJlcj1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiB0IT0ibnVtYmVyIil0aHJvdyBuZXcgSnQoV2ModHlwZW9mIHQsIm51bWJlciIsZSkpfTt0by50eXBlT2YubnVtYmVyLmxlc3NUaGFuPWZ1bmN0aW9uKGUsdCxuKXtpZih0by50eXBlT2YubnVtYmVyKGUsdCksdD49bil0aHJvdyBuZXcgSnQoYEV4cGVjdGVkICR7ZX0gdG8gYmUgbGVzcyB0aGFuICR7bn0sIGFjdHVhbCB2YWx1ZSB3YXMgJHt0fWApfTt0by50eXBlT2YubnVtYmVyLmxlc3NUaGFuT3JFcXVhbHM9ZnVuY3Rpb24oZSx0LG4pe2lmKHRvLnR5cGVPZi5udW1iZXIoZSx0KSx0Pm4pdGhyb3cgbmV3IEp0KGBFeHBlY3RlZCAke2V9IHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAke259LCBhY3R1YWwgdmFsdWUgd2FzICR7dH1gKX07dG8udHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbj1mdW5jdGlvbihlLHQsbil7aWYodG8udHlwZU9mLm51bWJlcihlLHQpLHQ8PW4pdGhyb3cgbmV3IEp0KGBFeHBlY3RlZCAke2V9IHRvIGJlIGdyZWF0ZXIgdGhhbiAke259LCBhY3R1YWwgdmFsdWUgd2FzICR7dH1gKX07dG8udHlwZU9mLm51bWJlci5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKGUsdCxuKXtpZih0by50eXBlT2YubnVtYmVyKGUsdCksdDxuKXRocm93IG5ldyBKdChgRXhwZWN0ZWQgJHtlfSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtufSwgYWN0dWFsIHZhbHVlIHdhcyAke3R9YCl9O3RvLnR5cGVPZi5vYmplY3Q9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdCE9Im9iamVjdCIpdGhyb3cgbmV3IEp0KFdjKHR5cGVvZiB0LCJvYmplY3QiLGUpKX07dG8udHlwZU9mLmJvb2w9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdCE9ImJvb2xlYW4iKXRocm93IG5ldyBKdChXYyh0eXBlb2YgdCwiYm9vbGVhbiIsZSkpfTt0by50eXBlT2YuYmlnaW50PWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIHQhPSJiaWdpbnQiKXRocm93IG5ldyBKdChXYyh0eXBlb2YgdCwiYmlnaW50IixlKSl9O3RvLnR5cGVPZi5udW1iZXIuZXF1YWxzPWZ1bmN0aW9uKGUsdCxuLG8pe2lmKHRvLnR5cGVPZi5udW1iZXIoZSxuKSx0by50eXBlT2YubnVtYmVyKHQsbyksbiE9PW8pdGhyb3cgbmV3IEp0KGAke2V9IG11c3QgYmUgZXF1YWwgdG8gJHt0fSwgdGhlIGFjdHVhbCB2YWx1ZXMgYXJlICR7bn0gYW5kICR7b31gKX07SW49dG99KTt2YXIgZDE9ZW8oKHdHLGYxKT0+e3ZhciBQYT1mdW5jdGlvbihlKXtlPT1udWxsJiYoZT1uZXcgRGF0ZSgpLmdldFRpbWUoKSksdGhpcy5OPTYyNCx0aGlzLk09Mzk3LHRoaXMuTUFUUklYX0E9MjU2NzQ4MzYxNSx0aGlzLlVQUEVSX01BU0s9MjE0NzQ4MzY0OCx0aGlzLkxPV0VSX01BU0s9MjE0NzQ4MzY0Nyx0aGlzLm10PW5ldyBBcnJheSh0aGlzLk4pLHRoaXMubXRpPXRoaXMuTisxLGUuY29uc3RydWN0b3I9PUFycmF5P3RoaXMuaW5pdF9ieV9hcnJheShlLGUubGVuZ3RoKTp0aGlzLmluaXRfc2VlZChlKX07UGEucHJvdG90eXBlLmluaXRfc2VlZD1mdW5jdGlvbihlKXtmb3IodGhpcy5tdFswXT1lPj4+MCx0aGlzLm10aT0xO3RoaXMubXRpPHRoaXMuTjt0aGlzLm10aSsrKXt2YXIgZT10aGlzLm10W3RoaXMubXRpLTFdXnRoaXMubXRbdGhpcy5tdGktMV0+Pj4zMDt0aGlzLm10W3RoaXMubXRpXT0oKChlJjQyOTQ5MDE3NjApPj4+MTYpKjE4MTI0MzMyNTM8PDE2KSsoZSY2NTUzNSkqMTgxMjQzMzI1Myt0aGlzLm10aSx0aGlzLm10W3RoaXMubXRpXT4+Pj0wfX07UGEucHJvdG90eXBlLmluaXRfYnlfYXJyYXk9ZnVuY3Rpb24oZSx0KXt2YXIgbixvLHI7Zm9yKHRoaXMuaW5pdF9zZWVkKDE5NjUwMjE4KSxuPTEsbz0wLHI9dGhpcy5OPnQ/dGhpcy5OOnQ7cjtyLS0pe3ZhciBhPXRoaXMubXRbbi0xXV50aGlzLm10W24tMV0+Pj4zMDt0aGlzLm10W25dPSh0aGlzLm10W25dXigoKGEmNDI5NDkwMTc2MCk+Pj4xNikqMTY2NDUyNTw8MTYpKyhhJjY1NTM1KSoxNjY0NTI1KStlW29dK28sdGhpcy5tdFtuXT4+Pj0wLG4rKyxvKyssbj49dGhpcy5OJiYodGhpcy5tdFswXT10aGlzLm10W3RoaXMuTi0xXSxuPTEpLG8+PXQmJihvPTApfWZvcihyPXRoaXMuTi0xO3I7ci0tKXt2YXIgYT10aGlzLm10W24tMV1edGhpcy5tdFtuLTFdPj4+MzA7dGhpcy5tdFtuXT0odGhpcy5tdFtuXV4oKChhJjQyOTQ5MDE3NjApPj4+MTYpKjE1NjYwODM5NDE8PDE2KSsoYSY2NTUzNSkqMTU2NjA4Mzk0MSktbix0aGlzLm10W25dPj4+PTAsbisrLG4+PXRoaXMuTiYmKHRoaXMubXRbMF09dGhpcy5tdFt0aGlzLk4tMV0sbj0xKX10aGlzLm10WzBdPTIxNDc0ODM2NDh9O1BhLnByb3RvdHlwZS5yYW5kb21faW50PWZ1bmN0aW9uKCl7dmFyIGUsdD1uZXcgQXJyYXkoMCx0aGlzLk1BVFJJWF9BKTtpZih0aGlzLm10aT49dGhpcy5OKXt2YXIgbjtmb3IodGhpcy5tdGk9PXRoaXMuTisxJiZ0aGlzLmluaXRfc2VlZCg1NDg5KSxuPTA7bjx0aGlzLk4tdGhpcy5NO24rKyllPXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rdGhpcy5NXV5lPj4+MV50W2UmMV07Zm9yKDtuPHRoaXMuTi0xO24rKyllPXRoaXMubXRbbl0mdGhpcy5VUFBFUl9NQVNLfHRoaXMubXRbbisxXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFtuXT10aGlzLm10W24rKHRoaXMuTS10aGlzLk4pXV5lPj4+MV50W2UmMV07ZT10aGlzLm10W3RoaXMuTi0xXSZ0aGlzLlVQUEVSX01BU0t8dGhpcy5tdFswXSZ0aGlzLkxPV0VSX01BU0ssdGhpcy5tdFt0aGlzLk4tMV09dGhpcy5tdFt0aGlzLk0tMV1eZT4+PjFedFtlJjFdLHRoaXMubXRpPTB9cmV0dXJuIGU9dGhpcy5tdFt0aGlzLm10aSsrXSxlXj1lPj4+MTEsZV49ZTw8NyYyNjM2OTI4NjQwLGVePWU8PDE1JjQwMjI3MzA3NTIsZV49ZT4+PjE4LGU+Pj4wfTtQYS5wcm90b3R5cGUucmFuZG9tX2ludDMxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpPj4+MX07UGEucHJvdG90eXBlLnJhbmRvbV9pbmNsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTUpfTtQYS5wcm90b3R5cGUucmFuZG9tPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZG9tX2ludCgpKigxLzQyOTQ5NjcyOTYpfTtQYS5wcm90b3R5cGUucmFuZG9tX2V4Y2w9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yYW5kb21faW50KCkrLjUpKigxLzQyOTQ5NjcyOTYpfTtQYS5wcm90b3R5cGUucmFuZG9tX2xvbmc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJhbmRvbV9pbnQoKT4+PjUsdD10aGlzLnJhbmRvbV9pbnQoKT4+PjY7cmV0dXJuKGUqNjcxMDg4NjQrdCkqKDEvOTAwNzE5OTI1NDc0MDk5Mil9O2YxLmV4cG9ydHM9UGF9KTt2YXIgam0sU2UsWXUsdTEsayxLZT1YKCgpPT57am09c3IoZDEoKSwxKSxTZT17fTtTZS5FUFNJTE9OMT0uMTtTZS5FUFNJTE9OMj0uMDE7U2UuRVBTSUxPTjM9LjAwMTtTZS5FUFNJTE9OND0xZS00O1NlLkVQU0lMT041PTFlLTU7U2UuRVBTSUxPTjY9MWUtNjtTZS5FUFNJTE9ONz0xZS03O1NlLkVQU0lMT044PTFlLTg7U2UuRVBTSUxPTjk9MWUtOTtTZS5FUFNJTE9OMTA9MWUtMTA7U2UuRVBTSUxPTjExPTFlLTExO1NlLkVQU0lMT04xMj0xZS0xMjtTZS5FUFNJTE9OMTM9MWUtMTM7U2UuRVBTSUxPTjE0PTFlLTE0O1NlLkVQU0lMT04xNT0xZS0xNTtTZS5FUFNJTE9OMTY9MWUtMTY7U2UuRVBTSUxPTjE3PTFlLTE3O1NlLkVQU0lMT04xOD0xZS0xODtTZS5FUFNJTE9OMTk9MWUtMTk7U2UuRVBTSUxPTjIwPTFlLTIwO1NlLkVQU0lMT04yMT0xZS0yMTtTZS5HUkFWSVRBVElPTkFMUEFSQU1FVEVSPTM5ODYwMDQ0MThlNTtTZS5TT0xBUl9SQURJVVM9Njk1NWU1O1NlLkxVTkFSX1JBRElVUz0xNzM3NDAwO1NlLlNJWFRZX0ZPVVJfS0lMT0JZVEVTPTY0KjEwMjQ7U2UuRk9VUl9HSUdBQllURVM9NCoxMDI0KjEwMjQqMTAyNDtTZS5zaWduPU1hdGguc2lnbj8/ZnVuY3Rpb24odCl7cmV0dXJuIHQ9K3QsdD09PTB8fHQhPT10P3Q6dD4wPzE6LTF9O1NlLnNpZ25Ob3RaZXJvPWZ1bmN0aW9uKGUpe3JldHVybiBlPDA/LTE6MX07U2UudG9TTm9ybT1mdW5jdGlvbihlLHQpe3JldHVybiB0PXQ/PzI1NSxNYXRoLnJvdW5kKChTZS5jbGFtcChlLC0xLDEpKi41Ky41KSp0KX07U2UuZnJvbVNOb3JtPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dD8/MjU1LFNlLmNsYW1wKGUsMCx0KS90KjItMX07U2Uubm9ybWFsaXplPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1NYXRoLm1heChuLXQsMCksbj09PTA/MDpTZS5jbGFtcCgoZS10KS9uLDAsMSl9O1NlLnNpbmg9TWF0aC5zaW5oPz9mdW5jdGlvbih0KXtyZXR1cm4oTWF0aC5leHAodCktTWF0aC5leHAoLXQpKS8yfTtTZS5jb3NoPU1hdGguY29zaD8/ZnVuY3Rpb24odCl7cmV0dXJuKE1hdGguZXhwKHQpK01hdGguZXhwKC10KSkvMn07U2UubGVycD1mdW5jdGlvbihlLHQsbil7cmV0dXJuKDEtbikqZStuKnR9O1NlLlBJPU1hdGguUEk7U2UuT05FX09WRVJfUEk9MS9NYXRoLlBJO1NlLlBJX09WRVJfVFdPPU1hdGguUEkvMjtTZS5QSV9PVkVSX1RIUkVFPU1hdGguUEkvMztTZS5QSV9PVkVSX0ZPVVI9TWF0aC5QSS80O1NlLlBJX09WRVJfU0lYPU1hdGguUEkvNjtTZS5USFJFRV9QSV9PVkVSX1RXTz0zKk1hdGguUEkvMjtTZS5UV09fUEk9MipNYXRoLlBJO1NlLk9ORV9PVkVSX1RXT19QST0xLygyKk1hdGguUEkpO1NlLlJBRElBTlNfUEVSX0RFR1JFRT1NYXRoLlBJLzE4MDtTZS5ERUdSRUVTX1BFUl9SQURJQU49MTgwL01hdGguUEk7U2UuUkFESUFOU19QRVJfQVJDU0VDT05EPVNlLlJBRElBTlNfUEVSX0RFR1JFRS8zNjAwO1NlLnRvUmFkaWFucz1mdW5jdGlvbihlKXtyZXR1cm4gZSpTZS5SQURJQU5TX1BFUl9ERUdSRUV9O1NlLnRvRGVncmVlcz1mdW5jdGlvbihlKXtyZXR1cm4gZSpTZS5ERUdSRUVTX1BFUl9SQURJQU59O1NlLmNvbnZlcnRMb25naXR1ZGVSYW5nZT1mdW5jdGlvbihlKXtsZXQgdD1TZS5UV09fUEksbj1lLU1hdGguZmxvb3IoZS90KSp0O3JldHVybiBuPC1NYXRoLlBJP24rdDpuPj1NYXRoLlBJP24tdDpufTtTZS5jbGFtcFRvTGF0aXR1ZGVSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gU2UuY2xhbXAoZSwtMSpTZS5QSV9PVkVSX1RXTyxTZS5QSV9PVkVSX1RXTyl9O1NlLm5lZ2F0aXZlUGlUb1BpPWZ1bmN0aW9uKGUpe3JldHVybiBlPj0tU2UuUEkmJmU8PVNlLlBJP2U6U2UuemVyb1RvVHdvUGkoZStTZS5QSSktU2UuUEl9O1NlLnplcm9Ub1R3b1BpPWZ1bmN0aW9uKGUpe2lmKGU+PTAmJmU8PVNlLlRXT19QSSlyZXR1cm4gZTtsZXQgdD1TZS5tb2QoZSxTZS5UV09fUEkpO3JldHVybiBNYXRoLmFicyh0KTxTZS5FUFNJTE9OMTQmJk1hdGguYWJzKGUpPlNlLkVQU0lMT04xND9TZS5UV09fUEk6dH07U2UubW9kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFNlLnNpZ24oZSk9PT1TZS5zaWduKHQpJiZNYXRoLmFicyhlKTxNYXRoLmFicyh0KT9lOihlJXQrdCkldH07U2UuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbihlLHQsbixvKXtuPW4/PzAsbz1vPz9uO2xldCByPU1hdGguYWJzKGUtdCk7cmV0dXJuIHI8PW98fHI8PW4qTWF0aC5tYXgoTWF0aC5hYnMoZSksTWF0aC5hYnModCkpfTtTZS5sZXNzVGhhbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUtdDwtbn07U2UubGVzc1RoYW5PckVxdWFscz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUtdDxufTtTZS5ncmVhdGVyVGhhbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUtdD5ufTtTZS5ncmVhdGVyVGhhbk9yRXF1YWxzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS10Pi1ufTtZdT1bMV07U2UuZmFjdG9yaWFsPWZ1bmN0aW9uKGUpe2xldCB0PVl1Lmxlbmd0aDtpZihlPj10KXtsZXQgbj1ZdVt0LTFdO2ZvcihsZXQgbz10O288PWU7bysrKXtsZXQgcj1uKm87WXUucHVzaChyKSxuPXJ9fXJldHVybiBZdVtlXX07U2UuaW5jcmVtZW50V3JhcD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG49bj8/MCwrK2UsZT50JiYoZT1uKSxlfTtTZS5pc1Bvd2VyT2ZUd289ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT0wJiYoZSZlLTEpPT09MH07U2UubmV4dFBvd2VyT2ZUd289ZnVuY3Rpb24oZSl7cmV0dXJuLS1lLGV8PWU+PjEsZXw9ZT4+MixlfD1lPj40LGV8PWU+PjgsZXw9ZT4+MTYsKytlLGV9O1NlLnByZXZpb3VzUG93ZXJPZlR3bz1mdW5jdGlvbihlKXtyZXR1cm4gZXw9ZT4+MSxlfD1lPj4yLGV8PWU+PjQsZXw9ZT4+OCxlfD1lPj4xNixlfD1lPj4zMixlPShlPj4+MCktKGU+Pj4xKSxlfTtTZS5jbGFtcD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU8dD90OmU+bj9uOmV9O3UxPW5ldyBqbS5kZWZhdWx0O1NlLnNldFJhbmRvbU51bWJlclNlZWQ9ZnVuY3Rpb24oZSl7dTE9bmV3IGptLmRlZmF1bHQoZSl9O1NlLm5leHRSYW5kb21OdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdTEucmFuZG9tKCl9O1NlLnJhbmRvbUJldHdlZW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gU2UubmV4dFJhbmRvbU51bWJlcigpKih0LWUpK2V9O1NlLmFjb3NDbGFtcGVkPWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmFjb3MoU2UuY2xhbXAoZSwtMSwxKSl9O1NlLmFzaW5DbGFtcGVkPWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmFzaW4oU2UuY2xhbXAoZSwtMSwxKSl9O1NlLmNob3JkTGVuZ3RoPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIDIqdCpNYXRoLnNpbihlKi41KX07U2UubG9nQmFzZT1mdW5jdGlvbihlLHQpe3JldHVybiBNYXRoLmxvZyhlKS9NYXRoLmxvZyh0KX07U2UuY2JydD1NYXRoLmNicnQ/P2Z1bmN0aW9uKHQpe2xldCBuPU1hdGgucG93KE1hdGguYWJzKHQpLC4zMzMzMzMzMzMzMzMzMzMzKTtyZXR1cm4gdDwwPy1uOm59O1NlLmxvZzI9TWF0aC5sb2cyPz9mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codCkqTWF0aC5MT0cyRX07U2UuZm9nPWZ1bmN0aW9uKGUsdCl7bGV0IG49ZSp0O3JldHVybiAxLU1hdGguZXhwKC0obipuKSl9O1NlLmZhc3RBcHByb3hpbWF0ZUF0YW49ZnVuY3Rpb24oZSl7cmV0dXJuIGUqKC0uMTc4NCpNYXRoLmFicyhlKS0uMDY2MyplKmUrMS4wMzAxKX07U2UuZmFzdEFwcHJveGltYXRlQXRhbjI9ZnVuY3Rpb24oZSx0KXtsZXQgbixvPU1hdGguYWJzKGUpO249TWF0aC5hYnModCk7bGV0IHI9TWF0aC5tYXgobyxuKTtuPU1hdGgubWluKG8sbik7bGV0IGE9bi9yO3JldHVybiBvPVNlLmZhc3RBcHByb3hpbWF0ZUF0YW4oYSksbz1NYXRoLmFicyh0KT5NYXRoLmFicyhlKT9TZS5QSV9PVkVSX1RXTy1vOm8sbz1lPDA/U2UuUEktbzpvLG89dDwwPy1vOm8sb307az1TZX0pO2Z1bmN0aW9uIEFlKGUsdCxuKXt0aGlzLng9ZT8/MCx0aGlzLnk9dD8/MCx0aGlzLno9bj8/MH12YXIgWnUsbDEsSnUsem0sRVMsZ3IsWGMscyxQZT1YKCgpPT57Y2UoKTtLZSgpO0FlLmZyb21TcGhlcmljYWw9ZnVuY3Rpb24oZSx0KXtnKHQpfHwodD1uZXcgQWUpO2xldCBuPWUuY2xvY2ssbz1lLmNvbmUscj1lLm1hZ25pdHVkZT8/MSxhPXIqTWF0aC5zaW4obyk7cmV0dXJuIHQueD1hKk1hdGguY29zKG4pLHQueT1hKk1hdGguc2luKG4pLHQuej1yKk1hdGguY29zKG8pLHR9O0FlLmZyb21FbGVtZW50cz1mdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gZyhvKT8oby54PWUsby55PXQsby56PW4sbyk6bmV3IEFlKGUsdCxuKX07QWUuY2xvbmU9ZnVuY3Rpb24oZSx0KXtpZihnKGUpKXJldHVybiBnKHQpPyh0Lng9ZS54LHQueT1lLnksdC56PWUueix0KTpuZXcgQWUoZS54LGUueSxlLnopfTtBZS5mcm9tQ2FydGVzaWFuND1BZS5jbG9uZTtBZS5wYWNrZWRMZW5ndGg9MztBZS5wYWNrPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1uPz8wLHRbbisrXT1lLngsdFtuKytdPWUueSx0W25dPWUueix0fTtBZS51bnBhY2s9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PXQ/PzAsZyhuKXx8KG49bmV3IEFlKSxuLng9ZVt0KytdLG4ueT1lW3QrK10sbi56PWVbdF0sbn07QWUucGFja0FycmF5PWZ1bmN0aW9uKGUsdCl7bGV0IG49ZS5sZW5ndGgsbz1uKjM7Zyh0KT8hQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGghPT1vfHx0Lmxlbmd0aCE9PW8mJih0Lmxlbmd0aD1vKTp0PW5ldyBBcnJheShvKTtmb3IobGV0IHI9MDtyPG47KytyKUFlLnBhY2soZVtyXSx0LHIqMyk7cmV0dXJuIHR9O0FlLnVucGFja0FycmF5PWZ1bmN0aW9uKGUsdCl7bGV0IG49ZS5sZW5ndGg7Zyh0KT90Lmxlbmd0aD1uLzM6dD1uZXcgQXJyYXkobi8zKTtmb3IobGV0IG89MDtvPG47bys9Myl7bGV0IHI9by8zO3Rbcl09QWUudW5wYWNrKGUsbyx0W3JdKX1yZXR1cm4gdH07QWUuZnJvbUFycmF5PUFlLnVucGFjaztBZS5tYXhpbXVtQ29tcG9uZW50PWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heChlLngsZS55LGUueil9O0FlLm1pbmltdW1Db21wb25lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWluKGUueCxlLnksZS56KX07QWUubWluaW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PU1hdGgubWluKGUueCx0LngpLG4ueT1NYXRoLm1pbihlLnksdC55KSxuLno9TWF0aC5taW4oZS56LHQueiksbn07QWUubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PU1hdGgubWF4KGUueCx0LngpLG4ueT1NYXRoLm1heChlLnksdC55KSxuLno9TWF0aC5tYXgoZS56LHQueiksbn07QWUuY2xhbXA9ZnVuY3Rpb24oZSx0LG4sbyl7bGV0IHI9ay5jbGFtcChlLngsdC54LG4ueCksYT1rLmNsYW1wKGUueSx0Lnksbi55KSxpPWsuY2xhbXAoZS56LHQueixuLnopO3JldHVybiBvLng9cixvLnk9YSxvLno9aSxvfTtBZS5tYWduaXR1ZGVTcXVhcmVkPWZ1bmN0aW9uKGUpe3JldHVybiBlLngqZS54K2UueSplLnkrZS56KmUuen07QWUubWFnbml0dWRlPWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnNxcnQoQWUubWFnbml0dWRlU3F1YXJlZChlKSl9O1p1PW5ldyBBZTtBZS5kaXN0YW5jZT1mdW5jdGlvbihlLHQpe3JldHVybiBBZS5zdWJ0cmFjdChlLHQsWnUpLEFlLm1hZ25pdHVkZShadSl9O0FlLmRpc3RhbmNlU3F1YXJlZD1mdW5jdGlvbihlLHQpe3JldHVybiBBZS5zdWJ0cmFjdChlLHQsWnUpLEFlLm1hZ25pdHVkZVNxdWFyZWQoWnUpfTtBZS5ub3JtYWxpemU9ZnVuY3Rpb24oZSx0KXtsZXQgbj1BZS5tYWduaXR1ZGUoZSk7cmV0dXJuIHQueD1lLngvbix0Lnk9ZS55L24sdC56PWUuei9uLHR9O0FlLmRvdD1mdW5jdGlvbihlLHQpe3JldHVybiBlLngqdC54K2UueSp0LnkrZS56KnQuen07QWUubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PWUueCp0Lngsbi55PWUueSp0Lnksbi56PWUueip0Lnosbn07QWUuZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueD1lLngvdC54LG4ueT1lLnkvdC55LG4uej1lLnovdC56LG59O0FlLmFkZD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueD1lLngrdC54LG4ueT1lLnkrdC55LG4uej1lLnordC56LG59O0FlLnN1YnRyYWN0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PWUueC10Lngsbi55PWUueS10Lnksbi56PWUuei10Lnosbn07QWUubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueD1lLngqdCxuLnk9ZS55KnQsbi56PWUueip0LG59O0FlLmRpdmlkZUJ5U2NhbGFyPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PWUueC90LG4ueT1lLnkvdCxuLno9ZS56L3Qsbn07QWUubmVnYXRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQueD0tZS54LHQueT0tZS55LHQuej0tZS56LHR9O0FlLmFicz1mdW5jdGlvbihlLHQpe3JldHVybiB0Lng9TWF0aC5hYnMoZS54KSx0Lnk9TWF0aC5hYnMoZS55KSx0Lno9TWF0aC5hYnMoZS56KSx0fTtsMT1uZXcgQWU7QWUubGVycD1mdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gQWUubXVsdGlwbHlCeVNjYWxhcih0LG4sbDEpLG89QWUubXVsdGlwbHlCeVNjYWxhcihlLDEtbixvKSxBZS5hZGQobDEsbyxvKX07SnU9bmV3IEFlLHptPW5ldyBBZTtBZS5hbmdsZUJldHdlZW49ZnVuY3Rpb24oZSx0KXtBZS5ub3JtYWxpemUoZSxKdSksQWUubm9ybWFsaXplKHQsem0pO2xldCBuPUFlLmRvdChKdSx6bSksbz1BZS5tYWduaXR1ZGUoQWUuY3Jvc3MoSnUsem0sSnUpKTtyZXR1cm4gTWF0aC5hdGFuMihvLG4pfTtFUz1uZXcgQWU7QWUubW9zdE9ydGhvZ29uYWxBeGlzPWZ1bmN0aW9uKGUsdCl7bGV0IG49QWUubm9ybWFsaXplKGUsRVMpO3JldHVybiBBZS5hYnMobixuKSxuLng8PW4ueT9uLng8PW4uej90PUFlLmNsb25lKEFlLlVOSVRfWCx0KTp0PUFlLmNsb25lKEFlLlVOSVRfWix0KTpuLnk8PW4uej90PUFlLmNsb25lKEFlLlVOSVRfWSx0KTp0PUFlLmNsb25lKEFlLlVOSVRfWix0KSx0fTtBZS5wcm9qZWN0VmVjdG9yPWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz1BZS5kb3QoZSx0KS9BZS5kb3QodCx0KTtyZXR1cm4gQWUubXVsdGlwbHlCeVNjYWxhcih0LG8sbil9O0FlLmVxdWFscz1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dHx8ZyhlKSYmZyh0KSYmZS54PT09dC54JiZlLnk9PT10LnkmJmUuej09PXQuen07QWUuZXF1YWxzQXJyYXk9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLng9PT10W25dJiZlLnk9PT10W24rMV0mJmUuej09PXRbbisyXX07QWUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gZT09PXR8fGcoZSkmJmcodCkmJmsuZXF1YWxzRXBzaWxvbihlLngsdC54LG4sbykmJmsuZXF1YWxzRXBzaWxvbihlLnksdC55LG4sbykmJmsuZXF1YWxzRXBzaWxvbihlLnosdC56LG4sbyl9O0FlLmNyb3NzPWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz1lLngscj1lLnksYT1lLnosaT10LngsZj10LnksZD10LnosYz1yKmQtYSpmLHU9YSppLW8qZCxsPW8qZi1yKmk7cmV0dXJuIG4ueD1jLG4ueT11LG4uej1sLG59O0FlLm1pZHBvaW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PShlLngrdC54KSouNSxuLnk9KGUueSt0LnkpKi41LG4uej0oZS56K3QueikqLjUsbn07QWUuZnJvbURlZ3JlZXM9ZnVuY3Rpb24oZSx0LG4sbyxyKXtyZXR1cm4gZT1rLnRvUmFkaWFucyhlKSx0PWsudG9SYWRpYW5zKHQpLEFlLmZyb21SYWRpYW5zKGUsdCxuLG8scil9O2dyPW5ldyBBZSxYYz1uZXcgQWU7QWUuX2VsbGlwc29pZFJhZGlpU3F1YXJlZD1uZXcgQWUoNjM3ODEzNyo2Mzc4MTM3LDYzNzgxMzcqNjM3ODEzNyw2MzU2NzUyMzE0MjQ1MTc5ZS05KjYzNTY3NTIzMTQyNDUxNzllLTkpO0FlLmZyb21SYWRpYW5zPWZ1bmN0aW9uKGUsdCxuLG8scil7bj1uPz8wO2xldCBhPWcobyk/by5yYWRpaVNxdWFyZWQ6QWUuX2VsbGlwc29pZFJhZGlpU3F1YXJlZCxpPU1hdGguY29zKHQpO2dyLng9aSpNYXRoLmNvcyhlKSxnci55PWkqTWF0aC5zaW4oZSksZ3Iuej1NYXRoLnNpbih0KSxncj1BZS5ub3JtYWxpemUoZ3IsZ3IpLEFlLm11bHRpcGx5Q29tcG9uZW50cyhhLGdyLFhjKTtsZXQgZj1NYXRoLnNxcnQoQWUuZG90KGdyLFhjKSk7cmV0dXJuIFhjPUFlLmRpdmlkZUJ5U2NhbGFyKFhjLGYsWGMpLGdyPUFlLm11bHRpcGx5QnlTY2FsYXIoZ3IsbixnciksZyhyKXx8KHI9bmV3IEFlKSxBZS5hZGQoWGMsZ3Iscil9O0FlLmZyb21EZWdyZWVzQXJyYXk9ZnVuY3Rpb24oZSx0LG4pe2xldCBvPWUubGVuZ3RoO2cobik/bi5sZW5ndGg9by8yOm49bmV3IEFycmF5KG8vMik7Zm9yKGxldCByPTA7cjxvO3IrPTIpe2xldCBhPWVbcl0saT1lW3IrMV0sZj1yLzI7bltmXT1BZS5mcm9tRGVncmVlcyhhLGksMCx0LG5bZl0pfXJldHVybiBufTtBZS5mcm9tUmFkaWFuc0FycmF5PWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz1lLmxlbmd0aDtnKG4pP24ubGVuZ3RoPW8vMjpuPW5ldyBBcnJheShvLzIpO2ZvcihsZXQgcj0wO3I8bztyKz0yKXtsZXQgYT1lW3JdLGk9ZVtyKzFdLGY9ci8yO25bZl09QWUuZnJvbVJhZGlhbnMoYSxpLDAsdCxuW2ZdKX1yZXR1cm4gbn07QWUuZnJvbURlZ3JlZXNBcnJheUhlaWdodHM9ZnVuY3Rpb24oZSx0LG4pe2xldCBvPWUubGVuZ3RoO2cobik/bi5sZW5ndGg9by8zOm49bmV3IEFycmF5KG8vMyk7Zm9yKGxldCByPTA7cjxvO3IrPTMpe2xldCBhPWVbcl0saT1lW3IrMV0sZj1lW3IrMl0sZD1yLzM7bltkXT1BZS5mcm9tRGVncmVlcyhhLGksZix0LG5bZF0pfXJldHVybiBufTtBZS5mcm9tUmFkaWFuc0FycmF5SGVpZ2h0cz1mdW5jdGlvbihlLHQsbil7bGV0IG89ZS5sZW5ndGg7ZyhuKT9uLmxlbmd0aD1vLzM6bj1uZXcgQXJyYXkoby8zKTtmb3IobGV0IHI9MDtyPG87cis9Myl7bGV0IGE9ZVtyXSxpPWVbcisxXSxmPWVbcisyXSxkPXIvMztuW2RdPUFlLmZyb21SYWRpYW5zKGEsaSxmLHQsbltkXSl9cmV0dXJuIG59O0FlLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgQWUoMCwwLDApKTtBZS5PTkU9T2JqZWN0LmZyZWV6ZShuZXcgQWUoMSwxLDEpKTtBZS5VTklUX1g9T2JqZWN0LmZyZWV6ZShuZXcgQWUoMSwwLDApKTtBZS5VTklUX1k9T2JqZWN0LmZyZWV6ZShuZXcgQWUoMCwxLDApKTtBZS5VTklUX1o9T2JqZWN0LmZyZWV6ZShuZXcgQWUoMCwwLDEpKTtBZS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIEFlLmNsb25lKHRoaXMsZSl9O0FlLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7cmV0dXJuIEFlLmVxdWFscyh0aGlzLGUpfTtBZS5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEFlLmVxdWFsc0Vwc2lsb24odGhpcyxlLHQsbil9O0FlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybmAoJHt0aGlzLnh9LCAke3RoaXMueX0sICR7dGhpcy56fSlgfTtzPUFlfSk7ZnVuY3Rpb24geFMoZSx0LG4sbyxyKXtsZXQgYT1lLngsaT1lLnksZj1lLnosZD10LngsYz10LnksdT10LnosbD1hKmEqZCpkLGg9aSppKmMqYyxtPWYqZip1KnUsYj1sK2grbSxwPU1hdGguc3FydCgxL2IpLHk9cy5tdWx0aXBseUJ5U2NhbGFyKGUscCxUUyk7aWYoYjxvKXJldHVybiBpc0Zpbml0ZShwKT9zLmNsb25lKHkscik6dm9pZCAwO2xldCBfPW4ueCxBPW4ueSxFPW4ueixUPVJTO1QueD15LngqXyoyLFQueT15LnkqQSoyLFQuej15LnoqRSoyO2xldCBSPSgxLXApKnMubWFnbml0dWRlKGUpLyguNSpzLm1hZ25pdHVkZShUKSksQz0wLE0sTixQLEksdix3LHgsUyxGLFUsejtkb3tSLT1DLFA9MS8oMStSKl8pLEk9MS8oMStSKkEpLHY9MS8oMStSKkUpLHc9UCpQLHg9SSpJLFM9dip2LEY9dypQLFU9eCpJLHo9Uyp2LE09bCp3K2gqeCttKlMtMSxOPWwqRipfK2gqVSpBK20qeipFO2xldCBEPS0yKk47Qz1NL0R9d2hpbGUoTWF0aC5hYnMoTSk+ay5FUFNJTE9OMTIpO3JldHVybiBnKHIpPyhyLng9YSpQLHIueT1pKkksci56PWYqdixyKTpuZXcgcyhhKlAsaSpJLGYqdil9dmFyIFRTLFJTLFF1LEdtPVgoKCk9PntQZSgpO2NlKCk7S2UoKTtUUz1uZXcgcyxSUz1uZXcgcztRdT14U30pO2Z1bmN0aW9uIGduKGUsdCxuKXt0aGlzLmxvbmdpdHVkZT1lPz8wLHRoaXMubGF0aXR1ZGU9dD8/MCx0aGlzLmhlaWdodD1uPz8wfXZhciBPUyxTUyxDUyxyZSx4dD1YKCgpPT57UGUoKTtjZSgpO0tlKCk7R20oKTtnbi5mcm9tUmFkaWFucz1mdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gbj1uPz8wLGcobyk/KG8ubG9uZ2l0dWRlPWUsby5sYXRpdHVkZT10LG8uaGVpZ2h0PW4sbyk6bmV3IGduKGUsdCxuKX07Z24uZnJvbURlZ3JlZXM9ZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuIGU9ay50b1JhZGlhbnMoZSksdD1rLnRvUmFkaWFucyh0KSxnbi5mcm9tUmFkaWFucyhlLHQsbixvKX07T1M9bmV3IHMsU1M9bmV3IHMsQ1M9bmV3IHM7Z24uX2VsbGlwc29pZE9uZU92ZXJSYWRpaT1uZXcgcygxLzYzNzgxMzcsMS82Mzc4MTM3LDEvNjM1Njc1MjMxNDI0NTE3OWUtOSk7Z24uX2VsbGlwc29pZE9uZU92ZXJSYWRpaVNxdWFyZWQ9bmV3IHMoMS8oNjM3ODEzNyo2Mzc4MTM3KSwxLyg2Mzc4MTM3KjYzNzgxMzcpLDEvKDYzNTY3NTIzMTQyNDUxNzllLTkqNjM1Njc1MjMxNDI0NTE3OWUtOSkpO2duLl9lbGxpcHNvaWRDZW50ZXJUb2xlcmFuY2VTcXVhcmVkPWsuRVBTSUxPTjE7Z24uZnJvbUNhcnRlc2lhbj1mdW5jdGlvbihlLHQsbil7bGV0IG89Zyh0KT90Lm9uZU92ZXJSYWRpaTpnbi5fZWxsaXBzb2lkT25lT3ZlclJhZGlpLHI9Zyh0KT90Lm9uZU92ZXJSYWRpaVNxdWFyZWQ6Z24uX2VsbGlwc29pZE9uZU92ZXJSYWRpaVNxdWFyZWQsYT1nKHQpP3QuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ6Z24uX2VsbGlwc29pZENlbnRlclRvbGVyYW5jZVNxdWFyZWQsaT1RdShlLG8scixhLFNTKTtpZighZyhpKSlyZXR1cm47bGV0IGY9cy5tdWx0aXBseUNvbXBvbmVudHMoaSxyLE9TKTtmPXMubm9ybWFsaXplKGYsZik7bGV0IGQ9cy5zdWJ0cmFjdChlLGksQ1MpLGM9TWF0aC5hdGFuMihmLnksZi54KSx1PU1hdGguYXNpbihmLnopLGw9ay5zaWduKHMuZG90KGQsZSkpKnMubWFnbml0dWRlKGQpO3JldHVybiBnKG4pPyhuLmxvbmdpdHVkZT1jLG4ubGF0aXR1ZGU9dSxuLmhlaWdodD1sLG4pOm5ldyBnbihjLHUsbCl9O2duLnRvQ2FydGVzaWFuPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gcy5mcm9tUmFkaWFucyhlLmxvbmdpdHVkZSxlLmxhdGl0dWRlLGUuaGVpZ2h0LHQsbil9O2duLmNsb25lPWZ1bmN0aW9uKGUsdCl7aWYoZyhlKSlyZXR1cm4gZyh0KT8odC5sb25naXR1ZGU9ZS5sb25naXR1ZGUsdC5sYXRpdHVkZT1lLmxhdGl0dWRlLHQuaGVpZ2h0PWUuaGVpZ2h0LHQpOm5ldyBnbihlLmxvbmdpdHVkZSxlLmxhdGl0dWRlLGUuaGVpZ2h0KX07Z24uZXF1YWxzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10fHxnKGUpJiZnKHQpJiZlLmxvbmdpdHVkZT09PXQubG9uZ2l0dWRlJiZlLmxhdGl0dWRlPT09dC5sYXRpdHVkZSYmZS5oZWlnaHQ9PT10LmhlaWdodH07Z24uZXF1YWxzRXBzaWxvbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG49bj8/MCxlPT09dHx8ZyhlKSYmZyh0KSYmTWF0aC5hYnMoZS5sb25naXR1ZGUtdC5sb25naXR1ZGUpPD1uJiZNYXRoLmFicyhlLmxhdGl0dWRlLXQubGF0aXR1ZGUpPD1uJiZNYXRoLmFicyhlLmhlaWdodC10LmhlaWdodCk8PW59O2duLlpFUk89T2JqZWN0LmZyZWV6ZShuZXcgZ24oMCwwLDApKTtnbi5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGduLmNsb25lKHRoaXMsZSl9O2duLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGduLmVxdWFscyh0aGlzLGUpfTtnbi5wcm90b3R5cGUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbihlLHQpe3JldHVybiBnbi5lcXVhbHNFcHNpbG9uKHRoaXMsZSx0KX07Z24ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMubG9uZ2l0dWRlfSwgJHt0aGlzLmxhdGl0dWRlfSwgJHt0aGlzLmhlaWdodH0pYH07cmU9Z259KTtmdW5jdGlvbiB6ZShlLHQpe3RoaXMueD1lPz8wLHRoaXMueT10Pz8wfXZhciAkdSxoMSxtMSxiMSxNUyxZLFZ0PVgoKCk9PntjZSgpO0tlKCk7emUuZnJvbUVsZW1lbnRzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZyhuKT8obi54PWUsbi55PXQsbik6bmV3IHplKGUsdCl9O3plLmNsb25lPWZ1bmN0aW9uKGUsdCl7aWYoZyhlKSlyZXR1cm4gZyh0KT8odC54PWUueCx0Lnk9ZS55LHQpOm5ldyB6ZShlLngsZS55KX07emUuZnJvbUNhcnRlc2lhbjM9emUuY2xvbmU7emUuZnJvbUNhcnRlc2lhbjQ9emUuY2xvbmU7emUucGFja2VkTGVuZ3RoPTI7emUucGFjaz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG49bj8/MCx0W24rK109ZS54LHRbbl09ZS55LHR9O3plLnVucGFjaz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9dD8/MCxnKG4pfHwobj1uZXcgemUpLG4ueD1lW3QrK10sbi55PWVbdF0sbn07emUucGFja0FycmF5PWZ1bmN0aW9uKGUsdCl7bGV0IG49ZS5sZW5ndGgsbz1uKjI7Zyh0KT8hQXJyYXkuaXNBcnJheSh0KSYmdC5sZW5ndGghPT1vfHx0Lmxlbmd0aCE9PW8mJih0Lmxlbmd0aD1vKTp0PW5ldyBBcnJheShvKTtmb3IobGV0IHI9MDtyPG47KytyKXplLnBhY2soZVtyXSx0LHIqMik7cmV0dXJuIHR9O3plLnVucGFja0FycmF5PWZ1bmN0aW9uKGUsdCl7bGV0IG49ZS5sZW5ndGg7Zyh0KT90Lmxlbmd0aD1uLzI6dD1uZXcgQXJyYXkobi8yKTtmb3IobGV0IG89MDtvPG47bys9Mil7bGV0IHI9by8yO3Rbcl09emUudW5wYWNrKGUsbyx0W3JdKX1yZXR1cm4gdH07emUuZnJvbUFycmF5PXplLnVucGFjazt6ZS5tYXhpbXVtQ29tcG9uZW50PWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heChlLngsZS55KX07emUubWluaW11bUNvbXBvbmVudD1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5taW4oZS54LGUueSl9O3plLm1pbmltdW1CeUNvbXBvbmVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueD1NYXRoLm1pbihlLngsdC54KSxuLnk9TWF0aC5taW4oZS55LHQueSksbn07emUubWF4aW11bUJ5Q29tcG9uZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PU1hdGgubWF4KGUueCx0LngpLG4ueT1NYXRoLm1heChlLnksdC55KSxufTt6ZS5jbGFtcD1mdW5jdGlvbihlLHQsbixvKXtsZXQgcj1rLmNsYW1wKGUueCx0Lngsbi54KSxhPWsuY2xhbXAoZS55LHQueSxuLnkpO3JldHVybiBvLng9cixvLnk9YSxvfTt6ZS5tYWduaXR1ZGVTcXVhcmVkPWZ1bmN0aW9uKGUpe3JldHVybiBlLngqZS54K2UueSplLnl9O3plLm1hZ25pdHVkZT1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5zcXJ0KHplLm1hZ25pdHVkZVNxdWFyZWQoZSkpfTskdT1uZXcgemU7emUuZGlzdGFuY2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gemUuc3VidHJhY3QoZSx0LCR1KSx6ZS5tYWduaXR1ZGUoJHUpfTt6ZS5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gemUuc3VidHJhY3QoZSx0LCR1KSx6ZS5tYWduaXR1ZGVTcXVhcmVkKCR1KX07emUubm9ybWFsaXplPWZ1bmN0aW9uKGUsdCl7bGV0IG49emUubWFnbml0dWRlKGUpO3JldHVybiB0Lng9ZS54L24sdC55PWUueS9uLHR9O3plLmRvdD1mdW5jdGlvbihlLHQpe3JldHVybiBlLngqdC54K2UueSp0Lnl9O3plLmNyb3NzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUueCp0LnktZS55KnQueH07emUubXVsdGlwbHlDb21wb25lbnRzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PWUueCp0Lngsbi55PWUueSp0Lnksbn07emUuZGl2aWRlQ29tcG9uZW50cz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueD1lLngvdC54LG4ueT1lLnkvdC55LG59O3plLmFkZD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueD1lLngrdC54LG4ueT1lLnkrdC55LG59O3plLnN1YnRyYWN0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbi54PWUueC10Lngsbi55PWUueS10Lnksbn07emUubXVsdGlwbHlCeVNjYWxhcj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueD1lLngqdCxuLnk9ZS55KnQsbn07emUuZGl2aWRlQnlTY2FsYXI9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuLng9ZS54L3Qsbi55PWUueS90LG59O3plLm5lZ2F0ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0Lng9LWUueCx0Lnk9LWUueSx0fTt6ZS5hYnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC54PU1hdGguYWJzKGUueCksdC55PU1hdGguYWJzKGUueSksdH07aDE9bmV3IHplO3plLmxlcnA9ZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuIHplLm11bHRpcGx5QnlTY2FsYXIodCxuLGgxKSxvPXplLm11bHRpcGx5QnlTY2FsYXIoZSwxLW4sbyksemUuYWRkKGgxLG8sbyl9O20xPW5ldyB6ZSxiMT1uZXcgemU7emUuYW5nbGVCZXR3ZWVuPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHplLm5vcm1hbGl6ZShlLG0xKSx6ZS5ub3JtYWxpemUodCxiMSksay5hY29zQ2xhbXBlZCh6ZS5kb3QobTEsYjEpKX07TVM9bmV3IHplO3plLm1vc3RPcnRob2dvbmFsQXhpcz1mdW5jdGlvbihlLHQpe2xldCBuPXplLm5vcm1hbGl6ZShlLE1TKTtyZXR1cm4gemUuYWJzKG4sbiksbi54PD1uLnk/dD16ZS5jbG9uZSh6ZS5VTklUX1gsdCk6dD16ZS5jbG9uZSh6ZS5VTklUX1ksdCksdH07emUuZXF1YWxzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10fHxnKGUpJiZnKHQpJiZlLng9PT10LngmJmUueT09PXQueX07emUuZXF1YWxzQXJyYXk9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLng9PT10W25dJiZlLnk9PT10W24rMV19O3plLmVxdWFsc0Vwc2lsb249ZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuIGU9PT10fHxnKGUpJiZnKHQpJiZrLmVxdWFsc0Vwc2lsb24oZS54LHQueCxuLG8pJiZrLmVxdWFsc0Vwc2lsb24oZS55LHQueSxuLG8pfTt6ZS5aRVJPPU9iamVjdC5mcmVlemUobmV3IHplKDAsMCkpO3plLk9ORT1PYmplY3QuZnJlZXplKG5ldyB6ZSgxLDEpKTt6ZS5VTklUX1g9T2JqZWN0LmZyZWV6ZShuZXcgemUoMSwwKSk7emUuVU5JVF9ZPU9iamVjdC5mcmVlemUobmV3IHplKDAsMSkpO3plLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbihlKXtyZXR1cm4gemUuY2xvbmUodGhpcyxlKX07emUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtyZXR1cm4gemUuZXF1YWxzKHRoaXMsZSl9O3plLnByb3RvdHlwZS5lcXVhbHNFcHNpbG9uPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gemUuZXF1YWxzRXBzaWxvbih0aGlzLGUsdCxuKX07emUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuYCgke3RoaXMueH0sICR7dGhpcy55fSlgfTtZPXplfSk7ZnVuY3Rpb24gZzEoZSx0LG4sbyl7dD10Pz8wLG49bj8/MCxvPW8/PzAsZS5fcmFkaWk9bmV3IHModCxuLG8pLGUuX3JhZGlpU3F1YXJlZD1uZXcgcyh0KnQsbipuLG8qbyksZS5fcmFkaWlUb1RoZUZvdXJ0aD1uZXcgcyh0KnQqdCp0LG4qbipuKm4sbypvKm8qbyksZS5fb25lT3ZlclJhZGlpPW5ldyBzKHQ9PT0wPzA6MS90LG49PT0wPzA6MS9uLG89PT0wPzA6MS9vKSxlLl9vbmVPdmVyUmFkaWlTcXVhcmVkPW5ldyBzKHQ9PT0wPzA6MS8odCp0KSxuPT09MD8wOjEvKG4qbiksbz09PTA/MDoxLyhvKm8pKSxlLl9taW5pbXVtUmFkaXVzPU1hdGgubWluKHQsbixvKSxlLl9tYXhpbXVtUmFkaXVzPU1hdGgubWF4KHQsbixvKSxlLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkPWsuRVBTSUxPTjEsZS5fcmFkaWlTcXVhcmVkLnohPT0wJiYoZS5fc3F1YXJlZFhPdmVyU3F1YXJlZFo9ZS5fcmFkaWlTcXVhcmVkLngvZS5fcmFkaWlTcXVhcmVkLnopfWZ1bmN0aW9uIHd0KGUsdCxuKXt0aGlzLl9yYWRpaT12b2lkIDAsdGhpcy5fcmFkaWlTcXVhcmVkPXZvaWQgMCx0aGlzLl9yYWRpaVRvVGhlRm91cnRoPXZvaWQgMCx0aGlzLl9vbmVPdmVyUmFkaWk9dm9pZCAwLHRoaXMuX29uZU92ZXJSYWRpaVNxdWFyZWQ9dm9pZCAwLHRoaXMuX21pbmltdW1SYWRpdXM9dm9pZCAwLHRoaXMuX21heGltdW1SYWRpdXM9dm9pZCAwLHRoaXMuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQ9dm9pZCAwLHRoaXMuX3NxdWFyZWRYT3ZlclNxdWFyZWRaPXZvaWQgMCxnMSh0aGlzLGUsdCxuKX1mdW5jdGlvbiBwMShlLHQsbil7bGV0IG89LjUqKHQrZSkscj0uNSoodC1lKSxhPTA7Zm9yKGxldCBpPTA7aTw1O2krKyl7bGV0IGY9cipEU1tpXTthKz1CU1tpXSoobihvK2YpK24oby1mKSl9cmV0dXJuIGEqPXIsYX12YXIgTlMsSVMsUFMsa1MsdlMsRlMsRFMsQlMscSxZZT1YKCgpPT57VnQoKTtQZSgpO3h0KCk7Y2UoKTtLZSgpO0dtKCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMod3QucHJvdG90eXBlLHtyYWRpaTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpfX0scmFkaWlTcXVhcmVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmFkaWlTcXVhcmVkfX0scmFkaWlUb1RoZUZvdXJ0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpVG9UaGVGb3VydGh9fSxvbmVPdmVyUmFkaWk6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbmVPdmVyUmFkaWl9fSxvbmVPdmVyUmFkaWlTcXVhcmVkOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZH19LG1pbmltdW1SYWRpdXM6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taW5pbXVtUmFkaXVzfX0sbWF4aW11bVJhZGl1czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heGltdW1SYWRpdXN9fX0pO3d0LmNsb25lPWZ1bmN0aW9uKGUsdCl7aWYoIWcoZSkpcmV0dXJuO2xldCBuPWUuX3JhZGlpO3JldHVybiBnKHQpPyhzLmNsb25lKG4sdC5fcmFkaWkpLHMuY2xvbmUoZS5fcmFkaWlTcXVhcmVkLHQuX3JhZGlpU3F1YXJlZCkscy5jbG9uZShlLl9yYWRpaVRvVGhlRm91cnRoLHQuX3JhZGlpVG9UaGVGb3VydGgpLHMuY2xvbmUoZS5fb25lT3ZlclJhZGlpLHQuX29uZU92ZXJSYWRpaSkscy5jbG9uZShlLl9vbmVPdmVyUmFkaWlTcXVhcmVkLHQuX29uZU92ZXJSYWRpaVNxdWFyZWQpLHQuX21pbmltdW1SYWRpdXM9ZS5fbWluaW11bVJhZGl1cyx0Ll9tYXhpbXVtUmFkaXVzPWUuX21heGltdW1SYWRpdXMsdC5fY2VudGVyVG9sZXJhbmNlU3F1YXJlZD1lLl9jZW50ZXJUb2xlcmFuY2VTcXVhcmVkLHQpOm5ldyB3dChuLngsbi55LG4ueil9O3d0LmZyb21DYXJ0ZXNpYW4zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGcodCl8fCh0PW5ldyB3dCksZyhlKSYmZzEodCxlLngsZS55LGUueiksdH07d3QuV0dTODQ9T2JqZWN0LmZyZWV6ZShuZXcgd3QoNjM3ODEzNyw2Mzc4MTM3LDYzNTY3NTIzMTQyNDUxNzllLTkpKTt3dC5VTklUX1NQSEVSRT1PYmplY3QuZnJlZXplKG5ldyB3dCgxLDEsMSkpO3d0Lk1PT049T2JqZWN0LmZyZWV6ZShuZXcgd3Qoay5MVU5BUl9SQURJVVMsay5MVU5BUl9SQURJVVMsay5MVU5BUl9SQURJVVMpKTt3dC5NQVJTPU9iamVjdC5mcmVlemUobmV3IHd0KDMzOTYxOTAsMzM5NjE5MCwzMzc2MjAwKSk7d3QuX2RlZmF1bHQ9d3QuV0dTODQ7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMod3Qse2RlZmF1bHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB3dC5fZGVmYXVsdH0sc2V0OmZ1bmN0aW9uKGUpe3d0Ll9kZWZhdWx0PWUscy5fZWxsaXBzb2lkUmFkaWlTcXVhcmVkPWUucmFkaWlTcXVhcmVkLHJlLl9lbGxpcHNvaWRPbmVPdmVyUmFkaWk9ZS5vbmVPdmVyUmFkaWkscmUuX2VsbGlwc29pZE9uZU92ZXJSYWRpaVNxdWFyZWQ9ZS5vbmVPdmVyUmFkaWlTcXVhcmVkLHJlLl9lbGxpcHNvaWRDZW50ZXJUb2xlcmFuY2VTcXVhcmVkPWUuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWR9fX0pO3d0LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbihlKXtyZXR1cm4gd3QuY2xvbmUodGhpcyxlKX07d3QucGFja2VkTGVuZ3RoPXMucGFja2VkTGVuZ3RoO3d0LnBhY2s9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuPW4/PzAscy5wYWNrKGUuX3JhZGlpLHQsbiksdH07d3QudW5wYWNrPWZ1bmN0aW9uKGUsdCxuKXt0PXQ/PzA7bGV0IG89cy51bnBhY2soZSx0KTtyZXR1cm4gd3QuZnJvbUNhcnRlc2lhbjMobyxuKX07d3QucHJvdG90eXBlLmdlb2NlbnRyaWNTdXJmYWNlTm9ybWFsPXMubm9ybWFsaXplO3d0LnByb3RvdHlwZS5nZW9kZXRpY1N1cmZhY2VOb3JtYWxDYXJ0b2dyYXBoaWM9ZnVuY3Rpb24oZSx0KXtsZXQgbj1lLmxvbmdpdHVkZSxvPWUubGF0aXR1ZGUscj1NYXRoLmNvcyhvKSxhPXIqTWF0aC5jb3MobiksaT1yKk1hdGguc2luKG4pLGY9TWF0aC5zaW4obyk7cmV0dXJuIGcodCl8fCh0PW5ldyBzKSx0Lng9YSx0Lnk9aSx0Lno9ZixzLm5vcm1hbGl6ZSh0LHQpfTt3dC5wcm90b3R5cGUuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsPWZ1bmN0aW9uKGUsdCl7aWYoIXMuZXF1YWxzRXBzaWxvbihlLHMuWkVSTyxrLkVQU0lMT04xNCkpcmV0dXJuIGcodCl8fCh0PW5ldyBzKSx0PXMubXVsdGlwbHlDb21wb25lbnRzKGUsdGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZCx0KSxzLm5vcm1hbGl6ZSh0LHQpfTtOUz1uZXcgcyxJUz1uZXcgczt3dC5wcm90b3R5cGUuY2FydG9ncmFwaGljVG9DYXJ0ZXNpYW49ZnVuY3Rpb24oZSx0KXtsZXQgbj1OUyxvPUlTO3RoaXMuZ2VvZGV0aWNTdXJmYWNlTm9ybWFsQ2FydG9ncmFwaGljKGUsbikscy5tdWx0aXBseUNvbXBvbmVudHModGhpcy5fcmFkaWlTcXVhcmVkLG4sbyk7bGV0IHI9TWF0aC5zcXJ0KHMuZG90KG4sbykpO3JldHVybiBzLmRpdmlkZUJ5U2NhbGFyKG8scixvKSxzLm11bHRpcGx5QnlTY2FsYXIobixlLmhlaWdodCxuKSxnKHQpfHwodD1uZXcgcykscy5hZGQobyxuLHQpfTt3dC5wcm90b3R5cGUuY2FydG9ncmFwaGljQXJyYXlUb0NhcnRlc2lhbkFycmF5PWZ1bmN0aW9uKGUsdCl7bGV0IG49ZS5sZW5ndGg7Zyh0KT90Lmxlbmd0aD1uOnQ9bmV3IEFycmF5KG4pO2ZvcihsZXQgbz0wO288bjtvKyspdFtvXT10aGlzLmNhcnRvZ3JhcGhpY1RvQ2FydGVzaWFuKGVbb10sdFtvXSk7cmV0dXJuIHR9O1BTPW5ldyBzLGtTPW5ldyBzLHZTPW5ldyBzO3d0LnByb3RvdHlwZS5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYz1mdW5jdGlvbihlLHQpe2xldCBuPXRoaXMuc2NhbGVUb0dlb2RldGljU3VyZmFjZShlLGtTKTtpZighZyhuKSlyZXR1cm47bGV0IG89dGhpcy5nZW9kZXRpY1N1cmZhY2VOb3JtYWwobixQUykscj1zLnN1YnRyYWN0KGUsbix2UyksYT1NYXRoLmF0YW4yKG8ueSxvLngpLGk9TWF0aC5hc2luKG8ueiksZj1rLnNpZ24ocy5kb3QocixlKSkqcy5tYWduaXR1ZGUocik7cmV0dXJuIGcodCk/KHQubG9uZ2l0dWRlPWEsdC5sYXRpdHVkZT1pLHQuaGVpZ2h0PWYsdCk6bmV3IHJlKGEsaSxmKX07d3QucHJvdG90eXBlLmNhcnRlc2lhbkFycmF5VG9DYXJ0b2dyYXBoaWNBcnJheT1mdW5jdGlvbihlLHQpe2xldCBuPWUubGVuZ3RoO2codCk/dC5sZW5ndGg9bjp0PW5ldyBBcnJheShuKTtmb3IobGV0IG89MDtvPG47KytvKXRbb109dGhpcy5jYXJ0ZXNpYW5Ub0NhcnRvZ3JhcGhpYyhlW29dLHRbb10pO3JldHVybiB0fTt3dC5wcm90b3R5cGUuc2NhbGVUb0dlb2RldGljU3VyZmFjZT1mdW5jdGlvbihlLHQpe3JldHVybiBRdShlLHRoaXMuX29uZU92ZXJSYWRpaSx0aGlzLl9vbmVPdmVyUmFkaWlTcXVhcmVkLHRoaXMuX2NlbnRlclRvbGVyYW5jZVNxdWFyZWQsdCl9O3d0LnByb3RvdHlwZS5zY2FsZVRvR2VvY2VudHJpY1N1cmZhY2U9ZnVuY3Rpb24oZSx0KXtnKHQpfHwodD1uZXcgcyk7bGV0IG49ZS54LG89ZS55LHI9ZS56LGE9dGhpcy5fb25lT3ZlclJhZGlpU3F1YXJlZCxpPTEvTWF0aC5zcXJ0KG4qbiphLngrbypvKmEueStyKnIqYS56KTtyZXR1cm4gcy5tdWx0aXBseUJ5U2NhbGFyKGUsaSx0KX07d3QucHJvdG90eXBlLnRyYW5zZm9ybVBvc2l0aW9uVG9TY2FsZWRTcGFjZT1mdW5jdGlvbihlLHQpe3JldHVybiBnKHQpfHwodD1uZXcgcykscy5tdWx0aXBseUNvbXBvbmVudHMoZSx0aGlzLl9vbmVPdmVyUmFkaWksdCl9O3d0LnByb3RvdHlwZS50cmFuc2Zvcm1Qb3NpdGlvbkZyb21TY2FsZWRTcGFjZT1mdW5jdGlvbihlLHQpe3JldHVybiBnKHQpfHwodD1uZXcgcykscy5tdWx0aXBseUNvbXBvbmVudHMoZSx0aGlzLl9yYWRpaSx0KX07d3QucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcz09PWV8fGcoZSkmJnMuZXF1YWxzKHRoaXMuX3JhZGlpLGUuX3JhZGlpKX07d3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhZGlpLnRvU3RyaW5nKCl9O3d0LnByb3RvdHlwZS5nZXRTdXJmYWNlTm9ybWFsSW50ZXJzZWN0aW9uV2l0aFpBeGlzPWZ1bmN0aW9uKGUsdCxuKXt0PXQ/PzA7bGV0IG89dGhpcy5fc3F1YXJlZFhPdmVyU3F1YXJlZFo7aWYoZyhuKXx8KG49bmV3IHMpLG4ueD0wLG4ueT0wLG4uej1lLnoqKDEtbyksIShNYXRoLmFicyhuLnopPj10aGlzLl9yYWRpaS56LXQpKXJldHVybiBufTtGUz1uZXcgczt3dC5wcm90b3R5cGUuZ2V0TG9jYWxDdXJ2YXR1cmU9ZnVuY3Rpb24oZSx0KXtnKHQpfHwodD1uZXcgWSk7bGV0IG49dGhpcy5nZXRTdXJmYWNlTm9ybWFsSW50ZXJzZWN0aW9uV2l0aFpBeGlzKGUsMCxGUyksbz1zLmRpc3RhbmNlKGUsbikscj10aGlzLm1pbmltdW1SYWRpdXMqby90aGlzLm1heGltdW1SYWRpdXMqKjIsYT1vKnIqKjI7cmV0dXJuIFkuZnJvbUVsZW1lbnRzKDEvbywxL2EsdCl9O0RTPVsuMTQ4ODc0MzM4OTgxNjMsLjQzMzM5NTM5NDEyOTI1LC42Nzk0MDk1NjgyOTkwMiwuODY1MDYzMzY2Njg4OTgsLjk3MzkwNjUyODUxNzE3LDBdLEJTPVsuMjk1NTI0MjI0NzE0NzUsLjI2OTI2NjcxOTMwOTk5LC4yMTkwODYzNjI1MTU5OCwuMTQ5NDUxMzQ5MTUwNTgsLjA2NjY3MTM0NDMwODY4NCwwXTt3dC5wcm90b3R5cGUuc3VyZmFjZUFyZWE9ZnVuY3Rpb24oZSl7bGV0IHQ9ZS53ZXN0LG49ZS5lYXN0LG89ZS5zb3V0aCxyPWUubm9ydGg7Zm9yKDtuPHQ7KW4rPWsuVFdPX1BJO2xldCBhPXRoaXMuX3JhZGlpU3F1YXJlZCxpPWEueCxmPWEueSxkPWEueixjPWkqZjtyZXR1cm4gcDEobyxyLGZ1bmN0aW9uKHUpe2xldCBsPU1hdGguY29zKHUpLGg9TWF0aC5zaW4odSk7cmV0dXJuIE1hdGguY29zKHUpKnAxKHQsbixmdW5jdGlvbihtKXtsZXQgYj1NYXRoLmNvcyhtKSxwPU1hdGguc2luKG0pO3JldHVybiBNYXRoLnNxcnQoYypoKmgrZCooZipiKmIraSpwKnApKmwqbCl9KX0pfTtxPXd0fSk7ZnVuY3Rpb24gZWwoZSl7dGhpcy5fZWxsaXBzb2lkPWU/P3EuZGVmYXVsdCx0aGlzLl9zZW1pbWFqb3JBeGlzPXRoaXMuX2VsbGlwc29pZC5tYXhpbXVtUmFkaXVzLHRoaXMuX29uZU92ZXJTZW1pbWFqb3JBeGlzPTEvdGhpcy5fc2VtaW1ham9yQXhpc312YXIgaW8sa2E9WCgoKT0+e1BlKCk7eHQoKTtjZSgpO1llKCk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZWwucHJvdG90eXBlLHtlbGxpcHNvaWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGxpcHNvaWR9fX0pO2VsLnByb3RvdHlwZS5wcm9qZWN0PWZ1bmN0aW9uKGUsdCl7bGV0IG49dGhpcy5fc2VtaW1ham9yQXhpcyxvPWUubG9uZ2l0dWRlKm4scj1lLmxhdGl0dWRlKm4sYT1lLmhlaWdodDtyZXR1cm4gZyh0KT8odC54PW8sdC55PXIsdC56PWEsdCk6bmV3IHMobyxyLGEpfTtlbC5wcm90b3R5cGUudW5wcm9qZWN0PWZ1bmN0aW9uKGUsdCl7bGV0IG49dGhpcy5fb25lT3ZlclNlbWltYWpvckF4aXMsbz1lLngqbixyPWUueSpuLGE9ZS56O3JldHVybiBnKHQpPyh0LmxvbmdpdHVkZT1vLHQubGF0aXR1ZGU9cix0LmhlaWdodD1hLHQpOm5ldyByZShvLHIsYSl9O2lvPWVsfSk7dmFyIFVTLE1uLFppPVgoKCk9PntVUz17T1VUU0lERTotMSxJTlRFUlNFQ1RJTkc6MCxJTlNJREU6MX0sTW49T2JqZWN0LmZyZWV6ZShVUyl9KTtmdW5jdGlvbiBMUyhlLHQpe3RoaXMuc3RhcnQ9ZT8/MCx0aGlzLnN0b3A9dD8/MH12YXIgRW8saGY9WCgoKT0+e0VvPUxTfSk7ZnVuY3Rpb24gRWUoZSx0LG4sbyxyLGEsaSxmLGQpe3RoaXNbMF09ZT8/MCx0aGlzWzFdPW8/PzAsdGhpc1syXT1pPz8wLHRoaXNbM109dD8/MCx0aGlzWzRdPXI/PzAsdGhpc1s1XT1mPz8wLHRoaXNbNl09bj8/MCx0aGlzWzddPWE/PzAsdGhpc1s4XT1kPz8wfWZ1bmN0aW9uIEhTKGUpe2xldCB0PTA7Zm9yKGxldCBuPTA7bjw5Oysrbil7bGV0IG89ZVtuXTt0Kz1vKm99cmV0dXJuIE1hdGguc3FydCh0KX1mdW5jdGlvbiBLUyhlKXtsZXQgdD0wO2ZvcihsZXQgbj0wO248MzsrK24pe2xldCBvPWVbRWUuZ2V0RWxlbWVudEluZGV4KEttW25dLEhtW25dKV07dCs9MipvKm99cmV0dXJuIE1hdGguc3FydCh0KX1mdW5jdGlvbiBxUyhlLHQpe2xldCBuPWsuRVBTSUxPTjE1LG89MCxyPTE7Zm9yKGxldCBjPTA7YzwzOysrYyl7bGV0IHU9TWF0aC5hYnMoZVtFZS5nZXRFbGVtZW50SW5kZXgoS21bY10sSG1bY10pXSk7dT5vJiYocj1jLG89dSl9bGV0IGE9MSxpPTAsZj1IbVtyXSxkPUttW3JdO2lmKE1hdGguYWJzKGVbRWUuZ2V0RWxlbWVudEluZGV4KGQsZildKT5uKXtsZXQgYz1lW0VlLmdldEVsZW1lbnRJbmRleChkLGQpXSx1PWVbRWUuZ2V0RWxlbWVudEluZGV4KGYsZildLGw9ZVtFZS5nZXRFbGVtZW50SW5kZXgoZCxmKV0saD0oYy11KS8yL2wsbTtoPDA/bT0tMS8oLWgrTWF0aC5zcXJ0KDEraCpoKSk6bT0xLyhoK01hdGguc3FydCgxK2gqaCkpLGE9MS9NYXRoLnNxcnQoMSttKm0pLGk9bSphfXJldHVybiB0PUVlLmNsb25lKEVlLklERU5USVRZLHQpLHRbRWUuZ2V0RWxlbWVudEluZGV4KGYsZildPXRbRWUuZ2V0RWxlbWVudEluZGV4KGQsZCldPWEsdFtFZS5nZXRFbGVtZW50SW5kZXgoZCxmKV09aSx0W0VlLmdldEVsZW1lbnRJbmRleChmLGQpXT0taSx0fXZhciBqUyx6UyxWbSxfMSxHUyxWUyxIbSxLbSx0bCx5MSxXUyxKLEJuPVgoKCk9PntQZSgpO2NlKCk7S2UoKTtFZS5wYWNrZWRMZW5ndGg9OTtFZS5wYWNrPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1uPz8wLHRbbisrXT1lWzBdLHRbbisrXT1lWzFdLHRbbisrXT1lWzJdLHRbbisrXT1lWzNdLHRbbisrXT1lWzRdLHRbbisrXT1lWzVdLHRbbisrXT1lWzZdLHRbbisrXT1lWzddLHRbbisrXT1lWzhdLHR9O0VlLnVucGFjaz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9dD8/MCxnKG4pfHwobj1uZXcgRWUpLG5bMF09ZVt0KytdLG5bMV09ZVt0KytdLG5bMl09ZVt0KytdLG5bM109ZVt0KytdLG5bNF09ZVt0KytdLG5bNV09ZVt0KytdLG5bNl09ZVt0KytdLG5bN109ZVt0KytdLG5bOF09ZVt0KytdLG59O0VlLnBhY2tBcnJheT1mdW5jdGlvbihlLHQpe2xldCBuPWUubGVuZ3RoLG89bio5O2codCk/IUFycmF5LmlzQXJyYXkodCkmJnQubGVuZ3RoIT09b3x8dC5sZW5ndGghPT1vJiYodC5sZW5ndGg9byk6dD1uZXcgQXJyYXkobyk7Zm9yKGxldCByPTA7cjxuOysrcilFZS5wYWNrKGVbcl0sdCxyKjkpO3JldHVybiB0fTtFZS51bnBhY2tBcnJheT1mdW5jdGlvbihlLHQpe2xldCBuPWUubGVuZ3RoO2codCk/dC5sZW5ndGg9bi85OnQ9bmV3IEFycmF5KG4vOSk7Zm9yKGxldCBvPTA7bzxuO28rPTkpe2xldCByPW8vOTt0W3JdPUVlLnVucGFjayhlLG8sdFtyXSl9cmV0dXJuIHR9O0VlLmNsb25lPWZ1bmN0aW9uKGUsdCl7aWYoZyhlKSlyZXR1cm4gZyh0KT8odFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbNF09ZVs0XSx0WzVdPWVbNV0sdFs2XT1lWzZdLHRbN109ZVs3XSx0WzhdPWVbOF0sdCk6bmV3IEVlKGVbMF0sZVszXSxlWzZdLGVbMV0sZVs0XSxlWzddLGVbMl0sZVs1XSxlWzhdKX07RWUuZnJvbUFycmF5PUVlLnVucGFjaztFZS5mcm9tQ29sdW1uTWFqb3JBcnJheT1mdW5jdGlvbihlLHQpe3JldHVybiBFZS5jbG9uZShlLHQpfTtFZS5mcm9tUm93TWFqb3JBcnJheT1mdW5jdGlvbihlLHQpe3JldHVybiBnKHQpPyh0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XSx0KTpuZXcgRWUoZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdLGVbNV0sZVs2XSxlWzddLGVbOF0pfTtFZS5mcm9tUXVhdGVybmlvbj1mdW5jdGlvbihlLHQpe2xldCBuPWUueCplLngsbz1lLngqZS55LHI9ZS54KmUueixhPWUueCplLncsaT1lLnkqZS55LGY9ZS55KmUueixkPWUueSplLncsYz1lLnoqZS56LHU9ZS56KmUudyxsPWUudyplLncsaD1uLWktYytsLG09Miooby11KSxiPTIqKHIrZCkscD0yKihvK3UpLHk9LW4raS1jK2wsXz0yKihmLWEpLEE9Miooci1kKSxFPTIqKGYrYSksVD0tbi1pK2MrbDtyZXR1cm4gZyh0KT8odFswXT1oLHRbMV09cCx0WzJdPUEsdFszXT1tLHRbNF09eSx0WzVdPUUsdFs2XT1iLHRbN109Xyx0WzhdPVQsdCk6bmV3IEVlKGgsbSxiLHAseSxfLEEsRSxUKX07RWUuZnJvbUhlYWRpbmdQaXRjaFJvbGw9ZnVuY3Rpb24oZSx0KXtsZXQgbj1NYXRoLmNvcygtZS5waXRjaCksbz1NYXRoLmNvcygtZS5oZWFkaW5nKSxyPU1hdGguY29zKGUucm9sbCksYT1NYXRoLnNpbigtZS5waXRjaCksaT1NYXRoLnNpbigtZS5oZWFkaW5nKSxmPU1hdGguc2luKGUucm9sbCksZD1uKm8sYz0tcippK2YqYSpvLHU9ZippK3IqYSpvLGw9bippLGg9cipvK2YqYSppLG09LWYqbytyKmEqaSxiPS1hLHA9ZipuLHk9cipuO3JldHVybiBnKHQpPyh0WzBdPWQsdFsxXT1sLHRbMl09Yix0WzNdPWMsdFs0XT1oLHRbNV09cCx0WzZdPXUsdFs3XT1tLHRbOF09eSx0KTpuZXcgRWUoZCxjLHUsbCxoLG0sYixwLHkpfTtFZS5mcm9tU2NhbGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZyh0KT8odFswXT1lLngsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT1lLnksdFs1XT0wLHRbNl09MCx0WzddPTAsdFs4XT1lLnosdCk6bmV3IEVlKGUueCwwLDAsMCxlLnksMCwwLDAsZS56KX07RWUuZnJvbVVuaWZvcm1TY2FsZT1mdW5jdGlvbihlLHQpe3JldHVybiBnKHQpPyh0WzBdPWUsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT1lLHRbNV09MCx0WzZdPTAsdFs3XT0wLHRbOF09ZSx0KTpuZXcgRWUoZSwwLDAsMCxlLDAsMCwwLGUpfTtFZS5mcm9tQ3Jvc3NQcm9kdWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGcodCk/KHRbMF09MCx0WzFdPWUueix0WzJdPS1lLnksdFszXT0tZS56LHRbNF09MCx0WzVdPWUueCx0WzZdPWUueSx0WzddPS1lLngsdFs4XT0wLHQpOm5ldyBFZSgwLC1lLnosZS55LGUueiwwLC1lLngsLWUueSxlLngsMCl9O0VlLmZyb21Sb3RhdGlvblg9ZnVuY3Rpb24oZSx0KXtsZXQgbj1NYXRoLmNvcyhlKSxvPU1hdGguc2luKGUpO3JldHVybiBnKHQpPyh0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT1uLHRbNV09byx0WzZdPTAsdFs3XT0tbyx0WzhdPW4sdCk6bmV3IEVlKDEsMCwwLDAsbiwtbywwLG8sbil9O0VlLmZyb21Sb3RhdGlvblk9ZnVuY3Rpb24oZSx0KXtsZXQgbj1NYXRoLmNvcyhlKSxvPU1hdGguc2luKGUpO3JldHVybiBnKHQpPyh0WzBdPW4sdFsxXT0wLHRbMl09LW8sdFszXT0wLHRbNF09MSx0WzVdPTAsdFs2XT1vLHRbN109MCx0WzhdPW4sdCk6bmV3IEVlKG4sMCxvLDAsMSwwLC1vLDAsbil9O0VlLmZyb21Sb3RhdGlvblo9ZnVuY3Rpb24oZSx0KXtsZXQgbj1NYXRoLmNvcyhlKSxvPU1hdGguc2luKGUpO3JldHVybiBnKHQpPyh0WzBdPW4sdFsxXT1vLHRbMl09MCx0WzNdPS1vLHRbNF09bix0WzVdPTAsdFs2XT0wLHRbN109MCx0WzhdPTEsdCk6bmV3IEVlKG4sLW8sMCxvLG4sMCwwLDAsMSl9O0VlLnRvQXJyYXk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZyh0KT8odFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbNF09ZVs0XSx0WzVdPWVbNV0sdFs2XT1lWzZdLHRbN109ZVs3XSx0WzhdPWVbOF0sdCk6W2VbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSxlWzVdLGVbNl0sZVs3XSxlWzhdXX07RWUuZ2V0RWxlbWVudEluZGV4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUqMyt0fTtFZS5nZXRDb2x1bW49ZnVuY3Rpb24oZSx0LG4pe2xldCBvPXQqMyxyPWVbb10sYT1lW28rMV0saT1lW28rMl07cmV0dXJuIG4ueD1yLG4ueT1hLG4uej1pLG59O0VlLnNldENvbHVtbj1mdW5jdGlvbihlLHQsbixvKXtvPUVlLmNsb25lKGUsbyk7bGV0IHI9dCozO3JldHVybiBvW3JdPW4ueCxvW3IrMV09bi55LG9bcisyXT1uLnosb307RWUuZ2V0Um93PWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz1lW3RdLHI9ZVt0KzNdLGE9ZVt0KzZdO3JldHVybiBuLng9byxuLnk9cixuLno9YSxufTtFZS5zZXRSb3c9ZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuIG89RWUuY2xvbmUoZSxvKSxvW3RdPW4ueCxvW3QrM109bi55LG9bdCs2XT1uLnosb307alM9bmV3IHM7RWUuc2V0U2NhbGU9ZnVuY3Rpb24oZSx0LG4pe2xldCBvPUVlLmdldFNjYWxlKGUsalMpLHI9dC54L28ueCxhPXQueS9vLnksaT10Lnovby56O3JldHVybiBuWzBdPWVbMF0qcixuWzFdPWVbMV0qcixuWzJdPWVbMl0qcixuWzNdPWVbM10qYSxuWzRdPWVbNF0qYSxuWzVdPWVbNV0qYSxuWzZdPWVbNl0qaSxuWzddPWVbN10qaSxuWzhdPWVbOF0qaSxufTt6Uz1uZXcgcztFZS5zZXRVbmlmb3JtU2NhbGU9ZnVuY3Rpb24oZSx0LG4pe2xldCBvPUVlLmdldFNjYWxlKGUselMpLHI9dC9vLngsYT10L28ueSxpPXQvby56O3JldHVybiBuWzBdPWVbMF0qcixuWzFdPWVbMV0qcixuWzJdPWVbMl0qcixuWzNdPWVbM10qYSxuWzRdPWVbNF0qYSxuWzVdPWVbNV0qYSxuWzZdPWVbNl0qaSxuWzddPWVbN10qaSxuWzhdPWVbOF0qaSxufTtWbT1uZXcgcztFZS5nZXRTY2FsZT1mdW5jdGlvbihlLHQpe3JldHVybiB0Lng9cy5tYWduaXR1ZGUocy5mcm9tRWxlbWVudHMoZVswXSxlWzFdLGVbMl0sVm0pKSx0Lnk9cy5tYWduaXR1ZGUocy5mcm9tRWxlbWVudHMoZVszXSxlWzRdLGVbNV0sVm0pKSx0Lno9cy5tYWduaXR1ZGUocy5mcm9tRWxlbWVudHMoZVs2XSxlWzddLGVbOF0sVm0pKSx0fTtfMT1uZXcgcztFZS5nZXRNYXhpbXVtU2NhbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIEVlLmdldFNjYWxlKGUsXzEpLHMubWF4aW11bUNvbXBvbmVudChfMSl9O0dTPW5ldyBzO0VlLnNldFJvdGF0aW9uPWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz1FZS5nZXRTY2FsZShlLEdTKTtyZXR1cm4gblswXT10WzBdKm8ueCxuWzFdPXRbMV0qby54LG5bMl09dFsyXSpvLngsblszXT10WzNdKm8ueSxuWzRdPXRbNF0qby55LG5bNV09dFs1XSpvLnksbls2XT10WzZdKm8ueixuWzddPXRbN10qby56LG5bOF09dFs4XSpvLnosbn07VlM9bmV3IHM7RWUuZ2V0Um90YXRpb249ZnVuY3Rpb24oZSx0KXtsZXQgbj1FZS5nZXRTY2FsZShlLFZTKTtyZXR1cm4gdFswXT1lWzBdL24ueCx0WzFdPWVbMV0vbi54LHRbMl09ZVsyXS9uLngsdFszXT1lWzNdL24ueSx0WzRdPWVbNF0vbi55LHRbNV09ZVs1XS9uLnksdFs2XT1lWzZdL24ueix0WzddPWVbN10vbi56LHRbOF09ZVs4XS9uLnosdH07RWUubXVsdGlwbHk9ZnVuY3Rpb24oZSx0LG4pe2xldCBvPWVbMF0qdFswXStlWzNdKnRbMV0rZVs2XSp0WzJdLHI9ZVsxXSp0WzBdK2VbNF0qdFsxXStlWzddKnRbMl0sYT1lWzJdKnRbMF0rZVs1XSp0WzFdK2VbOF0qdFsyXSxpPWVbMF0qdFszXStlWzNdKnRbNF0rZVs2XSp0WzVdLGY9ZVsxXSp0WzNdK2VbNF0qdFs0XStlWzddKnRbNV0sZD1lWzJdKnRbM10rZVs1XSp0WzRdK2VbOF0qdFs1XSxjPWVbMF0qdFs2XStlWzNdKnRbN10rZVs2XSp0WzhdLHU9ZVsxXSp0WzZdK2VbNF0qdFs3XStlWzddKnRbOF0sbD1lWzJdKnRbNl0rZVs1XSp0WzddK2VbOF0qdFs4XTtyZXR1cm4gblswXT1vLG5bMV09cixuWzJdPWEsblszXT1pLG5bNF09ZixuWzVdPWQsbls2XT1jLG5bN109dSxuWzhdPWwsbn07RWUuYWRkPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gblswXT1lWzBdK3RbMF0sblsxXT1lWzFdK3RbMV0sblsyXT1lWzJdK3RbMl0sblszXT1lWzNdK3RbM10sbls0XT1lWzRdK3RbNF0sbls1XT1lWzVdK3RbNV0sbls2XT1lWzZdK3RbNl0sbls3XT1lWzddK3RbN10sbls4XT1lWzhdK3RbOF0sbn07RWUuc3VidHJhY3Q9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuWzBdPWVbMF0tdFswXSxuWzFdPWVbMV0tdFsxXSxuWzJdPWVbMl0tdFsyXSxuWzNdPWVbM10tdFszXSxuWzRdPWVbNF0tdFs0XSxuWzVdPWVbNV0tdFs1XSxuWzZdPWVbNl0tdFs2XSxuWzddPWVbN10tdFs3XSxuWzhdPWVbOF0tdFs4XSxufTtFZS5tdWx0aXBseUJ5VmVjdG9yPWZ1bmN0aW9uKGUsdCxuKXtsZXQgbz10Lngscj10LnksYT10LnosaT1lWzBdKm8rZVszXSpyK2VbNl0qYSxmPWVbMV0qbytlWzRdKnIrZVs3XSphLGQ9ZVsyXSpvK2VbNV0qcitlWzhdKmE7cmV0dXJuIG4ueD1pLG4ueT1mLG4uej1kLG59O0VlLm11bHRpcGx5QnlTY2FsYXI9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuWzBdPWVbMF0qdCxuWzFdPWVbMV0qdCxuWzJdPWVbMl0qdCxuWzNdPWVbM10qdCxuWzRdPWVbNF0qdCxuWzVdPWVbNV0qdCxuWzZdPWVbNl0qdCxuWzddPWVbN10qdCxuWzhdPWVbOF0qdCxufTtFZS5tdWx0aXBseUJ5U2NhbGU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuWzBdPWVbMF0qdC54LG5bMV09ZVsxXSp0LngsblsyXT1lWzJdKnQueCxuWzNdPWVbM10qdC55LG5bNF09ZVs0XSp0Lnksbls1XT1lWzVdKnQueSxuWzZdPWVbNl0qdC56LG5bN109ZVs3XSp0Lnosbls4XT1lWzhdKnQueixufTtFZS5tdWx0aXBseUJ5VW5pZm9ybVNjYWxlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gblswXT1lWzBdKnQsblsxXT1lWzFdKnQsblsyXT1lWzJdKnQsblszXT1lWzNdKnQsbls0XT1lWzRdKnQsbls1XT1lWzVdKnQsbls2XT1lWzZdKnQsbls3XT1lWzddKnQsbls4XT1lWzhdKnQsbn07RWUubmVnYXRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRbMF09LWVbMF0sdFsxXT0tZVsxXSx0WzJdPS1lWzJdLHRbM109LWVbM10sdFs0XT0tZVs0XSx0WzVdPS1lWzVdLHRbNl09LWVbNl0sdFs3XT0tZVs3XSx0WzhdPS1lWzhdLHR9O0VlLnRyYW5zcG9zZT1mdW5jdGlvbihlLHQpe2xldCBuPWVbMF0sbz1lWzNdLHI9ZVs2XSxhPWVbMV0saT1lWzRdLGY9ZVs3XSxkPWVbMl0sYz1lWzVdLHU9ZVs4XTtyZXR1cm4gdFswXT1uLHRbMV09byx0WzJdPXIsdFszXT1hLHRbNF09aSx0WzVdPWYsdFs2XT1kLHRbN109Yyx0WzhdPXUsdH07SG09WzEsMCwwXSxLbT1bMiwyLDFdO3RsPW5ldyBFZSx5MT1uZXcgRWU7RWUuY29tcHV0ZUVpZ2VuRGVjb21wb3NpdGlvbj1mdW5jdGlvbihlLHQpe2xldCBuPWsuRVBTSUxPTjIwLG89MTAscj0wLGE9MDtnKHQpfHwodD17fSk7bGV0IGk9dC51bml0YXJ5PUVlLmNsb25lKEVlLklERU5USVRZLHQudW5pdGFyeSksZj10LmRpYWdvbmFsPUVlLmNsb25lKGUsdC5kaWFnb25hbCksZD1uKkhTKGYpO2Zvcig7YTxvJiZLUyhmKT5kOylxUyhmLHRsKSxFZS50cmFuc3Bvc2UodGwseTEpLEVlLm11bHRpcGx5KGYsdGwsZiksRWUubXVsdGlwbHkoeTEsZixmKSxFZS5tdWx0aXBseShpLHRsLGkpLCsrcj4yJiYoKythLHI9MCk7cmV0dXJuIHR9O0VlLmFicz1mdW5jdGlvbihlLHQpe3JldHVybiB0WzBdPU1hdGguYWJzKGVbMF0pLHRbMV09TWF0aC5hYnMoZVsxXSksdFsyXT1NYXRoLmFicyhlWzJdKSx0WzNdPU1hdGguYWJzKGVbM10pLHRbNF09TWF0aC5hYnMoZVs0XSksdFs1XT1NYXRoLmFicyhlWzVdKSx0WzZdPU1hdGguYWJzKGVbNl0pLHRbN109TWF0aC5hYnMoZVs3XSksdFs4XT1NYXRoLmFicyhlWzhdKSx0fTtFZS5kZXRlcm1pbmFudD1mdW5jdGlvbihlKXtsZXQgdD1lWzBdLG49ZVszXSxvPWVbNl0scj1lWzFdLGE9ZVs0XSxpPWVbN10sZj1lWzJdLGQ9ZVs1XSxjPWVbOF07cmV0dXJuIHQqKGEqYy1kKmkpK3IqKGQqby1uKmMpK2YqKG4qaS1hKm8pfTtFZS5pbnZlcnNlPWZ1bmN0aW9uKGUsdCl7bGV0IG49ZVswXSxvPWVbMV0scj1lWzJdLGE9ZVszXSxpPWVbNF0sZj1lWzVdLGQ9ZVs2XSxjPWVbN10sdT1lWzhdLGw9RWUuZGV0ZXJtaW5hbnQoZSk7dFswXT1pKnUtYypmLHRbMV09YypyLW8qdSx0WzJdPW8qZi1pKnIsdFszXT1kKmYtYSp1LHRbNF09bip1LWQqcix0WzVdPWEqci1uKmYsdFs2XT1hKmMtZCppLHRbN109ZCpvLW4qYyx0WzhdPW4qaS1hKm87bGV0IGg9MS9sO3JldHVybiBFZS5tdWx0aXBseUJ5U2NhbGFyKHQsaCx0KX07V1M9bmV3IEVlO0VlLmludmVyc2VUcmFuc3Bvc2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gRWUuaW52ZXJzZShFZS50cmFuc3Bvc2UoZSxXUyksdCl9O0VlLmVxdWFscz1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dHx8ZyhlKSYmZyh0KSYmZVswXT09PXRbMF0mJmVbMV09PT10WzFdJiZlWzJdPT09dFsyXSYmZVszXT09PXRbM10mJmVbNF09PT10WzRdJiZlWzVdPT09dFs1XSYmZVs2XT09PXRbNl0mJmVbN109PT10WzddJiZlWzhdPT09dFs4XX07RWUuZXF1YWxzRXBzaWxvbj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG49bj8/MCxlPT09dHx8ZyhlKSYmZyh0KSYmTWF0aC5hYnMoZVswXS10WzBdKTw9biYmTWF0aC5hYnMoZVsxXS10WzFdKTw9biYmTWF0aC5hYnMoZVsyXS10WzJdKTw9biYmTWF0aC5hYnMoZVszXS10WzNdKTw9biYmTWF0aC5hYnMoZVs0XS10WzRdKTw9biYmTWF0aC5hYnMoZVs1XS10WzVdKTw9biYmTWF0aC5hYnMoZVs2XS10WzZdKTw9biYmTWF0aC5hYnMoZVs3XS10WzddKTw9biYmTWF0aC5hYnMoZVs4XS10WzhdKTw9bn07RWUuSURFTlRJVFk9T2JqZWN0LmZyZWV6ZShuZXcgRWUoMSwwLDAsMCwxLDAsMCwwLDEpKTtFZS5aRVJPPU9iamVjdC5mcmVlemUobmV3IEVlKDAsMCwwLDAsMCwwLDAsMCwwKSk7RWUuQ09MVU1OMFJPVzA9MDtFZS5DT0xVTU4wUk9XMT0xO0VlLkNPTFVNTjBST1cyPTI7RWUuQ09MVU1OMVJPVzA9MztFZS5DT0xVTU4xUk9XMT00O0VlLkNPTFVNTjFST1cyPTU7RWUuQ09MVU1OMlJPVzA9NjtFZS5DT0xVTU4yUk9XMT03O0VlLkNPTFVNTjJST1cyPTg7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRWUucHJvdG90eXBlLHtsZW5ndGg6e2dldDpmdW5jdGlvbigpe3JldHVybiBFZS5wYWNrZWRMZW5ndGh9fX0pO0VlLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbihlKXtyZXR1cm4gRWUuY2xvbmUodGhpcyxlKX07RWUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtyZXR1cm4gRWUuZXF1YWxzKHRoaXMsZSl9O0VlLmVxdWFsc0FycmF5PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZVswX